sample/bpf: fix erspan metadata
authorWilliam Tu <u9012063@gmail.com>
Mon, 5 Feb 2018 21:35:36 +0000 (13:35 -0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 6 Feb 2018 16:32:49 +0000 (11:32 -0500)
The commit c69de58ba84f ("net: erspan: use bitfield instead of
mask and offset") changes the erspan header to use bitfield, and
commit d350a823020e ("net: erspan: create erspan metadata uapi header")
creates a uapi header file.  The above two commit breaks the current
erspan test.  This patch fixes it by adapting the above two changes.

Fixes: ac80c2a165af ("samples/bpf: add erspan v2 sample code")
Fixes: ef88f89c830f ("samples/bpf: extend test_tunnel_bpf.sh with ERSPAN")
Signed-off-by: William Tu <u9012063@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
samples/bpf/tcbpf2_kern.c
samples/bpf/test_tunnel_bpf.sh

index f6bbf8f50da39bfacaf915966282e4e243d58f2c..efdc16d195ff6e889f66104c60003a9801843831 100644 (file)
@@ -15,6 +15,7 @@
 #include <uapi/linux/tcp.h>
 #include <uapi/linux/filter.h>
 #include <uapi/linux/pkt_cls.h>
+#include <uapi/linux/erspan.h>
 #include <net/ipv6.h>
 #include "bpf_helpers.h"
 #include "bpf_endian.h"
@@ -35,24 +36,10 @@ struct geneve_opt {
        u8      opt_data[8]; /* hard-coded to 8 byte */
 };
 
-struct erspan_md2 {
-       __be32 timestamp;
-       __be16 sgt;
-       __be16 flags;
-};
-
 struct vxlan_metadata {
        u32     gbp;
 };
 
-struct erspan_metadata {
-       union {
-               __be32 index;
-               struct erspan_md2 md2;
-       } u;
-       int version;
-};
-
 SEC("gre_set_tunnel")
 int _gre_set_tunnel(struct __sk_buff *skb)
 {
@@ -156,13 +143,15 @@ int _erspan_set_tunnel(struct __sk_buff *skb)
        __builtin_memset(&md, 0, sizeof(md));
 #ifdef ERSPAN_V1
        md.version = 1;
-       md.u.index = htonl(123);
+       md.u.index = bpf_htonl(123);
 #else
        u8 direction = 1;
-       u16 hwid = 7;
+       u8 hwid = 7;
 
        md.version = 2;
-       md.u.md2.flags = htons((direction << 3) | (hwid << 4));
+       md.u.md2.dir = direction;
+       md.u.md2.hwid = hwid & 0xf;
+       md.u.md2.hwid_upper = (hwid >> 4) & 0x3;
 #endif
 
        ret = bpf_skb_set_tunnel_opt(skb, &md, sizeof(md));
@@ -207,9 +196,9 @@ int _erspan_get_tunnel(struct __sk_buff *skb)
        char fmt2[] = "\tdirection %d hwid %x timestamp %u\n";
 
        bpf_trace_printk(fmt2, sizeof(fmt2),
-               (ntohs(md.u.md2.flags) >> 3) & 0x1,
-               (ntohs(md.u.md2.flags) >> 4) & 0x3f,
-               bpf_ntohl(md.u.md2.timestamp));
+                        md.u.md2.dir,
+                        (md.u.md2.hwid_upper << 4) + md.u.md2.hwid,
+                        bpf_ntohl(md.u.md2.timestamp));
 #endif
 
        return TC_ACT_OK;
@@ -242,10 +231,12 @@ int _ip4ip6erspan_set_tunnel(struct __sk_buff *skb)
        md.version = 1;
 #else
        u8 direction = 0;
-       u16 hwid = 17;
+       u8 hwid = 17;
 
        md.version = 2;
-       md.u.md2.flags = htons((direction << 3) | (hwid << 4));
+       md.u.md2.dir = direction;
+       md.u.md2.hwid = hwid & 0xf;
+       md.u.md2.hwid_upper = (hwid >> 4) & 0x3;
 #endif
 
        ret = bpf_skb_set_tunnel_opt(skb, &md, sizeof(md));
@@ -290,9 +281,9 @@ int _ip4ip6erspan_get_tunnel(struct __sk_buff *skb)
        char fmt2[] = "\tdirection %d hwid %x timestamp %u\n";
 
        bpf_trace_printk(fmt2, sizeof(fmt2),
-               (ntohs(md.u.md2.flags) >> 3) & 0x1,
-               (ntohs(md.u.md2.flags) >> 4) & 0x3f,
-               bpf_ntohl(md.u.md2.timestamp));
+                        md.u.md2.dir,
+                        (md.u.md2.hwid_upper << 4) + md.u.md2.hwid,
+                        bpf_ntohl(md.u.md2.timestamp));
 #endif
 
        return TC_ACT_OK;
index ae7f7c38309b8c35d9fb107bfd8c4307d9fc733c..43ce049996eeb5b4d81394705861a3f11715d3b4 100755 (executable)
@@ -68,7 +68,7 @@ function add_erspan_tunnel {
                ip netns exec at_ns0 \
                ip link add dev $DEV_NS type $TYPE seq key 2 \
                local 172.16.1.100 remote 172.16.1.200 \
-               erspan_ver 2 erspan_dir 1 erspan_hwid 3
+               erspan_ver 2 erspan_dir egress erspan_hwid 3
        fi
        ip netns exec at_ns0 ip link set dev $DEV_NS up
        ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24
@@ -97,7 +97,7 @@ function add_ip6erspan_tunnel {
                ip netns exec at_ns0 \
                ip link add dev $DEV_NS type $TYPE seq key 2 \
                local ::11 remote ::22 \
-               erspan_ver 2 erspan_dir 1 erspan_hwid 7
+               erspan_ver 2 erspan_dir egress erspan_hwid 7
        fi
        ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24
        ip netns exec at_ns0 ip link set dev $DEV_NS up