samples/bpf: add ip6erspan sample code
authorWilliam Tu <u9012063@gmail.com>
Tue, 5 Dec 2017 23:15:45 +0000 (15:15 -0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 6 Dec 2017 19:45:29 +0000 (14:45 -0500)
Extend the existing tests for ip6erspan.

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 15a469220e198734d80830d3824a9146e817a0bc..79ad061079dd28c58257b158cde9414ec78764ca 100644 (file)
@@ -181,6 +181,64 @@ int _erspan_get_tunnel(struct __sk_buff *skb)
        return TC_ACT_OK;
 }
 
+SEC("ip4ip6erspan_set_tunnel")
+int _ip4ip6erspan_set_tunnel(struct __sk_buff *skb)
+{
+       struct bpf_tunnel_key key;
+       struct erspan_metadata md;
+       int ret;
+
+       __builtin_memset(&key, 0x0, sizeof(key));
+       key.remote_ipv6[3] = _htonl(0x11);
+       key.tunnel_id = 2;
+       key.tunnel_tos = 0;
+       key.tunnel_ttl = 64;
+
+       ret = bpf_skb_set_tunnel_key(skb, &key, sizeof(key),
+                                    BPF_F_TUNINFO_IPV6);
+       if (ret < 0) {
+               ERROR(ret);
+               return TC_ACT_SHOT;
+       }
+
+       md.index = htonl(123);
+       ret = bpf_skb_set_tunnel_opt(skb, &md, sizeof(md));
+       if (ret < 0) {
+               ERROR(ret);
+               return TC_ACT_SHOT;
+       }
+
+       return TC_ACT_OK;
+}
+
+SEC("ip4ip6erspan_get_tunnel")
+int _ip4ip6erspan_get_tunnel(struct __sk_buff *skb)
+{
+       char fmt[] = "key %d remote ip6 ::%x erspan index 0x%x\n";
+       struct bpf_tunnel_key key;
+       struct erspan_metadata md;
+       u32 index;
+       int ret;
+
+       ret = bpf_skb_get_tunnel_key(skb, &key, sizeof(key), BPF_F_TUNINFO_IPV6);
+       if (ret < 0) {
+               ERROR(ret);
+               return TC_ACT_SHOT;
+       }
+
+       ret = bpf_skb_get_tunnel_opt(skb, &md, sizeof(md));
+       if (ret < 0) {
+               ERROR(ret);
+               return TC_ACT_SHOT;
+       }
+
+       index = bpf_ntohl(md.index);
+       bpf_trace_printk(fmt, sizeof(fmt),
+                       key.tunnel_id, key.remote_ipv6[0], index);
+
+       return TC_ACT_OK;
+}
+
 SEC("vxlan_set_tunnel")
 int _vxlan_set_tunnel(struct __sk_buff *skb)
 {
index 226f45381b7690acfb16a3fc3d662f710cc5e436..f53efb62f699be9124c552305204d0f55344328a 100755 (executable)
@@ -70,6 +70,28 @@ function add_erspan_tunnel {
        ip addr add dev $DEV 10.1.1.200/24
 }
 
+function add_ip6erspan_tunnel {
+
+       # assign ipv6 address
+       ip netns exec at_ns0 ip addr add ::11/96 dev veth0
+       ip netns exec at_ns0 ip link set dev veth0 up
+       ip addr add dev veth1 ::22/96
+       ip link set dev veth1 up
+
+       # in namespace
+       ip netns exec at_ns0 \
+               ip link add dev $DEV_NS type $TYPE seq key 2 erspan 123 \
+               local ::11 remote ::22
+
+       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
+
+       # out of namespace
+       ip link add dev $DEV type $TYPE external
+       ip addr add dev $DEV 10.1.1.200/24
+       ip link set dev $DEV up
+}
+
 function add_vxlan_tunnel {
        # Set static ARP entry here because iptables set-mark works
        # on L3 packet, as a result not applying to ARP packets,
@@ -184,6 +206,18 @@ function test_erspan {
        cleanup
 }
 
+function test_ip6erspan {
+       TYPE=ip6erspan
+       DEV_NS=ip6erspan00
+       DEV=ip6erspan11
+       config_device
+       add_ip6erspan_tunnel
+       attach_bpf $DEV ip4ip6erspan_set_tunnel ip4ip6erspan_get_tunnel
+       ping6 -c 3 ::11
+       ip netns exec at_ns0 ping -c 1 10.1.1.200
+       cleanup
+}
+
 function test_vxlan {
        TYPE=vxlan
        DEV_NS=vxlan00
@@ -239,6 +273,7 @@ function cleanup {
        ip link del vxlan11
        ip link del geneve11
        ip link del erspan11
+       ip link del ip6erspan11
        pkill tcpdump
        pkill cat
        set -ex
@@ -254,6 +289,8 @@ echo "Testing IP6GRETAP tunnel..."
 test_ip6gretap
 echo "Testing ERSPAN tunnel..."
 test_erspan
+echo "Testing IP6ERSPAN tunnel..."
+test_ip6erspan
 echo "Testing VXLAN tunnel..."
 test_vxlan
 echo "Testing GENEVE tunnel..."