From c4a6ee1647f421ae8b5e791ab1d136848c0aaf9a Mon Sep 17 00:00:00 2001 From: Victor Julien Date: Sat, 23 Mar 2024 08:44:38 +0100 Subject: [PATCH] decode: reduce macro use in IPv4/IPv6 Improve readability by setting up data/data_len once before passing on to the other decoders. Work in preparation of other decoder changes. Ticket: #5517. --- src/decode-ipv4.c | 31 ++++++++++++------------------- src/decode-ipv6.c | 21 ++++++++++++--------- 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/src/decode-ipv4.c b/src/decode-ipv4.c index c1bb9cce47..753eb8ecaf 100644 --- a/src/decode-ipv4.c +++ b/src/decode-ipv4.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2007-2013 Open Information Security Foundation +/* Copyright (C) 2007-2024 Open Information Security Foundation * * You can copy, redistribute or modify this Program under the terms of * the GNU General Public License version 2 as published by the Free @@ -559,39 +559,33 @@ int DecodeIPV4(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, } #endif /* DEBUG */ + const uint8_t *data = pkt + IPV4_GET_HLEN(p); + const uint16_t data_len = IPV4_GET_IPLEN(p) - IPV4_GET_HLEN(p); + /* check what next decoder to invoke */ switch (IPV4_GET_IPPROTO(p)) { case IPPROTO_TCP: - DecodeTCP(tv, dtv, p, pkt + IPV4_GET_HLEN(p), - IPV4_GET_IPLEN(p) - IPV4_GET_HLEN(p)); + DecodeTCP(tv, dtv, p, data, data_len); break; case IPPROTO_UDP: - DecodeUDP(tv, dtv, p, pkt + IPV4_GET_HLEN(p), - IPV4_GET_IPLEN(p) - IPV4_GET_HLEN(p)); + DecodeUDP(tv, dtv, p, data, data_len); break; case IPPROTO_ICMP: - DecodeICMPV4(tv, dtv, p, pkt + IPV4_GET_HLEN(p), - IPV4_GET_IPLEN(p) - IPV4_GET_HLEN(p)); + DecodeICMPV4(tv, dtv, p, data, data_len); break; case IPPROTO_GRE: - DecodeGRE(tv, dtv, p, pkt + IPV4_GET_HLEN(p), - IPV4_GET_IPLEN(p) - IPV4_GET_HLEN(p)); + DecodeGRE(tv, dtv, p, data, data_len); break; case IPPROTO_SCTP: - DecodeSCTP(tv, dtv, p, pkt + IPV4_GET_HLEN(p), - IPV4_GET_IPLEN(p) - IPV4_GET_HLEN(p)); + DecodeSCTP(tv, dtv, p, data, data_len); break; - case IPPROTO_ESP: - DecodeESP(tv, dtv, p, pkt + IPV4_GET_HLEN(p), IPV4_GET_IPLEN(p) - IPV4_GET_HLEN(p)); + DecodeESP(tv, dtv, p, data, data_len); break; - case IPPROTO_IPV6: { /* spawn off tunnel packet */ - Packet *tp = PacketTunnelPktSetup(tv, dtv, p, pkt + IPV4_GET_HLEN(p), - IPV4_GET_IPLEN(p) - IPV4_GET_HLEN(p), - DECODE_TUNNEL_IPV6); + Packet *tp = PacketTunnelPktSetup(tv, dtv, p, data, data_len, DECODE_TUNNEL_IPV6); if (tp != NULL) { PKT_SET_SRC(tp, PKT_SRC_DECODER_IPV4); PacketEnqueueNoLock(&tv->decode_pq,tp); @@ -602,8 +596,7 @@ int DecodeIPV4(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, case IPPROTO_IP: /* check PPP VJ uncompressed packets and decode tcp dummy */ if (p->flags & PKT_PPP_VJ_UCOMP) { - DecodeTCP(tv, dtv, p, pkt + IPV4_GET_HLEN(p), - IPV4_GET_IPLEN(p) - IPV4_GET_HLEN(p)); + DecodeTCP(tv, dtv, p, data, data_len); } break; case IPPROTO_ICMPV6: diff --git a/src/decode-ipv6.c b/src/decode-ipv6.c index 4becd06338..754dec9439 100644 --- a/src/decode-ipv6.c +++ b/src/decode-ipv6.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2007-2013 Open Information Security Foundation +/* Copyright (C) 2007-2024 Open Information Security Foundation * * You can copy, redistribute or modify this Program under the terms of * the GNU General Public License version 2 as published by the Free @@ -588,34 +588,37 @@ int DecodeIPV6(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t * } #endif /* DEBUG */ + const uint8_t *data = pkt + IPV6_HEADER_LEN; + const uint16_t data_len = IPV6_GET_PLEN(p); + /* now process the Ext headers and/or the L4 Layer */ switch(IPV6_GET_NH(p)) { case IPPROTO_TCP: IPV6_SET_L4PROTO (p, IPPROTO_TCP); - DecodeTCP(tv, dtv, p, pkt + IPV6_HEADER_LEN, IPV6_GET_PLEN(p)); + DecodeTCP(tv, dtv, p, data, data_len); return TM_ECODE_OK; case IPPROTO_UDP: IPV6_SET_L4PROTO (p, IPPROTO_UDP); - DecodeUDP(tv, dtv, p, pkt + IPV6_HEADER_LEN, IPV6_GET_PLEN(p)); + DecodeUDP(tv, dtv, p, data, data_len); return TM_ECODE_OK; case IPPROTO_ICMPV6: IPV6_SET_L4PROTO (p, IPPROTO_ICMPV6); - DecodeICMPV6(tv, dtv, p, pkt + IPV6_HEADER_LEN, IPV6_GET_PLEN(p)); + DecodeICMPV6(tv, dtv, p, data, data_len); return TM_ECODE_OK; case IPPROTO_SCTP: IPV6_SET_L4PROTO (p, IPPROTO_SCTP); - DecodeSCTP(tv, dtv, p, pkt + IPV6_HEADER_LEN, IPV6_GET_PLEN(p)); + DecodeSCTP(tv, dtv, p, data, data_len); return TM_ECODE_OK; case IPPROTO_IPIP: IPV6_SET_L4PROTO(p, IPPROTO_IPIP); - DecodeIPv4inIPv6(tv, dtv, p, pkt + IPV6_HEADER_LEN, IPV6_GET_PLEN(p)); + DecodeIPv4inIPv6(tv, dtv, p, data, data_len); return TM_ECODE_OK; case IPPROTO_IPV6: - DecodeIP6inIP6(tv, dtv, p, pkt + IPV6_HEADER_LEN, IPV6_GET_PLEN(p)); + DecodeIP6inIP6(tv, dtv, p, data, data_len); return TM_ECODE_OK; case IPPROTO_GRE: IPV6_SET_L4PROTO(p, IPPROTO_GRE); - DecodeGRE(tv, dtv, p, pkt + IPV6_HEADER_LEN, IPV6_GET_PLEN(p)); + DecodeGRE(tv, dtv, p, data, data_len); break; case IPPROTO_FRAGMENT: case IPPROTO_HOPOPTS: @@ -627,7 +630,7 @@ int DecodeIPV6(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t * case IPPROTO_MH: case IPPROTO_HIP: case IPPROTO_SHIM6: - DecodeIPV6ExtHdrs(tv, dtv, p, pkt + IPV6_HEADER_LEN, IPV6_GET_PLEN(p)); + DecodeIPV6ExtHdrs(tv, dtv, p, data, data_len); break; case IPPROTO_ICMP: ENGINE_SET_EVENT(p,IPV6_WITH_ICMPV4); -- 2.47.3