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