mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-17 00:26:58 +07:00
Merge branch 'gre-seq-collect_md'
William Tu says: ==================== gre: add sequence number for collect md mode. Currently GRE sequence number can only be used in native tunnel mode. The first patch adds sequence number support for gre collect metadata mode, and the second patch tests it using BPF. RFC2890 defines GRE sequence number to be specific to the traffic flow identified by the key. However, this patch does not implement per-key seqno. The sequence number is shared in the same tunnel device. That is, different tunnel keys using the same collect_md tunnel share single sequence number. A new BFP uapi tunnel flag 'BPF_F_SEQ_NUMBER' is added. -- v1->v2: rename BPF_F_GRE_SEQ to BPF_F_SEQ_NUMBER suggested by Daniel ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
faa083bbe3
@ -800,6 +800,7 @@ enum bpf_func_id {
|
||||
/* BPF_FUNC_skb_set_tunnel_key flags. */
|
||||
#define BPF_F_ZERO_CSUM_TX (1ULL << 1)
|
||||
#define BPF_F_DONT_FRAGMENT (1ULL << 2)
|
||||
#define BPF_F_SEQ_NUMBER (1ULL << 3)
|
||||
|
||||
/* BPF_FUNC_perf_event_output, BPF_FUNC_perf_event_read and
|
||||
* BPF_FUNC_perf_event_read_value flags.
|
||||
|
@ -2991,7 +2991,7 @@ BPF_CALL_4(bpf_skb_set_tunnel_key, struct sk_buff *, skb,
|
||||
struct ip_tunnel_info *info;
|
||||
|
||||
if (unlikely(flags & ~(BPF_F_TUNINFO_IPV6 | BPF_F_ZERO_CSUM_TX |
|
||||
BPF_F_DONT_FRAGMENT)))
|
||||
BPF_F_DONT_FRAGMENT | BPF_F_SEQ_NUMBER)))
|
||||
return -EINVAL;
|
||||
if (unlikely(size != sizeof(struct bpf_tunnel_key))) {
|
||||
switch (size) {
|
||||
@ -3025,6 +3025,8 @@ BPF_CALL_4(bpf_skb_set_tunnel_key, struct sk_buff *, skb,
|
||||
info->key.tun_flags |= TUNNEL_DONT_FRAGMENT;
|
||||
if (flags & BPF_F_ZERO_CSUM_TX)
|
||||
info->key.tun_flags &= ~TUNNEL_CSUM;
|
||||
if (flags & BPF_F_SEQ_NUMBER)
|
||||
info->key.tun_flags |= TUNNEL_SEQ;
|
||||
|
||||
info->key.tun_id = cpu_to_be64(from->tunnel_id);
|
||||
info->key.tos = from->tunnel_tos;
|
||||
|
@ -522,6 +522,7 @@ static struct rtable *prepare_fb_xmit(struct sk_buff *skb,
|
||||
static void gre_fb_xmit(struct sk_buff *skb, struct net_device *dev,
|
||||
__be16 proto)
|
||||
{
|
||||
struct ip_tunnel *tunnel = netdev_priv(dev);
|
||||
struct ip_tunnel_info *tun_info;
|
||||
const struct ip_tunnel_key *key;
|
||||
struct rtable *rt = NULL;
|
||||
@ -545,9 +546,11 @@ static void gre_fb_xmit(struct sk_buff *skb, struct net_device *dev,
|
||||
if (gre_handle_offloads(skb, !!(tun_info->key.tun_flags & TUNNEL_CSUM)))
|
||||
goto err_free_rt;
|
||||
|
||||
flags = tun_info->key.tun_flags & (TUNNEL_CSUM | TUNNEL_KEY);
|
||||
flags = tun_info->key.tun_flags &
|
||||
(TUNNEL_CSUM | TUNNEL_KEY | TUNNEL_SEQ);
|
||||
gre_build_header(skb, tunnel_hlen, flags, proto,
|
||||
tunnel_id_to_key32(tun_info->key.tun_id), 0);
|
||||
tunnel_id_to_key32(tun_info->key.tun_id),
|
||||
(flags | TUNNEL_SEQ) ? htonl(tunnel->o_seqno++) : 0);
|
||||
|
||||
df = key->tun_flags & TUNNEL_DONT_FRAGMENT ? htons(IP_DF) : 0;
|
||||
|
||||
|
@ -695,9 +695,6 @@ static netdev_tx_t __gre6_xmit(struct sk_buff *skb,
|
||||
else
|
||||
fl6->daddr = tunnel->parms.raddr;
|
||||
|
||||
if (tunnel->parms.o_flags & TUNNEL_SEQ)
|
||||
tunnel->o_seqno++;
|
||||
|
||||
/* Push GRE header. */
|
||||
protocol = (dev->type == ARPHRD_ETHER) ? htons(ETH_P_TEB) : proto;
|
||||
|
||||
@ -720,14 +717,20 @@ static netdev_tx_t __gre6_xmit(struct sk_buff *skb,
|
||||
fl6->flowi6_uid = sock_net_uid(dev_net(dev), NULL);
|
||||
|
||||
dsfield = key->tos;
|
||||
flags = key->tun_flags & (TUNNEL_CSUM | TUNNEL_KEY);
|
||||
flags = key->tun_flags &
|
||||
(TUNNEL_CSUM | TUNNEL_KEY | TUNNEL_SEQ);
|
||||
tunnel->tun_hlen = gre_calc_hlen(flags);
|
||||
|
||||
gre_build_header(skb, tunnel->tun_hlen,
|
||||
flags, protocol,
|
||||
tunnel_id_to_key32(tun_info->key.tun_id), 0);
|
||||
tunnel_id_to_key32(tun_info->key.tun_id),
|
||||
(flags | TUNNEL_SEQ) ? htonl(tunnel->o_seqno++)
|
||||
: 0);
|
||||
|
||||
} else {
|
||||
if (tunnel->parms.o_flags & TUNNEL_SEQ)
|
||||
tunnel->o_seqno++;
|
||||
|
||||
gre_build_header(skb, tunnel->tun_hlen, tunnel->parms.o_flags,
|
||||
protocol, tunnel->parms.o_key,
|
||||
htonl(tunnel->o_seqno));
|
||||
|
@ -52,7 +52,8 @@ int _gre_set_tunnel(struct __sk_buff *skb)
|
||||
key.tunnel_tos = 0;
|
||||
key.tunnel_ttl = 64;
|
||||
|
||||
ret = bpf_skb_set_tunnel_key(skb, &key, sizeof(key), BPF_F_ZERO_CSUM_TX);
|
||||
ret = bpf_skb_set_tunnel_key(skb, &key, sizeof(key),
|
||||
BPF_F_ZERO_CSUM_TX | BPF_F_SEQ_NUMBER);
|
||||
if (ret < 0) {
|
||||
ERROR(ret);
|
||||
return TC_ACT_SHOT;
|
||||
@ -92,7 +93,8 @@ int _ip6gretap_set_tunnel(struct __sk_buff *skb)
|
||||
key.tunnel_label = 0xabcde;
|
||||
|
||||
ret = bpf_skb_set_tunnel_key(skb, &key, sizeof(key),
|
||||
BPF_F_TUNINFO_IPV6 | BPF_F_ZERO_CSUM_TX);
|
||||
BPF_F_TUNINFO_IPV6 | BPF_F_ZERO_CSUM_TX |
|
||||
BPF_F_SEQ_NUMBER);
|
||||
if (ret < 0) {
|
||||
ERROR(ret);
|
||||
return TC_ACT_SHOT;
|
||||
|
@ -23,7 +23,8 @@ function config_device {
|
||||
function add_gre_tunnel {
|
||||
# in namespace
|
||||
ip netns exec at_ns0 \
|
||||
ip link add dev $DEV_NS type $TYPE key 2 local 172.16.1.100 remote 172.16.1.200
|
||||
ip link add dev $DEV_NS type $TYPE seq key 2 \
|
||||
local 172.16.1.100 remote 172.16.1.200
|
||||
ip netns exec at_ns0 ip link set dev $DEV_NS up
|
||||
ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24
|
||||
|
||||
@ -43,7 +44,7 @@ function add_ip6gretap_tunnel {
|
||||
|
||||
# in namespace
|
||||
ip netns exec at_ns0 \
|
||||
ip link add dev $DEV_NS type $TYPE flowlabel 0xbcdef key 2 \
|
||||
ip link add dev $DEV_NS type $TYPE seq flowlabel 0xbcdef key 2 \
|
||||
local ::11 remote ::22
|
||||
|
||||
ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24
|
||||
|
Loading…
Reference in New Issue
Block a user