From: Victor Julien Date: Wed, 27 Mar 2024 10:40:46 +0000 (+0100) Subject: decode/icmpv4: shrink icmpv4 packet vars X-Git-Tag: suricata-8.0.0-beta1~1392 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a22047b7703cd6f1a383c59dc98e8b852054f907;p=thirdparty%2Fsuricata.git decode/icmpv4: shrink icmpv4 packet vars Remove unused L4 header pointers. Part of effort to make Packet more compact. Ticket: #6938. --- diff --git a/src/decode-icmpv4.c b/src/decode-icmpv4.c index bfa81363be..2a1db22879 100644 --- a/src/decode-icmpv4.c +++ b/src/decode-icmpv4.c @@ -74,9 +74,10 @@ static int DecodePartialIPV4(Packet* p, uint8_t* partial_packet, uint16_t len) switch (IPV4_GET_RAW_IPPROTO(icmp4_ip4h)) { case IPPROTO_TCP: if (len >= IPV4_HEADER_LEN + TCP_HEADER_LEN ) { - p->icmpv4vars.emb_tcph = (TCPHdr*)(partial_packet + IPV4_HEADER_LEN); - p->icmpv4vars.emb_sport = SCNtohs(p->icmpv4vars.emb_tcph->th_sport); - p->icmpv4vars.emb_dport = SCNtohs(p->icmpv4vars.emb_tcph->th_dport); + TCPHdr *emb_tcph = (TCPHdr *)(partial_packet + IPV4_HEADER_LEN); + p->icmpv4vars.emb_sport = SCNtohs(emb_tcph->th_sport); + p->icmpv4vars.emb_dport = SCNtohs(emb_tcph->th_dport); + p->icmpv4vars.emb_ports_set = true; p->icmpv4vars.emb_ip4_proto = IPPROTO_TCP; SCLogDebug("DecodePartialIPV4: ICMPV4->IPV4->TCP header sport: " @@ -84,11 +85,10 @@ static int DecodePartialIPV4(Packet* p, uint8_t* partial_packet, uint16_t len) p->icmpv4vars.emb_dport); } else if (len >= IPV4_HEADER_LEN + 4) { /* only access th_sport and th_dport */ - TCPHdr *emb_tcph = (TCPHdr*)(partial_packet + IPV4_HEADER_LEN); - - p->icmpv4vars.emb_tcph = NULL; + TCPHdr *emb_tcph = (TCPHdr *)(partial_packet + IPV4_HEADER_LEN); p->icmpv4vars.emb_sport = SCNtohs(emb_tcph->th_sport); p->icmpv4vars.emb_dport = SCNtohs(emb_tcph->th_dport); + p->icmpv4vars.emb_ports_set = true; p->icmpv4vars.emb_ip4_proto = IPPROTO_TCP; SCLogDebug("DecodePartialIPV4: ICMPV4->IPV4->TCP partial header sport: " "%"PRIu16" dport %"PRIu16"", p->icmpv4vars.emb_sport, @@ -103,9 +103,10 @@ static int DecodePartialIPV4(Packet* p, uint8_t* partial_packet, uint16_t len) break; case IPPROTO_UDP: if (len >= IPV4_HEADER_LEN + UDP_HEADER_LEN ) { - p->icmpv4vars.emb_udph = (UDPHdr*)(partial_packet + IPV4_HEADER_LEN); - p->icmpv4vars.emb_sport = SCNtohs(p->icmpv4vars.emb_udph->uh_sport); - p->icmpv4vars.emb_dport = SCNtohs(p->icmpv4vars.emb_udph->uh_dport); + UDPHdr *emb_udph = (UDPHdr *)(partial_packet + IPV4_HEADER_LEN); + p->icmpv4vars.emb_sport = SCNtohs(emb_udph->uh_sport); + p->icmpv4vars.emb_dport = SCNtohs(emb_udph->uh_dport); + p->icmpv4vars.emb_ports_set = true; p->icmpv4vars.emb_ip4_proto = IPPROTO_UDP; SCLogDebug("DecodePartialIPV4: ICMPV4->IPV4->UDP header sport: " @@ -120,8 +121,7 @@ static int DecodePartialIPV4(Packet* p, uint8_t* partial_packet, uint16_t len) break; case IPPROTO_ICMP: - if (len >= IPV4_HEADER_LEN + ICMPV4_HEADER_LEN ) { - p->icmpv4vars.emb_icmpv4h = (ICMPV4Hdr*)(partial_packet + IPV4_HEADER_LEN); + if (len >= IPV4_HEADER_LEN + ICMPV4_HEADER_LEN) { p->icmpv4vars.emb_sport = 0; p->icmpv4vars.emb_dport = 0; p->icmpv4vars.emb_ip4_proto = IPPROTO_ICMP; diff --git a/src/decode-icmpv4.h b/src/decode-icmpv4.h index 4d7ed38b3e..905b187b36 100644 --- a/src/decode-icmpv4.h +++ b/src/decode-icmpv4.h @@ -189,12 +189,10 @@ typedef struct ICMPV4Vars_ /** Pointers to the embedded packet headers */ IPV4Hdr *emb_ipv4h; - TCPHdr *emb_tcph; - UDPHdr *emb_udph; - ICMPV4Hdr *emb_icmpv4h; uint8_t emb_ip4_proto; + bool emb_ports_set; /** TCP/UDP ports */ uint16_t emb_sport; uint16_t emb_dport; @@ -245,13 +243,7 @@ typedef struct ICMPV4Timestamp_ { /** macro for icmpv4 embedded "protocol" access */ #define ICMPV4_GET_EMB_PROTO(p) (p)->icmpv4vars.emb_ip4_proto /** macro for icmpv4 embedded "ipv4h" header access */ -#define ICMPV4_GET_EMB_IPV4(p) (p)->icmpv4vars.emb_ipv4h -/** macro for icmpv4 embedded "tcph" header access */ -#define ICMPV4_GET_EMB_TCP(p) (p)->icmpv4vars.emb_tcph -/** macro for icmpv4 embedded "udph" header access */ -#define ICMPV4_GET_EMB_UDP(p) (p)->icmpv4vars.emb_udph -/** macro for icmpv4 embedded "icmpv4h" header access */ -#define ICMPV4_GET_EMB_ICMPV4H(p) (p)->icmpv4vars.emb_icmpv4h +#define ICMPV4_GET_EMB_IPV4(p) (p)->icmpv4vars.emb_ipv4h /** macro for icmpv4 header length */ #define ICMPV4_GET_HLEN_ICMPV4H(p) (p)->icmpv4vars.hlen @@ -260,13 +252,10 @@ typedef struct ICMPV4Timestamp_ { * * \warning use only _after_ the decoder has processed the packet */ -#define ICMPV4_DEST_UNREACH_IS_VALID(p) ( \ - (!((p)->flags & PKT_IS_INVALID)) && \ - ((p)->icmpv4h != NULL) && \ - (ICMPV4_GET_TYPE((p)) == ICMP_DEST_UNREACH) && \ - (ICMPV4_GET_EMB_IPV4((p)) != NULL) && \ - ((ICMPV4_GET_EMB_TCP((p)) != NULL) || \ - (ICMPV4_GET_EMB_UDP((p)) != NULL))) +#define ICMPV4_DEST_UNREACH_IS_VALID(p) \ + ((!((p)->flags & PKT_IS_INVALID)) && ((p)->icmpv4h != NULL) && \ + (ICMPV4_GET_TYPE((p)) == ICMP_DEST_UNREACH) && (ICMPV4_GET_EMB_IPV4((p)) != NULL) && \ + (p)->icmpv4vars.emb_ports_set) /** * marco for checking if a ICMP packet is an error message or an