]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
defrag: fix wrong datalink being logged
authorVictor Julien <vjulien@oisf.net>
Sat, 23 Mar 2024 19:17:54 +0000 (20:17 +0100)
committerVictor Julien <victor@inliniac.net>
Thu, 18 Apr 2024 08:30:21 +0000 (10:30 +0200)
Eve's packet_info.linktype should correctly indicated what the `packet`
field contains. Until now it was using DLT_RAW even if Ethernet or other
L2+ headers were present.

This commit records the datalink of the packet creating the first
fragment, which can include the L2+ header data.

Bug: #6887.
(cherry picked from commit 49c67b2bb1baa84b7105bca82afe6909be890855)

src/decode.c
src/defrag.c
src/defrag.h

index 45301f78d715fb014b1e71966e9d6a27c0df6365..5eeb85a78f970c0a99af7520c39f15898c96506c 100644 (file)
@@ -408,7 +408,6 @@ Packet *PacketDefragPktSetup(Packet *parent, const uint8_t *pkt, uint32_t len, u
     p->recursion_level = parent->recursion_level; /* NOT incremented */
     p->ts.tv_sec = parent->ts.tv_sec;
     p->ts.tv_usec = parent->ts.tv_usec;
-    p->datalink = DLT_RAW;
     p->tenant_id = parent->tenant_id;
     /* tell new packet it's part of a tunnel */
     SET_TUNNEL_PKT(p);
index 6b17f90738456241ac262f6fab34e009215749f1..d2fa4ffff46059babc5c99820c4b1530fca332f5 100644 (file)
@@ -295,6 +295,7 @@ Defrag4Reassemble(ThreadVars *tv, DefragTracker *tracker, Packet *p)
     }
     PKT_SET_SRC(rp, PKT_SRC_DEFRAG);
     rp->flags |= PKT_REBUILT_FRAGMENT;
+    rp->datalink = tracker->datalink;
 
     int fragmentable_offset = 0;
     int fragmentable_len = 0;
@@ -433,6 +434,7 @@ Defrag6Reassemble(ThreadVars *tv, DefragTracker *tracker, Packet *p)
     }
     PKT_SET_SRC(rp, PKT_SRC_DEFRAG);
     rp->flags |= PKT_REBUILT_FRAGMENT;
+    rp->datalink = tracker->datalink;
 
     int unfragmentable_len = 0;
     int fragmentable_offset = 0;
@@ -861,6 +863,9 @@ DefragInsertFrag(ThreadVars *tv, DecodeThreadVars *dtv, DefragTracker *tracker,
 #ifdef DEBUG
     new->pcap_cnt = pcap_cnt;
 #endif
+    if (frag_offset == 0) {
+        tracker->datalink = p->datalink;
+    }
 
     IP_FRAGMENTS_RB_INSERT(&tracker->fragment_tree, new);
 
index 771616e4ddaff22296ac90b8a68f75d93ff23c7d..7fd08262ffdeb8e7000986f9c5ee80afcf9d9570 100644 (file)
@@ -105,6 +105,7 @@ typedef struct DefragTracker_ {
     Address dst_addr; /**< Destination address for this tracker. */
 
     struct timeval timeout; /**< When this tracker will timeout. */
+    int datalink;           /**< datalink for reassembled packet, set by first fragment */
     uint32_t host_timeout;  /**< Host timeout, statically assigned from the yaml */
 
     /** use cnt, reference counter */