dd23059477ef944c7b72c7033fb8e617e44a47fa
[cascardo/ovs.git] / datapath / linux / compat / lisp.c
1 /*
2  * Copyright (c) 2015 Nicira, Inc.
3  * Copyright (c) 2013 Cisco Systems, Inc.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of version 2 of the GNU General Public
7  * License as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * General Public License for more details.
13  *
14  */
15
16 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
17
18 #include <linux/version.h>
19
20 #include <linux/etherdevice.h>
21 #include <linux/in.h>
22 #include <linux/ip.h>
23 #include <linux/net.h>
24 #include <linux/module.h>
25 #include <linux/rculist.h>
26 #include <linux/udp.h>
27
28 #include <net/icmp.h>
29 #include <net/ip.h>
30 #include <net/lisp.h>
31 #include <net/net_namespace.h>
32 #include <net/netns/generic.h>
33 #include <net/route.h>
34 #include <net/udp.h>
35 #include <net/udp_tunnel.h>
36 #include <net/xfrm.h>
37
38 #include "datapath.h"
39 #include "gso.h"
40 #include "vport.h"
41 #include "gso.h"
42 #include "vport-netdev.h"
43
44 #define LISP_UDP_PORT           4341
45 #define LISP_NETDEV_VER         "0.1"
46 static int lisp_net_id;
47
48 /* Pseudo network device */
49 struct lisp_dev {
50         struct net         *net;        /* netns for packet i/o */
51         struct net_device  *dev;        /* netdev for lisp tunnel */
52         struct socket           *sock;
53         __be16             dst_port;
54         struct list_head   next;
55 };
56
57 /* per-network namespace private data for this module */
58 struct lisp_net {
59         struct list_head lisp_list;
60 };
61
62 /*
63  *  LISP encapsulation header:
64  *
65  *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
66  *  |N|L|E|V|I|flags|            Nonce/Map-Version                  |
67  *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
68  *  |                 Instance ID/Locator Status Bits               |
69  *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
70  *
71  */
72
73 /**
74  * struct lisphdr - LISP header
75  * @nonce_present: Flag indicating the presence of a 24 bit nonce value.
76  * @locator_status_bits_present: Flag indicating the presence of Locator Status
77  *                               Bits (LSB).
78  * @solicit_echo_nonce: Flag indicating the use of the echo noncing mechanism.
79  * @map_version_present: Flag indicating the use of mapping versioning.
80  * @instance_id_present: Flag indicating the presence of a 24 bit Instance ID.
81  * @reserved_flags: 3 bits reserved for future flags.
82  * @nonce: 24 bit nonce value.
83  * @map_version: 24 bit mapping version.
84  * @locator_status_bits: Locator Status Bits: 32 bits when instance_id_present
85  *                       is not set, 8 bits when it is.
86  * @instance_id: 24 bit Instance ID
87  */
88 struct lisphdr {
89 #ifdef __LITTLE_ENDIAN_BITFIELD
90         __u8 reserved_flags:3;
91         __u8 instance_id_present:1;
92         __u8 map_version_present:1;
93         __u8 solicit_echo_nonce:1;
94         __u8 locator_status_bits_present:1;
95         __u8 nonce_present:1;
96 #else
97         __u8 nonce_present:1;
98         __u8 locator_status_bits_present:1;
99         __u8 solicit_echo_nonce:1;
100         __u8 map_version_present:1;
101         __u8 instance_id_present:1;
102         __u8 reserved_flags:3;
103 #endif
104         union {
105                 __u8 nonce[3];
106                 __u8 map_version[3];
107         } u1;
108         union {
109                 __be32 locator_status_bits;
110                 struct {
111                         __u8 instance_id[3];
112                         __u8 locator_status_bits;
113                 } word2;
114         } u2;
115 };
116
117 #define LISP_HLEN (sizeof(struct udphdr) + sizeof(struct lisphdr))
118 #define LISP_MAX_MTU (IP_MAX_MTU - LISP_HLEN - sizeof(struct iphdr))
119
120 static inline struct lisphdr *lisp_hdr(const struct sk_buff *skb)
121 {
122         return (struct lisphdr *)(udp_hdr(skb) + 1);
123 }
124
125 /* Convert 64 bit tunnel ID to 24 bit Instance ID. */
126 static void tunnel_id_to_instance_id(__be64 tun_id, __u8 *iid)
127 {
128
129 #ifdef __BIG_ENDIAN
130         iid[0] = (__force __u8)(tun_id >> 16);
131         iid[1] = (__force __u8)(tun_id >> 8);
132         iid[2] = (__force __u8)tun_id;
133 #else
134         iid[0] = (__force __u8)((__force u64)tun_id >> 40);
135         iid[1] = (__force __u8)((__force u64)tun_id >> 48);
136         iid[2] = (__force __u8)((__force u64)tun_id >> 56);
137 #endif
138 }
139
140 /* Convert 24 bit Instance ID to 64 bit tunnel ID. */
141 static __be64 instance_id_to_tunnel_id(__u8 *iid)
142 {
143 #ifdef __BIG_ENDIAN
144         return (iid[0] << 16) | (iid[1] << 8) | iid[2];
145 #else
146         return (__force __be64)(((__force u64)iid[0] << 40) |
147                         ((__force u64)iid[1] << 48) |
148                         ((__force u64)iid[2] << 56));
149 #endif
150 }
151
152 /* Compute source UDP port for outgoing packet.
153  * Currently we use the flow hash.
154  */
155 static u16 get_src_port(struct net *net, struct sk_buff *skb)
156 {
157         u32 hash = skb_get_hash(skb);
158         unsigned int range;
159         int high;
160         int low;
161
162         if (!hash) {
163                 if (skb->protocol == htons(ETH_P_IP)) {
164                         struct iphdr *iph;
165                         int size = (sizeof(iph->saddr) * 2) / sizeof(u32);
166
167                         iph = (struct iphdr *) skb_network_header(skb);
168                         hash = jhash2((const u32 *)&iph->saddr, size, 0);
169                 } else if (skb->protocol == htons(ETH_P_IPV6)) {
170                         struct ipv6hdr *ipv6hdr;
171
172                         ipv6hdr = (struct ipv6hdr *) skb_network_header(skb);
173                         hash = jhash2((const u32 *)&ipv6hdr->saddr,
174                                         (sizeof(struct in6_addr) * 2) / sizeof(u32), 0);
175                 } else {
176                         pr_warn_once("LISP inner protocol is not IP when "
177                                         "calculating hash.\n");
178                 }
179         }
180
181         inet_get_local_port_range(net, &low, &high);
182         range = (high - low) + 1;
183         return (((u64) hash * range) >> 32) + low;
184 }
185
186 static void lisp_build_header(struct sk_buff *skb,
187                               const struct ip_tunnel_key *tun_key)
188 {
189         struct lisphdr *lisph;
190
191         lisph = (struct lisphdr *)__skb_push(skb, sizeof(struct lisphdr));
192         lisph->nonce_present = 0;       /* We don't support echo nonce algorithm */
193         lisph->locator_status_bits_present = 1; /* Set LSB */
194         lisph->solicit_echo_nonce = 0;  /* No echo noncing */
195         lisph->map_version_present = 0; /* No mapping versioning, nonce instead */
196         lisph->instance_id_present = 1; /* Store the tun_id as Instance ID  */
197         lisph->reserved_flags = 0;      /* Reserved flags, set to 0  */
198
199         lisph->u1.nonce[0] = 0;
200         lisph->u1.nonce[1] = 0;
201         lisph->u1.nonce[2] = 0;
202
203         tunnel_id_to_instance_id(tun_key->tun_id, &lisph->u2.word2.instance_id[0]);
204         lisph->u2.word2.locator_status_bits = 1;
205 }
206
207 /* Called with rcu_read_lock and BH disabled. */
208 static int lisp_rcv(struct sock *sk, struct sk_buff *skb)
209 {
210         struct lisp_dev *lisp_dev;
211         struct net_device *dev;
212         struct lisphdr *lisph;
213         struct iphdr *inner_iph;
214         struct metadata_dst *tun_dst;
215 #ifndef USE_UPSTREAM_TUNNEL
216         struct metadata_dst temp;
217 #endif
218         __be64 key;
219         struct ethhdr *ethh;
220         __be16 protocol;
221
222         dev = rcu_dereference_sk_user_data(sk);
223         if (unlikely(!dev))
224                 goto error;
225
226         lisp_dev = netdev_priv(dev);
227         if (iptunnel_pull_header(skb, LISP_HLEN, 0,
228                                  !net_eq(lisp_dev->net, dev_net(lisp_dev->dev))))
229                 goto error;
230
231         lisph = lisp_hdr(skb);
232
233         if (lisph->instance_id_present != 1)
234                 key = 0;
235         else
236                 key = instance_id_to_tunnel_id(&lisph->u2.word2.instance_id[0]);
237
238         /* Save outer tunnel values */
239 #ifndef USE_UPSTREAM_TUNNEL
240         tun_dst = &temp;
241         ovs_udp_tun_rx_dst(tun_dst, skb, AF_INET, TUNNEL_KEY, key, 0);
242 #else
243         tun_dst = udp_tun_rx_dst(skb, AF_INET, TUNNEL_KEY, key, 0);
244 #endif
245         /* Drop non-IP inner packets */
246         inner_iph = (struct iphdr *)(lisph + 1);
247         switch (inner_iph->version) {
248         case 4:
249                 protocol = htons(ETH_P_IP);
250                 break;
251         case 6:
252                 protocol = htons(ETH_P_IPV6);
253                 break;
254         default:
255                 goto error;
256         }
257         skb->protocol = protocol;
258
259         /* Add Ethernet header */
260         ethh = (struct ethhdr *)skb_push(skb, ETH_HLEN);
261         memset(ethh, 0, ETH_HLEN);
262         ethh->h_dest[0] = 0x02;
263         ethh->h_source[0] = 0x02;
264         ethh->h_proto = protocol;
265
266         ovs_ip_tunnel_rcv(dev, skb, tun_dst);
267         goto out;
268
269 error:
270         kfree_skb(skb);
271 out:
272         return 0;
273 }
274
275 static struct rtable *lisp_get_rt(struct sk_buff *skb,
276                                  struct net_device *dev,
277                                  struct flowi4 *fl,
278                                  const struct ip_tunnel_key *key)
279 {
280         struct net *net = dev_net(dev);
281
282         /* Route lookup */
283         memset(fl, 0, sizeof(*fl));
284         fl->daddr = key->u.ipv4.dst;
285         fl->saddr = key->u.ipv4.src;
286         fl->flowi4_tos = RT_TOS(key->tos);
287         fl->flowi4_mark = skb->mark;
288         fl->flowi4_proto = IPPROTO_UDP;
289
290         return ip_route_output_key(net, fl);
291 }
292
293 netdev_tx_t rpl_lisp_xmit(struct sk_buff *skb)
294 {
295         struct net_device *dev = skb->dev;
296         struct lisp_dev *lisp_dev = netdev_priv(dev);
297         struct net *net = lisp_dev->net;
298         int network_offset = skb_network_offset(skb);
299         struct ip_tunnel_info *info;
300         struct ip_tunnel_key *tun_key;
301         struct rtable *rt;
302         int min_headroom;
303         __be16 src_port, dst_port;
304         struct flowi4 fl;
305         __be16 df;
306         int err;
307
308         info = skb_tunnel_info(skb);
309         if (unlikely(!info)) {
310                 err = -EINVAL;
311                 goto error;
312         }
313
314         if (skb->protocol != htons(ETH_P_IP) &&
315                         skb->protocol != htons(ETH_P_IPV6)) {
316                 err = 0;
317                 goto error;
318         }
319
320         tun_key = &info->key;
321
322         rt = lisp_get_rt(skb, dev, &fl, tun_key);
323         if (IS_ERR(rt)) {
324                 err = PTR_ERR(rt);
325                 goto error;
326         }
327
328         min_headroom = LL_RESERVED_SPACE(rt->dst.dev) + rt->dst.header_len
329                 + sizeof(struct iphdr) + LISP_HLEN;
330
331         if (skb_headroom(skb) < min_headroom || skb_header_cloned(skb)) {
332                 int head_delta = SKB_DATA_ALIGN(min_headroom -
333                                 skb_headroom(skb) +
334                                 16);
335
336                 err = pskb_expand_head(skb, max_t(int, head_delta, 0),
337                                 0, GFP_ATOMIC);
338                 if (unlikely(err))
339                         goto err_free_rt;
340         }
341
342         /* Reset l2 headers. */
343         skb_pull(skb, network_offset);
344         skb_reset_mac_header(skb);
345         skb->vlan_tci = 0;
346
347         err = udp_tunnel_handle_offloads(skb, false, false);
348         if (err)
349                 goto err_free_rt;
350
351         src_port = htons(get_src_port(net, skb));
352         dst_port = lisp_dev->dst_port;
353
354         lisp_build_header(skb, tun_key);
355
356         skb->ignore_df = 1;
357
358         ovs_skb_set_inner_protocol(skb, skb->protocol);
359
360         df = tun_key->tun_flags & TUNNEL_DONT_FRAGMENT ? htons(IP_DF) : 0;
361         udp_tunnel_xmit_skb(rt, lisp_dev->sock->sk, skb,
362                             fl.saddr, tun_key->u.ipv4.dst,
363                             tun_key->tos, tun_key->ttl,
364                             df, src_port, dst_port, false, true);
365
366         return NETDEV_TX_OK;
367
368 err_free_rt:
369         ip_rt_put(rt);
370 error:
371         kfree_skb(skb);
372         return NETDEV_TX_OK;
373 }
374 EXPORT_SYMBOL(rpl_lisp_xmit);
375
376 /* Setup stats when device is created */
377 static int lisp_init(struct net_device *dev)
378 {
379         dev->tstats = (typeof(dev->tstats)) netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
380         if (!dev->tstats)
381                 return -ENOMEM;
382
383         return 0;
384 }
385
386 static void lisp_uninit(struct net_device *dev)
387 {
388         free_percpu(dev->tstats);
389 }
390
391 static struct socket *create_sock(struct net *net, bool ipv6,
392                                        __be16 port)
393 {
394         struct socket *sock;
395         struct udp_port_cfg udp_conf;
396         int err;
397
398         memset(&udp_conf, 0, sizeof(udp_conf));
399
400         if (ipv6) {
401                 udp_conf.family = AF_INET6;
402         } else {
403                 udp_conf.family = AF_INET;
404                 udp_conf.local_ip.s_addr = htonl(INADDR_ANY);
405         }
406
407         udp_conf.local_udp_port = port;
408
409         /* Open UDP socket */
410         err = udp_sock_create(net, &udp_conf, &sock);
411         if (err < 0)
412                 return ERR_PTR(err);
413
414         return sock;
415 }
416
417 static int lisp_open(struct net_device *dev)
418 {
419         struct lisp_dev *lisp = netdev_priv(dev);
420         struct udp_tunnel_sock_cfg tunnel_cfg;
421         struct net *net = lisp->net;
422
423         lisp->sock = create_sock(net, false, lisp->dst_port);
424         if (IS_ERR(lisp->sock))
425                 return PTR_ERR(lisp->sock);
426
427         /* Mark socket as an encapsulation socket */
428         tunnel_cfg.sk_user_data = dev;
429         tunnel_cfg.encap_type = 1;
430         tunnel_cfg.encap_rcv = lisp_rcv;
431         tunnel_cfg.encap_destroy = NULL;
432         setup_udp_tunnel_sock(net, lisp->sock, &tunnel_cfg);
433         return 0;
434 }
435
436 static int lisp_stop(struct net_device *dev)
437 {
438         struct lisp_dev *lisp = netdev_priv(dev);
439
440         udp_tunnel_sock_release(lisp->sock);
441         lisp->sock = NULL;
442         return 0;
443 }
444
445 static netdev_tx_t lisp_dev_xmit(struct sk_buff *skb, struct net_device *dev)
446 {
447 #ifdef USE_UPSTREAM_TUNNEL
448         return rpl_lisp_xmit(skb);
449 #else
450         /* Drop All packets coming from networking stack. OVS-CB is
451          * not initialized for these packets.
452          */
453
454         dev_kfree_skb(skb);
455         dev->stats.tx_dropped++;
456         return NETDEV_TX_OK;
457 #endif
458 }
459
460 static int lisp_change_mtu(struct net_device *dev, int new_mtu)
461 {
462         if (new_mtu < 68 || new_mtu > LISP_MAX_MTU)
463                 return -EINVAL;
464
465         dev->mtu = new_mtu;
466         return 0;
467 }
468
469 static int egress_ipv4_tun_info(struct net_device *dev, struct sk_buff *skb,
470                                 struct ip_tunnel_info *info,
471                                 __be16 sport, __be16 dport)
472 {
473         struct rtable *rt;
474         struct flowi4 fl4;
475
476         rt = lisp_get_rt(skb, dev, &fl4, &info->key);
477         if (IS_ERR(rt))
478                 return PTR_ERR(rt);
479         ip_rt_put(rt);
480
481         info->key.u.ipv4.src = fl4.saddr;
482         info->key.tp_src = sport;
483         info->key.tp_dst = dport;
484         return 0;
485 }
486
487 int ovs_lisp_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb)
488 {
489         struct lisp_dev *lisp = netdev_priv(dev);
490         struct net *net = lisp->net;
491         struct ip_tunnel_info *info = skb_tunnel_info(skb);
492         __be16 sport, dport;
493
494         sport = htons(get_src_port(net, skb));
495         dport = lisp->dst_port;
496
497         if (ip_tunnel_info_af(info) == AF_INET)
498                 return egress_ipv4_tun_info(dev, skb, info, sport, dport);
499         return -EINVAL;
500 }
501 EXPORT_SYMBOL_GPL(ovs_lisp_fill_metadata_dst);
502
503 static const struct net_device_ops lisp_netdev_ops = {
504         .ndo_init               = lisp_init,
505         .ndo_uninit             = lisp_uninit,
506         .ndo_get_stats64        = ip_tunnel_get_stats64,
507         .ndo_open               = lisp_open,
508         .ndo_stop               = lisp_stop,
509         .ndo_start_xmit         = lisp_dev_xmit,
510         .ndo_change_mtu         = lisp_change_mtu,
511         .ndo_validate_addr      = eth_validate_addr,
512         .ndo_set_mac_address    = eth_mac_addr,
513 #ifdef USE_UPSTREAM_TUNNEL
514 #ifdef HAVE_NDO_FILL_METADATA_DST
515         .ndo_fill_metadata_dst  = lisp_fill_metadata_dst,
516 #endif
517 #endif
518 };
519
520 static void lisp_get_drvinfo(struct net_device *dev,
521                 struct ethtool_drvinfo *drvinfo)
522 {
523         strlcpy(drvinfo->version, LISP_NETDEV_VER, sizeof(drvinfo->version));
524         strlcpy(drvinfo->driver, "lisp", sizeof(drvinfo->driver));
525 }
526
527 static const struct ethtool_ops lisp_ethtool_ops = {
528         .get_drvinfo    = lisp_get_drvinfo,
529         .get_link       = ethtool_op_get_link,
530 };
531
532 /* Info for udev, that this is a virtual tunnel endpoint */
533 static struct device_type lisp_type = {
534         .name = "lisp",
535 };
536
537 /* Initialize the device structure. */
538 static void lisp_setup(struct net_device *dev)
539 {
540         ether_setup(dev);
541
542         dev->netdev_ops = &lisp_netdev_ops;
543         dev->ethtool_ops = &lisp_ethtool_ops;
544         dev->destructor = free_netdev;
545
546         SET_NETDEV_DEVTYPE(dev, &lisp_type);
547
548         dev->features    |= NETIF_F_LLTX | NETIF_F_NETNS_LOCAL;
549         dev->features    |= NETIF_F_SG | NETIF_F_HW_CSUM;
550         dev->features    |= NETIF_F_RXCSUM;
551         dev->features    |= NETIF_F_GSO_SOFTWARE;
552
553 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)
554         dev->hw_features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_RXCSUM;
555         dev->hw_features |= NETIF_F_GSO_SOFTWARE;
556 #endif
557 #ifdef USE_UPSTREAM_TUNNEL
558         netif_keep_dst(dev);
559 #endif
560         dev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_NO_QUEUE;
561         eth_hw_addr_random(dev);
562 }
563
564 static const struct nla_policy lisp_policy[IFLA_LISP_MAX + 1] = {
565         [IFLA_LISP_PORT]              = { .type = NLA_U16 },
566 };
567
568 static int lisp_validate(struct nlattr *tb[], struct nlattr *data[])
569 {
570         if (tb[IFLA_ADDRESS]) {
571                 if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN)
572                         return -EINVAL;
573
574                 if (!is_valid_ether_addr(nla_data(tb[IFLA_ADDRESS])))
575                         return -EADDRNOTAVAIL;
576         }
577
578         return 0;
579 }
580
581 static struct lisp_dev *find_dev(struct net *net, __be16 dst_port)
582 {
583         struct lisp_net *ln = net_generic(net, lisp_net_id);
584         struct lisp_dev *dev;
585
586         list_for_each_entry(dev, &ln->lisp_list, next) {
587                 if (dev->dst_port == dst_port)
588                         return dev;
589         }
590         return NULL;
591 }
592
593 static int lisp_configure(struct net *net, struct net_device *dev,
594                           __be16 dst_port)
595 {
596         struct lisp_net *ln = net_generic(net, lisp_net_id);
597         struct lisp_dev *lisp = netdev_priv(dev);
598         int err;
599
600         lisp->net = net;
601         lisp->dev = dev;
602
603         lisp->dst_port = dst_port;
604
605         if (find_dev(net, dst_port))
606                 return -EBUSY;
607
608         err = lisp_change_mtu(dev, LISP_MAX_MTU);
609         if (err)
610                 return err;
611
612         err = register_netdevice(dev);
613         if (err)
614                 return err;
615
616         list_add(&lisp->next, &ln->lisp_list);
617         return 0;
618 }
619
620 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)
621 static int lisp_newlink(struct net *net, struct net_device *dev,
622                 struct nlattr *tb[], struct nlattr *data[])
623 {
624 #else
625 static int lisp_newlink(struct net_device *dev,
626                 struct nlattr *tb[], struct nlattr *data[])
627
628 {
629         struct net *net = &init_net;
630 #endif
631         __be16 dst_port = htons(LISP_UDP_PORT);
632
633         if (data[IFLA_LISP_PORT])
634                 dst_port = nla_get_be16(data[IFLA_LISP_PORT]);
635
636         return lisp_configure(net, dev, dst_port);
637 }
638
639 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)
640 static void lisp_dellink(struct net_device *dev, struct list_head *head)
641 #else
642 static void lisp_dellink(struct net_device *dev)
643 #endif
644 {
645         struct lisp_dev *lisp = netdev_priv(dev);
646
647         list_del(&lisp->next);
648         unregister_netdevice_queue(dev, head);
649 }
650
651 static size_t lisp_get_size(const struct net_device *dev)
652 {
653         return nla_total_size(sizeof(__be32));  /* IFLA_LISP_PORT */
654 }
655
656 static int lisp_fill_info(struct sk_buff *skb, const struct net_device *dev)
657 {
658         struct lisp_dev *lisp = netdev_priv(dev);
659
660         if (nla_put_be16(skb, IFLA_LISP_PORT, lisp->dst_port))
661                 goto nla_put_failure;
662
663         return 0;
664
665 nla_put_failure:
666         return -EMSGSIZE;
667 }
668
669 static struct rtnl_link_ops lisp_link_ops __read_mostly = {
670         .kind           = "lisp",
671         .maxtype        = IFLA_LISP_MAX,
672         .policy         = lisp_policy,
673         .priv_size      = sizeof(struct lisp_dev),
674         .setup          = lisp_setup,
675         .validate       = lisp_validate,
676         .newlink        = lisp_newlink,
677         .dellink        = lisp_dellink,
678         .get_size       = lisp_get_size,
679         .fill_info      = lisp_fill_info,
680 };
681
682 struct net_device *rpl_lisp_dev_create_fb(struct net *net, const char *name,
683                                       u8 name_assign_type, u16 dst_port)
684 {
685         struct nlattr *tb[IFLA_MAX + 1];
686         struct net_device *dev;
687         int err;
688
689         memset(tb, 0, sizeof(tb));
690         dev = rtnl_create_link(net, (char *) name, name_assign_type,
691                         &lisp_link_ops, tb);
692         if (IS_ERR(dev))
693                 return dev;
694
695         err = lisp_configure(net, dev, htons(dst_port));
696         if (err) {
697                 free_netdev(dev);
698                 return ERR_PTR(err);
699         }
700         return dev;
701 }
702 EXPORT_SYMBOL_GPL(rpl_lisp_dev_create_fb);
703
704 static int lisp_init_net(struct net *net)
705 {
706         struct lisp_net *ln = net_generic(net, lisp_net_id);
707
708         INIT_LIST_HEAD(&ln->lisp_list);
709         return 0;
710 }
711
712 static void lisp_exit_net(struct net *net)
713 {
714         struct lisp_net *ln = net_generic(net, lisp_net_id);
715         struct lisp_dev *lisp, *next;
716         struct net_device *dev, *aux;
717         LIST_HEAD(list);
718
719         rtnl_lock();
720
721         /* gather any lisp devices that were moved into this ns */
722         for_each_netdev_safe(net, dev, aux)
723                 if (dev->rtnl_link_ops == &lisp_link_ops)
724                         unregister_netdevice_queue(dev, &list);
725
726         list_for_each_entry_safe(lisp, next, &ln->lisp_list, next) {
727                 /* If lisp->dev is in the same netns, it was already added
728                  * to the lisp by the previous loop.
729                  */
730                 if (!net_eq(dev_net(lisp->dev), net))
731                         unregister_netdevice_queue(lisp->dev, &list);
732         }
733
734         /* unregister the devices gathered above */
735         unregister_netdevice_many(&list);
736         rtnl_unlock();
737 }
738
739 static struct pernet_operations lisp_net_ops = {
740         .init = lisp_init_net,
741         .exit = lisp_exit_net,
742         .id   = &lisp_net_id,
743         .size = sizeof(struct lisp_net),
744 };
745
746 int rpl_lisp_init_module(void)
747 {
748         int rc;
749
750         rc = register_pernet_subsys(&lisp_net_ops);
751         if (rc)
752                 goto out1;
753
754         rc = rtnl_link_register(&lisp_link_ops);
755         if (rc)
756                 goto out2;
757
758         pr_info("LISP tunneling driver\n");
759         return 0;
760 out2:
761         unregister_pernet_subsys(&lisp_net_ops);
762 out1:
763         return rc;
764 }
765
766 void rpl_lisp_cleanup_module(void)
767 {
768         rtnl_link_unregister(&lisp_link_ops);
769         unregister_pernet_subsys(&lisp_net_ops);
770 }