@@ -1811,7 +1811,7 @@ static struct rtable *vxlan_get_route(struct vxlan_dev *vxlan,
1811
1811
fl4 .flowi4_mark = skb -> mark ;
1812
1812
fl4 .flowi4_proto = IPPROTO_UDP ;
1813
1813
fl4 .daddr = daddr ;
1814
- fl4 .saddr = vxlan -> cfg . saddr . sin . sin_addr . s_addr ;
1814
+ fl4 .saddr = * saddr ;
1815
1815
1816
1816
rt = ip_route_output_key (vxlan -> net , & fl4 );
1817
1817
if (!IS_ERR (rt )) {
@@ -1847,7 +1847,7 @@ static struct dst_entry *vxlan6_get_route(struct vxlan_dev *vxlan,
1847
1847
memset (& fl6 , 0 , sizeof (fl6 ));
1848
1848
fl6 .flowi6_oif = oif ;
1849
1849
fl6 .daddr = * daddr ;
1850
- fl6 .saddr = vxlan -> cfg . saddr . sin6 . sin6_addr ;
1850
+ fl6 .saddr = * saddr ;
1851
1851
fl6 .flowlabel = ip6_make_flowinfo (RT_TOS (tos ), label );
1852
1852
fl6 .flowi6_mark = skb -> mark ;
1853
1853
fl6 .flowi6_proto = IPPROTO_UDP ;
@@ -1920,7 +1920,8 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
1920
1920
struct rtable * rt = NULL ;
1921
1921
const struct iphdr * old_iph ;
1922
1922
union vxlan_addr * dst ;
1923
- union vxlan_addr remote_ip ;
1923
+ union vxlan_addr remote_ip , local_ip ;
1924
+ union vxlan_addr * src ;
1924
1925
struct vxlan_metadata _md ;
1925
1926
struct vxlan_metadata * md = & _md ;
1926
1927
__be16 src_port = 0 , dst_port ;
@@ -1938,6 +1939,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
1938
1939
dst_port = rdst -> remote_port ? rdst -> remote_port : vxlan -> cfg .dst_port ;
1939
1940
vni = rdst -> remote_vni ;
1940
1941
dst = & rdst -> remote_ip ;
1942
+ src = & vxlan -> cfg .saddr ;
1941
1943
dst_cache = & rdst -> dst_cache ;
1942
1944
} else {
1943
1945
if (!info ) {
@@ -1948,11 +1950,15 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
1948
1950
dst_port = info -> key .tp_dst ? : vxlan -> cfg .dst_port ;
1949
1951
vni = vxlan_tun_id_to_vni (info -> key .tun_id );
1950
1952
remote_ip .sa .sa_family = ip_tunnel_info_af (info );
1951
- if (remote_ip .sa .sa_family == AF_INET )
1953
+ if (remote_ip .sa .sa_family == AF_INET ) {
1952
1954
remote_ip .sin .sin_addr .s_addr = info -> key .u .ipv4 .dst ;
1953
- else
1955
+ local_ip .sin .sin_addr .s_addr = info -> key .u .ipv4 .src ;
1956
+ } else {
1954
1957
remote_ip .sin6 .sin6_addr = info -> key .u .ipv6 .dst ;
1958
+ local_ip .sin6 .sin6_addr = info -> key .u .ipv6 .src ;
1959
+ }
1955
1960
dst = & remote_ip ;
1961
+ src = & local_ip ;
1956
1962
dst_cache = & info -> dst_cache ;
1957
1963
}
1958
1964
@@ -1992,15 +1998,14 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
1992
1998
}
1993
1999
1994
2000
if (dst -> sa .sa_family == AF_INET ) {
1995
- __be32 saddr ;
1996
-
1997
2001
if (!vxlan -> vn4_sock )
1998
2002
goto drop ;
1999
2003
sk = vxlan -> vn4_sock -> sock -> sk ;
2000
2004
2001
2005
rt = vxlan_get_route (vxlan , skb ,
2002
2006
rdst ? rdst -> remote_ifindex : 0 , tos ,
2003
- dst -> sin .sin_addr .s_addr , & saddr ,
2007
+ dst -> sin .sin_addr .s_addr ,
2008
+ & src -> sin .sin_addr .s_addr ,
2004
2009
dst_cache , info );
2005
2010
if (IS_ERR (rt )) {
2006
2011
netdev_dbg (dev , "no route to %pI4\n" ,
@@ -2043,13 +2048,12 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
2043
2048
if (err < 0 )
2044
2049
goto xmit_tx_error ;
2045
2050
2046
- udp_tunnel_xmit_skb (rt , sk , skb , saddr ,
2051
+ udp_tunnel_xmit_skb (rt , sk , skb , src -> sin . sin_addr . s_addr ,
2047
2052
dst -> sin .sin_addr .s_addr , tos , ttl , df ,
2048
2053
src_port , dst_port , xnet , !udp_sum );
2049
2054
#if IS_ENABLED (CONFIG_IPV6 )
2050
2055
} else {
2051
2056
struct dst_entry * ndst ;
2052
- struct in6_addr saddr ;
2053
2057
u32 rt6i_flags ;
2054
2058
2055
2059
if (!vxlan -> vn6_sock )
@@ -2058,7 +2062,8 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
2058
2062
2059
2063
ndst = vxlan6_get_route (vxlan , skb ,
2060
2064
rdst ? rdst -> remote_ifindex : 0 , tos ,
2061
- label , & dst -> sin6 .sin6_addr , & saddr ,
2065
+ label , & dst -> sin6 .sin6_addr ,
2066
+ & src -> sin6 .sin6_addr ,
2062
2067
dst_cache , info );
2063
2068
if (IS_ERR (ndst )) {
2064
2069
netdev_dbg (dev , "no route to %pI6\n" ,
@@ -2104,7 +2109,8 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
2104
2109
return ;
2105
2110
}
2106
2111
udp_tunnel6_xmit_skb (ndst , sk , skb , dev ,
2107
- & saddr , & dst -> sin6 .sin6_addr , tos , ttl ,
2112
+ & src -> sin6 .sin6_addr ,
2113
+ & dst -> sin6 .sin6_addr , tos , ttl ,
2108
2114
label , src_port , dst_port , !udp_sum );
2109
2115
#endif
2110
2116
}
0 commit comments