On 3/22/22 8:42 AM, fankaixi.li@xxxxxxxxxxxxx wrote:
From: "kaixi.fan" <fankaixi.li@xxxxxxxxxxxxx>
Add two ipv6 address on underlay nic interface, and use bpf code to
configure the secondary ipv6 address as the vxlan tunnel source ip.
Then check ping6 result and log contains the correct tunnel source
ip.
Signed-off-by: kaixi.fan <fankaixi.li@xxxxxxxxxxxxx>
Similar here, proper name in Signed-off-by tag.
---
.../selftests/bpf/progs/test_tunnel_kern.c | 51 +++++++++++++++++++
tools/testing/selftests/bpf/test_tunnel.sh | 43 ++++++++++++++--
2 files changed, 90 insertions(+), 4 deletions(-)
diff --git a/tools/testing/selftests/bpf/progs/test_tunnel_kern.c b/tools/testing/selftests/bpf/progs/test_tunnel_kern.c
index ab635c55ae9b..56e1aee0ba5a 100644
--- a/tools/testing/selftests/bpf/progs/test_tunnel_kern.c
+++ b/tools/testing/selftests/bpf/progs/test_tunnel_kern.c
@@ -740,4 +740,55 @@ int _vxlan_get_tunnel_src(struct __sk_buff *skb)
return TC_ACT_OK;
}
+SEC("ip6vxlan_set_tunnel_src")
+int _ip6vxlan_set_tunnel_src(struct __sk_buff *skb)
+{
+ struct bpf_tunnel_key key;
+ int ret;
+
+ __builtin_memset(&key, 0x0, sizeof(key));
+ key.local_ipv6[3] = bpf_htonl(0xbb); /* ::bb */
+ key.remote_ipv6[3] = bpf_htonl(0x11); /* ::11 */
+ key.tunnel_id = 22;
+ 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;
+ }
+
+ return TC_ACT_OK;
+}
+
+SEC("ip6vxlan_get_tunnel_src")
+int _ip6vxlan_get_tunnel_src(struct __sk_buff *skb)
+{
+ char fmt[] = "key %d remote ip6 ::%x source ip6 ::%x\n";
+ char fmt2[] = "label %x\n";
+ struct bpf_tunnel_key key;
+ 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;
+ }
+
+ bpf_trace_printk(fmt, sizeof(fmt),
+ key.tunnel_id, key.remote_ipv6[3], key.local_ipv6[3]);
+ bpf_trace_printk(fmt2, sizeof(fmt2),
+ key.tunnel_label);
using bpf_printk().
+
+ if (bpf_ntohl(key.local_ipv6[3]) != 0xbb) {
+ ERROR(ret);
+ return TC_ACT_SHOT;
+ }
abstract 0xbb as a macro?
+
+ return TC_ACT_OK;
+}
+
[...]