lwip_debug.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. /*
  2. * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "debug/lwip_debug.h"
  7. #include "lwip/api.h"
  8. #include "lwip/netbuf.h"
  9. #include "lwip/tcp.h"
  10. #include "lwip/udp.h"
  11. #include "lwip/priv/tcp_priv.h"
  12. #include "lwip/stats.h"
  13. #include "lwip/priv/memp_priv.h"
  14. #include "lwip/memp.h"
  15. #include "esp_log.h"
  16. #if CONFIG_LWIP_IPV6 && CONFIG_LWIP_IPV4
  17. #define DBG_LWIP_IP_SHOW(info, ip) ESP_LWIP_LOGI("%s type=%" PRIu8 " ip=%" PRIX32, (info), (ip).type, (ip).u_addr.ip4.addr)
  18. #elif CONFIG_LWIP_IPV4
  19. #define DBG_LWIP_IP_SHOW(info, ip) ESP_LWIP_LOGI("%s type=%" PRIu8 " ip=%" PRIX32, (info), IPADDR_TYPE_V4, (ip).addr)
  20. #elif CONFIG_LWIP_IPV6
  21. #define DBG_LWIP_IP_SHOW(info, ip) ESP_LWIP_LOGI("%s type=%" PRIu8 " ip=%" PRIX32 ", %" PRIX32 ", %" PRIX32 ", %" PRIX32 , (info), IPADDR_TYPE_V6, (ip).addr[0], (ip).addr[1], (ip).addr[2], (ip).addr[3])
  22. #endif
  23. #define DBG_LWIP_IP_PCB_SHOW(pcb) \
  24. DBG_LWIP_IP_SHOW("local ip", (pcb)->local_ip);\
  25. DBG_LWIP_IP_SHOW("remote ip", (pcb)->remote_ip);\
  26. ESP_LWIP_LOGI("so_options=%x, tos=%" PRIu8 " ttl=%" PRIu8, (pcb)->so_options, (pcb)->tos, (pcb)->ttl)
  27. #define DBG_LWIP_SEG_SHOW(seg) while(seg) { ESP_LWIP_LOGI("\tseg=%p next=%p pbuf=%p flags=%x", (seg), (seg)->next, (seg)->p, (seg)->flags); (seg)=(seg)->next;}
  28. #define DBG_LWIP_ITEM_NUMBER_PER_LINE 9
  29. #if ESP_STATS_TCP
  30. static void dbg_lwip_tcp_pcb_cnt_show(struct tcp_pcb *pcb)
  31. {
  32. int len = 0;
  33. char *buf;
  34. char *p;
  35. int i;
  36. buf = mem_malloc(512);
  37. if (!buf) {
  38. return;
  39. }
  40. p = buf;
  41. len += sprintf(p + len, "%11s", "tcp_retry: ");
  42. for (i=0; i<TCP_MAXRTX; i++) {
  43. len += sprintf(p + len, "%-2d=%-5d ", i+1, pcb->retry_cnt[i]);
  44. }
  45. ESP_LWIP_LOGI("%s", buf);
  46. p = buf;
  47. len = 0;
  48. len += sprintf(p + len, "%11s", "tcp_rto#0:");
  49. for (i=0; i<ESP_STATS_TCP_ARRAY_SIZE; i++) {
  50. if ((i!=0) && (i%DBG_LWIP_ITEM_NUMBER_PER_LINE==0)) {
  51. ESP_LWIP_LOGI("%s", buf);
  52. len = 0;
  53. p = buf;
  54. len += sprintf(p + len, "%11s", "tcp_rto#1:");
  55. }
  56. len += sprintf(p + len, "%-2d=%-5d ", i+1, pcb->rto_cnt[i]);
  57. }
  58. ESP_LWIP_LOGI("%s", buf);
  59. free(buf);
  60. }
  61. #endif
  62. static void dbg_lwip_tcp_pcb_one_show(struct tcp_pcb* pcb)
  63. {
  64. struct tcp_seg *seg = NULL;
  65. if (!pcb) {
  66. return;
  67. }
  68. ESP_LWIP_LOGI("pcb=%p next=%p cb_arg=%p", pcb, pcb->next, pcb->callback_arg);
  69. DBG_LWIP_IP_PCB_SHOW(pcb);
  70. ESP_LWIP_LOGI("state=%x", pcb->state);
  71. ESP_LWIP_LOGI("prio=%d", pcb->prio);
  72. ESP_LWIP_LOGI("local_port=%d, remote_port=%d", pcb->local_port, pcb->remote_port);
  73. ESP_LWIP_LOGI("flags=%x", pcb->flags);
  74. ESP_LWIP_LOGI("pooltmr=%d pollinterval=%d, last_tmr=%d tmr=%" PRIu32 " rtmer=%d", pcb->polltmr, pcb->pollinterval, pcb->last_timer, pcb->tmr, pcb->rtime);
  75. ESP_LWIP_LOGI("recv_nxt=%" PRIu32 " recv_wnd=%d recv_ann_wnd=%d recv_ann_right_edge=%" PRIu32, pcb->rcv_nxt, pcb->rcv_wnd, pcb->rcv_ann_wnd, pcb->rcv_ann_right_edge);
  76. ESP_LWIP_LOGI("mss=%d", pcb->mss);
  77. ESP_LWIP_LOGI("rttest=%" PRIu32 " rtseq=%" PRIu32 " sa=%d sv=%d", pcb->rttest, pcb->rtseq, pcb->sa, pcb->sv);
  78. ESP_LWIP_LOGI("rto=%d nrtx=%d", pcb->rto, pcb->nrtx);
  79. ESP_LWIP_LOGI("dupacks=%d lastack=%" PRIu32, pcb->dupacks, pcb->lastack);
  80. #if ESP_PER_SOC_TCP_WND
  81. ESP_LWIP_LOGI("per_soc_window=%d per_soc_snd_buf=%d", pcb->per_soc_tcp_wnd, pcb->per_soc_tcp_snd_buf);
  82. #endif
  83. ESP_LWIP_LOGI("cwnd=%d ssthreash=%d", pcb->cwnd, pcb->ssthresh);
  84. ESP_LWIP_LOGI("snd_next=%" PRIu32 " snd_wl1=%" PRIu32 " snd_wl2=%" PRIu32, pcb->snd_nxt, pcb->snd_wl1, pcb->snd_wl2);
  85. ESP_LWIP_LOGI("snd_lbb=%" PRIu32 " snd_wnd=%d snd_wnd_max=%d", pcb->snd_lbb, pcb->snd_wnd, pcb->snd_wnd_max);
  86. //ESP_LWIP_LOGI("acked=%d", pcb->acked);
  87. ESP_LWIP_LOGI("snd_buf=%d snd_queuelen=%d", pcb->snd_buf, pcb->snd_queuelen);
  88. ESP_LWIP_LOGI("unsent_oversize=%d", pcb->unsent_oversize);
  89. ESP_LWIP_LOGI("keep_idle=%" PRIu32 " keep_intvl=%" PRIu32 " keep_cnt=%" PRIu32, pcb->keep_idle, pcb->keep_intvl, pcb->keep_cnt);
  90. ESP_LWIP_LOGI("persist_cnt=%d persist_backoff=%d", pcb->persist_cnt, pcb->persist_backoff);
  91. ESP_LWIP_LOGI("keep_cnt_sent=%d", pcb->keep_cnt_sent);
  92. ESP_LWIP_LOGI("unsent segments:");
  93. seg = pcb->unsent;
  94. DBG_LWIP_SEG_SHOW(seg)
  95. ESP_LWIP_LOGI("unacked segments:");
  96. seg = pcb->unacked;
  97. DBG_LWIP_SEG_SHOW(seg);
  98. #if TCP_QUEUE_OOSEQ
  99. ESP_LWIP_LOGI("ooseq segments:");
  100. seg = pcb->ooseq;
  101. DBG_LWIP_SEG_SHOW(seg);
  102. #endif
  103. ESP_LWIP_LOGI("refused data=%p", pcb->refused_data);
  104. #if ESP_STATS_TCP
  105. dbg_lwip_tcp_pcb_cnt_show(pcb);
  106. #endif
  107. }
  108. static void dbg_lwip_tcp_pcb_list_show(struct tcp_pcb* pcb)
  109. {
  110. while(pcb){
  111. dbg_lwip_tcp_pcb_one_show(pcb);
  112. pcb = pcb->next;
  113. }
  114. }
  115. extern struct tcp_pcb *tcp_bound_pcbs;
  116. extern struct tcp_pcb *tcp_active_pcbs;
  117. extern struct tcp_pcb *tcp_tw_pcbs;
  118. void dbg_lwip_tcp_pcb_show(void)
  119. {
  120. ESP_LWIP_LOGI("-------------active pcbs------------");
  121. dbg_lwip_tcp_pcb_list_show(tcp_active_pcbs);
  122. ESP_LWIP_LOGI("-------------bound pcbs-------------");
  123. dbg_lwip_tcp_pcb_list_show(tcp_bound_pcbs);
  124. ESP_LWIP_LOGI("-------------tw pcbs------------");
  125. dbg_lwip_tcp_pcb_list_show(tcp_tw_pcbs);
  126. }
  127. void dbg_lwip_udp_pcb_one_show(struct udp_pcb *pcb)
  128. {
  129. ESP_LWIP_LOGI("pcb=%p next=%p", pcb, (void*)pcb->next);
  130. DBG_LWIP_IP_PCB_SHOW(pcb);
  131. ESP_LWIP_LOGI("flags=%x", pcb->flags);
  132. ESP_LWIP_LOGI("local_port=%d remote_port=%d", pcb->local_port, pcb->remote_port);
  133. ESP_LWIP_LOGI("recv cb=%p recv_arg=%p", pcb->recv, pcb->recv_arg);
  134. }
  135. extern struct udp_pcb *udp_pcbs;
  136. void dbg_lwip_udp_pcb_show(void)
  137. {
  138. struct udp_pcb *pcb = udp_pcbs;
  139. while (pcb){
  140. dbg_lwip_udp_pcb_one_show(pcb);
  141. pcb = pcb->next;
  142. }
  143. }
  144. void dbg_lwip_tcp_rxtx_show(void)
  145. {
  146. ESP_LWIP_LOGI("TBC");
  147. }
  148. void dbg_lwip_udp_rxtx_show(void)
  149. {
  150. ESP_LWIP_LOGI("TBC");
  151. }
  152. void dbg_lwip_stats_show(void)
  153. {
  154. TCP_STATS_DISPLAY();
  155. UDP_STATS_DISPLAY();
  156. ICMP_STATS_DISPLAY();
  157. IGMP_STATS_DISPLAY();
  158. IP_STATS_DISPLAY();
  159. IPFRAG_STATS_DISPLAY();
  160. ETHARP_STATS_DISPLAY();
  161. LINK_STATS_DISPLAY();
  162. MEM_STATS_DISPLAY();
  163. SYS_STATS_DISPLAY();
  164. IP6_STATS_DISPLAY();
  165. ICMP6_STATS_DISPLAY();
  166. IP6_FRAG_STATS_DISPLAY();
  167. MLD6_STATS_DISPLAY();
  168. ND6_STATS_DISPLAY();
  169. }
  170. #if (ESP_STATS_MEM == 1)
  171. uint32_t g_lwip_mem_cnt[MEMP_MAX][2];
  172. extern const struct memp_desc * const memp_pools[MEMP_MAX];
  173. void dbg_lwip_cnt_show(void)
  174. {
  175. int i=0;
  176. ESP_LWIP_LOGI("-----lwip memory counter-----");
  177. ESP_LWIP_LOGI("%6s %8s %8s", "index", "alloc", "free");
  178. for (i=0; i<MEMP_MAX; i++){
  179. ESP_LWIP_LOGI("%6" U32_F " %8" U32_F " %8" U32_F, (u32_t)i, g_lwip_mem_cnt[i][0], g_lwip_mem_cnt[i][1]);
  180. }
  181. }
  182. #endif