From 9230e0d26d5bd7f34ae779e8c1a0e5e2ba789922 Mon Sep 17 00:00:00 2001 From: ronghulin Date: Tue, 23 Jun 2020 16:30:28 +0800 Subject: [PATCH] bugfix: fix ICMP specify length issue --- components/lwip/apps/ping/ping_sock.c | 5 +++-- components/lwip/include/apps/ping/ping_sock.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/components/lwip/apps/ping/ping_sock.c b/components/lwip/apps/ping/ping_sock.c index 3982d2f11..ced6e2bf3 100644 --- a/components/lwip/apps/ping/ping_sock.c +++ b/components/lwip/apps/ping/ping_sock.c @@ -103,10 +103,10 @@ static int esp_ping_receive(esp_ping_t *ep) int len = 0; struct sockaddr_storage from; int fromlen = sizeof(from); + uint16_t data_head = (uint16_t)(sizeof(struct ip_hdr) + sizeof(struct icmp_echo_hdr)); while ((len = recvfrom(ep->sock, buf, sizeof(buf), 0, (struct sockaddr *)&from, (socklen_t *)&fromlen)) > 0) { - if (len >= (int)(sizeof(struct ip_hdr) + sizeof(struct icmp_echo_hdr))) { - ep->recv_len = (uint32_t)len; + if (len >= data_head) { if (from.ss_family == AF_INET) { // IPv4 struct sockaddr_in *from4 = (struct sockaddr_in *)&from; @@ -126,6 +126,7 @@ static int esp_ping_receive(esp_ping_t *ep) if ((iecho->id == ep->packet_hdr->id) && (iecho->seqno == ep->packet_hdr->seqno)) { ep->received++; ep->ttl = iphdr->_ttl; + ep->recv_len = lwip_ntohs(IPH_LEN(iphdr)) - data_head; // The data portion of ICMP return len; } } diff --git a/components/lwip/include/apps/ping/ping_sock.h b/components/lwip/include/apps/ping/ping_sock.h index ef1189e84..f2581fdbe 100644 --- a/components/lwip/include/apps/ping/ping_sock.h +++ b/components/lwip/include/apps/ping/ping_sock.h @@ -82,7 +82,7 @@ typedef struct { .count = 5, \ .interval_ms = 1000, \ .timeout_ms = 1000, \ - .data_size = 56, \ + .data_size = 64, \ .tos = 0, \ .target_addr = ip_addr_any_type, \ .task_stack_size = 2048, \