]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
util-ebpf: conditional flow table loading
authorEric Leblond <eric@regit.org>
Sun, 20 Jan 2019 20:49:11 +0000 (21:49 +0100)
committerVictor Julien <victor@inliniac.net>
Tue, 18 Jun 2019 05:07:02 +0000 (07:07 +0200)
src/util-ebpf.c

index 48038570b1555e5c44cac0924fcc4b5930901fcd..f10435f7b28106eb91bc713b7c58381d37504dff 100644 (file)
@@ -184,18 +184,20 @@ static int EBPFLoadPinnedMaps(LiveDevice *livedev, struct ebpf_timeout_config *c
         }
     }
 
-    /* Get flow v4 table */
-    fd_v4 = EBPFLoadPinnedMapsFile(livedev, "flow_table_v4");
-    if (fd_v4 < 0) {
-        return fd_v4;
-    }
+    if (config->mode == AFP_MODE_XDP_BYPASS) {
+        /* Get flow v4 table */
+        fd_v4 = EBPFLoadPinnedMapsFile(livedev, "flow_table_v4");
+        if (fd_v4 < 0) {
+            return fd_v4;
+        }
 
-    /* Get flow v6 table */
-    fd_v6 = EBPFLoadPinnedMapsFile(livedev, "flow_table_v6");
-    if (fd_v6 < 0) {
-        SCLogWarning(SC_ERR_INVALID_ARGUMENT,
-                     "Found a flow_table_v4 map but no flow_table_v6 map");
-        return fd_v6;
+        /* Get flow v6 table */
+        fd_v6 = EBPFLoadPinnedMapsFile(livedev, "flow_table_v6");
+        if (fd_v6 < 0) {
+            SCLogWarning(SC_ERR_INVALID_ARGUMENT,
+                    "Found a flow_table_v4 map but no flow_table_v6 map");
+            return fd_v6;
+        }
     }
 
     struct bpf_maps_info *bpf_map_data = SCCalloc(1, sizeof(*bpf_map_data));
@@ -205,11 +207,42 @@ static int EBPFLoadPinnedMaps(LiveDevice *livedev, struct ebpf_timeout_config *c
     }
     SC_ATOMIC_INIT(bpf_map_data->ipv4_hash_count);
     SC_ATOMIC_INIT(bpf_map_data->ipv6_hash_count);
-    bpf_map_data->array[0].fd = fd_v4;
-    bpf_map_data->array[0].name = SCStrdup("flow_table_v4");
-    bpf_map_data->array[1].fd = fd_v6;
-    bpf_map_data->array[1].name = SCStrdup("flow_table_v6");
-    bpf_map_data->last = 2;
+    if (config->mode == AFP_MODE_XDP_BYPASS) {
+        bpf_map_data->array[0].fd = fd_v4;
+        bpf_map_data->array[0].name = SCStrdup("flow_table_v4");
+        bpf_map_data->array[1].fd = fd_v6;
+        bpf_map_data->array[1].name = SCStrdup("flow_table_v6");
+        bpf_map_data->last = 2;
+    } else {
+        bpf_map_data->last = 0;
+    }
+
+    /* Load other known maps: cpu_map, cpus_available, tx_peer, tx_peer_int */
+    int fd = EBPFLoadPinnedMapsFile(livedev, "cpu_map");
+    if (fd >= 0) {
+        bpf_map_data->array[bpf_map_data->last].fd = fd;
+        bpf_map_data->array[bpf_map_data->last].name = SCStrdup("cpu_map");
+        bpf_map_data->last++;
+    }
+    fd = EBPFLoadPinnedMapsFile(livedev, "cpus_available");
+    if (fd >= 0) {
+        bpf_map_data->array[bpf_map_data->last].fd = fd;
+        bpf_map_data->array[bpf_map_data->last].name = SCStrdup("cpus_available");
+        bpf_map_data->last++;
+    }
+    fd = EBPFLoadPinnedMapsFile(livedev, "tx_peer");
+    if (fd >= 0) {
+        bpf_map_data->array[bpf_map_data->last].fd = fd;
+        bpf_map_data->array[bpf_map_data->last].name = SCStrdup("tx_peer");
+        bpf_map_data->last++;
+    }
+    fd = EBPFLoadPinnedMapsFile(livedev, "tx_peer_int");
+    if (fd >= 0) {
+        bpf_map_data->array[bpf_map_data->last].fd = fd;
+        bpf_map_data->array[bpf_map_data->last].name = SCStrdup("tx_peer_int");
+        bpf_map_data->last++;
+    }
+
     /* Attach the bpf_maps_info to the LiveDevice via the device storage */
     LiveDevSetStorageById(livedev, g_livedev_storage_id, bpf_map_data);