@@ -75,6 +75,9 @@ static struct rtnl_link_ops vxlan_link_ops;
75
75
76
76
static const u8 all_zeros_mac [ETH_ALEN ];
77
77
78
+ static struct vxlan_sock * vxlan_sock_add (struct net * net , __be16 port ,
79
+ bool no_share , u32 flags );
80
+
78
81
/* per-network namespace private data for this module */
79
82
struct vxlan_net {
80
83
struct list_head vxlan_list ;
@@ -1027,7 +1030,7 @@ static bool vxlan_group_used(struct vxlan_net *vn, struct vxlan_dev *dev)
1027
1030
return false;
1028
1031
}
1029
1032
1030
- void vxlan_sock_release (struct vxlan_sock * vs )
1033
+ static void vxlan_sock_release (struct vxlan_sock * vs )
1031
1034
{
1032
1035
struct sock * sk = vs -> sock -> sk ;
1033
1036
struct net * net = sock_net (sk );
@@ -1043,7 +1046,6 @@ void vxlan_sock_release(struct vxlan_sock *vs)
1043
1046
1044
1047
queue_work (vxlan_wq , & vs -> del_work );
1045
1048
}
1046
- EXPORT_SYMBOL_GPL (vxlan_sock_release );
1047
1049
1048
1050
/* Update multicast group membership when first VNI on
1049
1051
* multicast address is brought up
@@ -1126,6 +1128,102 @@ static struct vxlanhdr *vxlan_remcsum(struct sk_buff *skb, struct vxlanhdr *vh,
1126
1128
return vh ;
1127
1129
}
1128
1130
1131
+ static void vxlan_rcv (struct vxlan_sock * vs , struct sk_buff * skb ,
1132
+ struct vxlan_metadata * md , u32 vni ,
1133
+ struct metadata_dst * tun_dst )
1134
+ {
1135
+ struct iphdr * oip = NULL ;
1136
+ struct ipv6hdr * oip6 = NULL ;
1137
+ struct vxlan_dev * vxlan ;
1138
+ struct pcpu_sw_netstats * stats ;
1139
+ union vxlan_addr saddr ;
1140
+ int err = 0 ;
1141
+ union vxlan_addr * remote_ip ;
1142
+
1143
+ /* For flow based devices, map all packets to VNI 0 */
1144
+ if (vs -> flags & VXLAN_F_FLOW_BASED )
1145
+ vni = 0 ;
1146
+
1147
+ /* Is this VNI defined? */
1148
+ vxlan = vxlan_vs_find_vni (vs , vni );
1149
+ if (!vxlan )
1150
+ goto drop ;
1151
+
1152
+ remote_ip = & vxlan -> default_dst .remote_ip ;
1153
+ skb_reset_mac_header (skb );
1154
+ skb_scrub_packet (skb , !net_eq (vxlan -> net , dev_net (vxlan -> dev )));
1155
+ skb -> protocol = eth_type_trans (skb , vxlan -> dev );
1156
+ skb_postpull_rcsum (skb , eth_hdr (skb ), ETH_HLEN );
1157
+
1158
+ /* Ignore packet loops (and multicast echo) */
1159
+ if (ether_addr_equal (eth_hdr (skb )-> h_source , vxlan -> dev -> dev_addr ))
1160
+ goto drop ;
1161
+
1162
+ /* Re-examine inner Ethernet packet */
1163
+ if (remote_ip -> sa .sa_family == AF_INET ) {
1164
+ oip = ip_hdr (skb );
1165
+ saddr .sin .sin_addr .s_addr = oip -> saddr ;
1166
+ saddr .sa .sa_family = AF_INET ;
1167
+ #if IS_ENABLED (CONFIG_IPV6 )
1168
+ } else {
1169
+ oip6 = ipv6_hdr (skb );
1170
+ saddr .sin6 .sin6_addr = oip6 -> saddr ;
1171
+ saddr .sa .sa_family = AF_INET6 ;
1172
+ #endif
1173
+ }
1174
+
1175
+ if (tun_dst ) {
1176
+ skb_dst_set (skb , (struct dst_entry * )tun_dst );
1177
+ tun_dst = NULL ;
1178
+ }
1179
+
1180
+ if ((vxlan -> flags & VXLAN_F_LEARN ) &&
1181
+ vxlan_snoop (skb -> dev , & saddr , eth_hdr (skb )-> h_source ))
1182
+ goto drop ;
1183
+
1184
+ skb_reset_network_header (skb );
1185
+ /* In flow-based mode, GBP is carried in dst_metadata */
1186
+ if (!(vs -> flags & VXLAN_F_FLOW_BASED ))
1187
+ skb -> mark = md -> gbp ;
1188
+
1189
+ if (oip6 )
1190
+ err = IP6_ECN_decapsulate (oip6 , skb );
1191
+ if (oip )
1192
+ err = IP_ECN_decapsulate (oip , skb );
1193
+
1194
+ if (unlikely (err )) {
1195
+ if (log_ecn_error ) {
1196
+ if (oip6 )
1197
+ net_info_ratelimited ("non-ECT from %pI6\n" ,
1198
+ & oip6 -> saddr );
1199
+ if (oip )
1200
+ net_info_ratelimited ("non-ECT from %pI4 with TOS=%#x\n" ,
1201
+ & oip -> saddr , oip -> tos );
1202
+ }
1203
+ if (err > 1 ) {
1204
+ ++ vxlan -> dev -> stats .rx_frame_errors ;
1205
+ ++ vxlan -> dev -> stats .rx_errors ;
1206
+ goto drop ;
1207
+ }
1208
+ }
1209
+
1210
+ stats = this_cpu_ptr (vxlan -> dev -> tstats );
1211
+ u64_stats_update_begin (& stats -> syncp );
1212
+ stats -> rx_packets ++ ;
1213
+ stats -> rx_bytes += skb -> len ;
1214
+ u64_stats_update_end (& stats -> syncp );
1215
+
1216
+ netif_rx (skb );
1217
+
1218
+ return ;
1219
+ drop :
1220
+ if (tun_dst )
1221
+ dst_release ((struct dst_entry * )tun_dst );
1222
+
1223
+ /* Consume bad packet */
1224
+ kfree_skb (skb );
1225
+ }
1226
+
1129
1227
/* Callback from net/ipv4/udp.c to receive packets */
1130
1228
static int vxlan_udp_encap_recv (struct sock * sk , struct sk_buff * skb )
1131
1229
{
@@ -1192,7 +1290,6 @@ static int vxlan_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
1192
1290
info -> key .tun_flags |= TUNNEL_CSUM ;
1193
1291
1194
1292
md = ip_tunnel_info_opts (info , sizeof (* md ));
1195
- md -> tun_dst = tun_dst ;
1196
1293
} else {
1197
1294
memset (md , 0 , sizeof (* md ));
1198
1295
}
@@ -1231,8 +1328,7 @@ static int vxlan_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
1231
1328
goto bad_flags ;
1232
1329
}
1233
1330
1234
- md -> vni = vxh -> vx_vni ;
1235
- vs -> rcv (vs , skb , md );
1331
+ vxlan_rcv (vs , skb , md , vni >> 8 , tun_dst );
1236
1332
return 0 ;
1237
1333
1238
1334
drop :
@@ -1252,104 +1348,6 @@ static int vxlan_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
1252
1348
return 1 ;
1253
1349
}
1254
1350
1255
- static void vxlan_rcv (struct vxlan_sock * vs , struct sk_buff * skb ,
1256
- struct vxlan_metadata * md )
1257
- {
1258
- struct iphdr * oip = NULL ;
1259
- struct ipv6hdr * oip6 = NULL ;
1260
- struct vxlan_dev * vxlan ;
1261
- struct pcpu_sw_netstats * stats ;
1262
- union vxlan_addr saddr ;
1263
- __u32 vni ;
1264
- int err = 0 ;
1265
- union vxlan_addr * remote_ip ;
1266
-
1267
- /* For flow based devices, map all packets to VNI 0 */
1268
- if (vs -> flags & VXLAN_F_FLOW_BASED )
1269
- vni = 0 ;
1270
- else
1271
- vni = ntohl (md -> vni ) >> 8 ;
1272
-
1273
- /* Is this VNI defined? */
1274
- vxlan = vxlan_vs_find_vni (vs , vni );
1275
- if (!vxlan )
1276
- goto drop ;
1277
-
1278
- remote_ip = & vxlan -> default_dst .remote_ip ;
1279
- skb_reset_mac_header (skb );
1280
- skb_scrub_packet (skb , !net_eq (vxlan -> net , dev_net (vxlan -> dev )));
1281
- skb -> protocol = eth_type_trans (skb , vxlan -> dev );
1282
- skb_postpull_rcsum (skb , eth_hdr (skb ), ETH_HLEN );
1283
-
1284
- /* Ignore packet loops (and multicast echo) */
1285
- if (ether_addr_equal (eth_hdr (skb )-> h_source , vxlan -> dev -> dev_addr ))
1286
- goto drop ;
1287
-
1288
- /* Re-examine inner Ethernet packet */
1289
- if (remote_ip -> sa .sa_family == AF_INET ) {
1290
- oip = ip_hdr (skb );
1291
- saddr .sin .sin_addr .s_addr = oip -> saddr ;
1292
- saddr .sa .sa_family = AF_INET ;
1293
- #if IS_ENABLED (CONFIG_IPV6 )
1294
- } else {
1295
- oip6 = ipv6_hdr (skb );
1296
- saddr .sin6 .sin6_addr = oip6 -> saddr ;
1297
- saddr .sa .sa_family = AF_INET6 ;
1298
- #endif
1299
- }
1300
-
1301
- if (md -> tun_dst ) {
1302
- skb_dst_set (skb , (struct dst_entry * )md -> tun_dst );
1303
- md -> tun_dst = NULL ;
1304
- }
1305
-
1306
- if ((vxlan -> flags & VXLAN_F_LEARN ) &&
1307
- vxlan_snoop (skb -> dev , & saddr , eth_hdr (skb )-> h_source ))
1308
- goto drop ;
1309
-
1310
- skb_reset_network_header (skb );
1311
- /* In flow-based mode, GBP is carried in dst_metadata */
1312
- if (!(vs -> flags & VXLAN_F_FLOW_BASED ))
1313
- skb -> mark = md -> gbp ;
1314
-
1315
- if (oip6 )
1316
- err = IP6_ECN_decapsulate (oip6 , skb );
1317
- if (oip )
1318
- err = IP_ECN_decapsulate (oip , skb );
1319
-
1320
- if (unlikely (err )) {
1321
- if (log_ecn_error ) {
1322
- if (oip6 )
1323
- net_info_ratelimited ("non-ECT from %pI6\n" ,
1324
- & oip6 -> saddr );
1325
- if (oip )
1326
- net_info_ratelimited ("non-ECT from %pI4 with TOS=%#x\n" ,
1327
- & oip -> saddr , oip -> tos );
1328
- }
1329
- if (err > 1 ) {
1330
- ++ vxlan -> dev -> stats .rx_frame_errors ;
1331
- ++ vxlan -> dev -> stats .rx_errors ;
1332
- goto drop ;
1333
- }
1334
- }
1335
-
1336
- stats = this_cpu_ptr (vxlan -> dev -> tstats );
1337
- u64_stats_update_begin (& stats -> syncp );
1338
- stats -> rx_packets ++ ;
1339
- stats -> rx_bytes += skb -> len ;
1340
- u64_stats_update_end (& stats -> syncp );
1341
-
1342
- netif_rx (skb );
1343
-
1344
- return ;
1345
- drop :
1346
- if (md -> tun_dst )
1347
- dst_release ((struct dst_entry * )md -> tun_dst );
1348
-
1349
- /* Consume bad packet */
1350
- kfree_skb (skb );
1351
- }
1352
-
1353
1351
static int arp_reduce (struct net_device * dev , struct sk_buff * skb )
1354
1352
{
1355
1353
struct vxlan_dev * vxlan = netdev_priv (dev );
@@ -1688,7 +1686,7 @@ static int vxlan6_xmit_skb(struct dst_entry *dst, struct sock *sk,
1688
1686
struct sk_buff * skb ,
1689
1687
struct net_device * dev , struct in6_addr * saddr ,
1690
1688
struct in6_addr * daddr , __u8 prio , __u8 ttl ,
1691
- __be16 src_port , __be16 dst_port ,
1689
+ __be16 src_port , __be16 dst_port , __u32 vni ,
1692
1690
struct vxlan_metadata * md , bool xnet , u32 vxflags )
1693
1691
{
1694
1692
struct vxlanhdr * vxh ;
@@ -1738,7 +1736,7 @@ static int vxlan6_xmit_skb(struct dst_entry *dst, struct sock *sk,
1738
1736
1739
1737
vxh = (struct vxlanhdr * ) __skb_push (skb , sizeof (* vxh ));
1740
1738
vxh -> vx_flags = htonl (VXLAN_HF_VNI );
1741
- vxh -> vx_vni = md -> vni ;
1739
+ vxh -> vx_vni = vni ;
1742
1740
1743
1741
if (type & SKB_GSO_TUNNEL_REMCSUM ) {
1744
1742
u32 data = (skb_checksum_start_offset (skb ) - hdrlen ) >>
@@ -1771,10 +1769,10 @@ static int vxlan6_xmit_skb(struct dst_entry *dst, struct sock *sk,
1771
1769
}
1772
1770
#endif
1773
1771
1774
- int vxlan_xmit_skb (struct rtable * rt , struct sock * sk , struct sk_buff * skb ,
1775
- __be32 src , __be32 dst , __u8 tos , __u8 ttl , __be16 df ,
1776
- __be16 src_port , __be16 dst_port ,
1777
- struct vxlan_metadata * md , bool xnet , u32 vxflags )
1772
+ static int vxlan_xmit_skb (struct rtable * rt , struct sock * sk , struct sk_buff * skb ,
1773
+ __be32 src , __be32 dst , __u8 tos , __u8 ttl , __be16 df ,
1774
+ __be16 src_port , __be16 dst_port , __u32 vni ,
1775
+ struct vxlan_metadata * md , bool xnet , u32 vxflags )
1778
1776
{
1779
1777
struct vxlanhdr * vxh ;
1780
1778
int min_headroom ;
@@ -1817,7 +1815,7 @@ int vxlan_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb,
1817
1815
1818
1816
vxh = (struct vxlanhdr * ) __skb_push (skb , sizeof (* vxh ));
1819
1817
vxh -> vx_flags = htonl (VXLAN_HF_VNI );
1820
- vxh -> vx_vni = md -> vni ;
1818
+ vxh -> vx_vni = vni ;
1821
1819
1822
1820
if (type & SKB_GSO_TUNNEL_REMCSUM ) {
1823
1821
u32 data = (skb_checksum_start_offset (skb ) - hdrlen ) >>
@@ -1844,7 +1842,6 @@ int vxlan_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb,
1844
1842
ttl , df , src_port , dst_port , xnet ,
1845
1843
!(vxflags & VXLAN_F_UDP_CSUM ));
1846
1844
}
1847
- EXPORT_SYMBOL_GPL (vxlan_xmit_skb );
1848
1845
1849
1846
/* Bypass encapsulation if the destination is local */
1850
1847
static void vxlan_encap_bypass (struct sk_buff * skb , struct vxlan_dev * src_vxlan ,
@@ -2012,10 +2009,9 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
2012
2009
2013
2010
tos = ip_tunnel_ecn_encap (tos , old_iph , skb );
2014
2011
ttl = ttl ? : ip4_dst_hoplimit (& rt -> dst );
2015
- md -> vni = htonl (vni << 8 );
2016
2012
err = vxlan_xmit_skb (rt , sk , skb , fl4 .saddr ,
2017
2013
dst -> sin .sin_addr .s_addr , tos , ttl , df ,
2018
- src_port , dst_port , md ,
2014
+ src_port , dst_port , htonl ( vni << 8 ), md ,
2019
2015
!net_eq (vxlan -> net , dev_net (vxlan -> dev )),
2020
2016
flags );
2021
2017
if (err < 0 ) {
@@ -2070,11 +2066,10 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
2070
2066
}
2071
2067
2072
2068
ttl = ttl ? : ip6_dst_hoplimit (ndst );
2073
- md -> vni = htonl (vni << 8 );
2074
2069
md -> gbp = skb -> mark ;
2075
2070
2076
2071
err = vxlan6_xmit_skb (ndst , sk , skb , dev , & fl6 .saddr , & fl6 .daddr ,
2077
- 0 , ttl , src_port , dst_port , md ,
2072
+ 0 , ttl , src_port , dst_port , htonl ( vni << 8 ), md ,
2078
2073
!net_eq (vxlan -> net , dev_net (vxlan -> dev )),
2079
2074
vxlan -> flags );
2080
2075
#endif
@@ -2269,8 +2264,8 @@ static int vxlan_open(struct net_device *dev)
2269
2264
struct vxlan_sock * vs ;
2270
2265
int ret = 0 ;
2271
2266
2272
- vs = vxlan_sock_add (vxlan -> net , vxlan -> cfg .dst_port , vxlan_rcv ,
2273
- NULL , vxlan -> cfg .no_share , vxlan -> flags );
2267
+ vs = vxlan_sock_add (vxlan -> net , vxlan -> cfg .dst_port ,
2268
+ vxlan -> cfg .no_share , vxlan -> flags );
2274
2269
if (IS_ERR (vs ))
2275
2270
return PTR_ERR (vs );
2276
2271
@@ -2563,7 +2558,6 @@ static struct socket *vxlan_create_sock(struct net *net, bool ipv6,
2563
2558
2564
2559
/* Create new listen socket if needed */
2565
2560
static struct vxlan_sock * vxlan_socket_create (struct net * net , __be16 port ,
2566
- vxlan_rcv_t * rcv , void * data ,
2567
2561
u32 flags )
2568
2562
{
2569
2563
struct vxlan_net * vn = net_generic (net , vxlan_net_id );
@@ -2592,8 +2586,6 @@ static struct vxlan_sock *vxlan_socket_create(struct net *net, __be16 port,
2592
2586
2593
2587
vs -> sock = sock ;
2594
2588
atomic_set (& vs -> refcnt , 1 );
2595
- vs -> rcv = rcv ;
2596
- vs -> data = data ;
2597
2589
vs -> flags = (flags & VXLAN_F_RCV_FLAGS );
2598
2590
2599
2591
/* Initialize the vxlan udp offloads structure */
@@ -2617,9 +2609,8 @@ static struct vxlan_sock *vxlan_socket_create(struct net *net, __be16 port,
2617
2609
return vs ;
2618
2610
}
2619
2611
2620
- struct vxlan_sock * vxlan_sock_add (struct net * net , __be16 port ,
2621
- vxlan_rcv_t * rcv , void * data ,
2622
- bool no_share , u32 flags )
2612
+ static struct vxlan_sock * vxlan_sock_add (struct net * net , __be16 port ,
2613
+ bool no_share , u32 flags )
2623
2614
{
2624
2615
struct vxlan_net * vn = net_generic (net , vxlan_net_id );
2625
2616
struct vxlan_sock * vs ;
@@ -2629,7 +2620,7 @@ struct vxlan_sock *vxlan_sock_add(struct net *net, __be16 port,
2629
2620
spin_lock (& vn -> sock_lock );
2630
2621
vs = vxlan_find_sock (net , ipv6 ? AF_INET6 : AF_INET , port ,
2631
2622
flags );
2632
- if (vs && vs -> rcv == rcv ) {
2623
+ if (vs ) {
2633
2624
if (!atomic_add_unless (& vs -> refcnt , 1 , 0 ))
2634
2625
vs = ERR_PTR (- EBUSY );
2635
2626
spin_unlock (& vn -> sock_lock );
@@ -2638,9 +2629,8 @@ struct vxlan_sock *vxlan_sock_add(struct net *net, __be16 port,
2638
2629
spin_unlock (& vn -> sock_lock );
2639
2630
}
2640
2631
2641
- return vxlan_socket_create (net , port , rcv , data , flags );
2632
+ return vxlan_socket_create (net , port , flags );
2642
2633
}
2643
- EXPORT_SYMBOL_GPL (vxlan_sock_add );
2644
2634
2645
2635
static int vxlan_dev_configure (struct net * src_net , struct net_device * dev ,
2646
2636
struct vxlan_config * conf )
0 commit comments