2015-07-21 16:43:56 +08:00
|
|
|
#ifndef __NET_DST_METADATA_H
|
|
|
|
#define __NET_DST_METADATA_H 1
|
|
|
|
|
|
|
|
#include <linux/skbuff.h>
|
|
|
|
#include <net/ip_tunnels.h>
|
|
|
|
#include <net/dst.h>
|
|
|
|
|
|
|
|
struct metadata_dst {
|
|
|
|
struct dst_entry dst;
|
|
|
|
size_t opts_len;
|
2015-07-21 16:43:58 +08:00
|
|
|
union {
|
|
|
|
struct ip_tunnel_info tun_info;
|
|
|
|
} u;
|
2015-07-21 16:43:56 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
static inline struct metadata_dst *skb_metadata_dst(struct sk_buff *skb)
|
|
|
|
{
|
|
|
|
struct metadata_dst *md_dst = (struct metadata_dst *) skb_dst(skb);
|
|
|
|
|
|
|
|
if (md_dst && md_dst->dst.flags & DST_METADATA)
|
|
|
|
return md_dst;
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2015-07-21 16:44:00 +08:00
|
|
|
static inline struct ip_tunnel_info *skb_tunnel_info(struct sk_buff *skb,
|
|
|
|
int family)
|
2015-07-21 16:43:58 +08:00
|
|
|
{
|
|
|
|
struct metadata_dst *md_dst = skb_metadata_dst(skb);
|
2015-07-21 16:44:00 +08:00
|
|
|
struct rtable *rt;
|
2015-07-21 16:43:58 +08:00
|
|
|
|
|
|
|
if (md_dst)
|
|
|
|
return &md_dst->u.tun_info;
|
|
|
|
|
2015-07-21 16:44:00 +08:00
|
|
|
switch (family) {
|
|
|
|
case AF_INET:
|
|
|
|
rt = (struct rtable *)skb_dst(skb);
|
|
|
|
if (rt && rt->rt_lwtstate)
|
|
|
|
return lwt_tun_info(rt->rt_lwtstate);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2015-07-21 16:43:58 +08:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2015-07-21 16:43:56 +08:00
|
|
|
static inline bool skb_valid_dst(const struct sk_buff *skb)
|
|
|
|
{
|
|
|
|
struct dst_entry *dst = skb_dst(skb);
|
|
|
|
|
|
|
|
return dst && !(dst->flags & DST_METADATA);
|
|
|
|
}
|
|
|
|
|
|
|
|
struct metadata_dst *metadata_dst_alloc(u8 optslen, gfp_t flags);
|
bpf: add helpers to access tunnel metadata
Introduce helpers to let eBPF programs attached to TC manipulate tunnel metadata:
bpf_skb_[gs]et_tunnel_key(skb, key, size, flags)
skb: pointer to skb
key: pointer to 'struct bpf_tunnel_key'
size: size of 'struct bpf_tunnel_key'
flags: room for future extensions
First eBPF program that uses these helpers will allocate per_cpu
metadata_dst structures that will be used on TX.
On RX metadata_dst is allocated by tunnel driver.
Typical usage for TX:
struct bpf_tunnel_key tkey;
... populate tkey ...
bpf_skb_set_tunnel_key(skb, &tkey, sizeof(tkey), 0);
bpf_clone_redirect(skb, vxlan_dev_ifindex, 0);
RX:
struct bpf_tunnel_key tkey = {};
bpf_skb_get_tunnel_key(skb, &tkey, sizeof(tkey), 0);
... lookup or redirect based on tkey ...
'struct bpf_tunnel_key' will be extended in the future by adding
elements to the end and the 'size' argument will indicate which fields
are populated, thereby keeping backwards compatibility.
The 'flags' argument may be used as well when the 'size' is not enough or
to indicate completely different layout of bpf_tunnel_key.
Signed-off-by: Alexei Starovoitov <ast@plumgrid.com>
Acked-by: Thomas Graf <tgraf@suug.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
2015-07-31 06:36:57 +08:00
|
|
|
struct metadata_dst __percpu *metadata_dst_alloc_percpu(u8 optslen, gfp_t flags);
|
2015-07-21 16:43:56 +08:00
|
|
|
|
|
|
|
#endif /* __NET_DST_METADATA_H */
|