aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPravin B Shelar <pshelar@nicira.com>2015-08-27 02:46:54 -0400
committerDavid S. Miller <davem@davemloft.net>2015-08-27 18:42:48 -0400
commit371bd1061d29562e6423435073623add8c475ee2 (patch)
treeaad9d29f89fbd982f69fb951563978a469118c17
parent6b001e682e90d7edf21f93687f5c3b39d412ad6c (diff)
geneve: Consolidate Geneve functionality in single module.
geneve_core module handles send and receive functionality. This way OVS could use the Geneve API. Now with use of tunnel meatadata mode OVS can directly use Geneve netdevice. So there is no need for separate module for Geneve. Following patch consolidates Geneve protocol processing in single module. Signed-off-by: Pravin B Shelar <pshelar@nicira.com> Reviewed-by: Jesse Gross <jesse@nicira.com> Acked-by: John W. Linville <linville@tuxdriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/Kconfig4
-rw-r--r--drivers/net/geneve.c507
-rw-r--r--include/net/geneve.h34
-rw-r--r--net/ipv4/Kconfig14
-rw-r--r--net/ipv4/Makefile1
-rw-r--r--net/ipv4/geneve_core.c447
6 files changed, 421 insertions, 586 deletions
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index 770483b31d62..d18eb607bee6 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -180,8 +180,8 @@ config VXLAN
180 will be called vxlan. 180 will be called vxlan.
181 181
182config GENEVE 182config GENEVE
183 tristate "Generic Network Virtualization Encapsulation netdev" 183 tristate "Generic Network Virtualization Encapsulation"
184 depends on INET && GENEVE_CORE 184 depends on INET && NET_UDP_TUNNEL
185 select NET_IP_TUNNEL 185 select NET_IP_TUNNEL
186 ---help--- 186 ---help---
187 This allows one to create geneve virtual interfaces that provide 187 This allows one to create geneve virtual interfaces that provide
diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c
index d05150cc25d4..90d4d433f1c9 100644
--- a/drivers/net/geneve.c
+++ b/drivers/net/geneve.c
@@ -18,6 +18,7 @@
18#include <net/dst_metadata.h> 18#include <net/dst_metadata.h>
19#include <net/rtnetlink.h> 19#include <net/rtnetlink.h>
20#include <net/geneve.h> 20#include <net/geneve.h>
21#include <net/protocol.h>
21 22
22#define GENEVE_NETDEV_VER "0.6" 23#define GENEVE_NETDEV_VER "0.6"
23 24
@@ -33,13 +34,18 @@ static bool log_ecn_error = true;
33module_param(log_ecn_error, bool, 0644); 34module_param(log_ecn_error, bool, 0644);
34MODULE_PARM_DESC(log_ecn_error, "Log packets received with corrupted ECN"); 35MODULE_PARM_DESC(log_ecn_error, "Log packets received with corrupted ECN");
35 36
37#define GENEVE_VER 0
38#define GENEVE_BASE_HLEN (sizeof(struct udphdr) + sizeof(struct genevehdr))
39
36/* per-network namespace private data for this module */ 40/* per-network namespace private data for this module */
37struct geneve_net { 41struct geneve_net {
38 struct list_head geneve_list; 42 struct list_head geneve_list;
39 struct hlist_head vni_list[VNI_HASH_SIZE]; 43 struct hlist_head vni_list[VNI_HASH_SIZE];
40 struct geneve_dev __rcu *collect_md_tun; 44 struct list_head sock_list;
41}; 45};
42 46
47static int geneve_net_id;
48
43/* Pseudo network device */ 49/* Pseudo network device */
44struct geneve_dev { 50struct geneve_dev {
45 struct hlist_node hlist; /* vni hash table */ 51 struct hlist_node hlist; /* vni hash table */
@@ -55,7 +61,15 @@ struct geneve_dev {
55 bool collect_md; 61 bool collect_md;
56}; 62};
57 63
58static int geneve_net_id; 64struct geneve_sock {
65 bool collect_md;
66 struct geneve_net *gn;
67 struct list_head list;
68 struct socket *sock;
69 struct rcu_head rcu;
70 int refcnt;
71 struct udp_offload udp_offloads;
72};
59 73
60static inline __u32 geneve_net_vni_hash(u8 vni[3]) 74static inline __u32 geneve_net_vni_hash(u8 vni[3])
61{ 75{
@@ -76,51 +90,62 @@ static __be64 vni_to_tunnel_id(const __u8 *vni)
76#endif 90#endif
77} 91}
78 92
79static struct geneve_dev *geneve_lookup(struct geneve_net *gn, 93static struct geneve_dev *geneve_lookup(struct geneve_net *gn, __be16 port,
80 struct geneve_sock *gs, 94 __be32 addr, u8 vni[])
81 struct iphdr *iph,
82 struct genevehdr *gnvh)
83{ 95{
84 struct inet_sock *sk = inet_sk(gs->sock->sk);
85 struct hlist_head *vni_list_head; 96 struct hlist_head *vni_list_head;
86 struct geneve_dev *geneve; 97 struct geneve_dev *geneve;
87 __u32 hash; 98 __u32 hash;
88 99
89 geneve = rcu_dereference(gn->collect_md_tun);
90 if (geneve)
91 return geneve;
92
93 /* Find the device for this VNI */ 100 /* Find the device for this VNI */
94 hash = geneve_net_vni_hash(gnvh->vni); 101 hash = geneve_net_vni_hash(vni);
95 vni_list_head = &gn->vni_list[hash]; 102 vni_list_head = &gn->vni_list[hash];
96 hlist_for_each_entry_rcu(geneve, vni_list_head, hlist) { 103 hlist_for_each_entry_rcu(geneve, vni_list_head, hlist) {
97 if (!memcmp(gnvh->vni, geneve->vni, sizeof(geneve->vni)) && 104 if (!memcmp(vni, geneve->vni, sizeof(geneve->vni)) &&
98 iph->saddr == geneve->remote.sin_addr.s_addr && 105 addr == geneve->remote.sin_addr.s_addr &&
99 sk->inet_sport == geneve->dst_port) { 106 port == geneve->dst_port) {
100 return geneve; 107 return geneve;
101 } 108 }
102 } 109 }
103 return NULL; 110 return NULL;
104} 111}
105 112
113static inline struct genevehdr *geneve_hdr(const struct sk_buff *skb)
114{
115 return (struct genevehdr *)(udp_hdr(skb) + 1);
116}
117
106/* geneve receive/decap routine */ 118/* geneve receive/decap routine */
107static void geneve_rx(struct geneve_sock *gs, struct sk_buff *skb) 119static void geneve_rx(struct geneve_sock *gs, struct sk_buff *skb)
108{ 120{
121 struct inet_sock *sk = inet_sk(gs->sock->sk);
109 struct genevehdr *gnvh = geneve_hdr(skb); 122 struct genevehdr *gnvh = geneve_hdr(skb);
123 struct geneve_net *gn = gs->gn;
110 struct metadata_dst *tun_dst = NULL; 124 struct metadata_dst *tun_dst = NULL;
111 struct geneve_dev *geneve = NULL; 125 struct geneve_dev *geneve = NULL;
112 struct pcpu_sw_netstats *stats; 126 struct pcpu_sw_netstats *stats;
113 struct geneve_net *gn;
114 struct iphdr *iph; 127 struct iphdr *iph;
128 u8 *vni;
129 __be32 addr;
115 int err; 130 int err;
116 131
117 iph = ip_hdr(skb); /* Still outer IP header... */ 132 iph = ip_hdr(skb); /* Still outer IP header... */
118 gn = gs->rcv_data; 133
119 geneve = geneve_lookup(gn, gs, iph, gnvh); 134 if (gs->collect_md) {
135 static u8 zero_vni[3];
136
137 vni = zero_vni;
138 addr = 0;
139 } else {
140 vni = gnvh->vni;
141 addr = iph->saddr;
142 }
143
144 geneve = geneve_lookup(gn, sk->inet_sport, addr, vni);
120 if (!geneve) 145 if (!geneve)
121 goto drop; 146 goto drop;
122 147
123 if (ip_tunnel_collect_metadata() || geneve->collect_md) { 148 if (ip_tunnel_collect_metadata() || gs->collect_md) {
124 __be16 flags; 149 __be16 flags;
125 void *opts; 150 void *opts;
126 151
@@ -201,31 +226,326 @@ static void geneve_uninit(struct net_device *dev)
201 free_percpu(dev->tstats); 226 free_percpu(dev->tstats);
202} 227}
203 228
229/* Callback from net/ipv4/udp.c to receive packets */
230static int geneve_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
231{
232 struct genevehdr *geneveh;
233 struct geneve_sock *gs;
234 int opts_len;
235
236 /* Need Geneve and inner Ethernet header to be present */
237 if (unlikely(!pskb_may_pull(skb, GENEVE_BASE_HLEN)))
238 goto error;
239
240 /* Return packets with reserved bits set */
241 geneveh = geneve_hdr(skb);
242 if (unlikely(geneveh->ver != GENEVE_VER))
243 goto error;
244
245 if (unlikely(geneveh->proto_type != htons(ETH_P_TEB)))
246 goto error;
247
248 opts_len = geneveh->opt_len * 4;
249 if (iptunnel_pull_header(skb, GENEVE_BASE_HLEN + opts_len,
250 htons(ETH_P_TEB)))
251 goto drop;
252
253 gs = rcu_dereference_sk_user_data(sk);
254 if (!gs)
255 goto drop;
256
257 geneve_rx(gs, skb);
258 return 0;
259
260drop:
261 /* Consume bad packet */
262 kfree_skb(skb);
263 return 0;
264
265error:
266 /* Let the UDP layer deal with the skb */
267 return 1;
268}
269
270static struct socket *geneve_create_sock(struct net *net, bool ipv6,
271 __be16 port)
272{
273 struct socket *sock;
274 struct udp_port_cfg udp_conf;
275 int err;
276
277 memset(&udp_conf, 0, sizeof(udp_conf));
278
279 if (ipv6) {
280 udp_conf.family = AF_INET6;
281 } else {
282 udp_conf.family = AF_INET;
283 udp_conf.local_ip.s_addr = htonl(INADDR_ANY);
284 }
285
286 udp_conf.local_udp_port = port;
287
288 /* Open UDP socket */
289 err = udp_sock_create(net, &udp_conf, &sock);
290 if (err < 0)
291 return ERR_PTR(err);
292
293 return sock;
294}
295
296static void geneve_notify_add_rx_port(struct geneve_sock *gs)
297{
298 struct sock *sk = gs->sock->sk;
299 sa_family_t sa_family = sk->sk_family;
300 int err;
301
302 if (sa_family == AF_INET) {
303 err = udp_add_offload(&gs->udp_offloads);
304 if (err)
305 pr_warn("geneve: udp_add_offload failed with status %d\n",
306 err);
307 }
308}
309
310static int geneve_hlen(struct genevehdr *gh)
311{
312 return sizeof(*gh) + gh->opt_len * 4;
313}
314
315static struct sk_buff **geneve_gro_receive(struct sk_buff **head,
316 struct sk_buff *skb,
317 struct udp_offload *uoff)
318{
319 struct sk_buff *p, **pp = NULL;
320 struct genevehdr *gh, *gh2;
321 unsigned int hlen, gh_len, off_gnv;
322 const struct packet_offload *ptype;
323 __be16 type;
324 int flush = 1;
325
326 off_gnv = skb_gro_offset(skb);
327 hlen = off_gnv + sizeof(*gh);
328 gh = skb_gro_header_fast(skb, off_gnv);
329 if (skb_gro_header_hard(skb, hlen)) {
330 gh = skb_gro_header_slow(skb, hlen, off_gnv);
331 if (unlikely(!gh))
332 goto out;
333 }
334
335 if (gh->ver != GENEVE_VER || gh->oam)
336 goto out;
337 gh_len = geneve_hlen(gh);
338
339 hlen = off_gnv + gh_len;
340 if (skb_gro_header_hard(skb, hlen)) {
341 gh = skb_gro_header_slow(skb, hlen, off_gnv);
342 if (unlikely(!gh))
343 goto out;
344 }
345
346 flush = 0;
347
348 for (p = *head; p; p = p->next) {
349 if (!NAPI_GRO_CB(p)->same_flow)
350 continue;
351
352 gh2 = (struct genevehdr *)(p->data + off_gnv);
353 if (gh->opt_len != gh2->opt_len ||
354 memcmp(gh, gh2, gh_len)) {
355 NAPI_GRO_CB(p)->same_flow = 0;
356 continue;
357 }
358 }
359
360 type = gh->proto_type;
361
362 rcu_read_lock();
363 ptype = gro_find_receive_by_type(type);
364 if (!ptype) {
365 flush = 1;
366 goto out_unlock;
367 }
368
369 skb_gro_pull(skb, gh_len);
370 skb_gro_postpull_rcsum(skb, gh, gh_len);
371 pp = ptype->callbacks.gro_receive(head, skb);
372
373out_unlock:
374 rcu_read_unlock();
375out:
376 NAPI_GRO_CB(skb)->flush |= flush;
377
378 return pp;
379}
380
381static int geneve_gro_complete(struct sk_buff *skb, int nhoff,
382 struct udp_offload *uoff)
383{
384 struct genevehdr *gh;
385 struct packet_offload *ptype;
386 __be16 type;
387 int gh_len;
388 int err = -ENOSYS;
389
390 udp_tunnel_gro_complete(skb, nhoff);
391
392 gh = (struct genevehdr *)(skb->data + nhoff);
393 gh_len = geneve_hlen(gh);
394 type = gh->proto_type;
395
396 rcu_read_lock();
397 ptype = gro_find_complete_by_type(type);
398 if (ptype)
399 err = ptype->callbacks.gro_complete(skb, nhoff + gh_len);
400
401 rcu_read_unlock();
402 return err;
403}
404
405/* Create new listen socket if needed */
406static struct geneve_sock *geneve_socket_create(struct net *net, __be16 port,
407 bool ipv6)
408{
409 struct geneve_net *gn = net_generic(net, geneve_net_id);
410 struct geneve_sock *gs;
411 struct socket *sock;
412 struct udp_tunnel_sock_cfg tunnel_cfg;
413
414 gs = kzalloc(sizeof(*gs), GFP_KERNEL);
415 if (!gs)
416 return ERR_PTR(-ENOMEM);
417
418 sock = geneve_create_sock(net, ipv6, port);
419 if (IS_ERR(sock)) {
420 kfree(gs);
421 return ERR_CAST(sock);
422 }
423
424 gs->sock = sock;
425 gs->refcnt = 1;
426 gs->gn = gn;
427
428 /* Initialize the geneve udp offloads structure */
429 gs->udp_offloads.port = port;
430 gs->udp_offloads.callbacks.gro_receive = geneve_gro_receive;
431 gs->udp_offloads.callbacks.gro_complete = geneve_gro_complete;
432 geneve_notify_add_rx_port(gs);
433
434 /* Mark socket as an encapsulation socket */
435 tunnel_cfg.sk_user_data = gs;
436 tunnel_cfg.encap_type = 1;
437 tunnel_cfg.encap_rcv = geneve_udp_encap_recv;
438 tunnel_cfg.encap_destroy = NULL;
439 setup_udp_tunnel_sock(net, sock, &tunnel_cfg);
440
441 list_add(&gs->list, &gn->sock_list);
442 return gs;
443}
444
445static void geneve_notify_del_rx_port(struct geneve_sock *gs)
446{
447 struct sock *sk = gs->sock->sk;
448 sa_family_t sa_family = sk->sk_family;
449
450 if (sa_family == AF_INET)
451 udp_del_offload(&gs->udp_offloads);
452}
453
454static void geneve_sock_release(struct geneve_sock *gs)
455{
456 if (--gs->refcnt)
457 return;
458
459 list_del(&gs->list);
460 geneve_notify_del_rx_port(gs);
461 udp_tunnel_sock_release(gs->sock);
462 kfree_rcu(gs, rcu);
463}
464
465static struct geneve_sock *geneve_find_sock(struct geneve_net *gn,
466 __be16 dst_port)
467{
468 struct geneve_sock *gs;
469
470 list_for_each_entry(gs, &gn->sock_list, list) {
471 if (inet_sk(gs->sock->sk)->inet_sport == dst_port &&
472 inet_sk(gs->sock->sk)->sk.sk_family == AF_INET) {
473 return gs;
474 }
475 }
476 return NULL;
477}
478
204static int geneve_open(struct net_device *dev) 479static int geneve_open(struct net_device *dev)
205{ 480{
206 struct geneve_dev *geneve = netdev_priv(dev); 481 struct geneve_dev *geneve = netdev_priv(dev);
207 struct net *net = geneve->net; 482 struct net *net = geneve->net;
208 struct geneve_net *gn = net_generic(geneve->net, geneve_net_id); 483 struct geneve_net *gn = net_generic(net, geneve_net_id);
209 struct geneve_sock *gs; 484 struct geneve_sock *gs;
210 485
211 gs = geneve_sock_add(net, geneve->dst_port, geneve_rx, gn, 486 gs = geneve_find_sock(gn, geneve->dst_port);
212 false, false); 487 if (gs) {
488 gs->refcnt++;
489 goto out;
490 }
491
492 gs = geneve_socket_create(net, geneve->dst_port, false);
213 if (IS_ERR(gs)) 493 if (IS_ERR(gs))
214 return PTR_ERR(gs); 494 return PTR_ERR(gs);
215 495
496out:
497 gs->collect_md = geneve->collect_md;
216 geneve->sock = gs; 498 geneve->sock = gs;
217
218 return 0; 499 return 0;
219} 500}
220 501
221static int geneve_stop(struct net_device *dev) 502static int geneve_stop(struct net_device *dev)
222{ 503{
223 struct geneve_dev *geneve = netdev_priv(dev); 504 struct geneve_dev *geneve = netdev_priv(dev);
224 struct geneve_sock *gs = geneve->sock;
225 505
226 geneve_sock_release(gs); 506 geneve_sock_release(geneve->sock);
507 return 0;
508}
509
510static int geneve_build_skb(struct rtable *rt, struct sk_buff *skb,
511 __be16 tun_flags, u8 vni[3], u8 opt_len, u8 *opt,
512 bool csum)
513{
514 struct genevehdr *gnvh;
515 int min_headroom;
516 int err;
227 517
518 min_headroom = LL_RESERVED_SPACE(rt->dst.dev) + rt->dst.header_len
519 + GENEVE_BASE_HLEN + opt_len + sizeof(struct iphdr);
520 err = skb_cow_head(skb, min_headroom);
521 if (unlikely(err)) {
522 kfree_skb(skb);
523 goto free_rt;
524 }
525
526 skb = udp_tunnel_handle_offloads(skb, csum);
527 if (IS_ERR(skb)) {
528 err = PTR_ERR(skb);
529 goto free_rt;
530 }
531
532 gnvh = (struct genevehdr *)__skb_push(skb, sizeof(*gnvh) + opt_len);
533 gnvh->ver = GENEVE_VER;
534 gnvh->opt_len = opt_len / 4;
535 gnvh->oam = !!(tun_flags & TUNNEL_OAM);
536 gnvh->critical = !!(tun_flags & TUNNEL_CRIT_OPT);
537 gnvh->rsvd1 = 0;
538 memcpy(gnvh->vni, vni, 3);
539 gnvh->proto_type = htons(ETH_P_TEB);
540 gnvh->rsvd2 = 0;
541 memcpy(gnvh->options, opt, opt_len);
542
543 skb_set_inner_protocol(skb, htons(ETH_P_TEB));
228 return 0; 544 return 0;
545
546free_rt:
547 ip_rt_put(rt);
548 return err;
229} 549}
230 550
231static struct rtable *geneve_get_rt(struct sk_buff *skb, 551static struct rtable *geneve_get_rt(struct sk_buff *skb,
@@ -269,7 +589,6 @@ static struct rtable *geneve_get_rt(struct sk_buff *skb,
269 ip_rt_put(rt); 589 ip_rt_put(rt);
270 return ERR_PTR(-EINVAL); 590 return ERR_PTR(-EINVAL);
271 } 591 }
272
273 return rt; 592 return rt;
274} 593}
275 594
@@ -293,15 +612,13 @@ static netdev_tx_t geneve_xmit(struct sk_buff *skb, struct net_device *dev)
293 struct geneve_sock *gs = geneve->sock; 612 struct geneve_sock *gs = geneve->sock;
294 struct ip_tunnel_info *info = NULL; 613 struct ip_tunnel_info *info = NULL;
295 struct rtable *rt = NULL; 614 struct rtable *rt = NULL;
296 const struct iphdr *iip; /* interior IP header */
297 struct flowi4 fl4; 615 struct flowi4 fl4;
298 __u8 tos, ttl; 616 __u8 tos, ttl;
299 __be16 sport; 617 __be16 sport;
300 bool xnet; 618 bool udp_csum;
619 __be16 df;
301 int err; 620 int err;
302 621
303 sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
304
305 if (geneve->collect_md) { 622 if (geneve->collect_md) {
306 info = skb_tunnel_info(skb); 623 info = skb_tunnel_info(skb);
307 if (unlikely(info && info->mode != IP_TUNNEL_INFO_TX)) { 624 if (unlikely(info && info->mode != IP_TUNNEL_INFO_TX)) {
@@ -316,52 +633,57 @@ static netdev_tx_t geneve_xmit(struct sk_buff *skb, struct net_device *dev)
316 dev->stats.tx_carrier_errors++; 633 dev->stats.tx_carrier_errors++;
317 goto tx_error; 634 goto tx_error;
318 } 635 }
636
637 sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
319 skb_reset_mac_header(skb); 638 skb_reset_mac_header(skb);
320 xnet = !net_eq(geneve->net, dev_net(geneve->dev));
321 639
322 if (info) { 640 if (info) {
323 const struct ip_tunnel_key *key = &info->key; 641 const struct ip_tunnel_key *key = &info->key;
324 bool udp_csum;
325 u8 *opts = NULL; 642 u8 *opts = NULL;
326 u8 vni[3]; 643 u8 vni[3];
327 __be16 df;
328 644
329 tunnel_id_to_vni(key->tun_id, vni); 645 tunnel_id_to_vni(key->tun_id, vni);
330 df = key->tun_flags & TUNNEL_DONT_FRAGMENT ? htons(IP_DF) : 0;
331 udp_csum = !!(key->tun_flags & TUNNEL_CSUM);
332
333 if (key->tun_flags & TUNNEL_GENEVE_OPT) 646 if (key->tun_flags & TUNNEL_GENEVE_OPT)
334 opts = ip_tunnel_info_opts(info, info->options_len); 647 opts = ip_tunnel_info_opts(info, info->options_len);
335 648
336 err = geneve_xmit_skb(gs, rt, skb, fl4.saddr, fl4.daddr, 649 udp_csum = !!(key->tun_flags & TUNNEL_CSUM);
337 key->tos, key->ttl, df, 650 err = geneve_build_skb(rt, skb, key->tun_flags, vni,
338 sport, geneve->dst_port, 651 info->options_len, opts, udp_csum);
339 key->tun_flags, vni, 652 if (unlikely(err))
340 info->options_len, opts, udp_csum, xnet); 653 goto err;
654
655 tos = key->tos;
656 ttl = key->ttl;
657 df = key->tun_flags & TUNNEL_DONT_FRAGMENT ? htons(IP_DF) : 0;
341 } else { 658 } else {
659 const struct iphdr *iip; /* interior IP header */
660
661 udp_csum = false;
662 err = geneve_build_skb(rt, skb, 0, geneve->vni,
663 0, NULL, udp_csum);
664 if (unlikely(err))
665 goto err;
666
342 iip = ip_hdr(skb); 667 iip = ip_hdr(skb);
343 tos = ip_tunnel_ecn_encap(fl4.flowi4_tos, iip, skb); 668 tos = ip_tunnel_ecn_encap(fl4.flowi4_tos, iip, skb);
344
345 ttl = geneve->ttl; 669 ttl = geneve->ttl;
346 if (!ttl && IN_MULTICAST(ntohl(fl4.daddr))) 670 if (!ttl && IN_MULTICAST(ntohl(fl4.daddr)))
347 ttl = 1; 671 ttl = 1;
348
349 ttl = ttl ? : ip4_dst_hoplimit(&rt->dst); 672 ttl = ttl ? : ip4_dst_hoplimit(&rt->dst);
350 673 df = 0;
351 /* no need to handle local destination and encap bypass...yet... */
352 err = geneve_xmit_skb(gs, rt, skb, fl4.saddr, fl4.daddr, tos,
353 ttl, 0, sport, geneve->dst_port, 0,
354 geneve->vni, 0, NULL, false, xnet);
355 } 674 }
356 if (err < 0) 675 err = udp_tunnel_xmit_skb(rt, gs->sock->sk, skb, fl4.saddr, fl4.daddr,
357 ip_rt_put(rt); 676 tos, ttl, df, sport, geneve->dst_port,
677 !net_eq(geneve->net, dev_net(geneve->dev)),
678 !udp_csum);
358 679
359 iptunnel_xmit_stats(err, &dev->stats, dev->tstats); 680 iptunnel_xmit_stats(err, &dev->stats, dev->tstats);
360 return NETDEV_TX_OK; 681 return NETDEV_TX_OK;
361 682
362tx_error: 683tx_error:
363 dev->stats.tx_errors++;
364 dev_kfree_skb(skb); 684 dev_kfree_skb(skb);
685err:
686 dev->stats.tx_errors++;
365 return NETDEV_TX_OK; 687 return NETDEV_TX_OK;
366} 688}
367 689
@@ -454,25 +776,44 @@ static int geneve_validate(struct nlattr *tb[], struct nlattr *data[])
454 return 0; 776 return 0;
455} 777}
456 778
779static struct geneve_dev *geneve_find_dev(struct geneve_net *gn,
780 __be16 dst_port,
781 __be32 rem_addr,
782 u8 vni[],
783 bool *tun_on_same_port,
784 bool *tun_collect_md)
785{
786 struct geneve_dev *geneve, *t;
787
788 *tun_on_same_port = false;
789 *tun_collect_md = false;
790 t = NULL;
791 list_for_each_entry(geneve, &gn->geneve_list, next) {
792 if (geneve->dst_port == dst_port) {
793 *tun_collect_md = geneve->collect_md;
794 *tun_on_same_port = true;
795 }
796 if (!memcmp(vni, geneve->vni, sizeof(geneve->vni)) &&
797 rem_addr == geneve->remote.sin_addr.s_addr &&
798 dst_port == geneve->dst_port)
799 t = geneve;
800 }
801 return t;
802}
803
457static int geneve_configure(struct net *net, struct net_device *dev, 804static int geneve_configure(struct net *net, struct net_device *dev,
458 __be32 rem_addr, __u32 vni, __u8 ttl, __u8 tos, 805 __be32 rem_addr, __u32 vni, __u8 ttl, __u8 tos,
459 __u16 dst_port, bool metadata) 806 __u16 dst_port, bool metadata)
460{ 807{
461 struct geneve_net *gn = net_generic(net, geneve_net_id); 808 struct geneve_net *gn = net_generic(net, geneve_net_id);
462 struct geneve_dev *dummy, *geneve = netdev_priv(dev); 809 struct geneve_dev *t, *geneve = netdev_priv(dev);
463 struct hlist_head *vni_list_head; 810 bool tun_collect_md, tun_on_same_port;
464 struct sockaddr_in remote; /* IPv4 address for link partner */
465 __u32 hash; 811 __u32 hash;
466 int err; 812 int err;
467 813
468 if (metadata) { 814 if (metadata) {
469 if (rtnl_dereference(gn->collect_md_tun)) 815 if (rem_addr || vni || tos || ttl)
470 return -EEXIST; 816 return -EINVAL;
471 if (!list_empty(&gn->geneve_list))
472 return -EPERM;
473 } else {
474 if (rtnl_dereference(gn->collect_md_tun))
475 return -EPERM;
476 } 817 }
477 818
478 geneve->net = net; 819 geneve->net = net;
@@ -486,36 +827,31 @@ static int geneve_configure(struct net *net, struct net_device *dev,
486 if (IN_MULTICAST(ntohl(geneve->remote.sin_addr.s_addr))) 827 if (IN_MULTICAST(ntohl(geneve->remote.sin_addr.s_addr)))
487 return -EINVAL; 828 return -EINVAL;
488 829
489 remote = geneve->remote;
490 if (metadata) {
491 if (rem_addr || vni || tos || ttl)
492 return -EINVAL;
493 }
494
495 hash = geneve_net_vni_hash(geneve->vni);
496 vni_list_head = &gn->vni_list[hash];
497 hlist_for_each_entry_rcu(dummy, vni_list_head, hlist) {
498 if (!memcmp(geneve->vni, dummy->vni, sizeof(dummy->vni)) &&
499 !memcmp(&remote, &dummy->remote, sizeof(dummy->remote)) &&
500 htons(dst_port) == dummy->dst_port) {
501 return -EBUSY;
502 }
503 }
504
505 geneve->ttl = ttl; 830 geneve->ttl = ttl;
506 geneve->tos = tos; 831 geneve->tos = tos;
507 geneve->dst_port = htons(dst_port); 832 geneve->dst_port = htons(dst_port);
508 geneve->collect_md = metadata; 833 geneve->collect_md = metadata;
509 834
835 t = geneve_find_dev(gn, htons(dst_port), rem_addr, geneve->vni,
836 &tun_on_same_port, &tun_collect_md);
837 if (t)
838 return -EBUSY;
839
840 if (metadata) {
841 if (tun_on_same_port)
842 return -EPERM;
843 } else {
844 if (tun_collect_md)
845 return -EPERM;
846 }
847
510 err = register_netdevice(dev); 848 err = register_netdevice(dev);
511 if (err) 849 if (err)
512 return err; 850 return err;
513 851
514 list_add(&geneve->next, &gn->geneve_list); 852 list_add(&geneve->next, &gn->geneve_list);
853 hash = geneve_net_vni_hash(geneve->vni);
515 hlist_add_head_rcu(&geneve->hlist, &gn->vni_list[hash]); 854 hlist_add_head_rcu(&geneve->hlist, &gn->vni_list[hash]);
516
517 if (geneve->collect_md)
518 rcu_assign_pointer(gn->collect_md_tun, geneve);
519 return 0; 855 return 0;
520} 856}
521 857
@@ -554,12 +890,6 @@ static void geneve_dellink(struct net_device *dev, struct list_head *head)
554{ 890{
555 struct geneve_dev *geneve = netdev_priv(dev); 891 struct geneve_dev *geneve = netdev_priv(dev);
556 892
557 if (geneve->collect_md) {
558 struct geneve_net *gn = net_generic(geneve->net, geneve_net_id);
559
560 rcu_assign_pointer(gn->collect_md_tun, NULL);
561 }
562
563 if (!hlist_unhashed(&geneve->hlist)) 893 if (!hlist_unhashed(&geneve->hlist))
564 hlist_del_rcu(&geneve->hlist); 894 hlist_del_rcu(&geneve->hlist);
565 895
@@ -651,6 +981,7 @@ static __net_init int geneve_init_net(struct net *net)
651 981
652 INIT_LIST_HEAD(&gn->geneve_list); 982 INIT_LIST_HEAD(&gn->geneve_list);
653 983
984 INIT_LIST_HEAD(&gn->sock_list);
654 for (h = 0; h < VNI_HASH_SIZE; ++h) 985 for (h = 0; h < VNI_HASH_SIZE; ++h)
655 INIT_HLIST_HEAD(&gn->vni_list[h]); 986 INIT_HLIST_HEAD(&gn->vni_list[h]);
656 987
diff --git a/include/net/geneve.h b/include/net/geneve.h
index 4245e1d23b9b..3106ed6eae0d 100644
--- a/include/net/geneve.h
+++ b/include/net/geneve.h
@@ -62,41 +62,7 @@ struct genevehdr {
62 struct geneve_opt options[]; 62 struct geneve_opt options[];
63}; 63};
64 64
65static inline struct genevehdr *geneve_hdr(const struct sk_buff *skb)
66{
67 return (struct genevehdr *)(udp_hdr(skb) + 1);
68}
69
70#ifdef CONFIG_INET 65#ifdef CONFIG_INET
71struct geneve_sock;
72
73typedef void (geneve_rcv_t)(struct geneve_sock *gs, struct sk_buff *skb);
74
75struct geneve_sock {
76 struct list_head list;
77 geneve_rcv_t *rcv;
78 void *rcv_data;
79 struct socket *sock;
80 struct rcu_head rcu;
81 int refcnt;
82 struct udp_offload udp_offloads;
83};
84
85#define GENEVE_VER 0
86#define GENEVE_BASE_HLEN (sizeof(struct udphdr) + sizeof(struct genevehdr))
87
88struct geneve_sock *geneve_sock_add(struct net *net, __be16 port,
89 geneve_rcv_t *rcv, void *data,
90 bool no_share, bool ipv6);
91
92void geneve_sock_release(struct geneve_sock *vs);
93
94int geneve_xmit_skb(struct geneve_sock *gs, struct rtable *rt,
95 struct sk_buff *skb, __be32 src, __be32 dst, __u8 tos,
96 __u8 ttl, __be16 df, __be16 src_port, __be16 dst_port,
97 __be16 tun_flags, u8 vni[3], u8 opt_len, u8 *opt,
98 bool csum, bool xnet);
99
100struct net_device *geneve_dev_create_fb(struct net *net, const char *name, 66struct net_device *geneve_dev_create_fb(struct net *net, const char *name,
101 u8 name_assign_type, u16 dst_port); 67 u8 name_assign_type, u16 dst_port);
102#endif /*ifdef CONFIG_INET */ 68#endif /*ifdef CONFIG_INET */
diff --git a/net/ipv4/Kconfig b/net/ipv4/Kconfig
index 6fb3c90ad726..416dfa004cfb 100644
--- a/net/ipv4/Kconfig
+++ b/net/ipv4/Kconfig
@@ -331,20 +331,6 @@ config NET_FOU_IP_TUNNELS
331 When this option is enabled IP tunnels can be configured to use 331 When this option is enabled IP tunnels can be configured to use
332 FOU or GUE encapsulation. 332 FOU or GUE encapsulation.
333 333
334config GENEVE_CORE
335 tristate "Generic Network Virtualization Encapsulation library"
336 depends on INET
337 select NET_UDP_TUNNEL
338 ---help---
339 This allows one to create Geneve virtual interfaces that provide
340 Layer 2 Networks over Layer 3 Networks. Geneve is often used
341 to tunnel virtual network infrastructure in virtualized environments.
342 For more information see:
343 http://tools.ietf.org/html/draft-gross-geneve-01
344
345 To compile this driver as a module, choose M here: the module
346
347
348config INET_AH 334config INET_AH
349 tristate "IP: AH transformation" 335 tristate "IP: AH transformation"
350 select XFRM_ALGO 336 select XFRM_ALGO
diff --git a/net/ipv4/Makefile b/net/ipv4/Makefile
index efc43f300b8c..89aacb630a53 100644
--- a/net/ipv4/Makefile
+++ b/net/ipv4/Makefile
@@ -57,7 +57,6 @@ obj-$(CONFIG_TCP_CONG_YEAH) += tcp_yeah.o
57obj-$(CONFIG_TCP_CONG_ILLINOIS) += tcp_illinois.o 57obj-$(CONFIG_TCP_CONG_ILLINOIS) += tcp_illinois.o
58obj-$(CONFIG_MEMCG_KMEM) += tcp_memcontrol.o 58obj-$(CONFIG_MEMCG_KMEM) += tcp_memcontrol.o
59obj-$(CONFIG_NETLABEL) += cipso_ipv4.o 59obj-$(CONFIG_NETLABEL) += cipso_ipv4.o
60obj-$(CONFIG_GENEVE_CORE) += geneve_core.o
61 60
62obj-$(CONFIG_XFRM) += xfrm4_policy.o xfrm4_state.o xfrm4_input.o \ 61obj-$(CONFIG_XFRM) += xfrm4_policy.o xfrm4_state.o xfrm4_input.o \
63 xfrm4_output.o xfrm4_protocol.o 62 xfrm4_output.o xfrm4_protocol.o
diff --git a/net/ipv4/geneve_core.c b/net/ipv4/geneve_core.c
deleted file mode 100644
index 311a4ba6950a..000000000000
--- a/net/ipv4/geneve_core.c
+++ /dev/null
@@ -1,447 +0,0 @@
1/*
2 * Geneve: Generic Network Virtualization Encapsulation
3 *
4 * Copyright (c) 2014 Nicira, Inc.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
10 */
11
12#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
13
14#include <linux/kernel.h>
15#include <linux/types.h>
16#include <linux/module.h>
17#include <linux/errno.h>
18#include <linux/slab.h>
19#include <linux/skbuff.h>
20#include <linux/list.h>
21#include <linux/netdevice.h>
22#include <linux/in.h>
23#include <linux/ip.h>
24#include <linux/udp.h>
25#include <linux/igmp.h>
26#include <linux/etherdevice.h>
27#include <linux/if_ether.h>
28#include <linux/if_vlan.h>
29#include <linux/ethtool.h>
30#include <linux/mutex.h>
31#include <net/arp.h>
32#include <net/ndisc.h>
33#include <net/ip.h>
34#include <net/ip_tunnels.h>
35#include <net/icmp.h>
36#include <net/udp.h>
37#include <net/rtnetlink.h>
38#include <net/route.h>
39#include <net/dsfield.h>
40#include <net/inet_ecn.h>
41#include <net/net_namespace.h>
42#include <net/netns/generic.h>
43#include <net/geneve.h>
44#include <net/protocol.h>
45#include <net/udp_tunnel.h>
46#if IS_ENABLED(CONFIG_IPV6)
47#include <net/ipv6.h>
48#include <net/addrconf.h>
49#include <net/ip6_tunnel.h>
50#include <net/ip6_checksum.h>
51#endif
52
53/* Protects sock_list and refcounts. */
54static DEFINE_MUTEX(geneve_mutex);
55
56/* per-network namespace private data for this module */
57struct geneve_net {
58 struct list_head sock_list;
59};
60
61static int geneve_net_id;
62
63static struct geneve_sock *geneve_find_sock(struct net *net,
64 sa_family_t family, __be16 port)
65{
66 struct geneve_net *gn = net_generic(net, geneve_net_id);
67 struct geneve_sock *gs;
68
69 list_for_each_entry(gs, &gn->sock_list, list) {
70 if (inet_sk(gs->sock->sk)->inet_sport == port &&
71 inet_sk(gs->sock->sk)->sk.sk_family == family)
72 return gs;
73 }
74
75 return NULL;
76}
77
78static void geneve_build_header(struct genevehdr *geneveh,
79 __be16 tun_flags, u8 vni[3],
80 u8 options_len, u8 *options)
81{
82 geneveh->ver = GENEVE_VER;
83 geneveh->opt_len = options_len / 4;
84 geneveh->oam = !!(tun_flags & TUNNEL_OAM);
85 geneveh->critical = !!(tun_flags & TUNNEL_CRIT_OPT);
86 geneveh->rsvd1 = 0;
87 memcpy(geneveh->vni, vni, 3);
88 geneveh->proto_type = htons(ETH_P_TEB);
89 geneveh->rsvd2 = 0;
90
91 memcpy(geneveh->options, options, options_len);
92}
93
94/* Transmit a fully formatted Geneve frame.
95 *
96 * When calling this function. The skb->data should point
97 * to the geneve header which is fully formed.
98 *
99 * This function will add other UDP tunnel headers.
100 */
101int geneve_xmit_skb(struct geneve_sock *gs, struct rtable *rt,
102 struct sk_buff *skb, __be32 src, __be32 dst, __u8 tos,
103 __u8 ttl, __be16 df, __be16 src_port, __be16 dst_port,
104 __be16 tun_flags, u8 vni[3], u8 opt_len, u8 *opt,
105 bool csum, bool xnet)
106{
107 struct genevehdr *gnvh;
108 int min_headroom;
109 int err;
110
111 min_headroom = LL_RESERVED_SPACE(rt->dst.dev) + rt->dst.header_len
112 + GENEVE_BASE_HLEN + opt_len + sizeof(struct iphdr)
113 + (skb_vlan_tag_present(skb) ? VLAN_HLEN : 0);
114
115 err = skb_cow_head(skb, min_headroom);
116 if (unlikely(err)) {
117 kfree_skb(skb);
118 return err;
119 }
120
121 skb = vlan_hwaccel_push_inside(skb);
122 if (unlikely(!skb))
123 return -ENOMEM;
124
125 skb = udp_tunnel_handle_offloads(skb, csum);
126 if (IS_ERR(skb))
127 return PTR_ERR(skb);
128
129 gnvh = (struct genevehdr *)__skb_push(skb, sizeof(*gnvh) + opt_len);
130 geneve_build_header(gnvh, tun_flags, vni, opt_len, opt);
131
132 skb_set_inner_protocol(skb, htons(ETH_P_TEB));
133
134 return udp_tunnel_xmit_skb(rt, gs->sock->sk, skb, src, dst,
135 tos, ttl, df, src_port, dst_port, xnet,
136 !csum);
137}
138EXPORT_SYMBOL_GPL(geneve_xmit_skb);
139
140static int geneve_hlen(struct genevehdr *gh)
141{
142 return sizeof(*gh) + gh->opt_len * 4;
143}
144
145static struct sk_buff **geneve_gro_receive(struct sk_buff **head,
146 struct sk_buff *skb,
147 struct udp_offload *uoff)
148{
149 struct sk_buff *p, **pp = NULL;
150 struct genevehdr *gh, *gh2;
151 unsigned int hlen, gh_len, off_gnv;
152 const struct packet_offload *ptype;
153 __be16 type;
154 int flush = 1;
155
156 off_gnv = skb_gro_offset(skb);
157 hlen = off_gnv + sizeof(*gh);
158 gh = skb_gro_header_fast(skb, off_gnv);
159 if (skb_gro_header_hard(skb, hlen)) {
160 gh = skb_gro_header_slow(skb, hlen, off_gnv);
161 if (unlikely(!gh))
162 goto out;
163 }
164
165 if (gh->ver != GENEVE_VER || gh->oam)
166 goto out;
167 gh_len = geneve_hlen(gh);
168
169 hlen = off_gnv + gh_len;
170 if (skb_gro_header_hard(skb, hlen)) {
171 gh = skb_gro_header_slow(skb, hlen, off_gnv);
172 if (unlikely(!gh))
173 goto out;
174 }
175
176 flush = 0;
177
178 for (p = *head; p; p = p->next) {
179 if (!NAPI_GRO_CB(p)->same_flow)
180 continue;
181
182 gh2 = (struct genevehdr *)(p->data + off_gnv);
183 if (gh->opt_len != gh2->opt_len ||
184 memcmp(gh, gh2, gh_len)) {
185 NAPI_GRO_CB(p)->same_flow = 0;
186 continue;
187 }
188 }
189
190 type = gh->proto_type;
191
192 rcu_read_lock();
193 ptype = gro_find_receive_by_type(type);
194 if (!ptype) {
195 flush = 1;
196 goto out_unlock;
197 }
198
199 skb_gro_pull(skb, gh_len);
200 skb_gro_postpull_rcsum(skb, gh, gh_len);
201 pp = ptype->callbacks.gro_receive(head, skb);
202
203out_unlock:
204 rcu_read_unlock();
205out:
206 NAPI_GRO_CB(skb)->flush |= flush;
207
208 return pp;
209}
210
211static int geneve_gro_complete(struct sk_buff *skb, int nhoff,
212 struct udp_offload *uoff)
213{
214 struct genevehdr *gh;
215 struct packet_offload *ptype;
216 __be16 type;
217 int gh_len;
218 int err = -ENOSYS;
219
220 udp_tunnel_gro_complete(skb, nhoff);
221
222 gh = (struct genevehdr *)(skb->data + nhoff);
223 gh_len = geneve_hlen(gh);
224 type = gh->proto_type;
225
226 rcu_read_lock();
227 ptype = gro_find_complete_by_type(type);
228 if (ptype)
229 err = ptype->callbacks.gro_complete(skb, nhoff + gh_len);
230
231 rcu_read_unlock();
232 return err;
233}
234
235static void geneve_notify_add_rx_port(struct geneve_sock *gs)
236{
237 struct sock *sk = gs->sock->sk;
238 sa_family_t sa_family = sk->sk_family;
239 int err;
240
241 if (sa_family == AF_INET) {
242 err = udp_add_offload(&gs->udp_offloads);
243 if (err)
244 pr_warn("geneve: udp_add_offload failed with status %d\n",
245 err);
246 }
247}
248
249static void geneve_notify_del_rx_port(struct geneve_sock *gs)
250{
251 struct sock *sk = gs->sock->sk;
252 sa_family_t sa_family = sk->sk_family;
253
254 if (sa_family == AF_INET)
255 udp_del_offload(&gs->udp_offloads);
256}
257
258/* Callback from net/ipv4/udp.c to receive packets */
259static int geneve_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
260{
261 struct genevehdr *geneveh;
262 struct geneve_sock *gs;
263 int opts_len;
264
265 /* Need Geneve and inner Ethernet header to be present */
266 if (unlikely(!pskb_may_pull(skb, GENEVE_BASE_HLEN)))
267 goto error;
268
269 /* Return packets with reserved bits set */
270 geneveh = geneve_hdr(skb);
271
272 if (unlikely(geneveh->ver != GENEVE_VER))
273 goto error;
274
275 if (unlikely(geneveh->proto_type != htons(ETH_P_TEB)))
276 goto error;
277
278 opts_len = geneveh->opt_len * 4;
279 if (iptunnel_pull_header(skb, GENEVE_BASE_HLEN + opts_len,
280 htons(ETH_P_TEB)))
281 goto drop;
282
283 gs = rcu_dereference_sk_user_data(sk);
284 if (!gs)
285 goto drop;
286
287 gs->rcv(gs, skb);
288 return 0;
289
290drop:
291 /* Consume bad packet */
292 kfree_skb(skb);
293 return 0;
294
295error:
296 /* Let the UDP layer deal with the skb */
297 return 1;
298}
299
300static struct socket *geneve_create_sock(struct net *net, bool ipv6,
301 __be16 port)
302{
303 struct socket *sock;
304 struct udp_port_cfg udp_conf;
305 int err;
306
307 memset(&udp_conf, 0, sizeof(udp_conf));
308
309 if (ipv6) {
310 udp_conf.family = AF_INET6;
311 } else {
312 udp_conf.family = AF_INET;
313 udp_conf.local_ip.s_addr = htonl(INADDR_ANY);
314 }
315
316 udp_conf.local_udp_port = port;
317
318 /* Open UDP socket */
319 err = udp_sock_create(net, &udp_conf, &sock);
320 if (err < 0)
321 return ERR_PTR(err);
322
323 return sock;
324}
325
326/* Create new listen socket if needed */
327static struct geneve_sock *geneve_socket_create(struct net *net, __be16 port,
328 geneve_rcv_t *rcv, void *data,
329 bool ipv6)
330{
331 struct geneve_net *gn = net_generic(net, geneve_net_id);
332 struct geneve_sock *gs;
333 struct socket *sock;
334 struct udp_tunnel_sock_cfg tunnel_cfg;
335
336 gs = kzalloc(sizeof(*gs), GFP_KERNEL);
337 if (!gs)
338 return ERR_PTR(-ENOMEM);
339
340 sock = geneve_create_sock(net, ipv6, port);
341 if (IS_ERR(sock)) {
342 kfree(gs);
343 return ERR_CAST(sock);
344 }
345
346 gs->sock = sock;
347 gs->refcnt = 1;
348 gs->rcv = rcv;
349 gs->rcv_data = data;
350
351 /* Initialize the geneve udp offloads structure */
352 gs->udp_offloads.port = port;
353 gs->udp_offloads.callbacks.gro_receive = geneve_gro_receive;
354 gs->udp_offloads.callbacks.gro_complete = geneve_gro_complete;
355 geneve_notify_add_rx_port(gs);
356
357 /* Mark socket as an encapsulation socket */
358 tunnel_cfg.sk_user_data = gs;
359 tunnel_cfg.encap_type = 1;
360 tunnel_cfg.encap_rcv = geneve_udp_encap_recv;
361 tunnel_cfg.encap_destroy = NULL;
362 setup_udp_tunnel_sock(net, sock, &tunnel_cfg);
363
364 list_add(&gs->list, &gn->sock_list);
365
366 return gs;
367}
368
369struct geneve_sock *geneve_sock_add(struct net *net, __be16 port,
370 geneve_rcv_t *rcv, void *data,
371 bool no_share, bool ipv6)
372{
373 struct geneve_sock *gs;
374
375 mutex_lock(&geneve_mutex);
376
377 gs = geneve_find_sock(net, ipv6 ? AF_INET6 : AF_INET, port);
378 if (gs) {
379 if (!no_share && gs->rcv == rcv)
380 gs->refcnt++;
381 else
382 gs = ERR_PTR(-EBUSY);
383 } else {
384 gs = geneve_socket_create(net, port, rcv, data, ipv6);
385 }
386
387 mutex_unlock(&geneve_mutex);
388
389 return gs;
390}
391EXPORT_SYMBOL_GPL(geneve_sock_add);
392
393void geneve_sock_release(struct geneve_sock *gs)
394{
395 mutex_lock(&geneve_mutex);
396
397 if (--gs->refcnt)
398 goto unlock;
399
400 list_del(&gs->list);
401 geneve_notify_del_rx_port(gs);
402 udp_tunnel_sock_release(gs->sock);
403 kfree_rcu(gs, rcu);
404
405unlock:
406 mutex_unlock(&geneve_mutex);
407}
408EXPORT_SYMBOL_GPL(geneve_sock_release);
409
410static __net_init int geneve_init_net(struct net *net)
411{
412 struct geneve_net *gn = net_generic(net, geneve_net_id);
413
414 INIT_LIST_HEAD(&gn->sock_list);
415
416 return 0;
417}
418
419static struct pernet_operations geneve_net_ops = {
420 .init = geneve_init_net,
421 .id = &geneve_net_id,
422 .size = sizeof(struct geneve_net),
423};
424
425static int __init geneve_init_module(void)
426{
427 int rc;
428
429 rc = register_pernet_subsys(&geneve_net_ops);
430 if (rc)
431 return rc;
432
433 pr_info("Geneve core logic\n");
434
435 return 0;
436}
437module_init(geneve_init_module);
438
439static void __exit geneve_cleanup_module(void)
440{
441 unregister_pernet_subsys(&geneve_net_ops);
442}
443module_exit(geneve_cleanup_module);
444
445MODULE_LICENSE("GPL");
446MODULE_AUTHOR("Jesse Gross <jesse@nicira.com>");
447MODULE_DESCRIPTION("Driver library for GENEVE encapsulated traffic");