]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
util-ebpf: fix ebpf bypass
authorEric Leblond <eric@regit.org>
Tue, 28 May 2019 21:10:53 +0000 (23:10 +0200)
committerVictor Julien <victor@inliniac.net>
Tue, 18 Jun 2019 05:07:02 +0000 (07:07 +0200)
Fix endian order in eBPF bypass. It has to be updated after the
bypassed flows handling change.

src/util-ebpf.c

index f4a3b320822ff62ccdb28c3ca2710c904c60c68f..ac15f2b2c0dc16575ceffab5b49597bb5b7fa0df 100644 (file)
@@ -635,17 +635,19 @@ static int EBPFForEachFlowV4Table(ThreadVars *th_v, LiveDevice *dev, const char
         if (tcfg->mode == AFP_MODE_XDP_BYPASS) {
             flow_key.sp = ntohs(next_key.port16[0]);
             flow_key.dp = ntohs(next_key.port16[1]);
+            flow_key.src.addr_data32[0] = next_key.src;
+            flow_key.dst.addr_data32[0] = next_key.dst;
         } else {
             flow_key.sp = next_key.port16[0];
             flow_key.dp = next_key.port16[1];
+            flow_key.src.addr_data32[0] = ntohl(next_key.src);
+            flow_key.dst.addr_data32[0] = ntohl(next_key.dst);
         }
         flow_key.src.family = AF_INET;
-        flow_key.src.addr_data32[0] = next_key.src;
         flow_key.src.addr_data32[1] = 0;
         flow_key.src.addr_data32[2] = 0;
         flow_key.src.addr_data32[3] = 0;
         flow_key.dst.family = AF_INET;
-        flow_key.dst.addr_data32[0] = next_key.dst;
         flow_key.dst.addr_data32[1] = 0;
         flow_key.dst.addr_data32[2] = 0;
         flow_key.dst.addr_data32[3] = 0;
@@ -734,20 +736,30 @@ static int EBPFForEachFlowV6Table(ThreadVars *th_v,
         if (tcfg->mode == AFP_MODE_XDP_BYPASS) {
             flow_key.sp = ntohs(next_key.port16[0]);
             flow_key.dp = ntohs(next_key.port16[1]);
+            flow_key.src.family = AF_INET6;
+            flow_key.src.addr_data32[0] = next_key.src[0];
+            flow_key.src.addr_data32[1] = next_key.src[1];
+            flow_key.src.addr_data32[2] = next_key.src[2];
+            flow_key.src.addr_data32[3] = next_key.src[3];
+            flow_key.dst.family = AF_INET6;
+            flow_key.dst.addr_data32[0] = next_key.dst[0];
+            flow_key.dst.addr_data32[1] = next_key.dst[1];
+            flow_key.dst.addr_data32[2] = next_key.dst[2];
+            flow_key.dst.addr_data32[3] = next_key.dst[3];
         } else {
             flow_key.sp = next_key.port16[0];
             flow_key.dp = next_key.port16[1];
+            flow_key.src.family = AF_INET6;
+            flow_key.src.addr_data32[0] = ntohl(next_key.src[0]);
+            flow_key.src.addr_data32[1] = ntohl(next_key.src[1]);
+            flow_key.src.addr_data32[2] = ntohl(next_key.src[2]);
+            flow_key.src.addr_data32[3] = ntohl(next_key.src[3]);
+            flow_key.dst.family = AF_INET6;
+            flow_key.dst.addr_data32[0] = ntohl(next_key.dst[0]);
+            flow_key.dst.addr_data32[1] = ntohl(next_key.dst[1]);
+            flow_key.dst.addr_data32[2] = ntohl(next_key.dst[2]);
+            flow_key.dst.addr_data32[3] = ntohl(next_key.dst[3]);
         }
-        flow_key.src.family = AF_INET6;
-        flow_key.src.addr_data32[0] = next_key.src[0];
-        flow_key.src.addr_data32[1] = next_key.src[1];
-        flow_key.src.addr_data32[2] = next_key.src[2];
-        flow_key.src.addr_data32[3] = next_key.src[3];
-        flow_key.dst.family = AF_INET6;
-        flow_key.dst.addr_data32[0] = next_key.dst[0];
-        flow_key.dst.addr_data32[1] = next_key.dst[1];
-        flow_key.dst.addr_data32[2] = next_key.dst[2];
-        flow_key.dst.addr_data32[3] = next_key.dst[3];
         flow_key.vlan_id[0] = next_key.vlan_id[0];
         flow_key.vlan_id[1] = next_key.vlan_id[1];
         flow_key.proto = next_key.ip_proto;