]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/blob - net/ipv6/ndisc.c
UBUNTU: Ubuntu-5.3.0-29.31
[mirror_ubuntu-eoan-kernel.git] / net / ipv6 / ndisc.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * Neighbour Discovery for IPv6
4 * Linux INET6 implementation
5 *
6 * Authors:
7 * Pedro Roque <roque@di.fc.ul.pt>
8 * Mike Shaver <shaver@ingenia.com>
9 */
10
11 /*
12 * Changes:
13 *
14 * Alexey I. Froloff : RFC6106 (DNSSL) support
15 * Pierre Ynard : export userland ND options
16 * through netlink (RDNSS support)
17 * Lars Fenneberg : fixed MTU setting on receipt
18 * of an RA.
19 * Janos Farkas : kmalloc failure checks
20 * Alexey Kuznetsov : state machine reworked
21 * and moved to net/core.
22 * Pekka Savola : RFC2461 validation
23 * YOSHIFUJI Hideaki @USAGI : Verify ND options properly
24 */
25
26 #define pr_fmt(fmt) "ICMPv6: " fmt
27
28 #include <linux/module.h>
29 #include <linux/errno.h>
30 #include <linux/types.h>
31 #include <linux/socket.h>
32 #include <linux/sockios.h>
33 #include <linux/sched.h>
34 #include <linux/net.h>
35 #include <linux/in6.h>
36 #include <linux/route.h>
37 #include <linux/init.h>
38 #include <linux/rcupdate.h>
39 #include <linux/slab.h>
40 #ifdef CONFIG_SYSCTL
41 #include <linux/sysctl.h>
42 #endif
43
44 #include <linux/if_addr.h>
45 #include <linux/if_ether.h>
46 #include <linux/if_arp.h>
47 #include <linux/ipv6.h>
48 #include <linux/icmpv6.h>
49 #include <linux/jhash.h>
50
51 #include <net/sock.h>
52 #include <net/snmp.h>
53
54 #include <net/ipv6.h>
55 #include <net/protocol.h>
56 #include <net/ndisc.h>
57 #include <net/ip6_route.h>
58 #include <net/addrconf.h>
59 #include <net/icmp.h>
60
61 #include <net/netlink.h>
62 #include <linux/rtnetlink.h>
63
64 #include <net/flow.h>
65 #include <net/ip6_checksum.h>
66 #include <net/inet_common.h>
67 #include <linux/proc_fs.h>
68
69 #include <linux/netfilter.h>
70 #include <linux/netfilter_ipv6.h>
71
72 static u32 ndisc_hash(const void *pkey,
73 const struct net_device *dev,
74 __u32 *hash_rnd);
75 static bool ndisc_key_eq(const struct neighbour *neigh, const void *pkey);
76 static bool ndisc_allow_add(const struct net_device *dev,
77 struct netlink_ext_ack *extack);
78 static int ndisc_constructor(struct neighbour *neigh);
79 static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb);
80 static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb);
81 static int pndisc_constructor(struct pneigh_entry *n);
82 static void pndisc_destructor(struct pneigh_entry *n);
83 static void pndisc_redo(struct sk_buff *skb);
84
85 static const struct neigh_ops ndisc_generic_ops = {
86 .family = AF_INET6,
87 .solicit = ndisc_solicit,
88 .error_report = ndisc_error_report,
89 .output = neigh_resolve_output,
90 .connected_output = neigh_connected_output,
91 };
92
93 static const struct neigh_ops ndisc_hh_ops = {
94 .family = AF_INET6,
95 .solicit = ndisc_solicit,
96 .error_report = ndisc_error_report,
97 .output = neigh_resolve_output,
98 .connected_output = neigh_resolve_output,
99 };
100
101
102 static const struct neigh_ops ndisc_direct_ops = {
103 .family = AF_INET6,
104 .output = neigh_direct_output,
105 .connected_output = neigh_direct_output,
106 };
107
108 struct neigh_table nd_tbl = {
109 .family = AF_INET6,
110 .key_len = sizeof(struct in6_addr),
111 .protocol = cpu_to_be16(ETH_P_IPV6),
112 .hash = ndisc_hash,
113 .key_eq = ndisc_key_eq,
114 .constructor = ndisc_constructor,
115 .pconstructor = pndisc_constructor,
116 .pdestructor = pndisc_destructor,
117 .proxy_redo = pndisc_redo,
118 .allow_add = ndisc_allow_add,
119 .id = "ndisc_cache",
120 .parms = {
121 .tbl = &nd_tbl,
122 .reachable_time = ND_REACHABLE_TIME,
123 .data = {
124 [NEIGH_VAR_MCAST_PROBES] = 3,
125 [NEIGH_VAR_UCAST_PROBES] = 3,
126 [NEIGH_VAR_RETRANS_TIME] = ND_RETRANS_TIMER,
127 [NEIGH_VAR_BASE_REACHABLE_TIME] = ND_REACHABLE_TIME,
128 [NEIGH_VAR_DELAY_PROBE_TIME] = 5 * HZ,
129 [NEIGH_VAR_GC_STALETIME] = 60 * HZ,
130 [NEIGH_VAR_QUEUE_LEN_BYTES] = SK_WMEM_MAX,
131 [NEIGH_VAR_PROXY_QLEN] = 64,
132 [NEIGH_VAR_ANYCAST_DELAY] = 1 * HZ,
133 [NEIGH_VAR_PROXY_DELAY] = (8 * HZ) / 10,
134 },
135 },
136 .gc_interval = 30 * HZ,
137 .gc_thresh1 = 128,
138 .gc_thresh2 = 512,
139 .gc_thresh3 = 1024,
140 };
141 EXPORT_SYMBOL_GPL(nd_tbl);
142
143 void __ndisc_fill_addr_option(struct sk_buff *skb, int type, void *data,
144 int data_len, int pad)
145 {
146 int space = __ndisc_opt_addr_space(data_len, pad);
147 u8 *opt = skb_put(skb, space);
148
149 opt[0] = type;
150 opt[1] = space>>3;
151
152 memset(opt + 2, 0, pad);
153 opt += pad;
154 space -= pad;
155
156 memcpy(opt+2, data, data_len);
157 data_len += 2;
158 opt += data_len;
159 space -= data_len;
160 if (space > 0)
161 memset(opt, 0, space);
162 }
163 EXPORT_SYMBOL_GPL(__ndisc_fill_addr_option);
164
165 static inline void ndisc_fill_addr_option(struct sk_buff *skb, int type,
166 void *data, u8 icmp6_type)
167 {
168 __ndisc_fill_addr_option(skb, type, data, skb->dev->addr_len,
169 ndisc_addr_option_pad(skb->dev->type));
170 ndisc_ops_fill_addr_option(skb->dev, skb, icmp6_type);
171 }
172
173 static inline void ndisc_fill_redirect_addr_option(struct sk_buff *skb,
174 void *ha,
175 const u8 *ops_data)
176 {
177 ndisc_fill_addr_option(skb, ND_OPT_TARGET_LL_ADDR, ha, NDISC_REDIRECT);
178 ndisc_ops_fill_redirect_addr_option(skb->dev, skb, ops_data);
179 }
180
181 static struct nd_opt_hdr *ndisc_next_option(struct nd_opt_hdr *cur,
182 struct nd_opt_hdr *end)
183 {
184 int type;
185 if (!cur || !end || cur >= end)
186 return NULL;
187 type = cur->nd_opt_type;
188 do {
189 cur = ((void *)cur) + (cur->nd_opt_len << 3);
190 } while (cur < end && cur->nd_opt_type != type);
191 return cur <= end && cur->nd_opt_type == type ? cur : NULL;
192 }
193
194 static inline int ndisc_is_useropt(const struct net_device *dev,
195 struct nd_opt_hdr *opt)
196 {
197 return opt->nd_opt_type == ND_OPT_RDNSS ||
198 opt->nd_opt_type == ND_OPT_DNSSL ||
199 ndisc_ops_is_useropt(dev, opt->nd_opt_type);
200 }
201
202 static struct nd_opt_hdr *ndisc_next_useropt(const struct net_device *dev,
203 struct nd_opt_hdr *cur,
204 struct nd_opt_hdr *end)
205 {
206 if (!cur || !end || cur >= end)
207 return NULL;
208 do {
209 cur = ((void *)cur) + (cur->nd_opt_len << 3);
210 } while (cur < end && !ndisc_is_useropt(dev, cur));
211 return cur <= end && ndisc_is_useropt(dev, cur) ? cur : NULL;
212 }
213
214 struct ndisc_options *ndisc_parse_options(const struct net_device *dev,
215 u8 *opt, int opt_len,
216 struct ndisc_options *ndopts)
217 {
218 struct nd_opt_hdr *nd_opt = (struct nd_opt_hdr *)opt;
219
220 if (!nd_opt || opt_len < 0 || !ndopts)
221 return NULL;
222 memset(ndopts, 0, sizeof(*ndopts));
223 while (opt_len) {
224 int l;
225 if (opt_len < sizeof(struct nd_opt_hdr))
226 return NULL;
227 l = nd_opt->nd_opt_len << 3;
228 if (opt_len < l || l == 0)
229 return NULL;
230 if (ndisc_ops_parse_options(dev, nd_opt, ndopts))
231 goto next_opt;
232 switch (nd_opt->nd_opt_type) {
233 case ND_OPT_SOURCE_LL_ADDR:
234 case ND_OPT_TARGET_LL_ADDR:
235 case ND_OPT_MTU:
236 case ND_OPT_NONCE:
237 case ND_OPT_REDIRECT_HDR:
238 if (ndopts->nd_opt_array[nd_opt->nd_opt_type]) {
239 ND_PRINTK(2, warn,
240 "%s: duplicated ND6 option found: type=%d\n",
241 __func__, nd_opt->nd_opt_type);
242 } else {
243 ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt;
244 }
245 break;
246 case ND_OPT_PREFIX_INFO:
247 ndopts->nd_opts_pi_end = nd_opt;
248 if (!ndopts->nd_opt_array[nd_opt->nd_opt_type])
249 ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt;
250 break;
251 #ifdef CONFIG_IPV6_ROUTE_INFO
252 case ND_OPT_ROUTE_INFO:
253 ndopts->nd_opts_ri_end = nd_opt;
254 if (!ndopts->nd_opts_ri)
255 ndopts->nd_opts_ri = nd_opt;
256 break;
257 #endif
258 default:
259 if (ndisc_is_useropt(dev, nd_opt)) {
260 ndopts->nd_useropts_end = nd_opt;
261 if (!ndopts->nd_useropts)
262 ndopts->nd_useropts = nd_opt;
263 } else {
264 /*
265 * Unknown options must be silently ignored,
266 * to accommodate future extension to the
267 * protocol.
268 */
269 ND_PRINTK(2, notice,
270 "%s: ignored unsupported option; type=%d, len=%d\n",
271 __func__,
272 nd_opt->nd_opt_type,
273 nd_opt->nd_opt_len);
274 }
275 }
276 next_opt:
277 opt_len -= l;
278 nd_opt = ((void *)nd_opt) + l;
279 }
280 return ndopts;
281 }
282
283 int ndisc_mc_map(const struct in6_addr *addr, char *buf, struct net_device *dev, int dir)
284 {
285 switch (dev->type) {
286 case ARPHRD_ETHER:
287 case ARPHRD_IEEE802: /* Not sure. Check it later. --ANK */
288 case ARPHRD_FDDI:
289 ipv6_eth_mc_map(addr, buf);
290 return 0;
291 case ARPHRD_ARCNET:
292 ipv6_arcnet_mc_map(addr, buf);
293 return 0;
294 case ARPHRD_INFINIBAND:
295 ipv6_ib_mc_map(addr, dev->broadcast, buf);
296 return 0;
297 case ARPHRD_IPGRE:
298 return ipv6_ipgre_mc_map(addr, dev->broadcast, buf);
299 default:
300 if (dir) {
301 memcpy(buf, dev->broadcast, dev->addr_len);
302 return 0;
303 }
304 }
305 return -EINVAL;
306 }
307 EXPORT_SYMBOL(ndisc_mc_map);
308
309 static u32 ndisc_hash(const void *pkey,
310 const struct net_device *dev,
311 __u32 *hash_rnd)
312 {
313 return ndisc_hashfn(pkey, dev, hash_rnd);
314 }
315
316 static bool ndisc_key_eq(const struct neighbour *n, const void *pkey)
317 {
318 return neigh_key_eq128(n, pkey);
319 }
320
321 static int ndisc_constructor(struct neighbour *neigh)
322 {
323 struct in6_addr *addr = (struct in6_addr *)&neigh->primary_key;
324 struct net_device *dev = neigh->dev;
325 struct inet6_dev *in6_dev;
326 struct neigh_parms *parms;
327 bool is_multicast = ipv6_addr_is_multicast(addr);
328
329 in6_dev = in6_dev_get(dev);
330 if (!in6_dev) {
331 return -EINVAL;
332 }
333
334 parms = in6_dev->nd_parms;
335 __neigh_parms_put(neigh->parms);
336 neigh->parms = neigh_parms_clone(parms);
337
338 neigh->type = is_multicast ? RTN_MULTICAST : RTN_UNICAST;
339 if (!dev->header_ops) {
340 neigh->nud_state = NUD_NOARP;
341 neigh->ops = &ndisc_direct_ops;
342 neigh->output = neigh_direct_output;
343 } else {
344 if (is_multicast) {
345 neigh->nud_state = NUD_NOARP;
346 ndisc_mc_map(addr, neigh->ha, dev, 1);
347 } else if (dev->flags&(IFF_NOARP|IFF_LOOPBACK)) {
348 neigh->nud_state = NUD_NOARP;
349 memcpy(neigh->ha, dev->dev_addr, dev->addr_len);
350 if (dev->flags&IFF_LOOPBACK)
351 neigh->type = RTN_LOCAL;
352 } else if (dev->flags&IFF_POINTOPOINT) {
353 neigh->nud_state = NUD_NOARP;
354 memcpy(neigh->ha, dev->broadcast, dev->addr_len);
355 }
356 if (dev->header_ops->cache)
357 neigh->ops = &ndisc_hh_ops;
358 else
359 neigh->ops = &ndisc_generic_ops;
360 if (neigh->nud_state&NUD_VALID)
361 neigh->output = neigh->ops->connected_output;
362 else
363 neigh->output = neigh->ops->output;
364 }
365 in6_dev_put(in6_dev);
366 return 0;
367 }
368
369 static int pndisc_constructor(struct pneigh_entry *n)
370 {
371 struct in6_addr *addr = (struct in6_addr *)&n->key;
372 struct in6_addr maddr;
373 struct net_device *dev = n->dev;
374
375 if (!dev || !__in6_dev_get(dev))
376 return -EINVAL;
377 addrconf_addr_solict_mult(addr, &maddr);
378 ipv6_dev_mc_inc(dev, &maddr);
379 return 0;
380 }
381
382 static void pndisc_destructor(struct pneigh_entry *n)
383 {
384 struct in6_addr *addr = (struct in6_addr *)&n->key;
385 struct in6_addr maddr;
386 struct net_device *dev = n->dev;
387
388 if (!dev || !__in6_dev_get(dev))
389 return;
390 addrconf_addr_solict_mult(addr, &maddr);
391 ipv6_dev_mc_dec(dev, &maddr);
392 }
393
394 /* called with rtnl held */
395 static bool ndisc_allow_add(const struct net_device *dev,
396 struct netlink_ext_ack *extack)
397 {
398 struct inet6_dev *idev = __in6_dev_get(dev);
399
400 if (!idev || idev->cnf.disable_ipv6) {
401 NL_SET_ERR_MSG(extack, "IPv6 is disabled on this device");
402 return false;
403 }
404
405 return true;
406 }
407
408 static struct sk_buff *ndisc_alloc_skb(struct net_device *dev,
409 int len)
410 {
411 int hlen = LL_RESERVED_SPACE(dev);
412 int tlen = dev->needed_tailroom;
413 struct sock *sk = dev_net(dev)->ipv6.ndisc_sk;
414 struct sk_buff *skb;
415
416 skb = alloc_skb(hlen + sizeof(struct ipv6hdr) + len + tlen, GFP_ATOMIC);
417 if (!skb) {
418 ND_PRINTK(0, err, "ndisc: %s failed to allocate an skb\n",
419 __func__);
420 return NULL;
421 }
422
423 skb->protocol = htons(ETH_P_IPV6);
424 skb->dev = dev;
425
426 skb_reserve(skb, hlen + sizeof(struct ipv6hdr));
427 skb_reset_transport_header(skb);
428
429 /* Manually assign socket ownership as we avoid calling
430 * sock_alloc_send_pskb() to bypass wmem buffer limits
431 */
432 skb_set_owner_w(skb, sk);
433
434 return skb;
435 }
436
437 static void ip6_nd_hdr(struct sk_buff *skb,
438 const struct in6_addr *saddr,
439 const struct in6_addr *daddr,
440 int hop_limit, int len)
441 {
442 struct ipv6hdr *hdr;
443 struct inet6_dev *idev;
444 unsigned tclass;
445
446 rcu_read_lock();
447 idev = __in6_dev_get(skb->dev);
448 tclass = idev ? idev->cnf.ndisc_tclass : 0;
449 rcu_read_unlock();
450
451 skb_push(skb, sizeof(*hdr));
452 skb_reset_network_header(skb);
453 hdr = ipv6_hdr(skb);
454
455 ip6_flow_hdr(hdr, tclass, 0);
456
457 hdr->payload_len = htons(len);
458 hdr->nexthdr = IPPROTO_ICMPV6;
459 hdr->hop_limit = hop_limit;
460
461 hdr->saddr = *saddr;
462 hdr->daddr = *daddr;
463 }
464
465 static void ndisc_send_skb(struct sk_buff *skb,
466 const struct in6_addr *daddr,
467 const struct in6_addr *saddr)
468 {
469 struct dst_entry *dst = skb_dst(skb);
470 struct net *net = dev_net(skb->dev);
471 struct sock *sk = net->ipv6.ndisc_sk;
472 struct inet6_dev *idev;
473 int err;
474 struct icmp6hdr *icmp6h = icmp6_hdr(skb);
475 u8 type;
476
477 type = icmp6h->icmp6_type;
478
479 if (!dst) {
480 struct flowi6 fl6;
481 int oif = skb->dev->ifindex;
482
483 icmpv6_flow_init(sk, &fl6, type, saddr, daddr, oif);
484 dst = icmp6_dst_alloc(skb->dev, &fl6);
485 if (IS_ERR(dst)) {
486 kfree_skb(skb);
487 return;
488 }
489
490 skb_dst_set(skb, dst);
491 }
492
493 icmp6h->icmp6_cksum = csum_ipv6_magic(saddr, daddr, skb->len,
494 IPPROTO_ICMPV6,
495 csum_partial(icmp6h,
496 skb->len, 0));
497
498 ip6_nd_hdr(skb, saddr, daddr, inet6_sk(sk)->hop_limit, skb->len);
499
500 rcu_read_lock();
501 idev = __in6_dev_get(dst->dev);
502 IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len);
503
504 err = NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT,
505 net, sk, skb, NULL, dst->dev,
506 dst_output);
507 if (!err) {
508 ICMP6MSGOUT_INC_STATS(net, idev, type);
509 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS);
510 }
511
512 rcu_read_unlock();
513 }
514
515 void ndisc_send_na(struct net_device *dev, const struct in6_addr *daddr,
516 const struct in6_addr *solicited_addr,
517 bool router, bool solicited, bool override, bool inc_opt)
518 {
519 struct sk_buff *skb;
520 struct in6_addr tmpaddr;
521 struct inet6_ifaddr *ifp;
522 const struct in6_addr *src_addr;
523 struct nd_msg *msg;
524 int optlen = 0;
525
526 /* for anycast or proxy, solicited_addr != src_addr */
527 ifp = ipv6_get_ifaddr(dev_net(dev), solicited_addr, dev, 1);
528 if (ifp) {
529 src_addr = solicited_addr;
530 if (ifp->flags & IFA_F_OPTIMISTIC)
531 override = false;
532 inc_opt |= ifp->idev->cnf.force_tllao;
533 in6_ifa_put(ifp);
534 } else {
535 if (ipv6_dev_get_saddr(dev_net(dev), dev, daddr,
536 inet6_sk(dev_net(dev)->ipv6.ndisc_sk)->srcprefs,
537 &tmpaddr))
538 return;
539 src_addr = &tmpaddr;
540 }
541
542 if (!dev->addr_len)
543 inc_opt = false;
544 if (inc_opt)
545 optlen += ndisc_opt_addr_space(dev,
546 NDISC_NEIGHBOUR_ADVERTISEMENT);
547
548 skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
549 if (!skb)
550 return;
551
552 msg = skb_put(skb, sizeof(*msg));
553 *msg = (struct nd_msg) {
554 .icmph = {
555 .icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT,
556 .icmp6_router = router,
557 .icmp6_solicited = solicited,
558 .icmp6_override = override,
559 },
560 .target = *solicited_addr,
561 };
562
563 if (inc_opt)
564 ndisc_fill_addr_option(skb, ND_OPT_TARGET_LL_ADDR,
565 dev->dev_addr,
566 NDISC_NEIGHBOUR_ADVERTISEMENT);
567
568 ndisc_send_skb(skb, daddr, src_addr);
569 }
570
571 static void ndisc_send_unsol_na(struct net_device *dev)
572 {
573 struct inet6_dev *idev;
574 struct inet6_ifaddr *ifa;
575
576 idev = in6_dev_get(dev);
577 if (!idev)
578 return;
579
580 read_lock_bh(&idev->lock);
581 list_for_each_entry(ifa, &idev->addr_list, if_list) {
582 /* skip tentative addresses until dad completes */
583 if (ifa->flags & IFA_F_TENTATIVE &&
584 !(ifa->flags & IFA_F_OPTIMISTIC))
585 continue;
586
587 ndisc_send_na(dev, &in6addr_linklocal_allnodes, &ifa->addr,
588 /*router=*/ !!idev->cnf.forwarding,
589 /*solicited=*/ false, /*override=*/ true,
590 /*inc_opt=*/ true);
591 }
592 read_unlock_bh(&idev->lock);
593
594 in6_dev_put(idev);
595 }
596
597 void ndisc_send_ns(struct net_device *dev, const struct in6_addr *solicit,
598 const struct in6_addr *daddr, const struct in6_addr *saddr,
599 u64 nonce)
600 {
601 struct sk_buff *skb;
602 struct in6_addr addr_buf;
603 int inc_opt = dev->addr_len;
604 int optlen = 0;
605 struct nd_msg *msg;
606
607 if (!saddr) {
608 if (ipv6_get_lladdr(dev, &addr_buf,
609 (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)))
610 return;
611 saddr = &addr_buf;
612 }
613
614 if (ipv6_addr_any(saddr))
615 inc_opt = false;
616 if (inc_opt)
617 optlen += ndisc_opt_addr_space(dev,
618 NDISC_NEIGHBOUR_SOLICITATION);
619 if (nonce != 0)
620 optlen += 8;
621
622 skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
623 if (!skb)
624 return;
625
626 msg = skb_put(skb, sizeof(*msg));
627 *msg = (struct nd_msg) {
628 .icmph = {
629 .icmp6_type = NDISC_NEIGHBOUR_SOLICITATION,
630 },
631 .target = *solicit,
632 };
633
634 if (inc_opt)
635 ndisc_fill_addr_option(skb, ND_OPT_SOURCE_LL_ADDR,
636 dev->dev_addr,
637 NDISC_NEIGHBOUR_SOLICITATION);
638 if (nonce != 0) {
639 u8 *opt = skb_put(skb, 8);
640
641 opt[0] = ND_OPT_NONCE;
642 opt[1] = 8 >> 3;
643 memcpy(opt + 2, &nonce, 6);
644 }
645
646 ndisc_send_skb(skb, daddr, saddr);
647 }
648
649 void ndisc_send_rs(struct net_device *dev, const struct in6_addr *saddr,
650 const struct in6_addr *daddr)
651 {
652 struct sk_buff *skb;
653 struct rs_msg *msg;
654 int send_sllao = dev->addr_len;
655 int optlen = 0;
656
657 #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
658 /*
659 * According to section 2.2 of RFC 4429, we must not
660 * send router solicitations with a sllao from
661 * optimistic addresses, but we may send the solicitation
662 * if we don't include the sllao. So here we check
663 * if our address is optimistic, and if so, we
664 * suppress the inclusion of the sllao.
665 */
666 if (send_sllao) {
667 struct inet6_ifaddr *ifp = ipv6_get_ifaddr(dev_net(dev), saddr,
668 dev, 1);
669 if (ifp) {
670 if (ifp->flags & IFA_F_OPTIMISTIC) {
671 send_sllao = 0;
672 }
673 in6_ifa_put(ifp);
674 } else {
675 send_sllao = 0;
676 }
677 }
678 #endif
679 if (send_sllao)
680 optlen += ndisc_opt_addr_space(dev, NDISC_ROUTER_SOLICITATION);
681
682 skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
683 if (!skb)
684 return;
685
686 msg = skb_put(skb, sizeof(*msg));
687 *msg = (struct rs_msg) {
688 .icmph = {
689 .icmp6_type = NDISC_ROUTER_SOLICITATION,
690 },
691 };
692
693 if (send_sllao)
694 ndisc_fill_addr_option(skb, ND_OPT_SOURCE_LL_ADDR,
695 dev->dev_addr,
696 NDISC_ROUTER_SOLICITATION);
697
698 ndisc_send_skb(skb, daddr, saddr);
699 }
700
701
702 static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb)
703 {
704 /*
705 * "The sender MUST return an ICMP
706 * destination unreachable"
707 */
708 dst_link_failure(skb);
709 kfree_skb(skb);
710 }
711
712 /* Called with locked neigh: either read or both */
713
714 static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb)
715 {
716 struct in6_addr *saddr = NULL;
717 struct in6_addr mcaddr;
718 struct net_device *dev = neigh->dev;
719 struct in6_addr *target = (struct in6_addr *)&neigh->primary_key;
720 int probes = atomic_read(&neigh->probes);
721
722 if (skb && ipv6_chk_addr_and_flags(dev_net(dev), &ipv6_hdr(skb)->saddr,
723 dev, false, 1,
724 IFA_F_TENTATIVE|IFA_F_OPTIMISTIC))
725 saddr = &ipv6_hdr(skb)->saddr;
726 probes -= NEIGH_VAR(neigh->parms, UCAST_PROBES);
727 if (probes < 0) {
728 if (!(neigh->nud_state & NUD_VALID)) {
729 ND_PRINTK(1, dbg,
730 "%s: trying to ucast probe in NUD_INVALID: %pI6\n",
731 __func__, target);
732 }
733 ndisc_send_ns(dev, target, target, saddr, 0);
734 } else if ((probes -= NEIGH_VAR(neigh->parms, APP_PROBES)) < 0) {
735 neigh_app_ns(neigh);
736 } else {
737 addrconf_addr_solict_mult(target, &mcaddr);
738 ndisc_send_ns(dev, target, &mcaddr, saddr, 0);
739 }
740 }
741
742 static int pndisc_is_router(const void *pkey,
743 struct net_device *dev)
744 {
745 struct pneigh_entry *n;
746 int ret = -1;
747
748 read_lock_bh(&nd_tbl.lock);
749 n = __pneigh_lookup(&nd_tbl, dev_net(dev), pkey, dev);
750 if (n)
751 ret = !!(n->flags & NTF_ROUTER);
752 read_unlock_bh(&nd_tbl.lock);
753
754 return ret;
755 }
756
757 void ndisc_update(const struct net_device *dev, struct neighbour *neigh,
758 const u8 *lladdr, u8 new, u32 flags, u8 icmp6_type,
759 struct ndisc_options *ndopts)
760 {
761 neigh_update(neigh, lladdr, new, flags, 0);
762 /* report ndisc ops about neighbour update */
763 ndisc_ops_update(dev, neigh, flags, icmp6_type, ndopts);
764 }
765
766 static void ndisc_recv_ns(struct sk_buff *skb)
767 {
768 struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb);
769 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
770 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr;
771 u8 *lladdr = NULL;
772 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) +
773 offsetof(struct nd_msg, opt));
774 struct ndisc_options ndopts;
775 struct net_device *dev = skb->dev;
776 struct inet6_ifaddr *ifp;
777 struct inet6_dev *idev = NULL;
778 struct neighbour *neigh;
779 int dad = ipv6_addr_any(saddr);
780 bool inc;
781 int is_router = -1;
782 u64 nonce = 0;
783
784 if (skb->len < sizeof(struct nd_msg)) {
785 ND_PRINTK(2, warn, "NS: packet too short\n");
786 return;
787 }
788
789 if (ipv6_addr_is_multicast(&msg->target)) {
790 ND_PRINTK(2, warn, "NS: multicast target address\n");
791 return;
792 }
793
794 /*
795 * RFC2461 7.1.1:
796 * DAD has to be destined for solicited node multicast address.
797 */
798 if (dad && !ipv6_addr_is_solict_mult(daddr)) {
799 ND_PRINTK(2, warn, "NS: bad DAD packet (wrong destination)\n");
800 return;
801 }
802
803 if (!ndisc_parse_options(dev, msg->opt, ndoptlen, &ndopts)) {
804 ND_PRINTK(2, warn, "NS: invalid ND options\n");
805 return;
806 }
807
808 if (ndopts.nd_opts_src_lladdr) {
809 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr, dev);
810 if (!lladdr) {
811 ND_PRINTK(2, warn,
812 "NS: invalid link-layer address length\n");
813 return;
814 }
815
816 /* RFC2461 7.1.1:
817 * If the IP source address is the unspecified address,
818 * there MUST NOT be source link-layer address option
819 * in the message.
820 */
821 if (dad) {
822 ND_PRINTK(2, warn,
823 "NS: bad DAD packet (link-layer address option)\n");
824 return;
825 }
826 }
827 if (ndopts.nd_opts_nonce && ndopts.nd_opts_nonce->nd_opt_len == 1)
828 memcpy(&nonce, (u8 *)(ndopts.nd_opts_nonce + 1), 6);
829
830 inc = ipv6_addr_is_multicast(daddr);
831
832 ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1);
833 if (ifp) {
834 have_ifp:
835 if (ifp->flags & (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)) {
836 if (dad) {
837 if (nonce != 0 && ifp->dad_nonce == nonce) {
838 u8 *np = (u8 *)&nonce;
839 /* Matching nonce if looped back */
840 ND_PRINTK(2, notice,
841 "%s: IPv6 DAD loopback for address %pI6c nonce %pM ignored\n",
842 ifp->idev->dev->name,
843 &ifp->addr, np);
844 goto out;
845 }
846 /*
847 * We are colliding with another node
848 * who is doing DAD
849 * so fail our DAD process
850 */
851 addrconf_dad_failure(skb, ifp);
852 return;
853 } else {
854 /*
855 * This is not a dad solicitation.
856 * If we are an optimistic node,
857 * we should respond.
858 * Otherwise, we should ignore it.
859 */
860 if (!(ifp->flags & IFA_F_OPTIMISTIC))
861 goto out;
862 }
863 }
864
865 idev = ifp->idev;
866 } else {
867 struct net *net = dev_net(dev);
868
869 /* perhaps an address on the master device */
870 if (netif_is_l3_slave(dev)) {
871 struct net_device *mdev;
872
873 mdev = netdev_master_upper_dev_get_rcu(dev);
874 if (mdev) {
875 ifp = ipv6_get_ifaddr(net, &msg->target, mdev, 1);
876 if (ifp)
877 goto have_ifp;
878 }
879 }
880
881 idev = in6_dev_get(dev);
882 if (!idev) {
883 /* XXX: count this drop? */
884 return;
885 }
886
887 if (ipv6_chk_acast_addr(net, dev, &msg->target) ||
888 (idev->cnf.forwarding &&
889 (net->ipv6.devconf_all->proxy_ndp || idev->cnf.proxy_ndp) &&
890 (is_router = pndisc_is_router(&msg->target, dev)) >= 0)) {
891 if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) &&
892 skb->pkt_type != PACKET_HOST &&
893 inc &&
894 NEIGH_VAR(idev->nd_parms, PROXY_DELAY) != 0) {
895 /*
896 * for anycast or proxy,
897 * sender should delay its response
898 * by a random time between 0 and
899 * MAX_ANYCAST_DELAY_TIME seconds.
900 * (RFC2461) -- yoshfuji
901 */
902 struct sk_buff *n = skb_clone(skb, GFP_ATOMIC);
903 if (n)
904 pneigh_enqueue(&nd_tbl, idev->nd_parms, n);
905 goto out;
906 }
907 } else
908 goto out;
909 }
910
911 if (is_router < 0)
912 is_router = idev->cnf.forwarding;
913
914 if (dad) {
915 ndisc_send_na(dev, &in6addr_linklocal_allnodes, &msg->target,
916 !!is_router, false, (ifp != NULL), true);
917 goto out;
918 }
919
920 if (inc)
921 NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_mcast);
922 else
923 NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_ucast);
924
925 /*
926 * update / create cache entry
927 * for the source address
928 */
929 neigh = __neigh_lookup(&nd_tbl, saddr, dev,
930 !inc || lladdr || !dev->addr_len);
931 if (neigh)
932 ndisc_update(dev, neigh, lladdr, NUD_STALE,
933 NEIGH_UPDATE_F_WEAK_OVERRIDE|
934 NEIGH_UPDATE_F_OVERRIDE,
935 NDISC_NEIGHBOUR_SOLICITATION, &ndopts);
936 if (neigh || !dev->header_ops) {
937 ndisc_send_na(dev, saddr, &msg->target, !!is_router,
938 true, (ifp != NULL && inc), inc);
939 if (neigh)
940 neigh_release(neigh);
941 }
942
943 out:
944 if (ifp)
945 in6_ifa_put(ifp);
946 else
947 in6_dev_put(idev);
948 }
949
950 static void ndisc_recv_na(struct sk_buff *skb)
951 {
952 struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb);
953 struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
954 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr;
955 u8 *lladdr = NULL;
956 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) +
957 offsetof(struct nd_msg, opt));
958 struct ndisc_options ndopts;
959 struct net_device *dev = skb->dev;
960 struct inet6_dev *idev = __in6_dev_get(dev);
961 struct inet6_ifaddr *ifp;
962 struct neighbour *neigh;
963
964 if (skb->len < sizeof(struct nd_msg)) {
965 ND_PRINTK(2, warn, "NA: packet too short\n");
966 return;
967 }
968
969 if (ipv6_addr_is_multicast(&msg->target)) {
970 ND_PRINTK(2, warn, "NA: target address is multicast\n");
971 return;
972 }
973
974 if (ipv6_addr_is_multicast(daddr) &&
975 msg->icmph.icmp6_solicited) {
976 ND_PRINTK(2, warn, "NA: solicited NA is multicasted\n");
977 return;
978 }
979
980 /* For some 802.11 wireless deployments (and possibly other networks),
981 * there will be a NA proxy and unsolicitd packets are attacks
982 * and thus should not be accepted.
983 */
984 if (!msg->icmph.icmp6_solicited && idev &&
985 idev->cnf.drop_unsolicited_na)
986 return;
987
988 if (!ndisc_parse_options(dev, msg->opt, ndoptlen, &ndopts)) {
989 ND_PRINTK(2, warn, "NS: invalid ND option\n");
990 return;
991 }
992 if (ndopts.nd_opts_tgt_lladdr) {
993 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_tgt_lladdr, dev);
994 if (!lladdr) {
995 ND_PRINTK(2, warn,
996 "NA: invalid link-layer address length\n");
997 return;
998 }
999 }
1000 ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1);
1001 if (ifp) {
1002 if (skb->pkt_type != PACKET_LOOPBACK
1003 && (ifp->flags & IFA_F_TENTATIVE)) {
1004 addrconf_dad_failure(skb, ifp);
1005 return;
1006 }
1007 /* What should we make now? The advertisement
1008 is invalid, but ndisc specs say nothing
1009 about it. It could be misconfiguration, or
1010 an smart proxy agent tries to help us :-)
1011
1012 We should not print the error if NA has been
1013 received from loopback - it is just our own
1014 unsolicited advertisement.
1015 */
1016 if (skb->pkt_type != PACKET_LOOPBACK)
1017 ND_PRINTK(1, warn,
1018 "NA: %pM advertised our address %pI6c on %s!\n",
1019 eth_hdr(skb)->h_source, &ifp->addr, ifp->idev->dev->name);
1020 in6_ifa_put(ifp);
1021 return;
1022 }
1023 neigh = neigh_lookup(&nd_tbl, &msg->target, dev);
1024
1025 if (neigh) {
1026 u8 old_flags = neigh->flags;
1027 struct net *net = dev_net(dev);
1028
1029 if (neigh->nud_state & NUD_FAILED)
1030 goto out;
1031
1032 /*
1033 * Don't update the neighbor cache entry on a proxy NA from
1034 * ourselves because either the proxied node is off link or it
1035 * has already sent a NA to us.
1036 */
1037 if (lladdr && !memcmp(lladdr, dev->dev_addr, dev->addr_len) &&
1038 net->ipv6.devconf_all->forwarding && net->ipv6.devconf_all->proxy_ndp &&
1039 pneigh_lookup(&nd_tbl, net, &msg->target, dev, 0)) {
1040 /* XXX: idev->cnf.proxy_ndp */
1041 goto out;
1042 }
1043
1044 ndisc_update(dev, neigh, lladdr,
1045 msg->icmph.icmp6_solicited ? NUD_REACHABLE : NUD_STALE,
1046 NEIGH_UPDATE_F_WEAK_OVERRIDE|
1047 (msg->icmph.icmp6_override ? NEIGH_UPDATE_F_OVERRIDE : 0)|
1048 NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
1049 (msg->icmph.icmp6_router ? NEIGH_UPDATE_F_ISROUTER : 0),
1050 NDISC_NEIGHBOUR_ADVERTISEMENT, &ndopts);
1051
1052 if ((old_flags & ~neigh->flags) & NTF_ROUTER) {
1053 /*
1054 * Change: router to host
1055 */
1056 rt6_clean_tohost(dev_net(dev), saddr);
1057 }
1058
1059 out:
1060 neigh_release(neigh);
1061 }
1062 }
1063
1064 static void ndisc_recv_rs(struct sk_buff *skb)
1065 {
1066 struct rs_msg *rs_msg = (struct rs_msg *)skb_transport_header(skb);
1067 unsigned long ndoptlen = skb->len - sizeof(*rs_msg);
1068 struct neighbour *neigh;
1069 struct inet6_dev *idev;
1070 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
1071 struct ndisc_options ndopts;
1072 u8 *lladdr = NULL;
1073
1074 if (skb->len < sizeof(*rs_msg))
1075 return;
1076
1077 idev = __in6_dev_get(skb->dev);
1078 if (!idev) {
1079 ND_PRINTK(1, err, "RS: can't find in6 device\n");
1080 return;
1081 }
1082
1083 /* Don't accept RS if we're not in router mode */
1084 if (!idev->cnf.forwarding)
1085 goto out;
1086
1087 /*
1088 * Don't update NCE if src = ::;
1089 * this implies that the source node has no ip address assigned yet.
1090 */
1091 if (ipv6_addr_any(saddr))
1092 goto out;
1093
1094 /* Parse ND options */
1095 if (!ndisc_parse_options(skb->dev, rs_msg->opt, ndoptlen, &ndopts)) {
1096 ND_PRINTK(2, notice, "NS: invalid ND option, ignored\n");
1097 goto out;
1098 }
1099
1100 if (ndopts.nd_opts_src_lladdr) {
1101 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr,
1102 skb->dev);
1103 if (!lladdr)
1104 goto out;
1105 }
1106
1107 neigh = __neigh_lookup(&nd_tbl, saddr, skb->dev, 1);
1108 if (neigh) {
1109 ndisc_update(skb->dev, neigh, lladdr, NUD_STALE,
1110 NEIGH_UPDATE_F_WEAK_OVERRIDE|
1111 NEIGH_UPDATE_F_OVERRIDE|
1112 NEIGH_UPDATE_F_OVERRIDE_ISROUTER,
1113 NDISC_ROUTER_SOLICITATION, &ndopts);
1114 neigh_release(neigh);
1115 }
1116 out:
1117 return;
1118 }
1119
1120 static void ndisc_ra_useropt(struct sk_buff *ra, struct nd_opt_hdr *opt)
1121 {
1122 struct icmp6hdr *icmp6h = (struct icmp6hdr *)skb_transport_header(ra);
1123 struct sk_buff *skb;
1124 struct nlmsghdr *nlh;
1125 struct nduseroptmsg *ndmsg;
1126 struct net *net = dev_net(ra->dev);
1127 int err;
1128 int base_size = NLMSG_ALIGN(sizeof(struct nduseroptmsg)
1129 + (opt->nd_opt_len << 3));
1130 size_t msg_size = base_size + nla_total_size(sizeof(struct in6_addr));
1131
1132 skb = nlmsg_new(msg_size, GFP_ATOMIC);
1133 if (!skb) {
1134 err = -ENOBUFS;
1135 goto errout;
1136 }
1137
1138 nlh = nlmsg_put(skb, 0, 0, RTM_NEWNDUSEROPT, base_size, 0);
1139 if (!nlh) {
1140 goto nla_put_failure;
1141 }
1142
1143 ndmsg = nlmsg_data(nlh);
1144 ndmsg->nduseropt_family = AF_INET6;
1145 ndmsg->nduseropt_ifindex = ra->dev->ifindex;
1146 ndmsg->nduseropt_icmp_type = icmp6h->icmp6_type;
1147 ndmsg->nduseropt_icmp_code = icmp6h->icmp6_code;
1148 ndmsg->nduseropt_opts_len = opt->nd_opt_len << 3;
1149
1150 memcpy(ndmsg + 1, opt, opt->nd_opt_len << 3);
1151
1152 if (nla_put_in6_addr(skb, NDUSEROPT_SRCADDR, &ipv6_hdr(ra)->saddr))
1153 goto nla_put_failure;
1154 nlmsg_end(skb, nlh);
1155
1156 rtnl_notify(skb, net, 0, RTNLGRP_ND_USEROPT, NULL, GFP_ATOMIC);
1157 return;
1158
1159 nla_put_failure:
1160 nlmsg_free(skb);
1161 err = -EMSGSIZE;
1162 errout:
1163 rtnl_set_sk_err(net, RTNLGRP_ND_USEROPT, err);
1164 }
1165
1166 static void ndisc_router_discovery(struct sk_buff *skb)
1167 {
1168 struct ra_msg *ra_msg = (struct ra_msg *)skb_transport_header(skb);
1169 struct neighbour *neigh = NULL;
1170 struct inet6_dev *in6_dev;
1171 struct fib6_info *rt = NULL;
1172 struct net *net;
1173 int lifetime;
1174 struct ndisc_options ndopts;
1175 int optlen;
1176 unsigned int pref = 0;
1177 __u32 old_if_flags;
1178 bool send_ifinfo_notify = false;
1179
1180 __u8 *opt = (__u8 *)(ra_msg + 1);
1181
1182 optlen = (skb_tail_pointer(skb) - skb_transport_header(skb)) -
1183 sizeof(struct ra_msg);
1184
1185 ND_PRINTK(2, info,
1186 "RA: %s, dev: %s\n",
1187 __func__, skb->dev->name);
1188 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) {
1189 ND_PRINTK(2, warn, "RA: source address is not link-local\n");
1190 return;
1191 }
1192 if (optlen < 0) {
1193 ND_PRINTK(2, warn, "RA: packet too short\n");
1194 return;
1195 }
1196
1197 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1198 if (skb->ndisc_nodetype == NDISC_NODETYPE_HOST) {
1199 ND_PRINTK(2, warn, "RA: from host or unauthorized router\n");
1200 return;
1201 }
1202 #endif
1203
1204 /*
1205 * set the RA_RECV flag in the interface
1206 */
1207
1208 in6_dev = __in6_dev_get(skb->dev);
1209 if (!in6_dev) {
1210 ND_PRINTK(0, err, "RA: can't find inet6 device for %s\n",
1211 skb->dev->name);
1212 return;
1213 }
1214
1215 if (!ndisc_parse_options(skb->dev, opt, optlen, &ndopts)) {
1216 ND_PRINTK(2, warn, "RA: invalid ND options\n");
1217 return;
1218 }
1219
1220 if (!ipv6_accept_ra(in6_dev)) {
1221 ND_PRINTK(2, info,
1222 "RA: %s, did not accept ra for dev: %s\n",
1223 __func__, skb->dev->name);
1224 goto skip_linkparms;
1225 }
1226
1227 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1228 /* skip link-specific parameters from interior routers */
1229 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) {
1230 ND_PRINTK(2, info,
1231 "RA: %s, nodetype is NODEFAULT, dev: %s\n",
1232 __func__, skb->dev->name);
1233 goto skip_linkparms;
1234 }
1235 #endif
1236
1237 if (in6_dev->if_flags & IF_RS_SENT) {
1238 /*
1239 * flag that an RA was received after an RS was sent
1240 * out on this interface.
1241 */
1242 in6_dev->if_flags |= IF_RA_RCVD;
1243 }
1244
1245 /*
1246 * Remember the managed/otherconf flags from most recently
1247 * received RA message (RFC 2462) -- yoshfuji
1248 */
1249 old_if_flags = in6_dev->if_flags;
1250 in6_dev->if_flags = (in6_dev->if_flags & ~(IF_RA_MANAGED |
1251 IF_RA_OTHERCONF)) |
1252 (ra_msg->icmph.icmp6_addrconf_managed ?
1253 IF_RA_MANAGED : 0) |
1254 (ra_msg->icmph.icmp6_addrconf_other ?
1255 IF_RA_OTHERCONF : 0);
1256
1257 if (old_if_flags != in6_dev->if_flags)
1258 send_ifinfo_notify = true;
1259
1260 if (!in6_dev->cnf.accept_ra_defrtr) {
1261 ND_PRINTK(2, info,
1262 "RA: %s, defrtr is false for dev: %s\n",
1263 __func__, skb->dev->name);
1264 goto skip_defrtr;
1265 }
1266
1267 /* Do not accept RA with source-addr found on local machine unless
1268 * accept_ra_from_local is set to true.
1269 */
1270 net = dev_net(in6_dev->dev);
1271 if (!in6_dev->cnf.accept_ra_from_local &&
1272 ipv6_chk_addr(net, &ipv6_hdr(skb)->saddr, in6_dev->dev, 0)) {
1273 ND_PRINTK(2, info,
1274 "RA from local address detected on dev: %s: default router ignored\n",
1275 skb->dev->name);
1276 goto skip_defrtr;
1277 }
1278
1279 lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime);
1280
1281 #ifdef CONFIG_IPV6_ROUTER_PREF
1282 pref = ra_msg->icmph.icmp6_router_pref;
1283 /* 10b is handled as if it were 00b (medium) */
1284 if (pref == ICMPV6_ROUTER_PREF_INVALID ||
1285 !in6_dev->cnf.accept_ra_rtr_pref)
1286 pref = ICMPV6_ROUTER_PREF_MEDIUM;
1287 #endif
1288 /* routes added from RAs do not use nexthop objects */
1289 rt = rt6_get_dflt_router(net, &ipv6_hdr(skb)->saddr, skb->dev);
1290 if (rt) {
1291 neigh = ip6_neigh_lookup(&rt->fib6_nh->fib_nh_gw6,
1292 rt->fib6_nh->fib_nh_dev, NULL,
1293 &ipv6_hdr(skb)->saddr);
1294 if (!neigh) {
1295 ND_PRINTK(0, err,
1296 "RA: %s got default router without neighbour\n",
1297 __func__);
1298 fib6_info_release(rt);
1299 return;
1300 }
1301 }
1302 if (rt && lifetime == 0) {
1303 ip6_del_rt(net, rt);
1304 rt = NULL;
1305 }
1306
1307 ND_PRINTK(3, info, "RA: rt: %p lifetime: %d, for dev: %s\n",
1308 rt, lifetime, skb->dev->name);
1309 if (!rt && lifetime) {
1310 ND_PRINTK(3, info, "RA: adding default router\n");
1311
1312 rt = rt6_add_dflt_router(net, &ipv6_hdr(skb)->saddr,
1313 skb->dev, pref);
1314 if (!rt) {
1315 ND_PRINTK(0, err,
1316 "RA: %s failed to add default route\n",
1317 __func__);
1318 return;
1319 }
1320
1321 neigh = ip6_neigh_lookup(&rt->fib6_nh->fib_nh_gw6,
1322 rt->fib6_nh->fib_nh_dev, NULL,
1323 &ipv6_hdr(skb)->saddr);
1324 if (!neigh) {
1325 ND_PRINTK(0, err,
1326 "RA: %s got default router without neighbour\n",
1327 __func__);
1328 fib6_info_release(rt);
1329 return;
1330 }
1331 neigh->flags |= NTF_ROUTER;
1332 } else if (rt) {
1333 rt->fib6_flags = (rt->fib6_flags & ~RTF_PREF_MASK) | RTF_PREF(pref);
1334 }
1335
1336 if (rt)
1337 fib6_set_expires(rt, jiffies + (HZ * lifetime));
1338 if (in6_dev->cnf.accept_ra_min_hop_limit < 256 &&
1339 ra_msg->icmph.icmp6_hop_limit) {
1340 if (in6_dev->cnf.accept_ra_min_hop_limit <= ra_msg->icmph.icmp6_hop_limit) {
1341 in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit;
1342 fib6_metric_set(rt, RTAX_HOPLIMIT,
1343 ra_msg->icmph.icmp6_hop_limit);
1344 } else {
1345 ND_PRINTK(2, warn, "RA: Got route advertisement with lower hop_limit than minimum\n");
1346 }
1347 }
1348
1349 skip_defrtr:
1350
1351 /*
1352 * Update Reachable Time and Retrans Timer
1353 */
1354
1355 if (in6_dev->nd_parms) {
1356 unsigned long rtime = ntohl(ra_msg->retrans_timer);
1357
1358 if (rtime && rtime/1000 < MAX_SCHEDULE_TIMEOUT/HZ) {
1359 rtime = (rtime*HZ)/1000;
1360 if (rtime < HZ/10)
1361 rtime = HZ/10;
1362 NEIGH_VAR_SET(in6_dev->nd_parms, RETRANS_TIME, rtime);
1363 in6_dev->tstamp = jiffies;
1364 send_ifinfo_notify = true;
1365 }
1366
1367 rtime = ntohl(ra_msg->reachable_time);
1368 if (rtime && rtime/1000 < MAX_SCHEDULE_TIMEOUT/(3*HZ)) {
1369 rtime = (rtime*HZ)/1000;
1370
1371 if (rtime < HZ/10)
1372 rtime = HZ/10;
1373
1374 if (rtime != NEIGH_VAR(in6_dev->nd_parms, BASE_REACHABLE_TIME)) {
1375 NEIGH_VAR_SET(in6_dev->nd_parms,
1376 BASE_REACHABLE_TIME, rtime);
1377 NEIGH_VAR_SET(in6_dev->nd_parms,
1378 GC_STALETIME, 3 * rtime);
1379 in6_dev->nd_parms->reachable_time = neigh_rand_reach_time(rtime);
1380 in6_dev->tstamp = jiffies;
1381 send_ifinfo_notify = true;
1382 }
1383 }
1384 }
1385
1386 /*
1387 * Send a notify if RA changed managed/otherconf flags or timer settings
1388 */
1389 if (send_ifinfo_notify)
1390 inet6_ifinfo_notify(RTM_NEWLINK, in6_dev);
1391
1392 skip_linkparms:
1393
1394 /*
1395 * Process options.
1396 */
1397
1398 if (!neigh)
1399 neigh = __neigh_lookup(&nd_tbl, &ipv6_hdr(skb)->saddr,
1400 skb->dev, 1);
1401 if (neigh) {
1402 u8 *lladdr = NULL;
1403 if (ndopts.nd_opts_src_lladdr) {
1404 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr,
1405 skb->dev);
1406 if (!lladdr) {
1407 ND_PRINTK(2, warn,
1408 "RA: invalid link-layer address length\n");
1409 goto out;
1410 }
1411 }
1412 ndisc_update(skb->dev, neigh, lladdr, NUD_STALE,
1413 NEIGH_UPDATE_F_WEAK_OVERRIDE|
1414 NEIGH_UPDATE_F_OVERRIDE|
1415 NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
1416 NEIGH_UPDATE_F_ISROUTER,
1417 NDISC_ROUTER_ADVERTISEMENT, &ndopts);
1418 }
1419
1420 if (!ipv6_accept_ra(in6_dev)) {
1421 ND_PRINTK(2, info,
1422 "RA: %s, accept_ra is false for dev: %s\n",
1423 __func__, skb->dev->name);
1424 goto out;
1425 }
1426
1427 #ifdef CONFIG_IPV6_ROUTE_INFO
1428 if (!in6_dev->cnf.accept_ra_from_local &&
1429 ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr,
1430 in6_dev->dev, 0)) {
1431 ND_PRINTK(2, info,
1432 "RA from local address detected on dev: %s: router info ignored.\n",
1433 skb->dev->name);
1434 goto skip_routeinfo;
1435 }
1436
1437 if (in6_dev->cnf.accept_ra_rtr_pref && ndopts.nd_opts_ri) {
1438 struct nd_opt_hdr *p;
1439 for (p = ndopts.nd_opts_ri;
1440 p;
1441 p = ndisc_next_option(p, ndopts.nd_opts_ri_end)) {
1442 struct route_info *ri = (struct route_info *)p;
1443 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1444 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT &&
1445 ri->prefix_len == 0)
1446 continue;
1447 #endif
1448 if (ri->prefix_len == 0 &&
1449 !in6_dev->cnf.accept_ra_defrtr)
1450 continue;
1451 if (ri->prefix_len < in6_dev->cnf.accept_ra_rt_info_min_plen)
1452 continue;
1453 if (ri->prefix_len > in6_dev->cnf.accept_ra_rt_info_max_plen)
1454 continue;
1455 rt6_route_rcv(skb->dev, (u8 *)p, (p->nd_opt_len) << 3,
1456 &ipv6_hdr(skb)->saddr);
1457 }
1458 }
1459
1460 skip_routeinfo:
1461 #endif
1462
1463 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1464 /* skip link-specific ndopts from interior routers */
1465 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) {
1466 ND_PRINTK(2, info,
1467 "RA: %s, nodetype is NODEFAULT (interior routes), dev: %s\n",
1468 __func__, skb->dev->name);
1469 goto out;
1470 }
1471 #endif
1472
1473 if (in6_dev->cnf.accept_ra_pinfo && ndopts.nd_opts_pi) {
1474 struct nd_opt_hdr *p;
1475 for (p = ndopts.nd_opts_pi;
1476 p;
1477 p = ndisc_next_option(p, ndopts.nd_opts_pi_end)) {
1478 addrconf_prefix_rcv(skb->dev, (u8 *)p,
1479 (p->nd_opt_len) << 3,
1480 ndopts.nd_opts_src_lladdr != NULL);
1481 }
1482 }
1483
1484 if (ndopts.nd_opts_mtu && in6_dev->cnf.accept_ra_mtu) {
1485 __be32 n;
1486 u32 mtu;
1487
1488 memcpy(&n, ((u8 *)(ndopts.nd_opts_mtu+1))+2, sizeof(mtu));
1489 mtu = ntohl(n);
1490
1491 if (mtu < IPV6_MIN_MTU || mtu > skb->dev->mtu) {
1492 ND_PRINTK(2, warn, "RA: invalid mtu: %d\n", mtu);
1493 } else if (in6_dev->cnf.mtu6 != mtu) {
1494 in6_dev->cnf.mtu6 = mtu;
1495 fib6_metric_set(rt, RTAX_MTU, mtu);
1496 rt6_mtu_change(skb->dev, mtu);
1497 }
1498 }
1499
1500 if (ndopts.nd_useropts) {
1501 struct nd_opt_hdr *p;
1502 for (p = ndopts.nd_useropts;
1503 p;
1504 p = ndisc_next_useropt(skb->dev, p,
1505 ndopts.nd_useropts_end)) {
1506 ndisc_ra_useropt(skb, p);
1507 }
1508 }
1509
1510 if (ndopts.nd_opts_tgt_lladdr || ndopts.nd_opts_rh) {
1511 ND_PRINTK(2, warn, "RA: invalid RA options\n");
1512 }
1513 out:
1514 fib6_info_release(rt);
1515 if (neigh)
1516 neigh_release(neigh);
1517 }
1518
1519 static void ndisc_redirect_rcv(struct sk_buff *skb)
1520 {
1521 u8 *hdr;
1522 struct ndisc_options ndopts;
1523 struct rd_msg *msg = (struct rd_msg *)skb_transport_header(skb);
1524 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) +
1525 offsetof(struct rd_msg, opt));
1526
1527 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1528 switch (skb->ndisc_nodetype) {
1529 case NDISC_NODETYPE_HOST:
1530 case NDISC_NODETYPE_NODEFAULT:
1531 ND_PRINTK(2, warn,
1532 "Redirect: from host or unauthorized router\n");
1533 return;
1534 }
1535 #endif
1536
1537 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) {
1538 ND_PRINTK(2, warn,
1539 "Redirect: source address is not link-local\n");
1540 return;
1541 }
1542
1543 if (!ndisc_parse_options(skb->dev, msg->opt, ndoptlen, &ndopts))
1544 return;
1545
1546 if (!ndopts.nd_opts_rh) {
1547 ip6_redirect_no_header(skb, dev_net(skb->dev),
1548 skb->dev->ifindex);
1549 return;
1550 }
1551
1552 hdr = (u8 *)ndopts.nd_opts_rh;
1553 hdr += 8;
1554 if (!pskb_pull(skb, hdr - skb_transport_header(skb)))
1555 return;
1556
1557 icmpv6_notify(skb, NDISC_REDIRECT, 0, 0);
1558 }
1559
1560 static void ndisc_fill_redirect_hdr_option(struct sk_buff *skb,
1561 struct sk_buff *orig_skb,
1562 int rd_len)
1563 {
1564 u8 *opt = skb_put(skb, rd_len);
1565
1566 memset(opt, 0, 8);
1567 *(opt++) = ND_OPT_REDIRECT_HDR;
1568 *(opt++) = (rd_len >> 3);
1569 opt += 6;
1570
1571 skb_copy_bits(orig_skb, skb_network_offset(orig_skb), opt,
1572 rd_len - 8);
1573 }
1574
1575 void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target)
1576 {
1577 struct net_device *dev = skb->dev;
1578 struct net *net = dev_net(dev);
1579 struct sock *sk = net->ipv6.ndisc_sk;
1580 int optlen = 0;
1581 struct inet_peer *peer;
1582 struct sk_buff *buff;
1583 struct rd_msg *msg;
1584 struct in6_addr saddr_buf;
1585 struct rt6_info *rt;
1586 struct dst_entry *dst;
1587 struct flowi6 fl6;
1588 int rd_len;
1589 u8 ha_buf[MAX_ADDR_LEN], *ha = NULL,
1590 ops_data_buf[NDISC_OPS_REDIRECT_DATA_SPACE], *ops_data = NULL;
1591 bool ret;
1592
1593 if (netif_is_l3_master(skb->dev)) {
1594 dev = __dev_get_by_index(dev_net(skb->dev), IPCB(skb)->iif);
1595 if (!dev)
1596 return;
1597 }
1598
1599 if (ipv6_get_lladdr(dev, &saddr_buf, IFA_F_TENTATIVE)) {
1600 ND_PRINTK(2, warn, "Redirect: no link-local address on %s\n",
1601 dev->name);
1602 return;
1603 }
1604
1605 if (!ipv6_addr_equal(&ipv6_hdr(skb)->daddr, target) &&
1606 ipv6_addr_type(target) != (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) {
1607 ND_PRINTK(2, warn,
1608 "Redirect: target address is not link-local unicast\n");
1609 return;
1610 }
1611
1612 icmpv6_flow_init(sk, &fl6, NDISC_REDIRECT,
1613 &saddr_buf, &ipv6_hdr(skb)->saddr, dev->ifindex);
1614
1615 dst = ip6_route_output(net, NULL, &fl6);
1616 if (dst->error) {
1617 dst_release(dst);
1618 return;
1619 }
1620 dst = xfrm_lookup(net, dst, flowi6_to_flowi(&fl6), NULL, 0);
1621 if (IS_ERR(dst))
1622 return;
1623
1624 rt = (struct rt6_info *) dst;
1625
1626 if (rt->rt6i_flags & RTF_GATEWAY) {
1627 ND_PRINTK(2, warn,
1628 "Redirect: destination is not a neighbour\n");
1629 goto release;
1630 }
1631 peer = inet_getpeer_v6(net->ipv6.peers, &ipv6_hdr(skb)->saddr, 1);
1632 ret = inet_peer_xrlim_allow(peer, 1*HZ);
1633 if (peer)
1634 inet_putpeer(peer);
1635 if (!ret)
1636 goto release;
1637
1638 if (dev->addr_len) {
1639 struct neighbour *neigh = dst_neigh_lookup(skb_dst(skb), target);
1640 if (!neigh) {
1641 ND_PRINTK(2, warn,
1642 "Redirect: no neigh for target address\n");
1643 goto release;
1644 }
1645
1646 read_lock_bh(&neigh->lock);
1647 if (neigh->nud_state & NUD_VALID) {
1648 memcpy(ha_buf, neigh->ha, dev->addr_len);
1649 read_unlock_bh(&neigh->lock);
1650 ha = ha_buf;
1651 optlen += ndisc_redirect_opt_addr_space(dev, neigh,
1652 ops_data_buf,
1653 &ops_data);
1654 } else
1655 read_unlock_bh(&neigh->lock);
1656
1657 neigh_release(neigh);
1658 }
1659
1660 rd_len = min_t(unsigned int,
1661 IPV6_MIN_MTU - sizeof(struct ipv6hdr) - sizeof(*msg) - optlen,
1662 skb->len + 8);
1663 rd_len &= ~0x7;
1664 optlen += rd_len;
1665
1666 buff = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
1667 if (!buff)
1668 goto release;
1669
1670 msg = skb_put(buff, sizeof(*msg));
1671 *msg = (struct rd_msg) {
1672 .icmph = {
1673 .icmp6_type = NDISC_REDIRECT,
1674 },
1675 .target = *target,
1676 .dest = ipv6_hdr(skb)->daddr,
1677 };
1678
1679 /*
1680 * include target_address option
1681 */
1682
1683 if (ha)
1684 ndisc_fill_redirect_addr_option(buff, ha, ops_data);
1685
1686 /*
1687 * build redirect option and copy skb over to the new packet.
1688 */
1689
1690 if (rd_len)
1691 ndisc_fill_redirect_hdr_option(buff, skb, rd_len);
1692
1693 skb_dst_set(buff, dst);
1694 ndisc_send_skb(buff, &ipv6_hdr(skb)->saddr, &saddr_buf);
1695 return;
1696
1697 release:
1698 dst_release(dst);
1699 }
1700
1701 static void pndisc_redo(struct sk_buff *skb)
1702 {
1703 ndisc_recv_ns(skb);
1704 kfree_skb(skb);
1705 }
1706
1707 static bool ndisc_suppress_frag_ndisc(struct sk_buff *skb)
1708 {
1709 struct inet6_dev *idev = __in6_dev_get(skb->dev);
1710
1711 if (!idev)
1712 return true;
1713 if (IP6CB(skb)->flags & IP6SKB_FRAGMENTED &&
1714 idev->cnf.suppress_frag_ndisc) {
1715 net_warn_ratelimited("Received fragmented ndisc packet. Carefully consider disabling suppress_frag_ndisc.\n");
1716 return true;
1717 }
1718 return false;
1719 }
1720
1721 int ndisc_rcv(struct sk_buff *skb)
1722 {
1723 struct nd_msg *msg;
1724
1725 if (ndisc_suppress_frag_ndisc(skb))
1726 return 0;
1727
1728 if (skb_linearize(skb))
1729 return 0;
1730
1731 msg = (struct nd_msg *)skb_transport_header(skb);
1732
1733 __skb_push(skb, skb->data - skb_transport_header(skb));
1734
1735 if (ipv6_hdr(skb)->hop_limit != 255) {
1736 ND_PRINTK(2, warn, "NDISC: invalid hop-limit: %d\n",
1737 ipv6_hdr(skb)->hop_limit);
1738 return 0;
1739 }
1740
1741 if (msg->icmph.icmp6_code != 0) {
1742 ND_PRINTK(2, warn, "NDISC: invalid ICMPv6 code: %d\n",
1743 msg->icmph.icmp6_code);
1744 return 0;
1745 }
1746
1747 switch (msg->icmph.icmp6_type) {
1748 case NDISC_NEIGHBOUR_SOLICITATION:
1749 memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb));
1750 ndisc_recv_ns(skb);
1751 break;
1752
1753 case NDISC_NEIGHBOUR_ADVERTISEMENT:
1754 ndisc_recv_na(skb);
1755 break;
1756
1757 case NDISC_ROUTER_SOLICITATION:
1758 ndisc_recv_rs(skb);
1759 break;
1760
1761 case NDISC_ROUTER_ADVERTISEMENT:
1762 ndisc_router_discovery(skb);
1763 break;
1764
1765 case NDISC_REDIRECT:
1766 ndisc_redirect_rcv(skb);
1767 break;
1768 }
1769
1770 return 0;
1771 }
1772
1773 static int ndisc_netdev_event(struct notifier_block *this, unsigned long event, void *ptr)
1774 {
1775 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
1776 struct netdev_notifier_change_info *change_info;
1777 struct net *net = dev_net(dev);
1778 struct inet6_dev *idev;
1779
1780 switch (event) {
1781 case NETDEV_CHANGEADDR:
1782 neigh_changeaddr(&nd_tbl, dev);
1783 fib6_run_gc(0, net, false);
1784 /* fallthrough */
1785 case NETDEV_UP:
1786 idev = in6_dev_get(dev);
1787 if (!idev)
1788 break;
1789 if (idev->cnf.ndisc_notify ||
1790 net->ipv6.devconf_all->ndisc_notify)
1791 ndisc_send_unsol_na(dev);
1792 in6_dev_put(idev);
1793 break;
1794 case NETDEV_CHANGE:
1795 change_info = ptr;
1796 if (change_info->flags_changed & IFF_NOARP)
1797 neigh_changeaddr(&nd_tbl, dev);
1798 if (!netif_carrier_ok(dev))
1799 neigh_carrier_down(&nd_tbl, dev);
1800 break;
1801 case NETDEV_DOWN:
1802 neigh_ifdown(&nd_tbl, dev);
1803 fib6_run_gc(0, net, false);
1804 break;
1805 case NETDEV_NOTIFY_PEERS:
1806 ndisc_send_unsol_na(dev);
1807 break;
1808 default:
1809 break;
1810 }
1811
1812 return NOTIFY_DONE;
1813 }
1814
1815 static struct notifier_block ndisc_netdev_notifier = {
1816 .notifier_call = ndisc_netdev_event,
1817 .priority = ADDRCONF_NOTIFY_PRIORITY - 5,
1818 };
1819
1820 #ifdef CONFIG_SYSCTL
1821 static void ndisc_warn_deprecated_sysctl(struct ctl_table *ctl,
1822 const char *func, const char *dev_name)
1823 {
1824 static char warncomm[TASK_COMM_LEN];
1825 static int warned;
1826 if (strcmp(warncomm, current->comm) && warned < 5) {
1827 strcpy(warncomm, current->comm);
1828 pr_warn("process `%s' is using deprecated sysctl (%s) net.ipv6.neigh.%s.%s - use net.ipv6.neigh.%s.%s_ms instead\n",
1829 warncomm, func,
1830 dev_name, ctl->procname,
1831 dev_name, ctl->procname);
1832 warned++;
1833 }
1834 }
1835
1836 int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl, int write, void __user *buffer, size_t *lenp, loff_t *ppos)
1837 {
1838 struct net_device *dev = ctl->extra1;
1839 struct inet6_dev *idev;
1840 int ret;
1841
1842 if ((strcmp(ctl->procname, "retrans_time") == 0) ||
1843 (strcmp(ctl->procname, "base_reachable_time") == 0))
1844 ndisc_warn_deprecated_sysctl(ctl, "syscall", dev ? dev->name : "default");
1845
1846 if (strcmp(ctl->procname, "retrans_time") == 0)
1847 ret = neigh_proc_dointvec(ctl, write, buffer, lenp, ppos);
1848
1849 else if (strcmp(ctl->procname, "base_reachable_time") == 0)
1850 ret = neigh_proc_dointvec_jiffies(ctl, write,
1851 buffer, lenp, ppos);
1852
1853 else if ((strcmp(ctl->procname, "retrans_time_ms") == 0) ||
1854 (strcmp(ctl->procname, "base_reachable_time_ms") == 0))
1855 ret = neigh_proc_dointvec_ms_jiffies(ctl, write,
1856 buffer, lenp, ppos);
1857 else
1858 ret = -1;
1859
1860 if (write && ret == 0 && dev && (idev = in6_dev_get(dev)) != NULL) {
1861 if (ctl->data == &NEIGH_VAR(idev->nd_parms, BASE_REACHABLE_TIME))
1862 idev->nd_parms->reachable_time =
1863 neigh_rand_reach_time(NEIGH_VAR(idev->nd_parms, BASE_REACHABLE_TIME));
1864 idev->tstamp = jiffies;
1865 inet6_ifinfo_notify(RTM_NEWLINK, idev);
1866 in6_dev_put(idev);
1867 }
1868 return ret;
1869 }
1870
1871
1872 #endif
1873
1874 static int __net_init ndisc_net_init(struct net *net)
1875 {
1876 struct ipv6_pinfo *np;
1877 struct sock *sk;
1878 int err;
1879
1880 err = inet_ctl_sock_create(&sk, PF_INET6,
1881 SOCK_RAW, IPPROTO_ICMPV6, net);
1882 if (err < 0) {
1883 ND_PRINTK(0, err,
1884 "NDISC: Failed to initialize the control socket (err %d)\n",
1885 err);
1886 return err;
1887 }
1888
1889 net->ipv6.ndisc_sk = sk;
1890
1891 np = inet6_sk(sk);
1892 np->hop_limit = 255;
1893 /* Do not loopback ndisc messages */
1894 np->mc_loop = 0;
1895
1896 return 0;
1897 }
1898
1899 static void __net_exit ndisc_net_exit(struct net *net)
1900 {
1901 inet_ctl_sock_destroy(net->ipv6.ndisc_sk);
1902 }
1903
1904 static struct pernet_operations ndisc_net_ops = {
1905 .init = ndisc_net_init,
1906 .exit = ndisc_net_exit,
1907 };
1908
1909 int __init ndisc_init(void)
1910 {
1911 int err;
1912
1913 err = register_pernet_subsys(&ndisc_net_ops);
1914 if (err)
1915 return err;
1916 /*
1917 * Initialize the neighbour table
1918 */
1919 neigh_table_init(NEIGH_ND_TABLE, &nd_tbl);
1920
1921 #ifdef CONFIG_SYSCTL
1922 err = neigh_sysctl_register(NULL, &nd_tbl.parms,
1923 ndisc_ifinfo_sysctl_change);
1924 if (err)
1925 goto out_unregister_pernet;
1926 out:
1927 #endif
1928 return err;
1929
1930 #ifdef CONFIG_SYSCTL
1931 out_unregister_pernet:
1932 unregister_pernet_subsys(&ndisc_net_ops);
1933 goto out;
1934 #endif
1935 }
1936
1937 int __init ndisc_late_init(void)
1938 {
1939 return register_netdevice_notifier(&ndisc_netdev_notifier);
1940 }
1941
1942 void ndisc_late_cleanup(void)
1943 {
1944 unregister_netdevice_notifier(&ndisc_netdev_notifier);
1945 }
1946
1947 void ndisc_cleanup(void)
1948 {
1949 #ifdef CONFIG_SYSCTL
1950 neigh_sysctl_unregister(&nd_tbl.parms);
1951 #endif
1952 neigh_table_clear(NEIGH_ND_TABLE, &nd_tbl);
1953 unregister_pernet_subsys(&ndisc_net_ops);
1954 }