lwip_debug.c 6.7 KB

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