@@ -1798,7 +1798,7 @@ static int vxlan_build_skb(struct sk_buff *skb, struct dst_entry *dst,
1798
1798
static struct rtable * vxlan_get_route (struct vxlan_dev * vxlan , struct net_device * dev ,
1799
1799
struct vxlan_sock * sock4 ,
1800
1800
struct sk_buff * skb , int oif , u8 tos ,
1801
- __be32 daddr , __be32 * saddr ,
1801
+ __be32 daddr , __be32 * saddr , __be16 dport , __be16 sport ,
1802
1802
struct dst_cache * dst_cache ,
1803
1803
const struct ip_tunnel_info * info )
1804
1804
{
@@ -1824,6 +1824,8 @@ static struct rtable *vxlan_get_route(struct vxlan_dev *vxlan, struct net_device
1824
1824
fl4 .flowi4_proto = IPPROTO_UDP ;
1825
1825
fl4 .daddr = daddr ;
1826
1826
fl4 .saddr = * saddr ;
1827
+ fl4 .fl4_dport = dport ;
1828
+ fl4 .fl4_sport = sport ;
1827
1829
1828
1830
rt = ip_route_output_key (vxlan -> net , & fl4 );
1829
1831
if (likely (!IS_ERR (rt ))) {
@@ -1851,6 +1853,7 @@ static struct dst_entry *vxlan6_get_route(struct vxlan_dev *vxlan,
1851
1853
__be32 label ,
1852
1854
const struct in6_addr * daddr ,
1853
1855
struct in6_addr * saddr ,
1856
+ __be16 dport , __be16 sport ,
1854
1857
struct dst_cache * dst_cache ,
1855
1858
const struct ip_tunnel_info * info )
1856
1859
{
@@ -1877,6 +1880,8 @@ static struct dst_entry *vxlan6_get_route(struct vxlan_dev *vxlan,
1877
1880
fl6 .flowlabel = ip6_make_flowinfo (RT_TOS (tos ), label );
1878
1881
fl6 .flowi6_mark = skb -> mark ;
1879
1882
fl6 .flowi6_proto = IPPROTO_UDP ;
1883
+ fl6 .fl6_dport = dport ;
1884
+ fl6 .fl6_sport = sport ;
1880
1885
1881
1886
err = ipv6_stub -> ipv6_dst_lookup (vxlan -> net ,
1882
1887
sock6 -> sock -> sk ,
@@ -2068,6 +2073,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
2068
2073
rdst ? rdst -> remote_ifindex : 0 , tos ,
2069
2074
dst -> sin .sin_addr .s_addr ,
2070
2075
& src -> sin .sin_addr .s_addr ,
2076
+ dst_port , src_port ,
2071
2077
dst_cache , info );
2072
2078
if (IS_ERR (rt )) {
2073
2079
err = PTR_ERR (rt );
@@ -2104,6 +2110,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
2104
2110
rdst ? rdst -> remote_ifindex : 0 , tos ,
2105
2111
label , & dst -> sin6 .sin6_addr ,
2106
2112
& src -> sin6 .sin6_addr ,
2113
+ dst_port , src_port ,
2107
2114
dst_cache , info );
2108
2115
if (IS_ERR (ndst )) {
2109
2116
err = PTR_ERR (ndst );
@@ -2430,7 +2437,7 @@ static int vxlan_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb)
2430
2437
2431
2438
rt = vxlan_get_route (vxlan , dev , sock4 , skb , 0 , info -> key .tos ,
2432
2439
info -> key .u .ipv4 .dst ,
2433
- & info -> key .u .ipv4 .src , NULL , info );
2440
+ & info -> key .u .ipv4 .src , dport , sport , NULL , info );
2434
2441
if (IS_ERR (rt ))
2435
2442
return PTR_ERR (rt );
2436
2443
ip_rt_put (rt );
@@ -2441,7 +2448,7 @@ static int vxlan_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb)
2441
2448
2442
2449
ndst = vxlan6_get_route (vxlan , dev , sock6 , skb , 0 , info -> key .tos ,
2443
2450
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 );
2445
2452
if (IS_ERR (ndst ))
2446
2453
return PTR_ERR (ndst );
2447
2454
dst_release (ndst );
0 commit comments