]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
af-packet: conditionaly remove XDP filter
authorEric Leblond <eric@regit.org>
Sun, 9 Dec 2018 19:34:28 +0000 (20:34 +0100)
committerVictor Julien <victor@inliniac.net>
Tue, 18 Jun 2019 05:07:01 +0000 (07:07 +0200)
Only remove the XDP filter if we are in XDP mode and not using the
pinned maps.

src/source-af-packet.c

index fdd9c1deb41a1490b763c2fcaabaa1c61c97d2a1..75208102befdc527be2b0ae8fdb9d51af57705d8 100644 (file)
@@ -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);