@@ -993,19 +993,30 @@ static bool vxlan_snoop(struct net_device *dev,
993
993
static bool vxlan_group_used (struct vxlan_net * vn , struct vxlan_dev * dev )
994
994
{
995
995
struct vxlan_dev * vxlan ;
996
+ unsigned short family = dev -> default_dst .remote_ip .sa .sa_family ;
996
997
997
998
/* The vxlan_sock is only used by dev, leaving group has
998
999
* no effect on other vxlan devices.
999
1000
*/
1000
- if (atomic_read (& dev -> vn_sock -> refcnt ) == 1 )
1001
+ if (family == AF_INET && dev -> vn4_sock &&
1002
+ atomic_read (& dev -> vn4_sock -> refcnt ) == 1 )
1001
1003
return false;
1004
+ #if IS_ENABLED (CONFIG_IPV6 )
1005
+ if (family == AF_INET6 && dev -> vn6_sock &&
1006
+ atomic_read (& dev -> vn6_sock -> refcnt ) == 1 )
1007
+ return false;
1008
+ #endif
1002
1009
1003
1010
list_for_each_entry (vxlan , & vn -> vxlan_list , next ) {
1004
1011
if (!netif_running (vxlan -> dev ) || vxlan == dev )
1005
1012
continue ;
1006
1013
1007
- if (vxlan -> vn_sock != dev -> vn_sock )
1014
+ if (family == AF_INET && vxlan -> vn4_sock != dev -> vn4_sock )
1008
1015
continue ;
1016
+ #if IS_ENABLED (CONFIG_IPV6 )
1017
+ if (family == AF_INET6 && vxlan -> vn6_sock != dev -> vn6_sock )
1018
+ continue ;
1019
+ #endif
1009
1020
1010
1021
if (!vxlan_addr_equal (& vxlan -> default_dst .remote_ip ,
1011
1022
& dev -> default_dst .remote_ip ))
@@ -1021,16 +1032,16 @@ static bool vxlan_group_used(struct vxlan_net *vn, struct vxlan_dev *dev)
1021
1032
return false;
1022
1033
}
1023
1034
1024
- static void vxlan_sock_release (struct vxlan_dev * vxlan )
1035
+ static void __vxlan_sock_release (struct vxlan_sock * vs )
1025
1036
{
1026
- struct vxlan_sock * vs = vxlan -> vn_sock ;
1027
- struct sock * sk = vs -> sock -> sk ;
1028
- struct net * net = sock_net (sk );
1029
- struct vxlan_net * vn = net_generic (net , vxlan_net_id );
1037
+ struct vxlan_net * vn ;
1030
1038
1039
+ if (!vs )
1040
+ return ;
1031
1041
if (!atomic_dec_and_test (& vs -> refcnt ))
1032
1042
return ;
1033
1043
1044
+ vn = net_generic (sock_net (vs -> sock -> sk ), vxlan_net_id );
1034
1045
spin_lock (& vn -> sock_lock );
1035
1046
hlist_del_rcu (& vs -> hlist );
1036
1047
vxlan_notify_del_rx_port (vs );
@@ -1039,60 +1050,74 @@ static void vxlan_sock_release(struct vxlan_dev *vxlan)
1039
1050
queue_work (vxlan_wq , & vs -> del_work );
1040
1051
}
1041
1052
1053
+ static void vxlan_sock_release (struct vxlan_dev * vxlan )
1054
+ {
1055
+ __vxlan_sock_release (vxlan -> vn4_sock );
1056
+ #if IS_ENABLED (CONFIG_IPV6 )
1057
+ __vxlan_sock_release (vxlan -> vn6_sock );
1058
+ #endif
1059
+ }
1060
+
1042
1061
/* Update multicast group membership when first VNI on
1043
1062
* multicast address is brought up
1044
1063
*/
1045
1064
static int vxlan_igmp_join (struct vxlan_dev * vxlan )
1046
1065
{
1047
- struct vxlan_sock * vs = vxlan -> vn_sock ;
1048
- struct sock * sk = vs -> sock -> sk ;
1066
+ struct sock * sk ;
1049
1067
union vxlan_addr * ip = & vxlan -> default_dst .remote_ip ;
1050
1068
int ifindex = vxlan -> default_dst .remote_ifindex ;
1051
1069
int ret = - EINVAL ;
1052
1070
1053
- lock_sock (sk );
1054
1071
if (ip -> sa .sa_family == AF_INET ) {
1055
1072
struct ip_mreqn mreq = {
1056
1073
.imr_multiaddr .s_addr = ip -> sin .sin_addr .s_addr ,
1057
1074
.imr_ifindex = ifindex ,
1058
1075
};
1059
1076
1077
+ sk = vxlan -> vn4_sock -> sock -> sk ;
1078
+ lock_sock (sk );
1060
1079
ret = ip_mc_join_group (sk , & mreq );
1080
+ release_sock (sk );
1061
1081
#if IS_ENABLED (CONFIG_IPV6 )
1062
1082
} else {
1083
+ sk = vxlan -> vn6_sock -> sock -> sk ;
1084
+ lock_sock (sk );
1063
1085
ret = ipv6_stub -> ipv6_sock_mc_join (sk , ifindex ,
1064
1086
& ip -> sin6 .sin6_addr );
1087
+ release_sock (sk );
1065
1088
#endif
1066
1089
}
1067
- release_sock (sk );
1068
1090
1069
1091
return ret ;
1070
1092
}
1071
1093
1072
1094
/* Inverse of vxlan_igmp_join when last VNI is brought down */
1073
1095
static int vxlan_igmp_leave (struct vxlan_dev * vxlan )
1074
1096
{
1075
- struct vxlan_sock * vs = vxlan -> vn_sock ;
1076
- struct sock * sk = vs -> sock -> sk ;
1097
+ struct sock * sk ;
1077
1098
union vxlan_addr * ip = & vxlan -> default_dst .remote_ip ;
1078
1099
int ifindex = vxlan -> default_dst .remote_ifindex ;
1079
1100
int ret = - EINVAL ;
1080
1101
1081
- lock_sock (sk );
1082
1102
if (ip -> sa .sa_family == AF_INET ) {
1083
1103
struct ip_mreqn mreq = {
1084
1104
.imr_multiaddr .s_addr = ip -> sin .sin_addr .s_addr ,
1085
1105
.imr_ifindex = ifindex ,
1086
1106
};
1087
1107
1108
+ sk = vxlan -> vn4_sock -> sock -> sk ;
1109
+ lock_sock (sk );
1088
1110
ret = ip_mc_leave_group (sk , & mreq );
1111
+ release_sock (sk );
1089
1112
#if IS_ENABLED (CONFIG_IPV6 )
1090
1113
} else {
1114
+ sk = vxlan -> vn6_sock -> sock -> sk ;
1115
+ lock_sock (sk );
1091
1116
ret = ipv6_stub -> ipv6_sock_mc_drop (sk , ifindex ,
1092
1117
& ip -> sin6 .sin6_addr );
1118
+ release_sock (sk );
1093
1119
#endif
1094
1120
}
1095
- release_sock (sk );
1096
1121
1097
1122
return ret ;
1098
1123
}
@@ -1873,8 +1898,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
1873
1898
{
1874
1899
struct ip_tunnel_info * info ;
1875
1900
struct vxlan_dev * vxlan = netdev_priv (dev );
1876
- struct sock * sk = vxlan -> vn_sock -> sock -> sk ;
1877
- unsigned short family = vxlan_get_sk_family (vxlan -> vn_sock );
1901
+ struct sock * sk ;
1878
1902
struct rtable * rt = NULL ;
1879
1903
const struct iphdr * old_iph ;
1880
1904
struct flowi4 fl4 ;
@@ -1901,13 +1925,10 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
1901
1925
dev -> name );
1902
1926
goto drop ;
1903
1927
}
1904
- if (family != ip_tunnel_info_af (info ))
1905
- goto drop ;
1906
-
1907
1928
dst_port = info -> key .tp_dst ? : vxlan -> cfg .dst_port ;
1908
1929
vni = be64_to_cpu (info -> key .tun_id );
1909
- remote_ip .sa .sa_family = family ;
1910
- if (family == AF_INET )
1930
+ remote_ip .sa .sa_family = ip_tunnel_info_af ( info ) ;
1931
+ if (remote_ip . sa . sa_family == AF_INET )
1911
1932
remote_ip .sin .sin_addr .s_addr = info -> key .u .ipv4 .dst ;
1912
1933
else
1913
1934
remote_ip .sin6 .sin6_addr = info -> key .u .ipv6 .dst ;
@@ -1952,6 +1973,10 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
1952
1973
}
1953
1974
1954
1975
if (dst -> sa .sa_family == AF_INET ) {
1976
+ if (!vxlan -> vn4_sock )
1977
+ goto drop ;
1978
+ sk = vxlan -> vn4_sock -> sock -> sk ;
1979
+
1955
1980
if (info && (info -> key .tun_flags & TUNNEL_DONT_FRAGMENT ))
1956
1981
df = htons (IP_DF );
1957
1982
@@ -2013,6 +2038,10 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
2013
2038
struct flowi6 fl6 ;
2014
2039
u32 rt6i_flags ;
2015
2040
2041
+ if (!vxlan -> vn6_sock )
2042
+ goto drop ;
2043
+ sk = vxlan -> vn6_sock -> sock -> sk ;
2044
+
2016
2045
memset (& fl6 , 0 , sizeof (fl6 ));
2017
2046
fl6 .flowi6_oif = rdst ? rdst -> remote_ifindex : 0 ;
2018
2047
fl6 .daddr = dst -> sin6 .sin6_addr ;
@@ -2204,7 +2233,6 @@ static void vxlan_vs_add_dev(struct vxlan_sock *vs, struct vxlan_dev *vxlan)
2204
2233
struct vxlan_net * vn = net_generic (vxlan -> net , vxlan_net_id );
2205
2234
__u32 vni = vxlan -> default_dst .remote_vni ;
2206
2235
2207
- vxlan -> vn_sock = vs ;
2208
2236
spin_lock (& vn -> sock_lock );
2209
2237
hlist_add_head_rcu (& vxlan -> hlist , vni_head (vs , vni ));
2210
2238
spin_unlock (& vn -> sock_lock );
@@ -2535,14 +2563,13 @@ static struct socket *vxlan_create_sock(struct net *net, bool ipv6,
2535
2563
}
2536
2564
2537
2565
/* Create new listen socket if needed */
2538
- static struct vxlan_sock * vxlan_socket_create (struct net * net , __be16 port ,
2539
- u32 flags )
2566
+ static struct vxlan_sock * vxlan_socket_create (struct net * net , bool ipv6 ,
2567
+ __be16 port , u32 flags )
2540
2568
{
2541
2569
struct vxlan_net * vn = net_generic (net , vxlan_net_id );
2542
2570
struct vxlan_sock * vs ;
2543
2571
struct socket * sock ;
2544
2572
unsigned int h ;
2545
- bool ipv6 = !!(flags & VXLAN_F_IPV6 );
2546
2573
struct udp_tunnel_sock_cfg tunnel_cfg ;
2547
2574
2548
2575
vs = kzalloc (sizeof (* vs ), GFP_KERNEL );
@@ -2587,11 +2614,10 @@ static struct vxlan_sock *vxlan_socket_create(struct net *net, __be16 port,
2587
2614
return vs ;
2588
2615
}
2589
2616
2590
- static int vxlan_sock_add (struct vxlan_dev * vxlan )
2617
+ static int __vxlan_sock_add (struct vxlan_dev * vxlan , bool ipv6 )
2591
2618
{
2592
2619
struct vxlan_net * vn = net_generic (vxlan -> net , vxlan_net_id );
2593
2620
struct vxlan_sock * vs = NULL ;
2594
- bool ipv6 = vxlan -> flags & VXLAN_F_IPV6 ;
2595
2621
2596
2622
if (!vxlan -> cfg .no_share ) {
2597
2623
spin_lock (& vn -> sock_lock );
@@ -2604,20 +2630,46 @@ static int vxlan_sock_add(struct vxlan_dev *vxlan)
2604
2630
spin_unlock (& vn -> sock_lock );
2605
2631
}
2606
2632
if (!vs )
2607
- vs = vxlan_socket_create (vxlan -> net , vxlan -> cfg . dst_port ,
2608
- vxlan -> flags );
2633
+ vs = vxlan_socket_create (vxlan -> net , ipv6 ,
2634
+ vxlan -> cfg . dst_port , vxlan -> flags );
2609
2635
if (IS_ERR (vs ))
2610
2636
return PTR_ERR (vs );
2637
+ #if IS_ENABLED (CONFIG_IPV6 )
2638
+ if (ipv6 )
2639
+ vxlan -> vn6_sock = vs ;
2640
+ else
2641
+ #endif
2642
+ vxlan -> vn4_sock = vs ;
2611
2643
vxlan_vs_add_dev (vs , vxlan );
2612
2644
return 0 ;
2613
2645
}
2614
2646
2647
+ static int vxlan_sock_add (struct vxlan_dev * vxlan )
2648
+ {
2649
+ bool ipv6 = vxlan -> flags & VXLAN_F_IPV6 ;
2650
+ bool metadata = vxlan -> flags & VXLAN_F_COLLECT_METADATA ;
2651
+ int ret = 0 ;
2652
+
2653
+ vxlan -> vn4_sock = NULL ;
2654
+ #if IS_ENABLED (CONFIG_IPV6 )
2655
+ vxlan -> vn6_sock = NULL ;
2656
+ if (ipv6 || metadata )
2657
+ ret = __vxlan_sock_add (vxlan , true);
2658
+ #endif
2659
+ if (!ret && (!ipv6 || metadata ))
2660
+ ret = __vxlan_sock_add (vxlan , false);
2661
+ if (ret < 0 )
2662
+ vxlan_sock_release (vxlan );
2663
+ return ret ;
2664
+ }
2665
+
2615
2666
static int vxlan_dev_configure (struct net * src_net , struct net_device * dev ,
2616
2667
struct vxlan_config * conf )
2617
2668
{
2618
2669
struct vxlan_net * vn = net_generic (src_net , vxlan_net_id );
2619
2670
struct vxlan_dev * vxlan = netdev_priv (dev );
2620
2671
struct vxlan_rdst * dst = & vxlan -> default_dst ;
2672
+ unsigned short needed_headroom = ETH_HLEN ;
2621
2673
int err ;
2622
2674
bool use_ipv6 = false;
2623
2675
__be16 default_port = vxlan -> cfg .dst_port ;
@@ -2637,6 +2689,7 @@ static int vxlan_dev_configure(struct net *src_net, struct net_device *dev,
2637
2689
if (!IS_ENABLED (CONFIG_IPV6 ))
2638
2690
return - EPFNOSUPPORT ;
2639
2691
use_ipv6 = true;
2692
+ vxlan -> flags |= VXLAN_F_IPV6 ;
2640
2693
}
2641
2694
2642
2695
if (conf -> remote_ifindex ) {
@@ -2657,22 +2710,21 @@ static int vxlan_dev_configure(struct net *src_net, struct net_device *dev,
2657
2710
pr_info ("IPv6 is disabled via sysctl\n" );
2658
2711
return - EPERM ;
2659
2712
}
2660
- vxlan -> flags |= VXLAN_F_IPV6 ;
2661
2713
}
2662
2714
#endif
2663
2715
2664
2716
if (!conf -> mtu )
2665
2717
dev -> mtu = lowerdev -> mtu - (use_ipv6 ? VXLAN6_HEADROOM : VXLAN_HEADROOM );
2666
2718
2667
- dev -> needed_headroom = lowerdev -> hard_header_len +
2668
- (use_ipv6 ? VXLAN6_HEADROOM : VXLAN_HEADROOM );
2669
- } else if (use_ipv6 ) {
2670
- vxlan -> flags |= VXLAN_F_IPV6 ;
2671
- dev -> needed_headroom = ETH_HLEN + VXLAN6_HEADROOM ;
2672
- } else {
2673
- dev -> needed_headroom = ETH_HLEN + VXLAN_HEADROOM ;
2719
+ needed_headroom = lowerdev -> hard_header_len ;
2674
2720
}
2675
2721
2722
+ if (use_ipv6 || conf -> flags & VXLAN_F_COLLECT_METADATA )
2723
+ needed_headroom += VXLAN6_HEADROOM ;
2724
+ else
2725
+ needed_headroom += VXLAN_HEADROOM ;
2726
+ dev -> needed_headroom = needed_headroom ;
2727
+
2676
2728
memcpy (& vxlan -> cfg , conf , sizeof (* conf ));
2677
2729
if (!vxlan -> cfg .dst_port )
2678
2730
vxlan -> cfg .dst_port = default_port ;
0 commit comments