From: Victor Julien Date: Sun, 31 Oct 2021 21:36:29 +0000 (+0100) Subject: af-packet: remove zero copy flag X-Git-Tag: suricata-7.0.0-beta1~1250 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=558930a192ec8732a3ea3167cc87f38eef6f6ad7;p=thirdparty%2Fsuricata.git af-packet: remove zero copy flag Flag was always set for tpacket v2 and v3, which meant the check for it in the packet setup paths were useless. --- diff --git a/src/runmode-af-packet.c b/src/runmode-af-packet.c index f8053ab0f9..20131cd591 100644 --- a/src/runmode-af-packet.c +++ b/src/runmode-af-packet.c @@ -690,20 +690,12 @@ finalize: break; } - if (active_runmode && !strcmp("workers", active_runmode)) { - aconf->flags |= AFP_ZERO_COPY; - } else { + if (active_runmode == NULL || strcmp("workers", active_runmode) != 0) { /* If we are using copy mode we need a lock */ aconf->flags |= AFP_SOCK_PROTECT; } - /* If we are in RING mode, then we can use ZERO copy - * by using the data release mechanism */ if (aconf->flags & AFP_RING_MODE) { - aconf->flags |= AFP_ZERO_COPY; - } - - if (aconf->flags & AFP_ZERO_COPY) { SCLogConfig("%s: enabling zero copy mode by using data release call", iface); } diff --git a/src/source-af-packet.c b/src/source-af-packet.c index 26515188ef..728266a48f 100644 --- a/src/source-af-packet.c +++ b/src/source-af-packet.c @@ -949,27 +949,22 @@ static bool AFPReadFromRingSetupPacket( p->vlan_idx = 1; } - if (ptv->flags & AFP_ZERO_COPY) { - if (PacketSetData(p, (unsigned char *)h.raw + h.h2->tp_mac, h.h2->tp_snaplen) == -1) { - return false; - } + if (PacketSetData(p, (unsigned char *)h.raw + h.h2->tp_mac, h.h2->tp_snaplen) == -1) { + return false; + } - p->afp_v.relptr = h.raw; - p->ReleasePacket = AFPReleasePacket; - p->afp_v.mpeer = ptv->mpeer; - AFPRefSocket(ptv->mpeer); + p->afp_v.relptr = h.raw; + p->ReleasePacket = AFPReleasePacket; + p->afp_v.mpeer = ptv->mpeer; + AFPRefSocket(ptv->mpeer); - p->afp_v.copy_mode = ptv->copy_mode; - if (p->afp_v.copy_mode != AFP_COPY_MODE_NONE) { - p->afp_v.peer = ptv->mpeer->peer; - } else { - p->afp_v.peer = NULL; - } + p->afp_v.copy_mode = ptv->copy_mode; + if (p->afp_v.copy_mode != AFP_COPY_MODE_NONE) { + p->afp_v.peer = ptv->mpeer->peer; } else { - if (PacketCopyData(p, (unsigned char *)h.raw + h.h2->tp_mac, h.h2->tp_snaplen) == -1) { - return false; - } + p->afp_v.peer = NULL; } + /* Timestamp */ p->ts.tv_sec = h.h2->tp_sec; p->ts.tv_usec = h.h2->tp_nsec / 1000; @@ -1083,10 +1078,6 @@ static int AFPReadFromRing(AFPThreadVars *ptv) TmqhOutputPacketpool(ptv->tv, p); return AFPSuriFailure(ptv, h); } - /* release frame if not in zero copy mode */ - if (!(ptv->flags & AFP_ZERO_COPY)) { - h.h2->tp_status = TP_STATUS_KERNEL; - } if (TmThreadsSlotProcessPkt(ptv->tv, ptv->slot, p) != TM_ECODE_OK) { return AFPSuriFailure(ptv, h); @@ -1131,28 +1122,22 @@ static inline int AFPParsePacketV3(AFPThreadVars *ptv, struct tpacket_block_desc p->vlan_idx = 1; } - if (ptv->flags & AFP_ZERO_COPY) { - if (PacketSetData(p, (unsigned char*)ppd + ppd->tp_mac, ppd->tp_snaplen) == -1) { - TmqhOutputPacketpool(ptv->tv, p); - SCReturnInt(AFP_SURI_FAILURE); - } - p->afp_v.relptr = ppd; - p->ReleasePacket = AFPReleasePacketV3; - p->afp_v.mpeer = ptv->mpeer; - AFPRefSocket(ptv->mpeer); + if (PacketSetData(p, (unsigned char *)ppd + ppd->tp_mac, ppd->tp_snaplen) == -1) { + TmqhOutputPacketpool(ptv->tv, p); + SCReturnInt(AFP_SURI_FAILURE); + } + p->afp_v.relptr = ppd; + p->ReleasePacket = AFPReleasePacketV3; + p->afp_v.mpeer = ptv->mpeer; + AFPRefSocket(ptv->mpeer); - p->afp_v.copy_mode = ptv->copy_mode; - if (p->afp_v.copy_mode != AFP_COPY_MODE_NONE) { - p->afp_v.peer = ptv->mpeer->peer; - } else { - p->afp_v.peer = NULL; - } + p->afp_v.copy_mode = ptv->copy_mode; + if (p->afp_v.copy_mode != AFP_COPY_MODE_NONE) { + p->afp_v.peer = ptv->mpeer->peer; } else { - if (PacketCopyData(p, (unsigned char*)ppd + ppd->tp_mac, ppd->tp_snaplen) == -1) { - TmqhOutputPacketpool(ptv->tv, p); - SCReturnInt(AFP_SURI_FAILURE); - } + p->afp_v.peer = NULL; } + /* Timestamp */ p->ts.tv_sec = ppd->tp_sec; p->ts.tv_usec = ppd->tp_nsec/1000; diff --git a/src/source-af-packet.h b/src/source-af-packet.h index b3643b081d..d599a28d62 100644 --- a/src/source-af-packet.h +++ b/src/source-af-packet.h @@ -56,7 +56,7 @@ struct ebpf_timeout_config { /* value for flags */ #define AFP_RING_MODE (1<<0) -#define AFP_ZERO_COPY (1<<1) +// (1<<1) vacant #define AFP_SOCK_PROTECT (1<<2) #define AFP_EMERGENCY_MODE (1<<3) #define AFP_TPACKET_V3 (1<<4)