Skip to content

Commit 4ecb1d8

Browse files
Martynas Pumputisdavem330
authored andcommitted
vxlan: Set ports in flow key when doing route lookups
Otherwise, a xfrm policy with sport/dport being set cannot be matched. Signed-off-by: Martynas Pumputis <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 19c0f40 commit 4ecb1d8

File tree

1 file changed

+10
-3
lines changed

1 file changed

+10
-3
lines changed

drivers/net/vxlan.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1798,7 +1798,7 @@ static int vxlan_build_skb(struct sk_buff *skb, struct dst_entry *dst,
17981798
static struct rtable *vxlan_get_route(struct vxlan_dev *vxlan, struct net_device *dev,
17991799
struct vxlan_sock *sock4,
18001800
struct sk_buff *skb, int oif, u8 tos,
1801-
__be32 daddr, __be32 *saddr,
1801+
__be32 daddr, __be32 *saddr, __be16 dport, __be16 sport,
18021802
struct dst_cache *dst_cache,
18031803
const struct ip_tunnel_info *info)
18041804
{
@@ -1824,6 +1824,8 @@ static struct rtable *vxlan_get_route(struct vxlan_dev *vxlan, struct net_device
18241824
fl4.flowi4_proto = IPPROTO_UDP;
18251825
fl4.daddr = daddr;
18261826
fl4.saddr = *saddr;
1827+
fl4.fl4_dport = dport;
1828+
fl4.fl4_sport = sport;
18271829

18281830
rt = ip_route_output_key(vxlan->net, &fl4);
18291831
if (likely(!IS_ERR(rt))) {
@@ -1851,6 +1853,7 @@ static struct dst_entry *vxlan6_get_route(struct vxlan_dev *vxlan,
18511853
__be32 label,
18521854
const struct in6_addr *daddr,
18531855
struct in6_addr *saddr,
1856+
__be16 dport, __be16 sport,
18541857
struct dst_cache *dst_cache,
18551858
const struct ip_tunnel_info *info)
18561859
{
@@ -1877,6 +1880,8 @@ static struct dst_entry *vxlan6_get_route(struct vxlan_dev *vxlan,
18771880
fl6.flowlabel = ip6_make_flowinfo(RT_TOS(tos), label);
18781881
fl6.flowi6_mark = skb->mark;
18791882
fl6.flowi6_proto = IPPROTO_UDP;
1883+
fl6.fl6_dport = dport;
1884+
fl6.fl6_sport = sport;
18801885

18811886
err = ipv6_stub->ipv6_dst_lookup(vxlan->net,
18821887
sock6->sock->sk,
@@ -2068,6 +2073,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
20682073
rdst ? rdst->remote_ifindex : 0, tos,
20692074
dst->sin.sin_addr.s_addr,
20702075
&src->sin.sin_addr.s_addr,
2076+
dst_port, src_port,
20712077
dst_cache, info);
20722078
if (IS_ERR(rt)) {
20732079
err = PTR_ERR(rt);
@@ -2104,6 +2110,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
21042110
rdst ? rdst->remote_ifindex : 0, tos,
21052111
label, &dst->sin6.sin6_addr,
21062112
&src->sin6.sin6_addr,
2113+
dst_port, src_port,
21072114
dst_cache, info);
21082115
if (IS_ERR(ndst)) {
21092116
err = PTR_ERR(ndst);
@@ -2430,7 +2437,7 @@ static int vxlan_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb)
24302437

24312438
rt = vxlan_get_route(vxlan, dev, sock4, skb, 0, info->key.tos,
24322439
info->key.u.ipv4.dst,
2433-
&info->key.u.ipv4.src, NULL, info);
2440+
&info->key.u.ipv4.src, dport, sport, NULL, info);
24342441
if (IS_ERR(rt))
24352442
return PTR_ERR(rt);
24362443
ip_rt_put(rt);
@@ -2441,7 +2448,7 @@ static int vxlan_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb)
24412448

24422449
ndst = vxlan6_get_route(vxlan, dev, sock6, skb, 0, info->key.tos,
24432450
info->key.label, &info->key.u.ipv6.dst,
2444-
&info->key.u.ipv6.src, NULL, info);
2451+
&info->key.u.ipv6.src, dport, sport, NULL, info);
24452452
if (IS_ERR(ndst))
24462453
return PTR_ERR(ndst);
24472454
dst_release(ndst);

0 commit comments

Comments
 (0)