c50e96099e
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>
23 lines
578 B
C
23 lines
578 B
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __NET_FOU_H
|
|
#define __NET_FOU_H
|
|
|
|
#include <linux/skbuff.h>
|
|
|
|
#include <net/flow.h>
|
|
#include <net/gue.h>
|
|
#include <net/ip_tunnels.h>
|
|
#include <net/udp.h>
|
|
|
|
size_t fou_encap_hlen(struct ip_tunnel_encap *e);
|
|
size_t gue_encap_hlen(struct ip_tunnel_encap *e);
|
|
|
|
int __fou_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
|
|
u8 *protocol, __be16 *sport, int type);
|
|
int __gue_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
|
|
u8 *protocol, __be16 *sport, int type);
|
|
|
|
int register_fou_bpf(void);
|
|
|
|
#endif
|