]> git.baikalelectronics.ru Git - kernel.git/commitdiff
vxlan: Use ip_tunnel_key flow flags in route lookups
authorPaul Chaignon <paul@isovalent.com>
Mon, 25 Jul 2022 14:31:58 +0000 (16:31 +0200)
committerDaniel Borkmann <daniel@iogearbox.net>
Tue, 26 Jul 2022 10:43:16 +0000 (12:43 +0200)
Use the new ip_tunnel_key field with the flow flags in the IPv4 route
lookups for the encapsulated packet. This will be used by the
bpf_skb_set_tunnel_key helper in a subsequent commit.

Signed-off-by: Paul Chaignon <paul@isovalent.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Reviewed-by: Nikolay Aleksandrov <razor@blackwall.org>
Acked-by: Martin KaFai Lau <kafai@fb.com>
Link: https://lore.kernel.org/bpf/1ffc95c3d60182fd5ec0cf6602083f8f68afe98f.1658759380.git.paul@isovalent.com
drivers/net/vxlan/vxlan_core.c

index 8b0710b576c2109c135e86515ded416360383535..90811ab851fd8bddead016764d05e01d60a76054 100644 (file)
@@ -2243,7 +2243,7 @@ static struct rtable *vxlan_get_route(struct vxlan_dev *vxlan, struct net_device
                                      struct vxlan_sock *sock4,
                                      struct sk_buff *skb, int oif, u8 tos,
                                      __be32 daddr, __be32 *saddr, __be16 dport, __be16 sport,
-                                     struct dst_cache *dst_cache,
+                                     __u8 flow_flags, struct dst_cache *dst_cache,
                                      const struct ip_tunnel_info *info)
 {
        bool use_cache = ip_tunnel_dst_cache_usable(skb, info);
@@ -2270,6 +2270,7 @@ static struct rtable *vxlan_get_route(struct vxlan_dev *vxlan, struct net_device
        fl4.saddr = *saddr;
        fl4.fl4_dport = dport;
        fl4.fl4_sport = sport;
+       fl4.flowi4_flags = flow_flags;
 
        rt = ip_route_output_key(vxlan->net, &fl4);
        if (!IS_ERR(rt)) {
@@ -2459,7 +2460,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
        unsigned int pkt_len = skb->len;
        __be16 src_port = 0, dst_port;
        struct dst_entry *ndst = NULL;
-       __u8 tos, ttl;
+       __u8 tos, ttl, flow_flags = 0;
        int ifindex;
        int err;
        u32 flags = vxlan->cfg.flags;
@@ -2525,6 +2526,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
                }
                dst = &remote_ip;
                dst_port = info->key.tp_dst ? : vxlan->cfg.dst_port;
+               flow_flags = info->key.flow_flags;
                vni = tunnel_id_to_key32(info->key.tun_id);
                ifindex = 0;
                dst_cache = &info->dst_cache;
@@ -2555,7 +2557,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
                rt = vxlan_get_route(vxlan, dev, sock4, skb, ifindex, tos,
                                     dst->sin.sin_addr.s_addr,
                                     &local_ip.sin.sin_addr.s_addr,
-                                    dst_port, src_port,
+                                    dst_port, src_port, flow_flags,
                                     dst_cache, info);
                if (IS_ERR(rt)) {
                        err = PTR_ERR(rt);
@@ -3061,7 +3063,8 @@ static int vxlan_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb)
                rt = vxlan_get_route(vxlan, dev, sock4, skb, 0, info->key.tos,
                                     info->key.u.ipv4.dst,
                                     &info->key.u.ipv4.src, dport, sport,
-                                    &info->dst_cache, info);
+                                    info->key.flow_flags, &info->dst_cache,
+                                    info);
                if (IS_ERR(rt))
                        return PTR_ERR(rt);
                ip_rt_put(rt);