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