lwip_debug.c 6.6 KB

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