Merge tag 'pm+acpi-4.6-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[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;
7a02bf89 886 struct inet6_dev *idev = __in6_dev_get(dev);
1da177e4
LT
887 struct inet6_ifaddr *ifp;
888 struct neighbour *neigh;
889
890 if (skb->len < sizeof(struct nd_msg)) {
675418d5 891 ND_PRINTK(2, warn, "NA: packet too short\n");
1da177e4
LT
892 return;
893 }
894
895 if (ipv6_addr_is_multicast(&msg->target)) {
675418d5 896 ND_PRINTK(2, warn, "NA: target address is multicast\n");
1da177e4
LT
897 return;
898 }
899
900 if (ipv6_addr_is_multicast(daddr) &&
901 msg->icmph.icmp6_solicited) {
675418d5 902 ND_PRINTK(2, warn, "NA: solicited NA is multicasted\n");
1da177e4
LT
903 return;
904 }
1ab1457c 905
7a02bf89
JB
906 /* For some 802.11 wireless deployments (and possibly other networks),
907 * there will be a NA proxy and unsolicitd packets are attacks
908 * and thus should not be accepted.
909 */
910 if (!msg->icmph.icmp6_solicited && idev &&
911 idev->cnf.drop_unsolicited_na)
912 return;
913
1da177e4 914 if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) {
675418d5 915 ND_PRINTK(2, warn, "NS: invalid ND option\n");
1da177e4
LT
916 return;
917 }
918 if (ndopts.nd_opts_tgt_lladdr) {
919 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_tgt_lladdr, dev);
920 if (!lladdr) {
675418d5
JP
921 ND_PRINTK(2, warn,
922 "NA: invalid link-layer address length\n");
1da177e4
LT
923 return;
924 }
925 }
c346dca1 926 ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1);
a18bc695 927 if (ifp) {
bd015928
DW
928 if (skb->pkt_type != PACKET_LOOPBACK
929 && (ifp->flags & IFA_F_TENTATIVE)) {
930 addrconf_dad_failure(ifp);
931 return;
1da177e4
LT
932 }
933 /* What should we make now? The advertisement
934 is invalid, but ndisc specs say nothing
935 about it. It could be misconfiguration, or
936 an smart proxy agent tries to help us :-)
24fc7b86
JS
937
938 We should not print the error if NA has been
939 received from loopback - it is just our own
940 unsolicited advertisement.
1da177e4 941 */
24fc7b86 942 if (skb->pkt_type != PACKET_LOOPBACK)
675418d5
JP
943 ND_PRINTK(1, warn,
944 "NA: someone advertises our address %pI6 on %s!\n",
945 &ifp->addr, ifp->idev->dev->name);
1da177e4
LT
946 in6_ifa_put(ifp);
947 return;
948 }
949 neigh = neigh_lookup(&nd_tbl, &msg->target, dev);
950
951 if (neigh) {
952 u8 old_flags = neigh->flags;
53b7997f 953 struct net *net = dev_net(dev);
1da177e4
LT
954
955 if (neigh->nud_state & NUD_FAILED)
956 goto out;
957
5f3e6e9e
VN
958 /*
959 * Don't update the neighbor cache entry on a proxy NA from
960 * ourselves because either the proxied node is off link or it
961 * has already sent a NA to us.
962 */
963 if (lladdr && !memcmp(lladdr, dev->dev_addr, dev->addr_len) &&
53b7997f
YH
964 net->ipv6.devconf_all->forwarding && net->ipv6.devconf_all->proxy_ndp &&
965 pneigh_lookup(&nd_tbl, net, &msg->target, dev, 0)) {
b20b6d97 966 /* XXX: idev->cnf.proxy_ndp */
5f3e6e9e 967 goto out;
fbea49e1 968 }
5f3e6e9e 969
1da177e4
LT
970 neigh_update(neigh, lladdr,
971 msg->icmph.icmp6_solicited ? NUD_REACHABLE : NUD_STALE,
972 NEIGH_UPDATE_F_WEAK_OVERRIDE|
973 (msg->icmph.icmp6_override ? NEIGH_UPDATE_F_OVERRIDE : 0)|
974 NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
975 (msg->icmph.icmp6_router ? NEIGH_UPDATE_F_ISROUTER : 0));
976
977 if ((old_flags & ~neigh->flags) & NTF_ROUTER) {
978 /*
979 * Change: router to host
980 */
be7a010d 981 rt6_clean_tohost(dev_net(dev), saddr);
1da177e4
LT
982 }
983
984out:
985 neigh_release(neigh);
986 }
987}
988
989static void ndisc_recv_rs(struct sk_buff *skb)
990{
9c70220b 991 struct rs_msg *rs_msg = (struct rs_msg *)skb_transport_header(skb);
1da177e4
LT
992 unsigned long ndoptlen = skb->len - sizeof(*rs_msg);
993 struct neighbour *neigh;
994 struct inet6_dev *idev;
b71d1d42 995 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
1da177e4
LT
996 struct ndisc_options ndopts;
997 u8 *lladdr = NULL;
998
999 if (skb->len < sizeof(*rs_msg))
1000 return;
1001
cfdf7647 1002 idev = __in6_dev_get(skb->dev);
1da177e4 1003 if (!idev) {
675418d5 1004 ND_PRINTK(1, err, "RS: can't find in6 device\n");
1da177e4
LT
1005 return;
1006 }
1007
1008 /* Don't accept RS if we're not in router mode */
1009 if (!idev->cnf.forwarding)
1010 goto out;
1011
1012 /*
1013 * Don't update NCE if src = ::;
1014 * this implies that the source node has no ip address assigned yet.
1015 */
1016 if (ipv6_addr_any(saddr))
1017 goto out;
1018
1019 /* Parse ND options */
1020 if (!ndisc_parse_options(rs_msg->opt, ndoptlen, &ndopts)) {
675418d5 1021 ND_PRINTK(2, notice, "NS: invalid ND option, ignored\n");
1da177e4
LT
1022 goto out;
1023 }
1024
1025 if (ndopts.nd_opts_src_lladdr) {
1026 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr,
1027 skb->dev);
1028 if (!lladdr)
1029 goto out;
1030 }
1031
1032 neigh = __neigh_lookup(&nd_tbl, saddr, skb->dev, 1);
1033 if (neigh) {
1034 neigh_update(neigh, lladdr, NUD_STALE,
1035 NEIGH_UPDATE_F_WEAK_OVERRIDE|
1036 NEIGH_UPDATE_F_OVERRIDE|
1037 NEIGH_UPDATE_F_OVERRIDE_ISROUTER);
1038 neigh_release(neigh);
1039 }
1040out:
cfdf7647 1041 return;
1da177e4
LT
1042}
1043
31910575
PY
1044static void ndisc_ra_useropt(struct sk_buff *ra, struct nd_opt_hdr *opt)
1045{
1046 struct icmp6hdr *icmp6h = (struct icmp6hdr *)skb_transport_header(ra);
1047 struct sk_buff *skb;
1048 struct nlmsghdr *nlh;
1049 struct nduseroptmsg *ndmsg;
c346dca1 1050 struct net *net = dev_net(ra->dev);
31910575
PY
1051 int err;
1052 int base_size = NLMSG_ALIGN(sizeof(struct nduseroptmsg)
1053 + (opt->nd_opt_len << 3));
1054 size_t msg_size = base_size + nla_total_size(sizeof(struct in6_addr));
1055
1056 skb = nlmsg_new(msg_size, GFP_ATOMIC);
63159f29 1057 if (!skb) {
31910575
PY
1058 err = -ENOBUFS;
1059 goto errout;
1060 }
1061
1062 nlh = nlmsg_put(skb, 0, 0, RTM_NEWNDUSEROPT, base_size, 0);
63159f29 1063 if (!nlh) {
31910575
PY
1064 goto nla_put_failure;
1065 }
1066
1067 ndmsg = nlmsg_data(nlh);
1068 ndmsg->nduseropt_family = AF_INET6;
dbb2ed24 1069 ndmsg->nduseropt_ifindex = ra->dev->ifindex;
31910575
PY
1070 ndmsg->nduseropt_icmp_type = icmp6h->icmp6_type;
1071 ndmsg->nduseropt_icmp_code = icmp6h->icmp6_code;
1072 ndmsg->nduseropt_opts_len = opt->nd_opt_len << 3;
1073
1074 memcpy(ndmsg + 1, opt, opt->nd_opt_len << 3);
1075
930345ea 1076 if (nla_put_in6_addr(skb, NDUSEROPT_SRCADDR, &ipv6_hdr(ra)->saddr))
c78679e8 1077 goto nla_put_failure;
31910575
PY
1078 nlmsg_end(skb, nlh);
1079
1ce85fe4 1080 rtnl_notify(skb, net, 0, RTNLGRP_ND_USEROPT, NULL, GFP_ATOMIC);
31910575
PY
1081 return;
1082
1083nla_put_failure:
1084 nlmsg_free(skb);
1085 err = -EMSGSIZE;
1086errout:
a18bc695 1087 rtnl_set_sk_err(net, RTNLGRP_ND_USEROPT, err);
31910575
PY
1088}
1089
1da177e4
LT
1090static void ndisc_router_discovery(struct sk_buff *skb)
1091{
9c70220b 1092 struct ra_msg *ra_msg = (struct ra_msg *)skb_transport_header(skb);
1da177e4
LT
1093 struct neighbour *neigh = NULL;
1094 struct inet6_dev *in6_dev;
65f5c7c1 1095 struct rt6_info *rt = NULL;
1da177e4
LT
1096 int lifetime;
1097 struct ndisc_options ndopts;
1098 int optlen;
ebacaaa0 1099 unsigned int pref = 0;
a394eef5 1100 __u32 old_if_flags;
2053aeb6 1101 bool send_ifinfo_notify = false;
1da177e4 1102
67ba4152 1103 __u8 *opt = (__u8 *)(ra_msg + 1);
1da177e4 1104
29a3cad5
SH
1105 optlen = (skb_tail_pointer(skb) - skb_transport_header(skb)) -
1106 sizeof(struct ra_msg);
1da177e4 1107
f2a762d8
BG
1108 ND_PRINTK(2, info,
1109 "RA: %s, dev: %s\n",
1110 __func__, skb->dev->name);
0660e03f 1111 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) {
675418d5 1112 ND_PRINTK(2, warn, "RA: source address is not link-local\n");
1da177e4
LT
1113 return;
1114 }
1115 if (optlen < 0) {
675418d5 1116 ND_PRINTK(2, warn, "RA: packet too short\n");
1da177e4
LT
1117 return;
1118 }
1119
de357cc0 1120#ifdef CONFIG_IPV6_NDISC_NODETYPE
fadf6bf0 1121 if (skb->ndisc_nodetype == NDISC_NODETYPE_HOST) {
675418d5 1122 ND_PRINTK(2, warn, "RA: from host or unauthorized router\n");
fadf6bf0
TF
1123 return;
1124 }
de357cc0 1125#endif
fadf6bf0 1126
1da177e4
LT
1127 /*
1128 * set the RA_RECV flag in the interface
1129 */
1130
cfdf7647 1131 in6_dev = __in6_dev_get(skb->dev);
63159f29 1132 if (!in6_dev) {
675418d5
JP
1133 ND_PRINTK(0, err, "RA: can't find inet6 device for %s\n",
1134 skb->dev->name);
1da177e4
LT
1135 return;
1136 }
1da177e4
LT
1137
1138 if (!ndisc_parse_options(opt, optlen, &ndopts)) {
675418d5 1139 ND_PRINTK(2, warn, "RA: invalid ND options\n");
1da177e4
LT
1140 return;
1141 }
1142
f2a762d8
BG
1143 if (!ipv6_accept_ra(in6_dev)) {
1144 ND_PRINTK(2, info,
1145 "RA: %s, did not accept ra for dev: %s\n",
1146 __func__, skb->dev->name);
31ce8c71 1147 goto skip_linkparms;
f2a762d8 1148 }
31ce8c71 1149
de357cc0 1150#ifdef CONFIG_IPV6_NDISC_NODETYPE
fadf6bf0 1151 /* skip link-specific parameters from interior routers */
f2a762d8
BG
1152 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) {
1153 ND_PRINTK(2, info,
1154 "RA: %s, nodetype is NODEFAULT, dev: %s\n",
1155 __func__, skb->dev->name);
fadf6bf0 1156 goto skip_linkparms;
f2a762d8 1157 }
de357cc0 1158#endif
fadf6bf0 1159
1da177e4
LT
1160 if (in6_dev->if_flags & IF_RS_SENT) {
1161 /*
1162 * flag that an RA was received after an RS was sent
1163 * out on this interface.
1164 */
1165 in6_dev->if_flags |= IF_RA_RCVD;
1166 }
1167
1168 /*
1169 * Remember the managed/otherconf flags from most recently
1170 * received RA message (RFC 2462) -- yoshfuji
1171 */
a394eef5 1172 old_if_flags = in6_dev->if_flags;
1da177e4
LT
1173 in6_dev->if_flags = (in6_dev->if_flags & ~(IF_RA_MANAGED |
1174 IF_RA_OTHERCONF)) |
1175 (ra_msg->icmph.icmp6_addrconf_managed ?
1176 IF_RA_MANAGED : 0) |
1177 (ra_msg->icmph.icmp6_addrconf_other ?
1178 IF_RA_OTHERCONF : 0);
1179
a394eef5 1180 if (old_if_flags != in6_dev->if_flags)
2053aeb6 1181 send_ifinfo_notify = true;
a394eef5 1182
f2a762d8
BG
1183 if (!in6_dev->cnf.accept_ra_defrtr) {
1184 ND_PRINTK(2, info,
1185 "RA: %s, defrtr is false for dev: %s\n",
1186 __func__, skb->dev->name);
65f5c7c1 1187 goto skip_defrtr;
f2a762d8 1188 }
65f5c7c1 1189
d9333196
BG
1190 /* Do not accept RA with source-addr found on local machine unless
1191 * accept_ra_from_local is set to true.
1192 */
b6428817
LR
1193 if (!in6_dev->cnf.accept_ra_from_local &&
1194 ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr,
c1a9a291 1195 in6_dev->dev, 0)) {
f2a762d8 1196 ND_PRINTK(2, info,
d9333196
BG
1197 "RA from local address detected on dev: %s: default router ignored\n",
1198 skb->dev->name);
9f56220f 1199 goto skip_defrtr;
f2a762d8 1200 }
9f56220f 1201
1da177e4
LT
1202 lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime);
1203
ebacaaa0
YH
1204#ifdef CONFIG_IPV6_ROUTER_PREF
1205 pref = ra_msg->icmph.icmp6_router_pref;
1206 /* 10b is handled as if it were 00b (medium) */
930d6ff2 1207 if (pref == ICMPV6_ROUTER_PREF_INVALID ||
6d5b78cd 1208 !in6_dev->cnf.accept_ra_rtr_pref)
ebacaaa0
YH
1209 pref = ICMPV6_ROUTER_PREF_MEDIUM;
1210#endif
1211
0660e03f 1212 rt = rt6_get_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev);
1da177e4 1213
eb857186
DM
1214 if (rt) {
1215 neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr);
1216 if (!neigh) {
675418d5
JP
1217 ND_PRINTK(0, err,
1218 "RA: %s got default router without neighbour\n",
1219 __func__);
94e187c0 1220 ip6_rt_put(rt);
eb857186
DM
1221 return;
1222 }
1223 }
1da177e4 1224 if (rt && lifetime == 0) {
e0a1ad73 1225 ip6_del_rt(rt);
1da177e4
LT
1226 rt = NULL;
1227 }
1228
f2a762d8
BG
1229 ND_PRINTK(3, info, "RA: rt: %p lifetime: %d, for dev: %s\n",
1230 rt, lifetime, skb->dev->name);
63159f29 1231 if (!rt && lifetime) {
f2a762d8 1232 ND_PRINTK(3, info, "RA: adding default router\n");
1da177e4 1233
0660e03f 1234 rt = rt6_add_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev, pref);
63159f29 1235 if (!rt) {
675418d5
JP
1236 ND_PRINTK(0, err,
1237 "RA: %s failed to add default route\n",
1238 __func__);
1da177e4
LT
1239 return;
1240 }
1241
eb857186 1242 neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr);
63159f29 1243 if (!neigh) {
675418d5
JP
1244 ND_PRINTK(0, err,
1245 "RA: %s got default router without neighbour\n",
1246 __func__);
94e187c0 1247 ip6_rt_put(rt);
1da177e4
LT
1248 return;
1249 }
1250 neigh->flags |= NTF_ROUTER;
ebacaaa0 1251 } else if (rt) {
22441cfa 1252 rt->rt6i_flags = (rt->rt6i_flags & ~RTF_PREF_MASK) | RTF_PREF(pref);
1da177e4
LT
1253 }
1254
1255 if (rt)
1716a961 1256 rt6_set_expires(rt, jiffies + (HZ * lifetime));
8013d1d7
HL
1257 if (in6_dev->cnf.accept_ra_min_hop_limit < 256 &&
1258 ra_msg->icmph.icmp6_hop_limit) {
1259 if (in6_dev->cnf.accept_ra_min_hop_limit <= ra_msg->icmph.icmp6_hop_limit) {
6fd99094 1260 in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit;
8013d1d7
HL
1261 if (rt)
1262 dst_metric_set(&rt->dst, RTAX_HOPLIMIT,
1263 ra_msg->icmph.icmp6_hop_limit);
6fd99094 1264 } else {
8013d1d7 1265 ND_PRINTK(2, warn, "RA: Got route advertisement with lower hop_limit than minimum\n");
6fd99094 1266 }
1da177e4
LT
1267 }
1268
65f5c7c1
YH
1269skip_defrtr:
1270
1da177e4
LT
1271 /*
1272 * Update Reachable Time and Retrans Timer
1273 */
1274
1275 if (in6_dev->nd_parms) {
1276 unsigned long rtime = ntohl(ra_msg->retrans_timer);
1277
1278 if (rtime && rtime/1000 < MAX_SCHEDULE_TIMEOUT/HZ) {
1279 rtime = (rtime*HZ)/1000;
1280 if (rtime < HZ/10)
1281 rtime = HZ/10;
1f9248e5 1282 NEIGH_VAR_SET(in6_dev->nd_parms, RETRANS_TIME, rtime);
1da177e4 1283 in6_dev->tstamp = jiffies;
2053aeb6 1284 send_ifinfo_notify = true;
1da177e4
LT
1285 }
1286
1287 rtime = ntohl(ra_msg->reachable_time);
1288 if (rtime && rtime/1000 < MAX_SCHEDULE_TIMEOUT/(3*HZ)) {
1289 rtime = (rtime*HZ)/1000;
1290
1291 if (rtime < HZ/10)
1292 rtime = HZ/10;
1293
1f9248e5
JP
1294 if (rtime != NEIGH_VAR(in6_dev->nd_parms, BASE_REACHABLE_TIME)) {
1295 NEIGH_VAR_SET(in6_dev->nd_parms,
1296 BASE_REACHABLE_TIME, rtime);
1297 NEIGH_VAR_SET(in6_dev->nd_parms,
1298 GC_STALETIME, 3 * rtime);
1da177e4
LT
1299 in6_dev->nd_parms->reachable_time = neigh_rand_reach_time(rtime);
1300 in6_dev->tstamp = jiffies;
2053aeb6 1301 send_ifinfo_notify = true;
1da177e4
LT
1302 }
1303 }
1304 }
1305
2053aeb6
MT
1306 /*
1307 * Send a notify if RA changed managed/otherconf flags or timer settings
1308 */
1309 if (send_ifinfo_notify)
1310 inet6_ifinfo_notify(RTM_NEWLINK, in6_dev);
1311
fadf6bf0
TF
1312skip_linkparms:
1313
1da177e4
LT
1314 /*
1315 * Process options.
1316 */
1317
1318 if (!neigh)
0660e03f 1319 neigh = __neigh_lookup(&nd_tbl, &ipv6_hdr(skb)->saddr,
1da177e4
LT
1320 skb->dev, 1);
1321 if (neigh) {
1322 u8 *lladdr = NULL;
1323 if (ndopts.nd_opts_src_lladdr) {
1324 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr,
1325 skb->dev);
1326 if (!lladdr) {
675418d5
JP
1327 ND_PRINTK(2, warn,
1328 "RA: invalid link-layer address length\n");
1da177e4
LT
1329 goto out;
1330 }
1331 }
1332 neigh_update(neigh, lladdr, NUD_STALE,
1333 NEIGH_UPDATE_F_WEAK_OVERRIDE|
1334 NEIGH_UPDATE_F_OVERRIDE|
1335 NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
1336 NEIGH_UPDATE_F_ISROUTER);
1337 }
1338
f2a762d8
BG
1339 if (!ipv6_accept_ra(in6_dev)) {
1340 ND_PRINTK(2, info,
1341 "RA: %s, accept_ra is false for dev: %s\n",
1342 __func__, skb->dev->name);
31ce8c71 1343 goto out;
f2a762d8 1344 }
31ce8c71 1345
70ceb4f5 1346#ifdef CONFIG_IPV6_ROUTE_INFO
b6428817
LR
1347 if (!in6_dev->cnf.accept_ra_from_local &&
1348 ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr,
c1a9a291 1349 in6_dev->dev, 0)) {
f2a762d8 1350 ND_PRINTK(2, info,
d9333196
BG
1351 "RA from local address detected on dev: %s: router info ignored.\n",
1352 skb->dev->name);
9f56220f 1353 goto skip_routeinfo;
f2a762d8 1354 }
9f56220f 1355
09c884d4 1356 if (in6_dev->cnf.accept_ra_rtr_pref && ndopts.nd_opts_ri) {
70ceb4f5
YH
1357 struct nd_opt_hdr *p;
1358 for (p = ndopts.nd_opts_ri;
1359 p;
1360 p = ndisc_next_option(p, ndopts.nd_opts_ri_end)) {
6294e000
YH
1361 struct route_info *ri = (struct route_info *)p;
1362#ifdef CONFIG_IPV6_NDISC_NODETYPE
1363 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT &&
1364 ri->prefix_len == 0)
1365 continue;
1366#endif
30e56918
DJ
1367 if (ri->prefix_len == 0 &&
1368 !in6_dev->cnf.accept_ra_defrtr)
1369 continue;
6294e000 1370 if (ri->prefix_len > in6_dev->cnf.accept_ra_rt_info_max_plen)
09c884d4 1371 continue;
67ba4152 1372 rt6_route_rcv(skb->dev, (u8 *)p, (p->nd_opt_len) << 3,
0660e03f 1373 &ipv6_hdr(skb)->saddr);
70ceb4f5
YH
1374 }
1375 }
9f56220f
AH
1376
1377skip_routeinfo:
70ceb4f5
YH
1378#endif
1379
de357cc0 1380#ifdef CONFIG_IPV6_NDISC_NODETYPE
fadf6bf0 1381 /* skip link-specific ndopts from interior routers */
f2a762d8
BG
1382 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) {
1383 ND_PRINTK(2, info,
1384 "RA: %s, nodetype is NODEFAULT (interior routes), dev: %s\n",
1385 __func__, skb->dev->name);
fadf6bf0 1386 goto out;
f2a762d8 1387 }
de357cc0 1388#endif
fadf6bf0 1389
c4fd30eb 1390 if (in6_dev->cnf.accept_ra_pinfo && ndopts.nd_opts_pi) {
1da177e4
LT
1391 struct nd_opt_hdr *p;
1392 for (p = ndopts.nd_opts_pi;
1393 p;
1394 p = ndisc_next_option(p, ndopts.nd_opts_pi_end)) {
e6bff995
NH
1395 addrconf_prefix_rcv(skb->dev, (u8 *)p,
1396 (p->nd_opt_len) << 3,
1397 ndopts.nd_opts_src_lladdr != NULL);
1da177e4
LT
1398 }
1399 }
1400
c2943f14 1401 if (ndopts.nd_opts_mtu && in6_dev->cnf.accept_ra_mtu) {
e69a4adc 1402 __be32 n;
1da177e4
LT
1403 u32 mtu;
1404
67ba4152 1405 memcpy(&n, ((u8 *)(ndopts.nd_opts_mtu+1))+2, sizeof(mtu));
e69a4adc 1406 mtu = ntohl(n);
1da177e4
LT
1407
1408 if (mtu < IPV6_MIN_MTU || mtu > skb->dev->mtu) {
675418d5 1409 ND_PRINTK(2, warn, "RA: invalid mtu: %d\n", mtu);
1da177e4
LT
1410 } else if (in6_dev->cnf.mtu6 != mtu) {
1411 in6_dev->cnf.mtu6 = mtu;
1412
1413 if (rt)
defb3519 1414 dst_metric_set(&rt->dst, RTAX_MTU, mtu);
1da177e4
LT
1415
1416 rt6_mtu_change(skb->dev, mtu);
1417 }
1418 }
1ab1457c 1419
31910575 1420 if (ndopts.nd_useropts) {
61cf46ad
YH
1421 struct nd_opt_hdr *p;
1422 for (p = ndopts.nd_useropts;
1423 p;
1424 p = ndisc_next_useropt(p, ndopts.nd_useropts_end)) {
1425 ndisc_ra_useropt(skb, p);
31910575
PY
1426 }
1427 }
1428
1da177e4 1429 if (ndopts.nd_opts_tgt_lladdr || ndopts.nd_opts_rh) {
675418d5 1430 ND_PRINTK(2, warn, "RA: invalid RA options\n");
1da177e4
LT
1431 }
1432out:
94e187c0 1433 ip6_rt_put(rt);
eb857186 1434 if (neigh)
1da177e4 1435 neigh_release(neigh);
1da177e4
LT
1436}
1437
1438static void ndisc_redirect_rcv(struct sk_buff *skb)
1439{
093d04d4
DJ
1440 u8 *hdr;
1441 struct ndisc_options ndopts;
1442 struct rd_msg *msg = (struct rd_msg *)skb_transport_header(skb);
29a3cad5 1443 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) +
093d04d4
DJ
1444 offsetof(struct rd_msg, opt));
1445
de357cc0 1446#ifdef CONFIG_IPV6_NDISC_NODETYPE
fadf6bf0
TF
1447 switch (skb->ndisc_nodetype) {
1448 case NDISC_NODETYPE_HOST:
1449 case NDISC_NODETYPE_NODEFAULT:
675418d5
JP
1450 ND_PRINTK(2, warn,
1451 "Redirect: from host or unauthorized router\n");
fadf6bf0
TF
1452 return;
1453 }
de357cc0 1454#endif
fadf6bf0 1455
0660e03f 1456 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) {
675418d5
JP
1457 ND_PRINTK(2, warn,
1458 "Redirect: source address is not link-local\n");
1da177e4
LT
1459 return;
1460 }
1461
093d04d4
DJ
1462 if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts))
1463 return;
1464
c92a59ec 1465 if (!ndopts.nd_opts_rh) {
b55b76b2
DJ
1466 ip6_redirect_no_header(skb, dev_net(skb->dev),
1467 skb->dev->ifindex, 0);
093d04d4 1468 return;
c92a59ec 1469 }
093d04d4
DJ
1470
1471 hdr = (u8 *)ndopts.nd_opts_rh;
1472 hdr += 8;
1473 if (!pskb_pull(skb, hdr - skb_transport_header(skb)))
1474 return;
1475
b94f1c09 1476 icmpv6_notify(skb, NDISC_REDIRECT, 0, 0);
1da177e4
LT
1477}
1478
5f5a0115
YH
1479static void ndisc_fill_redirect_hdr_option(struct sk_buff *skb,
1480 struct sk_buff *orig_skb,
1481 int rd_len)
9c86dafe 1482{
5f5a0115
YH
1483 u8 *opt = skb_put(skb, rd_len);
1484
9c86dafe
YH
1485 memset(opt, 0, 8);
1486 *(opt++) = ND_OPT_REDIRECT_HDR;
1487 *(opt++) = (rd_len >> 3);
1488 opt += 6;
1489
1490 memcpy(opt, ipv6_hdr(orig_skb), rd_len - 8);
9c86dafe
YH
1491}
1492
4991969a 1493void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target)
1da177e4 1494{
1762f7e8 1495 struct net_device *dev = skb->dev;
c346dca1 1496 struct net *net = dev_net(dev);
1762f7e8 1497 struct sock *sk = net->ipv6.ndisc_sk;
2ce13576 1498 int optlen = 0;
fbfe95a4 1499 struct inet_peer *peer;
1da177e4 1500 struct sk_buff *buff;
71bcdba0 1501 struct rd_msg *msg;
1da177e4 1502 struct in6_addr saddr_buf;
1da177e4
LT
1503 struct rt6_info *rt;
1504 struct dst_entry *dst;
4c9483b2 1505 struct flowi6 fl6;
1da177e4 1506 int rd_len;
1da177e4 1507 u8 ha_buf[MAX_ADDR_LEN], *ha = NULL;
ca254490 1508 int oif = l3mdev_fib_oif(dev);
1d861aa4 1509 bool ret;
1da177e4 1510
95c385b4 1511 if (ipv6_get_lladdr(dev, &saddr_buf, IFA_F_TENTATIVE)) {
675418d5
JP
1512 ND_PRINTK(2, warn, "Redirect: no link-local address on %s\n",
1513 dev->name);
1ab1457c
YH
1514 return;
1515 }
1da177e4 1516
0660e03f 1517 if (!ipv6_addr_equal(&ipv6_hdr(skb)->daddr, target) &&
bf0b48df 1518 ipv6_addr_type(target) != (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) {
675418d5
JP
1519 ND_PRINTK(2, warn,
1520 "Redirect: target address is not link-local unicast\n");
29556526
LY
1521 return;
1522 }
1523
4c9483b2 1524 icmpv6_flow_init(sk, &fl6, NDISC_REDIRECT,
ca254490
DA
1525 &saddr_buf, &ipv6_hdr(skb)->saddr, oif);
1526
1527 if (oif != skb->dev->ifindex)
1528 fl6.flowi6_flags |= FLOWI_FLAG_L3MDEV_SRC;
1da177e4 1529
4c9483b2 1530 dst = ip6_route_output(net, NULL, &fl6);
5095d64d
RL
1531 if (dst->error) {
1532 dst_release(dst);
1da177e4 1533 return;
5095d64d 1534 }
4c9483b2 1535 dst = xfrm_lookup(net, dst, flowi6_to_flowi(&fl6), NULL, 0);
452edd59 1536 if (IS_ERR(dst))
1da177e4 1537 return;
1da177e4
LT
1538
1539 rt = (struct rt6_info *) dst;
1540
1541 if (rt->rt6i_flags & RTF_GATEWAY) {
675418d5
JP
1542 ND_PRINTK(2, warn,
1543 "Redirect: destination is not a neighbour\n");
d73f0801 1544 goto release;
1da177e4 1545 }
fd0273d7 1546 peer = inet_getpeer_v6(net->ipv6.peers, &ipv6_hdr(skb)->saddr, 1);
1d861aa4
DM
1547 ret = inet_peer_xrlim_allow(peer, 1*HZ);
1548 if (peer)
1549 inet_putpeer(peer);
1550 if (!ret)
d73f0801 1551 goto release;
1da177e4
LT
1552
1553 if (dev->addr_len) {
4991969a
DM
1554 struct neighbour *neigh = dst_neigh_lookup(skb_dst(skb), target);
1555 if (!neigh) {
675418d5
JP
1556 ND_PRINTK(2, warn,
1557 "Redirect: no neigh for target address\n");
4991969a
DM
1558 goto release;
1559 }
1560
1da177e4
LT
1561 read_lock_bh(&neigh->lock);
1562 if (neigh->nud_state & NUD_VALID) {
1563 memcpy(ha_buf, neigh->ha, dev->addr_len);
1564 read_unlock_bh(&neigh->lock);
1565 ha = ha_buf;
2ce13576 1566 optlen += ndisc_opt_addr_space(dev);
1da177e4
LT
1567 } else
1568 read_unlock_bh(&neigh->lock);
4991969a
DM
1569
1570 neigh_release(neigh);
1da177e4
LT
1571 }
1572
1573 rd_len = min_t(unsigned int,
2ce13576
YH
1574 IPV6_MIN_MTU - sizeof(struct ipv6hdr) - sizeof(*msg) - optlen,
1575 skb->len + 8);
1da177e4 1576 rd_len &= ~0x7;
2ce13576 1577 optlen += rd_len;
1da177e4 1578
2ce13576 1579 buff = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
de09334b 1580 if (!buff)
d73f0801 1581 goto release;
1da177e4 1582
4d5c152e
YH
1583 msg = (struct rd_msg *)skb_put(buff, sizeof(*msg));
1584 *msg = (struct rd_msg) {
1585 .icmph = {
1586 .icmp6_type = NDISC_REDIRECT,
1587 },
1588 .target = *target,
1589 .dest = ipv6_hdr(skb)->daddr,
1590 };
1da177e4 1591
1da177e4
LT
1592 /*
1593 * include target_address option
1594 */
1595
1596 if (ha)
33be081a 1597 ndisc_fill_addr_option(buff, ND_OPT_TARGET_LL_ADDR, ha);
1da177e4
LT
1598
1599 /*
1600 * build redirect option and copy skb over to the new packet.
1601 */
1602
9c86dafe 1603 if (rd_len)
5f5a0115 1604 ndisc_fill_redirect_hdr_option(buff, skb, rd_len);
1da177e4 1605
adf30907 1606 skb_dst_set(buff, dst);
f4de84c6 1607 ndisc_send_skb(buff, &ipv6_hdr(skb)->saddr, &saddr_buf);
d73f0801
IJ
1608 return;
1609
1610release:
1611 dst_release(dst);
1da177e4
LT
1612}
1613
1614static void pndisc_redo(struct sk_buff *skb)
1615{
140e26fc 1616 ndisc_recv_ns(skb);
1da177e4
LT
1617 kfree_skb(skb);
1618}
1619
b800c3b9
HFS
1620static bool ndisc_suppress_frag_ndisc(struct sk_buff *skb)
1621{
1622 struct inet6_dev *idev = __in6_dev_get(skb->dev);
1623
1624 if (!idev)
1625 return true;
1626 if (IP6CB(skb)->flags & IP6SKB_FRAGMENTED &&
1627 idev->cnf.suppress_frag_ndisc) {
1628 net_warn_ratelimited("Received fragmented ndisc packet. Carefully consider disabling suppress_frag_ndisc.\n");
1629 return true;
1630 }
1631 return false;
1632}
1633
1da177e4
LT
1634int ndisc_rcv(struct sk_buff *skb)
1635{
1636 struct nd_msg *msg;
1637
b800c3b9
HFS
1638 if (ndisc_suppress_frag_ndisc(skb))
1639 return 0;
1640
6bce6b4e 1641 if (skb_linearize(skb))
1da177e4
LT
1642 return 0;
1643
9c70220b 1644 msg = (struct nd_msg *)skb_transport_header(skb);
1da177e4 1645
9c70220b 1646 __skb_push(skb, skb->data - skb_transport_header(skb));
1da177e4 1647
0660e03f 1648 if (ipv6_hdr(skb)->hop_limit != 255) {
675418d5
JP
1649 ND_PRINTK(2, warn, "NDISC: invalid hop-limit: %d\n",
1650 ipv6_hdr(skb)->hop_limit);
1da177e4
LT
1651 return 0;
1652 }
1653
1654 if (msg->icmph.icmp6_code != 0) {
675418d5
JP
1655 ND_PRINTK(2, warn, "NDISC: invalid ICMPv6 code: %d\n",
1656 msg->icmph.icmp6_code);
1da177e4
LT
1657 return 0;
1658 }
1659
a61bbcf2
PM
1660 memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb));
1661
1da177e4
LT
1662 switch (msg->icmph.icmp6_type) {
1663 case NDISC_NEIGHBOUR_SOLICITATION:
1664 ndisc_recv_ns(skb);
1665 break;
1666
1667 case NDISC_NEIGHBOUR_ADVERTISEMENT:
1668 ndisc_recv_na(skb);
1669 break;
1670
1671 case NDISC_ROUTER_SOLICITATION:
1672 ndisc_recv_rs(skb);
1673 break;
1674
1675 case NDISC_ROUTER_ADVERTISEMENT:
1676 ndisc_router_discovery(skb);
1677 break;
1678
1679 case NDISC_REDIRECT:
1680 ndisc_redirect_rcv(skb);
1681 break;
3ff50b79 1682 }
1da177e4
LT
1683
1684 return 0;
1685}
1686
1687static int ndisc_netdev_event(struct notifier_block *this, unsigned long event, void *ptr)
1688{
351638e7 1689 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
c8507fb2 1690 struct netdev_notifier_change_info *change_info;
c346dca1 1691 struct net *net = dev_net(dev);
5cb04436 1692 struct inet6_dev *idev;
1da177e4
LT
1693
1694 switch (event) {
1695 case NETDEV_CHANGEADDR:
1696 neigh_changeaddr(&nd_tbl, dev);
2ac3ac8f 1697 fib6_run_gc(0, net, false);
5cb04436
HFS
1698 idev = in6_dev_get(dev);
1699 if (!idev)
1700 break;
1701 if (idev->cnf.ndisc_notify)
1702 ndisc_send_unsol_na(dev);
1703 in6_dev_put(idev);
1da177e4 1704 break;
c8507fb2
ED
1705 case NETDEV_CHANGE:
1706 change_info = ptr;
1707 if (change_info->flags_changed & IFF_NOARP)
1708 neigh_changeaddr(&nd_tbl, dev);
1709 break;
1da177e4
LT
1710 case NETDEV_DOWN:
1711 neigh_ifdown(&nd_tbl, dev);
2ac3ac8f 1712 fib6_run_gc(0, net, false);
1da177e4 1713 break;
f47b9464
BH
1714 case NETDEV_NOTIFY_PEERS:
1715 ndisc_send_unsol_na(dev);
1716 break;
1da177e4
LT
1717 default:
1718 break;
1719 }
1720
1721 return NOTIFY_DONE;
1722}
1723
1724static struct notifier_block ndisc_netdev_notifier = {
1725 .notifier_call = ndisc_netdev_event,
1726};
1727
1728#ifdef CONFIG_SYSCTL
1729static void ndisc_warn_deprecated_sysctl(struct ctl_table *ctl,
1730 const char *func, const char *dev_name)
1731{
1732 static char warncomm[TASK_COMM_LEN];
1733 static int warned;
1734 if (strcmp(warncomm, current->comm) && warned < 5) {
1735 strcpy(warncomm, current->comm);
f3213831 1736 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
1737 warncomm, func,
1738 dev_name, ctl->procname,
1739 dev_name, ctl->procname);
1740 warned++;
1741 }
1742}
1743
8d65af78 1744int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl, int write, void __user *buffer, size_t *lenp, loff_t *ppos)
1da177e4
LT
1745{
1746 struct net_device *dev = ctl->extra1;
1747 struct inet6_dev *idev;
1748 int ret;
1749
d12af679
EB
1750 if ((strcmp(ctl->procname, "retrans_time") == 0) ||
1751 (strcmp(ctl->procname, "base_reachable_time") == 0))
1da177e4
LT
1752 ndisc_warn_deprecated_sysctl(ctl, "syscall", dev ? dev->name : "default");
1753
d12af679 1754 if (strcmp(ctl->procname, "retrans_time") == 0)
cb5b09c1 1755 ret = neigh_proc_dointvec(ctl, write, buffer, lenp, ppos);
d12af679
EB
1756
1757 else if (strcmp(ctl->procname, "base_reachable_time") == 0)
cb5b09c1
JP
1758 ret = neigh_proc_dointvec_jiffies(ctl, write,
1759 buffer, lenp, ppos);
d12af679
EB
1760
1761 else if ((strcmp(ctl->procname, "retrans_time_ms") == 0) ||
ad02ac14 1762 (strcmp(ctl->procname, "base_reachable_time_ms") == 0))
cb5b09c1
JP
1763 ret = neigh_proc_dointvec_ms_jiffies(ctl, write,
1764 buffer, lenp, ppos);
d12af679 1765 else
1da177e4 1766 ret = -1;
1da177e4
LT
1767
1768 if (write && ret == 0 && dev && (idev = in6_dev_get(dev)) != NULL) {
1f9248e5
JP
1769 if (ctl->data == &NEIGH_VAR(idev->nd_parms, BASE_REACHABLE_TIME))
1770 idev->nd_parms->reachable_time =
1771 neigh_rand_reach_time(NEIGH_VAR(idev->nd_parms, BASE_REACHABLE_TIME));
1da177e4
LT
1772 idev->tstamp = jiffies;
1773 inet6_ifinfo_notify(RTM_NEWLINK, idev);
1774 in6_dev_put(idev);
1775 }
1776 return ret;
1777}
1778
1da177e4
LT
1779
1780#endif
1781
2c8c1e72 1782static int __net_init ndisc_net_init(struct net *net)
1da177e4
LT
1783{
1784 struct ipv6_pinfo *np;
1785 struct sock *sk;
1ab1457c 1786 int err;
1da177e4 1787
1ed8516f
DL
1788 err = inet_ctl_sock_create(&sk, PF_INET6,
1789 SOCK_RAW, IPPROTO_ICMPV6, net);
1da177e4 1790 if (err < 0) {
675418d5
JP
1791 ND_PRINTK(0, err,
1792 "NDISC: Failed to initialize the control socket (err %d)\n",
1793 err);
1da177e4
LT
1794 return err;
1795 }
1796
1ed8516f 1797 net->ipv6.ndisc_sk = sk;
1762f7e8 1798
1da177e4 1799 np = inet6_sk(sk);
1da177e4
LT
1800 np->hop_limit = 255;
1801 /* Do not loopback ndisc messages */
1802 np->mc_loop = 0;
1da177e4 1803
1762f7e8
DL
1804 return 0;
1805}
1806
2c8c1e72 1807static void __net_exit ndisc_net_exit(struct net *net)
1762f7e8 1808{
1ed8516f 1809 inet_ctl_sock_destroy(net->ipv6.ndisc_sk);
1762f7e8
DL
1810}
1811
1812static struct pernet_operations ndisc_net_ops = {
1813 .init = ndisc_net_init,
1814 .exit = ndisc_net_exit,
1815};
1816
1817int __init ndisc_init(void)
1818{
1819 int err;
1820
1821 err = register_pernet_subsys(&ndisc_net_ops);
1822 if (err)
1823 return err;
1ab1457c
YH
1824 /*
1825 * Initialize the neighbour table
1826 */
d7480fd3 1827 neigh_table_init(NEIGH_ND_TABLE, &nd_tbl);
1da177e4
LT
1828
1829#ifdef CONFIG_SYSCTL
73af614a 1830 err = neigh_sysctl_register(NULL, &nd_tbl.parms,
56ec0fb1 1831 ndisc_ifinfo_sysctl_change);
1762f7e8
DL
1832 if (err)
1833 goto out_unregister_pernet;
1762f7e8 1834out:
bcd081a3 1835#endif
1762f7e8 1836 return err;
1da177e4 1837
1762f7e8 1838#ifdef CONFIG_SYSCTL
1762f7e8 1839out_unregister_pernet:
1762f7e8
DL
1840 unregister_pernet_subsys(&ndisc_net_ops);
1841 goto out;
2c861cc6 1842#endif
1da177e4
LT
1843}
1844
2c861cc6
MK
1845int __init ndisc_late_init(void)
1846{
1847 return register_netdevice_notifier(&ndisc_netdev_notifier);
1848}
1849
1850void ndisc_late_cleanup(void)
1da177e4 1851{
36f73d0c 1852 unregister_netdevice_notifier(&ndisc_netdev_notifier);
2c861cc6
MK
1853}
1854
1855void ndisc_cleanup(void)
1856{
1da177e4
LT
1857#ifdef CONFIG_SYSCTL
1858 neigh_sysctl_unregister(&nd_tbl.parms);
1859#endif
d7480fd3 1860 neigh_table_clear(NEIGH_ND_TABLE, &nd_tbl);
1762f7e8 1861 unregister_pernet_subsys(&ndisc_net_ops);
1da177e4 1862}
This page took 1.0805 seconds and 5 git commands to generate.