From 7d194e09b00b808d2debead452b2da52838d0514 Mon Sep 17 00:00:00 2001 From: Victor Julien Date: Fri, 29 May 2020 13:04:47 +0200 Subject: [PATCH] capture: optimize checksum handling Don't use a flag in the livedev, but overwrite the config setting after 'auto' mode has determined checksums should be disabled. (cherry picked from commit 3957750731e6699fcb1f2a4c777f7892f0556ab4) --- src/source-af-packet.c | 18 ++++++------------ src/source-pcap.c | 6 ++---- src/source-pfring.c | 6 ++---- src/util-device.c | 1 - src/util-device.h | 1 - 5 files changed, 10 insertions(+), 22 deletions(-) diff --git a/src/source-af-packet.c b/src/source-af-packet.c index b0a8148f8b..49bb02723f 100644 --- a/src/source-af-packet.c +++ b/src/source-af-packet.c @@ -716,12 +716,10 @@ static int AFPRead(AFPThreadVars *ptv) if (ptv->checksum_mode == CHECKSUM_VALIDATION_DISABLE) { p->flags |= PKT_IGNORE_CHECKSUM; } else if (ptv->checksum_mode == CHECKSUM_VALIDATION_AUTO) { - if (ptv->livedev->ignore_checksum) { - p->flags |= PKT_IGNORE_CHECKSUM; - } else if (ChecksumAutoModeCheck(ptv->pkts, + if (ChecksumAutoModeCheck(ptv->pkts, SC_ATOMIC_GET(ptv->livedev->pkts), SC_ATOMIC_GET(ptv->livedev->invalid_checksums))) { - ptv->livedev->ignore_checksum = 1; + ptv->checksum_mode = CHECKSUM_VALIDATION_DISABLE; p->flags |= PKT_IGNORE_CHECKSUM; } } else { @@ -1034,12 +1032,10 @@ static int AFPReadFromRing(AFPThreadVars *ptv) if (ptv->checksum_mode == CHECKSUM_VALIDATION_DISABLE) { p->flags |= PKT_IGNORE_CHECKSUM; } else if (ptv->checksum_mode == CHECKSUM_VALIDATION_AUTO) { - if (ptv->livedev->ignore_checksum) { - p->flags |= PKT_IGNORE_CHECKSUM; - } else if (ChecksumAutoModeCheck(ptv->pkts, + if (ChecksumAutoModeCheck(ptv->pkts, SC_ATOMIC_GET(ptv->livedev->pkts), SC_ATOMIC_GET(ptv->livedev->invalid_checksums))) { - ptv->livedev->ignore_checksum = 1; + ptv->checksum_mode = CHECKSUM_VALIDATION_DISABLE; p->flags |= PKT_IGNORE_CHECKSUM; } } else { @@ -1148,12 +1144,10 @@ static inline int AFPParsePacketV3(AFPThreadVars *ptv, struct tpacket_block_desc if (ptv->checksum_mode == CHECKSUM_VALIDATION_DISABLE) { p->flags |= PKT_IGNORE_CHECKSUM; } else if (ptv->checksum_mode == CHECKSUM_VALIDATION_AUTO) { - if (ptv->livedev->ignore_checksum) { - p->flags |= PKT_IGNORE_CHECKSUM; - } else if (ChecksumAutoModeCheck(ptv->pkts, + if (ChecksumAutoModeCheck(ptv->pkts, SC_ATOMIC_GET(ptv->livedev->pkts), SC_ATOMIC_GET(ptv->livedev->invalid_checksums))) { - ptv->livedev->ignore_checksum = 1; + ptv->checksum_mode = CHECKSUM_VALIDATION_DISABLE; p->flags |= PKT_IGNORE_CHECKSUM; } } else { diff --git a/src/source-pcap.c b/src/source-pcap.c index 0c078748a7..f0f2cdc5c4 100644 --- a/src/source-pcap.c +++ b/src/source-pcap.c @@ -202,12 +202,10 @@ static void PcapCallbackLoop(char *user, struct pcap_pkthdr *h, u_char *pkt) switch (ptv->checksum_mode) { case CHECKSUM_VALIDATION_AUTO: - if (ptv->livedev->ignore_checksum) { - p->flags |= PKT_IGNORE_CHECKSUM; - } else if (ChecksumAutoModeCheck(ptv->pkts, + if (ChecksumAutoModeCheck(ptv->pkts, SC_ATOMIC_GET(ptv->livedev->pkts), SC_ATOMIC_GET(ptv->livedev->invalid_checksums))) { - ptv->livedev->ignore_checksum = 1; + ptv->checksum_mode = CHECKSUM_VALIDATION_DISABLE; p->flags |= PKT_IGNORE_CHECKSUM; } break; diff --git a/src/source-pfring.c b/src/source-pfring.c index 8976f61359..6653549fab 100644 --- a/src/source-pfring.c +++ b/src/source-pfring.c @@ -280,12 +280,10 @@ static inline void PfringProcessPacket(void *user, struct pfring_pkthdr *h, Pack p->flags |= PKT_IGNORE_CHECKSUM; break; case CHECKSUM_VALIDATION_AUTO: - if (ptv->livedev->ignore_checksum) { - p->flags |= PKT_IGNORE_CHECKSUM; - } else if (ChecksumAutoModeCheck(ptv->pkts, + if (ChecksumAutoModeCheck(ptv->pkts, SC_ATOMIC_GET(ptv->livedev->pkts), SC_ATOMIC_GET(ptv->livedev->invalid_checksums))) { - ptv->livedev->ignore_checksum = 1; + ptv->checksum_mode = CHECKSUM_VALIDATION_DISABLE; p->flags |= PKT_IGNORE_CHECKSUM; } break; diff --git a/src/util-device.c b/src/util-device.c index 4c0779ea63..a0f0e6e428 100644 --- a/src/util-device.c +++ b/src/util-device.c @@ -141,7 +141,6 @@ int LiveRegisterDevice(const char *dev) SC_ATOMIC_INIT(pd->pkts); SC_ATOMIC_INIT(pd->drop); SC_ATOMIC_INIT(pd->invalid_checksums); - pd->ignore_checksum = 0; pd->id = LiveGetDeviceCount(); TAILQ_INSERT_TAIL(&live_devices, pd, next); diff --git a/src/util-device.h b/src/util-device.h index 229d00245f..b43479b06a 100644 --- a/src/util-device.h +++ b/src/util-device.h @@ -42,7 +42,6 @@ typedef struct LiveDevice_ { char dev_short[MAX_DEVNAME + 1]; bool tenant_id_set; - int ignore_checksum; int id; SC_ATOMIC_DECLARE(uint64_t, pkts); -- 2.47.2