ipv6: change ipv6_stub_impl.ipv6_dst_lookup to take net argument
[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
7026b1dd
DM
466 err = NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT, sk, skb,
467 NULL, dst->dev,
468 dst_output_sk);
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
f564f45c
CW
477void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
478 const struct in6_addr *daddr,
479 const struct in6_addr *solicited_addr,
480 bool router, bool solicited, bool override, bool inc_opt)
e1ec7842 481{
b44b5f4a 482 struct sk_buff *skb;
e1ec7842
YH
483 struct in6_addr tmpaddr;
484 struct inet6_ifaddr *ifp;
9acd9f3a 485 const struct in6_addr *src_addr;
1cb3fe51
YH
486 struct nd_msg *msg;
487 int optlen = 0;
e1ec7842
YH
488
489 /* for anycast or proxy, solicited_addr != src_addr */
c346dca1 490 ifp = ipv6_get_ifaddr(dev_net(dev), solicited_addr, dev, 1);
e1ec7842
YH
491 if (ifp) {
492 src_addr = solicited_addr;
493 if (ifp->flags & IFA_F_OPTIMISTIC)
f2f79cca 494 override = false;
9f888160 495 inc_opt |= ifp->idev->cnf.force_tllao;
e1ec7842
YH
496 in6_ifa_put(ifp);
497 } else {
191cd582 498 if (ipv6_dev_get_saddr(dev_net(dev), dev, daddr,
c346dca1 499 inet6_sk(dev_net(dev)->ipv6.ndisc_sk)->srcprefs,
7cbca67c 500 &tmpaddr))
e1ec7842
YH
501 return;
502 src_addr = &tmpaddr;
503 }
504
1cb3fe51
YH
505 if (!dev->addr_len)
506 inc_opt = 0;
507 if (inc_opt)
508 optlen += ndisc_opt_addr_space(dev);
e1ec7842 509
1cb3fe51 510 skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
b44b5f4a
YH
511 if (!skb)
512 return;
513
1cb3fe51
YH
514 msg = (struct nd_msg *)skb_put(skb, sizeof(*msg));
515 *msg = (struct nd_msg) {
516 .icmph = {
517 .icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT,
518 .icmp6_router = router,
519 .icmp6_solicited = solicited,
520 .icmp6_override = override,
521 },
522 .target = *solicited_addr,
523 };
524
525 if (inc_opt)
526 ndisc_fill_addr_option(skb, ND_OPT_TARGET_LL_ADDR,
527 dev->dev_addr);
528
529
b44b5f4a 530 ndisc_send_skb(skb, daddr, src_addr);
e1ec7842
YH
531}
532
f47b9464
BH
533static void ndisc_send_unsol_na(struct net_device *dev)
534{
535 struct inet6_dev *idev;
536 struct inet6_ifaddr *ifa;
f47b9464
BH
537
538 idev = in6_dev_get(dev);
539 if (!idev)
540 return;
541
542 read_lock_bh(&idev->lock);
543 list_for_each_entry(ifa, &idev->addr_list, if_list) {
9fafd65a 544 ndisc_send_na(dev, NULL, &in6addr_linklocal_allnodes, &ifa->addr,
f47b9464
BH
545 /*router=*/ !!idev->cnf.forwarding,
546 /*solicited=*/ false, /*override=*/ true,
547 /*inc_opt=*/ true);
548 }
549 read_unlock_bh(&idev->lock);
550
551 in6_dev_put(idev);
552}
553
1da177e4 554void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh,
9acd9f3a
YH
555 const struct in6_addr *solicit,
556 const struct in6_addr *daddr, const struct in6_addr *saddr)
1da177e4 557{
b44b5f4a 558 struct sk_buff *skb;
1da177e4 559 struct in6_addr addr_buf;
1cb3fe51
YH
560 int inc_opt = dev->addr_len;
561 int optlen = 0;
562 struct nd_msg *msg;
1da177e4 563
63159f29 564 if (!saddr) {
95c385b4
NH
565 if (ipv6_get_lladdr(dev, &addr_buf,
566 (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)))
1da177e4
LT
567 return;
568 saddr = &addr_buf;
569 }
570
1cb3fe51 571 if (ipv6_addr_any(saddr))
f2f79cca 572 inc_opt = false;
1cb3fe51
YH
573 if (inc_opt)
574 optlen += ndisc_opt_addr_space(dev);
575
576 skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
b44b5f4a
YH
577 if (!skb)
578 return;
579
1cb3fe51
YH
580 msg = (struct nd_msg *)skb_put(skb, sizeof(*msg));
581 *msg = (struct nd_msg) {
582 .icmph = {
583 .icmp6_type = NDISC_NEIGHBOUR_SOLICITATION,
584 },
585 .target = *solicit,
586 };
587
588 if (inc_opt)
589 ndisc_fill_addr_option(skb, ND_OPT_SOURCE_LL_ADDR,
590 dev->dev_addr);
591
b44b5f4a 592 ndisc_send_skb(skb, daddr, saddr);
1da177e4
LT
593}
594
9acd9f3a
YH
595void ndisc_send_rs(struct net_device *dev, const struct in6_addr *saddr,
596 const struct in6_addr *daddr)
1da177e4 597{
b44b5f4a 598 struct sk_buff *skb;
1cb3fe51 599 struct rs_msg *msg;
95c385b4 600 int send_sllao = dev->addr_len;
1cb3fe51 601 int optlen = 0;
95c385b4
NH
602
603#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
604 /*
605 * According to section 2.2 of RFC 4429, we must not
606 * send router solicitations with a sllao from
607 * optimistic addresses, but we may send the solicitation
608 * if we don't include the sllao. So here we check
609 * if our address is optimistic, and if so, we
bea85195 610 * suppress the inclusion of the sllao.
95c385b4
NH
611 */
612 if (send_sllao) {
c346dca1 613 struct inet6_ifaddr *ifp = ipv6_get_ifaddr(dev_net(dev), saddr,
1cab3da6 614 dev, 1);
95c385b4
NH
615 if (ifp) {
616 if (ifp->flags & IFA_F_OPTIMISTIC) {
ca043569 617 send_sllao = 0;
95c385b4 618 }
ca043569 619 in6_ifa_put(ifp);
95c385b4
NH
620 } else {
621 send_sllao = 0;
622 }
623 }
624#endif
1cb3fe51
YH
625 if (send_sllao)
626 optlen += ndisc_opt_addr_space(dev);
627
628 skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
b44b5f4a
YH
629 if (!skb)
630 return;
631
1cb3fe51
YH
632 msg = (struct rs_msg *)skb_put(skb, sizeof(*msg));
633 *msg = (struct rs_msg) {
634 .icmph = {
635 .icmp6_type = NDISC_ROUTER_SOLICITATION,
636 },
637 };
638
639 if (send_sllao)
640 ndisc_fill_addr_option(skb, ND_OPT_SOURCE_LL_ADDR,
641 dev->dev_addr);
642
b44b5f4a 643 ndisc_send_skb(skb, daddr, saddr);
1da177e4 644}
1ab1457c 645
1da177e4
LT
646
647static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb)
648{
649 /*
650 * "The sender MUST return an ICMP
651 * destination unreachable"
652 */
653 dst_link_failure(skb);
654 kfree_skb(skb);
655}
656
657/* Called with locked neigh: either read or both */
658
659static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb)
660{
661 struct in6_addr *saddr = NULL;
662 struct in6_addr mcaddr;
663 struct net_device *dev = neigh->dev;
664 struct in6_addr *target = (struct in6_addr *)&neigh->primary_key;
665 int probes = atomic_read(&neigh->probes);
666
c58da4c6
EK
667 if (skb && ipv6_chk_addr_and_flags(dev_net(dev), &ipv6_hdr(skb)->saddr,
668 dev, 1,
669 IFA_F_TENTATIVE|IFA_F_OPTIMISTIC))
0660e03f 670 saddr = &ipv6_hdr(skb)->saddr;
e5d08d71
IM
671 probes -= NEIGH_VAR(neigh->parms, UCAST_PROBES);
672 if (probes < 0) {
1da177e4 673 if (!(neigh->nud_state & NUD_VALID)) {
675418d5
JP
674 ND_PRINTK(1, dbg,
675 "%s: trying to ucast probe in NUD_INVALID: %pI6\n",
676 __func__, target);
1da177e4
LT
677 }
678 ndisc_send_ns(dev, neigh, target, target, saddr);
1f9248e5 679 } else if ((probes -= NEIGH_VAR(neigh->parms, APP_PROBES)) < 0) {
1da177e4 680 neigh_app_ns(neigh);
1da177e4
LT
681 } else {
682 addrconf_addr_solict_mult(target, &mcaddr);
683 ndisc_send_ns(dev, NULL, target, &mcaddr, saddr);
684 }
685}
686
0736ffc0
YH
687static int pndisc_is_router(const void *pkey,
688 struct net_device *dev)
fa86d322
PE
689{
690 struct pneigh_entry *n;
0736ffc0 691 int ret = -1;
fa86d322
PE
692
693 read_lock_bh(&nd_tbl.lock);
0736ffc0
YH
694 n = __pneigh_lookup(&nd_tbl, dev_net(dev), pkey, dev);
695 if (n)
696 ret = !!(n->flags & NTF_ROUTER);
fa86d322
PE
697 read_unlock_bh(&nd_tbl.lock);
698
0736ffc0 699 return ret;
fa86d322
PE
700}
701
1da177e4
LT
702static void ndisc_recv_ns(struct sk_buff *skb)
703{
9c70220b 704 struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb);
b71d1d42
ED
705 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
706 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr;
1da177e4 707 u8 *lladdr = NULL;
29a3cad5 708 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) +
27a884dc 709 offsetof(struct nd_msg, opt));
1da177e4
LT
710 struct ndisc_options ndopts;
711 struct net_device *dev = skb->dev;
712 struct inet6_ifaddr *ifp;
713 struct inet6_dev *idev = NULL;
714 struct neighbour *neigh;
715 int dad = ipv6_addr_any(saddr);
a50feda5 716 bool inc;
0736ffc0 717 int is_router = -1;
1da177e4 718
115b0aa6
YH
719 if (skb->len < sizeof(struct nd_msg)) {
720 ND_PRINTK(2, warn, "NS: packet too short\n");
721 return;
722 }
723
1da177e4 724 if (ipv6_addr_is_multicast(&msg->target)) {
675418d5 725 ND_PRINTK(2, warn, "NS: multicast target address\n");
1da177e4
LT
726 return;
727 }
728
729 /*
730 * RFC2461 7.1.1:
731 * DAD has to be destined for solicited node multicast address.
732 */
ca97a644 733 if (dad && !ipv6_addr_is_solict_mult(daddr)) {
675418d5 734 ND_PRINTK(2, warn, "NS: bad DAD packet (wrong destination)\n");
1da177e4
LT
735 return;
736 }
737
738 if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) {
675418d5 739 ND_PRINTK(2, warn, "NS: invalid ND options\n");
1da177e4
LT
740 return;
741 }
742
743 if (ndopts.nd_opts_src_lladdr) {
744 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr, dev);
745 if (!lladdr) {
675418d5
JP
746 ND_PRINTK(2, warn,
747 "NS: invalid link-layer address length\n");
1da177e4
LT
748 return;
749 }
750
751 /* RFC2461 7.1.1:
1ab1457c
YH
752 * If the IP source address is the unspecified address,
753 * there MUST NOT be source link-layer address option
1da177e4
LT
754 * in the message.
755 */
756 if (dad) {
675418d5
JP
757 ND_PRINTK(2, warn,
758 "NS: bad DAD packet (link-layer address option)\n");
1da177e4
LT
759 return;
760 }
761 }
762
763 inc = ipv6_addr_is_multicast(daddr);
764
c346dca1 765 ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1);
a18bc695 766 if (ifp) {
95c385b4
NH
767
768 if (ifp->flags & (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)) {
769 if (dad) {
95c385b4
NH
770 /*
771 * We are colliding with another node
772 * who is doing DAD
773 * so fail our DAD process
774 */
775 addrconf_dad_failure(ifp);
9e3be4b3 776 return;
95c385b4
NH
777 } else {
778 /*
779 * This is not a dad solicitation.
780 * If we are an optimistic node,
781 * we should respond.
782 * Otherwise, we should ignore it.
783 */
784 if (!(ifp->flags & IFA_F_OPTIMISTIC))
1da177e4 785 goto out;
1da177e4 786 }
1da177e4
LT
787 }
788
789 idev = ifp->idev;
790 } else {
53b7997f
YH
791 struct net *net = dev_net(dev);
792
1da177e4
LT
793 idev = in6_dev_get(dev);
794 if (!idev) {
795 /* XXX: count this drop? */
796 return;
797 }
798
53b7997f 799 if (ipv6_chk_acast_addr(net, dev, &msg->target) ||
1ab1457c 800 (idev->cnf.forwarding &&
53b7997f 801 (net->ipv6.devconf_all->proxy_ndp || idev->cnf.proxy_ndp) &&
0736ffc0 802 (is_router = pndisc_is_router(&msg->target, dev)) >= 0)) {
a61bbcf2 803 if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) &&
1da177e4 804 skb->pkt_type != PACKET_HOST &&
f2f79cca 805 inc &&
1f9248e5 806 NEIGH_VAR(idev->nd_parms, PROXY_DELAY) != 0) {
1da177e4
LT
807 /*
808 * for anycast or proxy,
1ab1457c
YH
809 * sender should delay its response
810 * by a random time between 0 and
1da177e4
LT
811 * MAX_ANYCAST_DELAY_TIME seconds.
812 * (RFC2461) -- yoshfuji
813 */
814 struct sk_buff *n = skb_clone(skb, GFP_ATOMIC);
815 if (n)
816 pneigh_enqueue(&nd_tbl, idev->nd_parms, n);
817 goto out;
818 }
819 } else
820 goto out;
821 }
822
0736ffc0 823 if (is_router < 0)
fb568637 824 is_router = idev->cnf.forwarding;
62dd9318 825
1da177e4 826 if (dad) {
f3ee4010 827 ndisc_send_na(dev, NULL, &in6addr_linklocal_allnodes, &msg->target,
fb568637 828 !!is_router, false, (ifp != NULL), true);
1da177e4
LT
829 goto out;
830 }
831
832 if (inc)
833 NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_mcast);
834 else
835 NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_ucast);
836
1ab1457c 837 /*
1da177e4
LT
838 * update / create cache entry
839 * for the source address
840 */
841 neigh = __neigh_lookup(&nd_tbl, saddr, dev,
842 !inc || lladdr || !dev->addr_len);
843 if (neigh)
1ab1457c 844 neigh_update(neigh, lladdr, NUD_STALE,
1da177e4
LT
845 NEIGH_UPDATE_F_WEAK_OVERRIDE|
846 NEIGH_UPDATE_F_OVERRIDE);
3b04ddde 847 if (neigh || !dev->header_ops) {
1da177e4 848 ndisc_send_na(dev, neigh, saddr, &msg->target,
fb568637
YH
849 !!is_router,
850 true, (ifp != NULL && inc), inc);
1da177e4
LT
851 if (neigh)
852 neigh_release(neigh);
853 }
854
855out:
856 if (ifp)
857 in6_ifa_put(ifp);
858 else
859 in6_dev_put(idev);
1da177e4
LT
860}
861
862static void ndisc_recv_na(struct sk_buff *skb)
863{
9c70220b 864 struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb);
be7a010d 865 struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
b71d1d42 866 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr;
1da177e4 867 u8 *lladdr = NULL;
29a3cad5 868 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) +
27a884dc 869 offsetof(struct nd_msg, opt));
1da177e4
LT
870 struct ndisc_options ndopts;
871 struct net_device *dev = skb->dev;
872 struct inet6_ifaddr *ifp;
873 struct neighbour *neigh;
874
875 if (skb->len < sizeof(struct nd_msg)) {
675418d5 876 ND_PRINTK(2, warn, "NA: packet too short\n");
1da177e4
LT
877 return;
878 }
879
880 if (ipv6_addr_is_multicast(&msg->target)) {
675418d5 881 ND_PRINTK(2, warn, "NA: target address is multicast\n");
1da177e4
LT
882 return;
883 }
884
885 if (ipv6_addr_is_multicast(daddr) &&
886 msg->icmph.icmp6_solicited) {
675418d5 887 ND_PRINTK(2, warn, "NA: solicited NA is multicasted\n");
1da177e4
LT
888 return;
889 }
1ab1457c 890
1da177e4 891 if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) {
675418d5 892 ND_PRINTK(2, warn, "NS: invalid ND option\n");
1da177e4
LT
893 return;
894 }
895 if (ndopts.nd_opts_tgt_lladdr) {
896 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_tgt_lladdr, dev);
897 if (!lladdr) {
675418d5
JP
898 ND_PRINTK(2, warn,
899 "NA: invalid link-layer address length\n");
1da177e4
LT
900 return;
901 }
902 }
c346dca1 903 ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1);
a18bc695 904 if (ifp) {
bd015928
DW
905 if (skb->pkt_type != PACKET_LOOPBACK
906 && (ifp->flags & IFA_F_TENTATIVE)) {
907 addrconf_dad_failure(ifp);
908 return;
1da177e4
LT
909 }
910 /* What should we make now? The advertisement
911 is invalid, but ndisc specs say nothing
912 about it. It could be misconfiguration, or
913 an smart proxy agent tries to help us :-)
24fc7b86
JS
914
915 We should not print the error if NA has been
916 received from loopback - it is just our own
917 unsolicited advertisement.
1da177e4 918 */
24fc7b86 919 if (skb->pkt_type != PACKET_LOOPBACK)
675418d5
JP
920 ND_PRINTK(1, warn,
921 "NA: someone advertises our address %pI6 on %s!\n",
922 &ifp->addr, ifp->idev->dev->name);
1da177e4
LT
923 in6_ifa_put(ifp);
924 return;
925 }
926 neigh = neigh_lookup(&nd_tbl, &msg->target, dev);
927
928 if (neigh) {
929 u8 old_flags = neigh->flags;
53b7997f 930 struct net *net = dev_net(dev);
1da177e4
LT
931
932 if (neigh->nud_state & NUD_FAILED)
933 goto out;
934
5f3e6e9e
VN
935 /*
936 * Don't update the neighbor cache entry on a proxy NA from
937 * ourselves because either the proxied node is off link or it
938 * has already sent a NA to us.
939 */
940 if (lladdr && !memcmp(lladdr, dev->dev_addr, dev->addr_len) &&
53b7997f
YH
941 net->ipv6.devconf_all->forwarding && net->ipv6.devconf_all->proxy_ndp &&
942 pneigh_lookup(&nd_tbl, net, &msg->target, dev, 0)) {
b20b6d97 943 /* XXX: idev->cnf.proxy_ndp */
5f3e6e9e 944 goto out;
fbea49e1 945 }
5f3e6e9e 946
1da177e4
LT
947 neigh_update(neigh, lladdr,
948 msg->icmph.icmp6_solicited ? NUD_REACHABLE : NUD_STALE,
949 NEIGH_UPDATE_F_WEAK_OVERRIDE|
950 (msg->icmph.icmp6_override ? NEIGH_UPDATE_F_OVERRIDE : 0)|
951 NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
952 (msg->icmph.icmp6_router ? NEIGH_UPDATE_F_ISROUTER : 0));
953
954 if ((old_flags & ~neigh->flags) & NTF_ROUTER) {
955 /*
956 * Change: router to host
957 */
be7a010d 958 rt6_clean_tohost(dev_net(dev), saddr);
1da177e4
LT
959 }
960
961out:
962 neigh_release(neigh);
963 }
964}
965
966static void ndisc_recv_rs(struct sk_buff *skb)
967{
9c70220b 968 struct rs_msg *rs_msg = (struct rs_msg *)skb_transport_header(skb);
1da177e4
LT
969 unsigned long ndoptlen = skb->len - sizeof(*rs_msg);
970 struct neighbour *neigh;
971 struct inet6_dev *idev;
b71d1d42 972 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
1da177e4
LT
973 struct ndisc_options ndopts;
974 u8 *lladdr = NULL;
975
976 if (skb->len < sizeof(*rs_msg))
977 return;
978
cfdf7647 979 idev = __in6_dev_get(skb->dev);
1da177e4 980 if (!idev) {
675418d5 981 ND_PRINTK(1, err, "RS: can't find in6 device\n");
1da177e4
LT
982 return;
983 }
984
985 /* Don't accept RS if we're not in router mode */
986 if (!idev->cnf.forwarding)
987 goto out;
988
989 /*
990 * Don't update NCE if src = ::;
991 * this implies that the source node has no ip address assigned yet.
992 */
993 if (ipv6_addr_any(saddr))
994 goto out;
995
996 /* Parse ND options */
997 if (!ndisc_parse_options(rs_msg->opt, ndoptlen, &ndopts)) {
675418d5 998 ND_PRINTK(2, notice, "NS: invalid ND option, ignored\n");
1da177e4
LT
999 goto out;
1000 }
1001
1002 if (ndopts.nd_opts_src_lladdr) {
1003 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr,
1004 skb->dev);
1005 if (!lladdr)
1006 goto out;
1007 }
1008
1009 neigh = __neigh_lookup(&nd_tbl, saddr, skb->dev, 1);
1010 if (neigh) {
1011 neigh_update(neigh, lladdr, NUD_STALE,
1012 NEIGH_UPDATE_F_WEAK_OVERRIDE|
1013 NEIGH_UPDATE_F_OVERRIDE|
1014 NEIGH_UPDATE_F_OVERRIDE_ISROUTER);
1015 neigh_release(neigh);
1016 }
1017out:
cfdf7647 1018 return;
1da177e4
LT
1019}
1020
31910575
PY
1021static void ndisc_ra_useropt(struct sk_buff *ra, struct nd_opt_hdr *opt)
1022{
1023 struct icmp6hdr *icmp6h = (struct icmp6hdr *)skb_transport_header(ra);
1024 struct sk_buff *skb;
1025 struct nlmsghdr *nlh;
1026 struct nduseroptmsg *ndmsg;
c346dca1 1027 struct net *net = dev_net(ra->dev);
31910575
PY
1028 int err;
1029 int base_size = NLMSG_ALIGN(sizeof(struct nduseroptmsg)
1030 + (opt->nd_opt_len << 3));
1031 size_t msg_size = base_size + nla_total_size(sizeof(struct in6_addr));
1032
1033 skb = nlmsg_new(msg_size, GFP_ATOMIC);
63159f29 1034 if (!skb) {
31910575
PY
1035 err = -ENOBUFS;
1036 goto errout;
1037 }
1038
1039 nlh = nlmsg_put(skb, 0, 0, RTM_NEWNDUSEROPT, base_size, 0);
63159f29 1040 if (!nlh) {
31910575
PY
1041 goto nla_put_failure;
1042 }
1043
1044 ndmsg = nlmsg_data(nlh);
1045 ndmsg->nduseropt_family = AF_INET6;
dbb2ed24 1046 ndmsg->nduseropt_ifindex = ra->dev->ifindex;
31910575
PY
1047 ndmsg->nduseropt_icmp_type = icmp6h->icmp6_type;
1048 ndmsg->nduseropt_icmp_code = icmp6h->icmp6_code;
1049 ndmsg->nduseropt_opts_len = opt->nd_opt_len << 3;
1050
1051 memcpy(ndmsg + 1, opt, opt->nd_opt_len << 3);
1052
930345ea 1053 if (nla_put_in6_addr(skb, NDUSEROPT_SRCADDR, &ipv6_hdr(ra)->saddr))
c78679e8 1054 goto nla_put_failure;
31910575
PY
1055 nlmsg_end(skb, nlh);
1056
1ce85fe4 1057 rtnl_notify(skb, net, 0, RTNLGRP_ND_USEROPT, NULL, GFP_ATOMIC);
31910575
PY
1058 return;
1059
1060nla_put_failure:
1061 nlmsg_free(skb);
1062 err = -EMSGSIZE;
1063errout:
a18bc695 1064 rtnl_set_sk_err(net, RTNLGRP_ND_USEROPT, err);
31910575
PY
1065}
1066
1da177e4
LT
1067static void ndisc_router_discovery(struct sk_buff *skb)
1068{
9c70220b 1069 struct ra_msg *ra_msg = (struct ra_msg *)skb_transport_header(skb);
1da177e4
LT
1070 struct neighbour *neigh = NULL;
1071 struct inet6_dev *in6_dev;
65f5c7c1 1072 struct rt6_info *rt = NULL;
1da177e4
LT
1073 int lifetime;
1074 struct ndisc_options ndopts;
1075 int optlen;
ebacaaa0 1076 unsigned int pref = 0;
1da177e4 1077
67ba4152 1078 __u8 *opt = (__u8 *)(ra_msg + 1);
1da177e4 1079
29a3cad5
SH
1080 optlen = (skb_tail_pointer(skb) - skb_transport_header(skb)) -
1081 sizeof(struct ra_msg);
1da177e4 1082
f2a762d8
BG
1083 ND_PRINTK(2, info,
1084 "RA: %s, dev: %s\n",
1085 __func__, skb->dev->name);
0660e03f 1086 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) {
675418d5 1087 ND_PRINTK(2, warn, "RA: source address is not link-local\n");
1da177e4
LT
1088 return;
1089 }
1090 if (optlen < 0) {
675418d5 1091 ND_PRINTK(2, warn, "RA: packet too short\n");
1da177e4
LT
1092 return;
1093 }
1094
de357cc0 1095#ifdef CONFIG_IPV6_NDISC_NODETYPE
fadf6bf0 1096 if (skb->ndisc_nodetype == NDISC_NODETYPE_HOST) {
675418d5 1097 ND_PRINTK(2, warn, "RA: from host or unauthorized router\n");
fadf6bf0
TF
1098 return;
1099 }
de357cc0 1100#endif
fadf6bf0 1101
1da177e4
LT
1102 /*
1103 * set the RA_RECV flag in the interface
1104 */
1105
cfdf7647 1106 in6_dev = __in6_dev_get(skb->dev);
63159f29 1107 if (!in6_dev) {
675418d5
JP
1108 ND_PRINTK(0, err, "RA: can't find inet6 device for %s\n",
1109 skb->dev->name);
1da177e4
LT
1110 return;
1111 }
1da177e4
LT
1112
1113 if (!ndisc_parse_options(opt, optlen, &ndopts)) {
675418d5 1114 ND_PRINTK(2, warn, "RA: invalid ND options\n");
1da177e4
LT
1115 return;
1116 }
1117
f2a762d8
BG
1118 if (!ipv6_accept_ra(in6_dev)) {
1119 ND_PRINTK(2, info,
1120 "RA: %s, did not accept ra for dev: %s\n",
1121 __func__, skb->dev->name);
31ce8c71 1122 goto skip_linkparms;
f2a762d8 1123 }
31ce8c71 1124
de357cc0 1125#ifdef CONFIG_IPV6_NDISC_NODETYPE
fadf6bf0 1126 /* skip link-specific parameters from interior routers */
f2a762d8
BG
1127 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) {
1128 ND_PRINTK(2, info,
1129 "RA: %s, nodetype is NODEFAULT, dev: %s\n",
1130 __func__, skb->dev->name);
fadf6bf0 1131 goto skip_linkparms;
f2a762d8 1132 }
de357cc0 1133#endif
fadf6bf0 1134
1da177e4
LT
1135 if (in6_dev->if_flags & IF_RS_SENT) {
1136 /*
1137 * flag that an RA was received after an RS was sent
1138 * out on this interface.
1139 */
1140 in6_dev->if_flags |= IF_RA_RCVD;
1141 }
1142
1143 /*
1144 * Remember the managed/otherconf flags from most recently
1145 * received RA message (RFC 2462) -- yoshfuji
1146 */
1147 in6_dev->if_flags = (in6_dev->if_flags & ~(IF_RA_MANAGED |
1148 IF_RA_OTHERCONF)) |
1149 (ra_msg->icmph.icmp6_addrconf_managed ?
1150 IF_RA_MANAGED : 0) |
1151 (ra_msg->icmph.icmp6_addrconf_other ?
1152 IF_RA_OTHERCONF : 0);
1153
f2a762d8
BG
1154 if (!in6_dev->cnf.accept_ra_defrtr) {
1155 ND_PRINTK(2, info,
1156 "RA: %s, defrtr is false for dev: %s\n",
1157 __func__, skb->dev->name);
65f5c7c1 1158 goto skip_defrtr;
f2a762d8 1159 }
65f5c7c1 1160
d9333196
BG
1161 /* Do not accept RA with source-addr found on local machine unless
1162 * accept_ra_from_local is set to true.
1163 */
b6428817
LR
1164 if (!in6_dev->cnf.accept_ra_from_local &&
1165 ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr,
1166 NULL, 0)) {
f2a762d8 1167 ND_PRINTK(2, info,
d9333196
BG
1168 "RA from local address detected on dev: %s: default router ignored\n",
1169 skb->dev->name);
9f56220f 1170 goto skip_defrtr;
f2a762d8 1171 }
9f56220f 1172
1da177e4
LT
1173 lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime);
1174
ebacaaa0
YH
1175#ifdef CONFIG_IPV6_ROUTER_PREF
1176 pref = ra_msg->icmph.icmp6_router_pref;
1177 /* 10b is handled as if it were 00b (medium) */
930d6ff2 1178 if (pref == ICMPV6_ROUTER_PREF_INVALID ||
6d5b78cd 1179 !in6_dev->cnf.accept_ra_rtr_pref)
ebacaaa0
YH
1180 pref = ICMPV6_ROUTER_PREF_MEDIUM;
1181#endif
1182
0660e03f 1183 rt = rt6_get_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev);
1da177e4 1184
eb857186
DM
1185 if (rt) {
1186 neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr);
1187 if (!neigh) {
675418d5
JP
1188 ND_PRINTK(0, err,
1189 "RA: %s got default router without neighbour\n",
1190 __func__);
94e187c0 1191 ip6_rt_put(rt);
eb857186
DM
1192 return;
1193 }
1194 }
1da177e4 1195 if (rt && lifetime == 0) {
e0a1ad73 1196 ip6_del_rt(rt);
1da177e4
LT
1197 rt = NULL;
1198 }
1199
f2a762d8
BG
1200 ND_PRINTK(3, info, "RA: rt: %p lifetime: %d, for dev: %s\n",
1201 rt, lifetime, skb->dev->name);
63159f29 1202 if (!rt && lifetime) {
f2a762d8 1203 ND_PRINTK(3, info, "RA: adding default router\n");
1da177e4 1204
0660e03f 1205 rt = rt6_add_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev, pref);
63159f29 1206 if (!rt) {
675418d5
JP
1207 ND_PRINTK(0, err,
1208 "RA: %s failed to add default route\n",
1209 __func__);
1da177e4
LT
1210 return;
1211 }
1212
eb857186 1213 neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr);
63159f29 1214 if (!neigh) {
675418d5
JP
1215 ND_PRINTK(0, err,
1216 "RA: %s got default router without neighbour\n",
1217 __func__);
94e187c0 1218 ip6_rt_put(rt);
1da177e4
LT
1219 return;
1220 }
1221 neigh->flags |= NTF_ROUTER;
ebacaaa0 1222 } else if (rt) {
22441cfa 1223 rt->rt6i_flags = (rt->rt6i_flags & ~RTF_PREF_MASK) | RTF_PREF(pref);
1da177e4
LT
1224 }
1225
1226 if (rt)
1716a961 1227 rt6_set_expires(rt, jiffies + (HZ * lifetime));
8013d1d7
HL
1228 if (in6_dev->cnf.accept_ra_min_hop_limit < 256 &&
1229 ra_msg->icmph.icmp6_hop_limit) {
1230 if (in6_dev->cnf.accept_ra_min_hop_limit <= ra_msg->icmph.icmp6_hop_limit) {
6fd99094 1231 in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit;
8013d1d7
HL
1232 if (rt)
1233 dst_metric_set(&rt->dst, RTAX_HOPLIMIT,
1234 ra_msg->icmph.icmp6_hop_limit);
6fd99094 1235 } else {
8013d1d7 1236 ND_PRINTK(2, warn, "RA: Got route advertisement with lower hop_limit than minimum\n");
6fd99094 1237 }
1da177e4
LT
1238 }
1239
65f5c7c1
YH
1240skip_defrtr:
1241
1da177e4
LT
1242 /*
1243 * Update Reachable Time and Retrans Timer
1244 */
1245
1246 if (in6_dev->nd_parms) {
1247 unsigned long rtime = ntohl(ra_msg->retrans_timer);
1248
1249 if (rtime && rtime/1000 < MAX_SCHEDULE_TIMEOUT/HZ) {
1250 rtime = (rtime*HZ)/1000;
1251 if (rtime < HZ/10)
1252 rtime = HZ/10;
1f9248e5 1253 NEIGH_VAR_SET(in6_dev->nd_parms, RETRANS_TIME, rtime);
1da177e4
LT
1254 in6_dev->tstamp = jiffies;
1255 inet6_ifinfo_notify(RTM_NEWLINK, in6_dev);
1256 }
1257
1258 rtime = ntohl(ra_msg->reachable_time);
1259 if (rtime && rtime/1000 < MAX_SCHEDULE_TIMEOUT/(3*HZ)) {
1260 rtime = (rtime*HZ)/1000;
1261
1262 if (rtime < HZ/10)
1263 rtime = HZ/10;
1264
1f9248e5
JP
1265 if (rtime != NEIGH_VAR(in6_dev->nd_parms, BASE_REACHABLE_TIME)) {
1266 NEIGH_VAR_SET(in6_dev->nd_parms,
1267 BASE_REACHABLE_TIME, rtime);
1268 NEIGH_VAR_SET(in6_dev->nd_parms,
1269 GC_STALETIME, 3 * rtime);
1da177e4
LT
1270 in6_dev->nd_parms->reachable_time = neigh_rand_reach_time(rtime);
1271 in6_dev->tstamp = jiffies;
1272 inet6_ifinfo_notify(RTM_NEWLINK, in6_dev);
1273 }
1274 }
1275 }
1276
fadf6bf0
TF
1277skip_linkparms:
1278
1da177e4
LT
1279 /*
1280 * Process options.
1281 */
1282
1283 if (!neigh)
0660e03f 1284 neigh = __neigh_lookup(&nd_tbl, &ipv6_hdr(skb)->saddr,
1da177e4
LT
1285 skb->dev, 1);
1286 if (neigh) {
1287 u8 *lladdr = NULL;
1288 if (ndopts.nd_opts_src_lladdr) {
1289 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr,
1290 skb->dev);
1291 if (!lladdr) {
675418d5
JP
1292 ND_PRINTK(2, warn,
1293 "RA: invalid link-layer address length\n");
1da177e4
LT
1294 goto out;
1295 }
1296 }
1297 neigh_update(neigh, lladdr, NUD_STALE,
1298 NEIGH_UPDATE_F_WEAK_OVERRIDE|
1299 NEIGH_UPDATE_F_OVERRIDE|
1300 NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
1301 NEIGH_UPDATE_F_ISROUTER);
1302 }
1303
f2a762d8
BG
1304 if (!ipv6_accept_ra(in6_dev)) {
1305 ND_PRINTK(2, info,
1306 "RA: %s, accept_ra is false for dev: %s\n",
1307 __func__, skb->dev->name);
31ce8c71 1308 goto out;
f2a762d8 1309 }
31ce8c71 1310
70ceb4f5 1311#ifdef CONFIG_IPV6_ROUTE_INFO
b6428817
LR
1312 if (!in6_dev->cnf.accept_ra_from_local &&
1313 ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr,
1314 NULL, 0)) {
f2a762d8 1315 ND_PRINTK(2, info,
d9333196
BG
1316 "RA from local address detected on dev: %s: router info ignored.\n",
1317 skb->dev->name);
9f56220f 1318 goto skip_routeinfo;
f2a762d8 1319 }
9f56220f 1320
09c884d4 1321 if (in6_dev->cnf.accept_ra_rtr_pref && ndopts.nd_opts_ri) {
70ceb4f5
YH
1322 struct nd_opt_hdr *p;
1323 for (p = ndopts.nd_opts_ri;
1324 p;
1325 p = ndisc_next_option(p, ndopts.nd_opts_ri_end)) {
6294e000
YH
1326 struct route_info *ri = (struct route_info *)p;
1327#ifdef CONFIG_IPV6_NDISC_NODETYPE
1328 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT &&
1329 ri->prefix_len == 0)
1330 continue;
1331#endif
30e56918
DJ
1332 if (ri->prefix_len == 0 &&
1333 !in6_dev->cnf.accept_ra_defrtr)
1334 continue;
6294e000 1335 if (ri->prefix_len > in6_dev->cnf.accept_ra_rt_info_max_plen)
09c884d4 1336 continue;
67ba4152 1337 rt6_route_rcv(skb->dev, (u8 *)p, (p->nd_opt_len) << 3,
0660e03f 1338 &ipv6_hdr(skb)->saddr);
70ceb4f5
YH
1339 }
1340 }
9f56220f
AH
1341
1342skip_routeinfo:
70ceb4f5
YH
1343#endif
1344
de357cc0 1345#ifdef CONFIG_IPV6_NDISC_NODETYPE
fadf6bf0 1346 /* skip link-specific ndopts from interior routers */
f2a762d8
BG
1347 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) {
1348 ND_PRINTK(2, info,
1349 "RA: %s, nodetype is NODEFAULT (interior routes), dev: %s\n",
1350 __func__, skb->dev->name);
fadf6bf0 1351 goto out;
f2a762d8 1352 }
de357cc0 1353#endif
fadf6bf0 1354
c4fd30eb 1355 if (in6_dev->cnf.accept_ra_pinfo && ndopts.nd_opts_pi) {
1da177e4
LT
1356 struct nd_opt_hdr *p;
1357 for (p = ndopts.nd_opts_pi;
1358 p;
1359 p = ndisc_next_option(p, ndopts.nd_opts_pi_end)) {
e6bff995
NH
1360 addrconf_prefix_rcv(skb->dev, (u8 *)p,
1361 (p->nd_opt_len) << 3,
1362 ndopts.nd_opts_src_lladdr != NULL);
1da177e4
LT
1363 }
1364 }
1365
c2943f14 1366 if (ndopts.nd_opts_mtu && in6_dev->cnf.accept_ra_mtu) {
e69a4adc 1367 __be32 n;
1da177e4
LT
1368 u32 mtu;
1369
67ba4152 1370 memcpy(&n, ((u8 *)(ndopts.nd_opts_mtu+1))+2, sizeof(mtu));
e69a4adc 1371 mtu = ntohl(n);
1da177e4
LT
1372
1373 if (mtu < IPV6_MIN_MTU || mtu > skb->dev->mtu) {
675418d5 1374 ND_PRINTK(2, warn, "RA: invalid mtu: %d\n", mtu);
1da177e4
LT
1375 } else if (in6_dev->cnf.mtu6 != mtu) {
1376 in6_dev->cnf.mtu6 = mtu;
1377
1378 if (rt)
defb3519 1379 dst_metric_set(&rt->dst, RTAX_MTU, mtu);
1da177e4
LT
1380
1381 rt6_mtu_change(skb->dev, mtu);
1382 }
1383 }
1ab1457c 1384
31910575 1385 if (ndopts.nd_useropts) {
61cf46ad
YH
1386 struct nd_opt_hdr *p;
1387 for (p = ndopts.nd_useropts;
1388 p;
1389 p = ndisc_next_useropt(p, ndopts.nd_useropts_end)) {
1390 ndisc_ra_useropt(skb, p);
31910575
PY
1391 }
1392 }
1393
1da177e4 1394 if (ndopts.nd_opts_tgt_lladdr || ndopts.nd_opts_rh) {
675418d5 1395 ND_PRINTK(2, warn, "RA: invalid RA options\n");
1da177e4
LT
1396 }
1397out:
94e187c0 1398 ip6_rt_put(rt);
eb857186 1399 if (neigh)
1da177e4 1400 neigh_release(neigh);
1da177e4
LT
1401}
1402
1403static void ndisc_redirect_rcv(struct sk_buff *skb)
1404{
093d04d4
DJ
1405 u8 *hdr;
1406 struct ndisc_options ndopts;
1407 struct rd_msg *msg = (struct rd_msg *)skb_transport_header(skb);
29a3cad5 1408 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) +
093d04d4
DJ
1409 offsetof(struct rd_msg, opt));
1410
de357cc0 1411#ifdef CONFIG_IPV6_NDISC_NODETYPE
fadf6bf0
TF
1412 switch (skb->ndisc_nodetype) {
1413 case NDISC_NODETYPE_HOST:
1414 case NDISC_NODETYPE_NODEFAULT:
675418d5
JP
1415 ND_PRINTK(2, warn,
1416 "Redirect: from host or unauthorized router\n");
fadf6bf0
TF
1417 return;
1418 }
de357cc0 1419#endif
fadf6bf0 1420
0660e03f 1421 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) {
675418d5
JP
1422 ND_PRINTK(2, warn,
1423 "Redirect: source address is not link-local\n");
1da177e4
LT
1424 return;
1425 }
1426
093d04d4
DJ
1427 if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts))
1428 return;
1429
c92a59ec 1430 if (!ndopts.nd_opts_rh) {
b55b76b2
DJ
1431 ip6_redirect_no_header(skb, dev_net(skb->dev),
1432 skb->dev->ifindex, 0);
093d04d4 1433 return;
c92a59ec 1434 }
093d04d4
DJ
1435
1436 hdr = (u8 *)ndopts.nd_opts_rh;
1437 hdr += 8;
1438 if (!pskb_pull(skb, hdr - skb_transport_header(skb)))
1439 return;
1440
b94f1c09 1441 icmpv6_notify(skb, NDISC_REDIRECT, 0, 0);
1da177e4
LT
1442}
1443
5f5a0115
YH
1444static void ndisc_fill_redirect_hdr_option(struct sk_buff *skb,
1445 struct sk_buff *orig_skb,
1446 int rd_len)
9c86dafe 1447{
5f5a0115
YH
1448 u8 *opt = skb_put(skb, rd_len);
1449
9c86dafe
YH
1450 memset(opt, 0, 8);
1451 *(opt++) = ND_OPT_REDIRECT_HDR;
1452 *(opt++) = (rd_len >> 3);
1453 opt += 6;
1454
1455 memcpy(opt, ipv6_hdr(orig_skb), rd_len - 8);
9c86dafe
YH
1456}
1457
4991969a 1458void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target)
1da177e4 1459{
1762f7e8 1460 struct net_device *dev = skb->dev;
c346dca1 1461 struct net *net = dev_net(dev);
1762f7e8 1462 struct sock *sk = net->ipv6.ndisc_sk;
2ce13576 1463 int optlen = 0;
fbfe95a4 1464 struct inet_peer *peer;
1da177e4 1465 struct sk_buff *buff;
71bcdba0 1466 struct rd_msg *msg;
1da177e4 1467 struct in6_addr saddr_buf;
1da177e4
LT
1468 struct rt6_info *rt;
1469 struct dst_entry *dst;
4c9483b2 1470 struct flowi6 fl6;
1da177e4 1471 int rd_len;
1da177e4 1472 u8 ha_buf[MAX_ADDR_LEN], *ha = NULL;
1d861aa4 1473 bool ret;
1da177e4 1474
95c385b4 1475 if (ipv6_get_lladdr(dev, &saddr_buf, IFA_F_TENTATIVE)) {
675418d5
JP
1476 ND_PRINTK(2, warn, "Redirect: no link-local address on %s\n",
1477 dev->name);
1ab1457c
YH
1478 return;
1479 }
1da177e4 1480
0660e03f 1481 if (!ipv6_addr_equal(&ipv6_hdr(skb)->daddr, target) &&
bf0b48df 1482 ipv6_addr_type(target) != (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) {
675418d5
JP
1483 ND_PRINTK(2, warn,
1484 "Redirect: target address is not link-local unicast\n");
29556526
LY
1485 return;
1486 }
1487
4c9483b2 1488 icmpv6_flow_init(sk, &fl6, NDISC_REDIRECT,
95e41e93 1489 &saddr_buf, &ipv6_hdr(skb)->saddr, dev->ifindex);
1da177e4 1490
4c9483b2 1491 dst = ip6_route_output(net, NULL, &fl6);
5095d64d
RL
1492 if (dst->error) {
1493 dst_release(dst);
1da177e4 1494 return;
5095d64d 1495 }
4c9483b2 1496 dst = xfrm_lookup(net, dst, flowi6_to_flowi(&fl6), NULL, 0);
452edd59 1497 if (IS_ERR(dst))
1da177e4 1498 return;
1da177e4
LT
1499
1500 rt = (struct rt6_info *) dst;
1501
1502 if (rt->rt6i_flags & RTF_GATEWAY) {
675418d5
JP
1503 ND_PRINTK(2, warn,
1504 "Redirect: destination is not a neighbour\n");
d73f0801 1505 goto release;
1da177e4 1506 }
fd0273d7 1507 peer = inet_getpeer_v6(net->ipv6.peers, &ipv6_hdr(skb)->saddr, 1);
1d861aa4
DM
1508 ret = inet_peer_xrlim_allow(peer, 1*HZ);
1509 if (peer)
1510 inet_putpeer(peer);
1511 if (!ret)
d73f0801 1512 goto release;
1da177e4
LT
1513
1514 if (dev->addr_len) {
4991969a
DM
1515 struct neighbour *neigh = dst_neigh_lookup(skb_dst(skb), target);
1516 if (!neigh) {
675418d5
JP
1517 ND_PRINTK(2, warn,
1518 "Redirect: no neigh for target address\n");
4991969a
DM
1519 goto release;
1520 }
1521
1da177e4
LT
1522 read_lock_bh(&neigh->lock);
1523 if (neigh->nud_state & NUD_VALID) {
1524 memcpy(ha_buf, neigh->ha, dev->addr_len);
1525 read_unlock_bh(&neigh->lock);
1526 ha = ha_buf;
2ce13576 1527 optlen += ndisc_opt_addr_space(dev);
1da177e4
LT
1528 } else
1529 read_unlock_bh(&neigh->lock);
4991969a
DM
1530
1531 neigh_release(neigh);
1da177e4
LT
1532 }
1533
1534 rd_len = min_t(unsigned int,
2ce13576
YH
1535 IPV6_MIN_MTU - sizeof(struct ipv6hdr) - sizeof(*msg) - optlen,
1536 skb->len + 8);
1da177e4 1537 rd_len &= ~0x7;
2ce13576 1538 optlen += rd_len;
1da177e4 1539
2ce13576 1540 buff = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
de09334b 1541 if (!buff)
d73f0801 1542 goto release;
1da177e4 1543
4d5c152e
YH
1544 msg = (struct rd_msg *)skb_put(buff, sizeof(*msg));
1545 *msg = (struct rd_msg) {
1546 .icmph = {
1547 .icmp6_type = NDISC_REDIRECT,
1548 },
1549 .target = *target,
1550 .dest = ipv6_hdr(skb)->daddr,
1551 };
1da177e4 1552
1da177e4
LT
1553 /*
1554 * include target_address option
1555 */
1556
1557 if (ha)
33be081a 1558 ndisc_fill_addr_option(buff, ND_OPT_TARGET_LL_ADDR, ha);
1da177e4
LT
1559
1560 /*
1561 * build redirect option and copy skb over to the new packet.
1562 */
1563
9c86dafe 1564 if (rd_len)
5f5a0115 1565 ndisc_fill_redirect_hdr_option(buff, skb, rd_len);
1da177e4 1566
adf30907 1567 skb_dst_set(buff, dst);
f4de84c6 1568 ndisc_send_skb(buff, &ipv6_hdr(skb)->saddr, &saddr_buf);
d73f0801
IJ
1569 return;
1570
1571release:
1572 dst_release(dst);
1da177e4
LT
1573}
1574
1575static void pndisc_redo(struct sk_buff *skb)
1576{
140e26fc 1577 ndisc_recv_ns(skb);
1da177e4
LT
1578 kfree_skb(skb);
1579}
1580
b800c3b9
HFS
1581static bool ndisc_suppress_frag_ndisc(struct sk_buff *skb)
1582{
1583 struct inet6_dev *idev = __in6_dev_get(skb->dev);
1584
1585 if (!idev)
1586 return true;
1587 if (IP6CB(skb)->flags & IP6SKB_FRAGMENTED &&
1588 idev->cnf.suppress_frag_ndisc) {
1589 net_warn_ratelimited("Received fragmented ndisc packet. Carefully consider disabling suppress_frag_ndisc.\n");
1590 return true;
1591 }
1592 return false;
1593}
1594
1da177e4
LT
1595int ndisc_rcv(struct sk_buff *skb)
1596{
1597 struct nd_msg *msg;
1598
b800c3b9
HFS
1599 if (ndisc_suppress_frag_ndisc(skb))
1600 return 0;
1601
6bce6b4e 1602 if (skb_linearize(skb))
1da177e4
LT
1603 return 0;
1604
9c70220b 1605 msg = (struct nd_msg *)skb_transport_header(skb);
1da177e4 1606
9c70220b 1607 __skb_push(skb, skb->data - skb_transport_header(skb));
1da177e4 1608
0660e03f 1609 if (ipv6_hdr(skb)->hop_limit != 255) {
675418d5
JP
1610 ND_PRINTK(2, warn, "NDISC: invalid hop-limit: %d\n",
1611 ipv6_hdr(skb)->hop_limit);
1da177e4
LT
1612 return 0;
1613 }
1614
1615 if (msg->icmph.icmp6_code != 0) {
675418d5
JP
1616 ND_PRINTK(2, warn, "NDISC: invalid ICMPv6 code: %d\n",
1617 msg->icmph.icmp6_code);
1da177e4
LT
1618 return 0;
1619 }
1620
a61bbcf2
PM
1621 memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb));
1622
1da177e4
LT
1623 switch (msg->icmph.icmp6_type) {
1624 case NDISC_NEIGHBOUR_SOLICITATION:
1625 ndisc_recv_ns(skb);
1626 break;
1627
1628 case NDISC_NEIGHBOUR_ADVERTISEMENT:
1629 ndisc_recv_na(skb);
1630 break;
1631
1632 case NDISC_ROUTER_SOLICITATION:
1633 ndisc_recv_rs(skb);
1634 break;
1635
1636 case NDISC_ROUTER_ADVERTISEMENT:
1637 ndisc_router_discovery(skb);
1638 break;
1639
1640 case NDISC_REDIRECT:
1641 ndisc_redirect_rcv(skb);
1642 break;
3ff50b79 1643 }
1da177e4
LT
1644
1645 return 0;
1646}
1647
1648static int ndisc_netdev_event(struct notifier_block *this, unsigned long event, void *ptr)
1649{
351638e7 1650 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
c346dca1 1651 struct net *net = dev_net(dev);
5cb04436 1652 struct inet6_dev *idev;
1da177e4
LT
1653
1654 switch (event) {
1655 case NETDEV_CHANGEADDR:
1656 neigh_changeaddr(&nd_tbl, dev);
2ac3ac8f 1657 fib6_run_gc(0, net, false);
5cb04436
HFS
1658 idev = in6_dev_get(dev);
1659 if (!idev)
1660 break;
1661 if (idev->cnf.ndisc_notify)
1662 ndisc_send_unsol_na(dev);
1663 in6_dev_put(idev);
1da177e4
LT
1664 break;
1665 case NETDEV_DOWN:
1666 neigh_ifdown(&nd_tbl, dev);
2ac3ac8f 1667 fib6_run_gc(0, net, false);
1da177e4 1668 break;
f47b9464
BH
1669 case NETDEV_NOTIFY_PEERS:
1670 ndisc_send_unsol_na(dev);
1671 break;
1da177e4
LT
1672 default:
1673 break;
1674 }
1675
1676 return NOTIFY_DONE;
1677}
1678
1679static struct notifier_block ndisc_netdev_notifier = {
1680 .notifier_call = ndisc_netdev_event,
1681};
1682
1683#ifdef CONFIG_SYSCTL
1684static void ndisc_warn_deprecated_sysctl(struct ctl_table *ctl,
1685 const char *func, const char *dev_name)
1686{
1687 static char warncomm[TASK_COMM_LEN];
1688 static int warned;
1689 if (strcmp(warncomm, current->comm) && warned < 5) {
1690 strcpy(warncomm, current->comm);
f3213831 1691 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
1692 warncomm, func,
1693 dev_name, ctl->procname,
1694 dev_name, ctl->procname);
1695 warned++;
1696 }
1697}
1698
8d65af78 1699int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl, int write, void __user *buffer, size_t *lenp, loff_t *ppos)
1da177e4
LT
1700{
1701 struct net_device *dev = ctl->extra1;
1702 struct inet6_dev *idev;
1703 int ret;
1704
d12af679
EB
1705 if ((strcmp(ctl->procname, "retrans_time") == 0) ||
1706 (strcmp(ctl->procname, "base_reachable_time") == 0))
1da177e4
LT
1707 ndisc_warn_deprecated_sysctl(ctl, "syscall", dev ? dev->name : "default");
1708
d12af679 1709 if (strcmp(ctl->procname, "retrans_time") == 0)
cb5b09c1 1710 ret = neigh_proc_dointvec(ctl, write, buffer, lenp, ppos);
d12af679
EB
1711
1712 else if (strcmp(ctl->procname, "base_reachable_time") == 0)
cb5b09c1
JP
1713 ret = neigh_proc_dointvec_jiffies(ctl, write,
1714 buffer, lenp, ppos);
d12af679
EB
1715
1716 else if ((strcmp(ctl->procname, "retrans_time_ms") == 0) ||
ad02ac14 1717 (strcmp(ctl->procname, "base_reachable_time_ms") == 0))
cb5b09c1
JP
1718 ret = neigh_proc_dointvec_ms_jiffies(ctl, write,
1719 buffer, lenp, ppos);
d12af679 1720 else
1da177e4 1721 ret = -1;
1da177e4
LT
1722
1723 if (write && ret == 0 && dev && (idev = in6_dev_get(dev)) != NULL) {
1f9248e5
JP
1724 if (ctl->data == &NEIGH_VAR(idev->nd_parms, BASE_REACHABLE_TIME))
1725 idev->nd_parms->reachable_time =
1726 neigh_rand_reach_time(NEIGH_VAR(idev->nd_parms, BASE_REACHABLE_TIME));
1da177e4
LT
1727 idev->tstamp = jiffies;
1728 inet6_ifinfo_notify(RTM_NEWLINK, idev);
1729 in6_dev_put(idev);
1730 }
1731 return ret;
1732}
1733
1da177e4
LT
1734
1735#endif
1736
2c8c1e72 1737static int __net_init ndisc_net_init(struct net *net)
1da177e4
LT
1738{
1739 struct ipv6_pinfo *np;
1740 struct sock *sk;
1ab1457c 1741 int err;
1da177e4 1742
1ed8516f
DL
1743 err = inet_ctl_sock_create(&sk, PF_INET6,
1744 SOCK_RAW, IPPROTO_ICMPV6, net);
1da177e4 1745 if (err < 0) {
675418d5
JP
1746 ND_PRINTK(0, err,
1747 "NDISC: Failed to initialize the control socket (err %d)\n",
1748 err);
1da177e4
LT
1749 return err;
1750 }
1751
1ed8516f 1752 net->ipv6.ndisc_sk = sk;
1762f7e8 1753
1da177e4 1754 np = inet6_sk(sk);
1da177e4
LT
1755 np->hop_limit = 255;
1756 /* Do not loopback ndisc messages */
1757 np->mc_loop = 0;
1da177e4 1758
1762f7e8
DL
1759 return 0;
1760}
1761
2c8c1e72 1762static void __net_exit ndisc_net_exit(struct net *net)
1762f7e8 1763{
1ed8516f 1764 inet_ctl_sock_destroy(net->ipv6.ndisc_sk);
1762f7e8
DL
1765}
1766
1767static struct pernet_operations ndisc_net_ops = {
1768 .init = ndisc_net_init,
1769 .exit = ndisc_net_exit,
1770};
1771
1772int __init ndisc_init(void)
1773{
1774 int err;
1775
1776 err = register_pernet_subsys(&ndisc_net_ops);
1777 if (err)
1778 return err;
1ab1457c
YH
1779 /*
1780 * Initialize the neighbour table
1781 */
d7480fd3 1782 neigh_table_init(NEIGH_ND_TABLE, &nd_tbl);
1da177e4
LT
1783
1784#ifdef CONFIG_SYSCTL
73af614a 1785 err = neigh_sysctl_register(NULL, &nd_tbl.parms,
56ec0fb1 1786 ndisc_ifinfo_sysctl_change);
1762f7e8
DL
1787 if (err)
1788 goto out_unregister_pernet;
1762f7e8 1789out:
bcd081a3 1790#endif
1762f7e8 1791 return err;
1da177e4 1792
1762f7e8 1793#ifdef CONFIG_SYSCTL
1762f7e8 1794out_unregister_pernet:
1762f7e8
DL
1795 unregister_pernet_subsys(&ndisc_net_ops);
1796 goto out;
2c861cc6 1797#endif
1da177e4
LT
1798}
1799
2c861cc6
MK
1800int __init ndisc_late_init(void)
1801{
1802 return register_netdevice_notifier(&ndisc_netdev_notifier);
1803}
1804
1805void ndisc_late_cleanup(void)
1da177e4 1806{
36f73d0c 1807 unregister_netdevice_notifier(&ndisc_netdev_notifier);
2c861cc6
MK
1808}
1809
1810void ndisc_cleanup(void)
1811{
1da177e4
LT
1812#ifdef CONFIG_SYSCTL
1813 neigh_sysctl_unregister(&nd_tbl.parms);
1814#endif
d7480fd3 1815 neigh_table_clear(NEIGH_ND_TABLE, &nd_tbl);
1762f7e8 1816 unregister_pernet_subsys(&ndisc_net_ops);
1da177e4 1817}
This page took 1.053715 seconds and 5 git commands to generate.