From: Victor Julien Date: Fri, 29 May 2020 11:04:47 +0000 (+0200) Subject: capture: optimize checksum handling X-Git-Tag: suricata-6.0.0-beta1~404 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3957750731e6699fcb1f2a4c777f7892f0556ab4;p=thirdparty%2Fsuricata.git 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. --- diff --git a/src/source-af-packet.c b/src/source-af-packet.c index f3cb43b2b7..db6b906268 100644 --- a/src/source-af-packet.c +++ b/src/source-af-packet.c @@ -677,12 +677,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 { @@ -994,12 +992,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 { @@ -1107,12 +1103,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 6fdc417ab2..06b4205794 100644 --- a/src/source-pcap.c +++ b/src/source-pcap.c @@ -201,12 +201,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 a21674037d..6e81a94dab 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 67f47a7934..f95696a6c0 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);