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