From 4cf531008e8840d09793bce64ce00565ad65dbb0 Mon Sep 17 00:00:00 2001 From: Eric Leblond Date: Sun, 9 Dec 2018 20:34:28 +0100 Subject: [PATCH] af-packet: conditionaly remove XDP filter Only remove the XDP filter if we are in XDP mode and not using the pinned maps. --- src/source-af-packet.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/source-af-packet.c b/src/source-af-packet.c index fdd9c1deb4..75208102be 100644 --- a/src/source-af-packet.c +++ b/src/source-af-packet.c @@ -292,7 +292,7 @@ typedef struct AFPThreadVars_ uint8_t xdp_mode; - unsigned int nr_cpus; + struct ebpf_timeout_config ebpf_t_config; } AFPThreadVars; @@ -631,7 +631,7 @@ static int AFPRead(AFPThreadVars *ptv) #ifdef HAVE_PACKET_EBPF p->afp_v.v4_map_fd = ptv->v4_map_fd; p->afp_v.v6_map_fd = ptv->v6_map_fd; - p->afp_v.nr_cpus = ptv->nr_cpus; + p->afp_v.nr_cpus = ptv->ebpf_t_config.cpus_count; #endif } if (ptv->flags & AFP_XDPBYPASS) { @@ -639,7 +639,7 @@ static int AFPRead(AFPThreadVars *ptv) #ifdef HAVE_PACKET_EBPF p->afp_v.v4_map_fd = ptv->v4_map_fd; p->afp_v.v6_map_fd = ptv->v6_map_fd; - p->afp_v.nr_cpus = ptv->nr_cpus; + p->afp_v.nr_cpus = ptv->ebpf_t_config.cpus_count; #endif } @@ -918,7 +918,7 @@ static int AFPReadFromRing(AFPThreadVars *ptv) #ifdef HAVE_PACKET_EBPF p->afp_v.v4_map_fd = ptv->v4_map_fd; p->afp_v.v6_map_fd = ptv->v6_map_fd; - p->afp_v.nr_cpus = ptv->nr_cpus; + p->afp_v.nr_cpus = ptv->ebpf_t_config.cpus_count; #endif } if (ptv->flags & AFP_XDPBYPASS) { @@ -926,7 +926,7 @@ static int AFPReadFromRing(AFPThreadVars *ptv) #ifdef HAVE_PACKET_EBPF p->afp_v.v4_map_fd = ptv->v4_map_fd; p->afp_v.v6_map_fd = ptv->v6_map_fd; - p->afp_v.nr_cpus = ptv->nr_cpus; + p->afp_v.nr_cpus = ptv->ebpf_t_config.cpus_count; #endif } @@ -1054,14 +1054,14 @@ static inline int AFPParsePacketV3(AFPThreadVars *ptv, struct tpacket_block_desc #ifdef HAVE_PACKET_EBPF p->afp_v.v4_map_fd = ptv->v4_map_fd; p->afp_v.v6_map_fd = ptv->v6_map_fd; - p->afp_v.nr_cpus = ptv->nr_cpus; + p->afp_v.nr_cpus = ptv->ebpf_t_config.cpus_count; #endif } else if (ptv->flags & AFP_XDPBYPASS) { p->BypassPacketsFlow = AFPXDPBypassCallback; #ifdef HAVE_PACKET_EBPF p->afp_v.v4_map_fd = ptv->v4_map_fd; p->afp_v.v6_map_fd = ptv->v6_map_fd; - p->afp_v.nr_cpus = ptv->nr_cpus; + p->afp_v.nr_cpus = ptv->ebpf_t_config.cpus_count; #endif } @@ -2583,7 +2583,7 @@ TmEcode ReceiveAFPThreadInit(ThreadVars *tv, const void *initdata, void **data) ptv->ebpf_lb_fd = afpconfig->ebpf_lb_fd; ptv->ebpf_filter_fd = afpconfig->ebpf_filter_fd; ptv->xdp_mode = afpconfig->xdp_mode; - ptv->nr_cpus = UtilCpuGetNumProcessorsConfigured(); + ptv->ebpf_t_config.cpus_count = UtilCpuGetNumProcessorsConfigured(); #ifdef HAVE_PACKET_EBPF if (ptv->flags & (AFP_BYPASS|AFP_XDPBYPASS)) { @@ -2596,7 +2596,7 @@ TmEcode ReceiveAFPThreadInit(ThreadVars *tv, const void *initdata, void **data) SCLogError(SC_ERR_INVALID_VALUE, "Can't find eBPF map fd for '%s'", "flow_table_v6"); } } - ptv->nr_cpus = afpconfig->ebpf_t_config.cpus_count; + ptv->ebpf_t_config = afpconfig->ebpf_t_config; #endif #ifdef PACKET_STATISTICS @@ -2689,7 +2689,10 @@ TmEcode ReceiveAFPThreadDeinit(ThreadVars *tv, void *data) AFPSwitchState(ptv, AFP_STATE_DOWN); #ifdef HAVE_PACKET_XDP - EBPFSetupXDP(ptv->iface, -1, ptv->xdp_mode); + if ((ptv->ebpf_t_config.flags & EBPF_XDP_CODE) && + (!(ptv->ebpf_t_config.flags & EBPF_PINNED_MAPS))) { + EBPFSetupXDP(ptv->iface, -1, ptv->xdp_mode); + } #endif if (ptv->data != NULL) { SCFree(ptv->data);