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