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