diff --git a/src/core/ipv4/icmp.c b/src/core/ipv4/icmp.c index a462ccd3..de6d1e85 100644 --- a/src/core/ipv4/icmp.c +++ b/src/core/ipv4/icmp.c @@ -341,8 +341,7 @@ icmp_send_response(struct pbuf *p, u8_t type, u8_t code) { struct pbuf *q; struct ip_hdr *iphdr; - /* we can use the echo header here */ - struct icmp_echo_hdr *icmphdr; + struct icmp_hdr *icmphdr; ip4_addr_t iphdr_src; struct netif *netif; @@ -350,7 +349,7 @@ icmp_send_response(struct pbuf *p, u8_t type, u8_t code) MIB2_STATS_INC(mib2.icmpoutmsgs); /* ICMP header + IP header + 8 bytes of data */ - q = pbuf_alloc(PBUF_IP, sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE, + q = pbuf_alloc(PBUF_IP, sizeof(struct icmp_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE, PBUF_RAM); if (q == NULL) { LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded: failed to allocate pbuf for ICMP packet.\n")); @@ -367,11 +366,10 @@ icmp_send_response(struct pbuf *p, u8_t type, u8_t code) ip4_addr_debug_print_val(ICMP_DEBUG, iphdr->dest); LWIP_DEBUGF(ICMP_DEBUG, ("\n")); - icmphdr = (struct icmp_echo_hdr *)q->payload; + icmphdr = (struct icmp_hdr *)q->payload; icmphdr->type = type; icmphdr->code = code; - icmphdr->id = 0; - icmphdr->seqno = 0; + icmphdr->data = 0; /* copy fields from original packet */ SMEMCPY((u8_t *)q->payload + sizeof(struct icmp_echo_hdr), (u8_t *)p->payload, diff --git a/src/include/lwip/prot/icmp.h b/src/include/lwip/prot/icmp.h index 7d19385c..1fe12d96 100644 --- a/src/include/lwip/prot/icmp.h +++ b/src/include/lwip/prot/icmp.h @@ -57,13 +57,33 @@ extern "C" { #define ICMP_AM 17 /* address mask request */ #define ICMP_AMR 18 /* address mask reply */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +/** The standard ICMP header (unspecified 32 bit data) */ +PACK_STRUCT_BEGIN +struct icmp_hdr { + PACK_STRUCT_FLD_8(u8_t type); + PACK_STRUCT_FLD_8(u8_t code); + PACK_STRUCT_FIELD(u16_t chksum); + PACK_STRUCT_FIELD(u32_t data); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/* Compatibility defines, old versions used to combine type and code to an u16_t */ +#define ICMPH_TYPE(hdr) ((hdr)->type) +#define ICMPH_CODE(hdr) ((hdr)->code) +#define ICMPH_TYPE_SET(hdr, t) ((hdr)->type = (t)) +#define ICMPH_CODE_SET(hdr, c) ((hdr)->code = (c)) + #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif /** This is the standard ICMP header only that the u32_t data * is split to two u16_t like ICMP echo needs it. - * This header is also used for other ICMP types that do not - * use the data part. */ PACK_STRUCT_BEGIN struct icmp_echo_hdr { @@ -78,12 +98,6 @@ PACK_STRUCT_END # include "arch/epstruct.h" #endif -/* Compatibility defines, old versions used to combine type and code to an u16_t */ -#define ICMPH_TYPE(hdr) ((hdr)->type) -#define ICMPH_CODE(hdr) ((hdr)->code) -#define ICMPH_TYPE_SET(hdr, t) ((hdr)->type = (t)) -#define ICMPH_CODE_SET(hdr, c) ((hdr)->code = (c)) - #ifdef __cplusplus } #endif