summaryrefslogtreecommitdiff
path: root/net/ipv4/fou_core.c
diff options
context:
space:
mode:
authorChristian Ehrig <cehrig@cloudflare.com>2023-04-07 16:38:54 +0300
committerAlexei Starovoitov <ast@kernel.org>2023-04-13 02:40:39 +0300
commitc50e96099edb134bf107fafc02715fbc4aa2277f (patch)
tree4c9aaa19e524055ea4c6e5b6ca6f11ca40fc4bd0 /net/ipv4/fou_core.c
parentac931d4cdec3df8b6eac3bc40a6871123021f078 (diff)
downloadlinux-c50e96099edb134bf107fafc02715fbc4aa2277f.tar.xz
bpf,fou: Add bpf_skb_{set,get}_fou_encap kfuncs
Add two new kfuncs that allow a BPF tc-hook, installed on an ipip device in collect-metadata mode, to control FOU encap parameters on a per-packet level. The set of kfuncs is registered with the fou module. The bpf_skb_set_fou_encap kfunc is supposed to be used in tandem and after a successful call to the bpf_skb_set_tunnel_key bpf-helper. UDP source and destination ports can be controlled by passing a struct bpf_fou_encap. A source port of zero will auto-assign a source port. enum bpf_fou_encap_type is used to specify if the egress path should FOU or GUE encap the packet. On the ingress path bpf_skb_get_fou_encap can be used to read UDP source and destination ports from the receiver's point of view and allows for packet multiplexing across different destination ports within a single BPF program and ipip device. Signed-off-by: Christian Ehrig <cehrig@cloudflare.com> Link: https://lore.kernel.org/r/e17c94a646b63e78ce0dbf3f04b2c33dc948a32d.1680874078.git.cehrig@cloudflare.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Diffstat (limited to 'net/ipv4/fou_core.c')
-rw-r--r--net/ipv4/fou_core.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/net/ipv4/fou_core.c b/net/ipv4/fou_core.c
index cafec9b4eee0..0c41076e31ed 100644
--- a/net/ipv4/fou_core.c
+++ b/net/ipv4/fou_core.c
@@ -1236,10 +1236,15 @@ static int __init fou_init(void)
if (ret < 0)
goto unregister;
+ ret = register_fou_bpf();
+ if (ret < 0)
+ goto kfunc_failed;
+
ret = ip_tunnel_encap_add_fou_ops();
if (ret == 0)
return 0;
+kfunc_failed:
genl_unregister_family(&fou_nl_family);
unregister:
unregister_pernet_device(&fou_net_ops);