Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9c33ca43 authored by William Tu's avatar William Tu Committed by David S. Miller
Browse files

sample/bpf: fix erspan metadata



The commit c69de58b ("net: erspan: use bitfield instead of
mask and offset") changes the erspan header to use bitfield, and
commit d350a823 ("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: ac80c2a1 ("samples/bpf: add erspan v2 sample code")
Fixes: ef88f89c ("samples/bpf: extend test_tunnel_bpf.sh with ERSPAN")
Signed-off-by: default avatarWilliam Tu <u9012063@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 39f57f67
Loading
Loading
Loading
Loading
+16 −25
Original line number Diff line number Diff line
@@ -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,8 +196,8 @@ 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,
			 md.u.md2.dir,
			 (md.u.md2.hwid_upper << 4) + md.u.md2.hwid,
			 bpf_ntohl(md.u.md2.timestamp));
#endif

@@ -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,8 +281,8 @@ 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,
			 md.u.md2.dir,
			 (md.u.md2.hwid_upper << 4) + md.u.md2.hwid,
			 bpf_ntohl(md.u.md2.timestamp));
#endif

+2 −2
Original line number Diff line number Diff line
@@ -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