2 * Neighbour Discovery for IPv6
3 * Linux INET6 implementation
6 * Pedro Roque <roque@di.fc.ul.pt>
7 * Mike Shaver <shaver@ingenia.com>
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.
18 * Alexey I. Froloff : RFC6106 (DNSSL) support
19 * Pierre Ynard : export userland ND options
20 * through netlink (RDNSS support)
21 * Lars Fenneberg : fixed MTU setting on receipt
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
30 #define pr_fmt(fmt) "ICMPv6: " fmt
32 #include <linux/module.h>
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>
43 #include <linux/slab.h>
45 #include <linux/sysctl.h>
48 #include <linux/if_addr.h>
49 #include <linux/if_arp.h>
50 #include <linux/ipv6.h>
51 #include <linux/icmpv6.h>
52 #include <linux/jhash.h>
58 #include <net/protocol.h>
59 #include <net/ndisc.h>
60 #include <net/ip6_route.h>
61 #include <net/addrconf.h>
64 #include <net/netlink.h>
65 #include <linux/rtnetlink.h>
68 #include <net/ip6_checksum.h>
69 #include <net/inet_common.h>
70 #include <linux/proc_fs.h>
72 #include <linux/netfilter.h>
73 #include <linux/netfilter_ipv6.h>
75 static u32
ndisc_hash(const void *pkey
,
76 const struct net_device
*dev
,
78 static bool ndisc_key_eq(const struct neighbour
*neigh
, const void *pkey
);
79 static int ndisc_constructor(struct neighbour
*neigh
);
80 static void ndisc_solicit(struct neighbour
*neigh
, struct sk_buff
*skb
);
81 static void ndisc_error_report(struct neighbour
*neigh
, struct sk_buff
*skb
);
82 static int pndisc_constructor(struct pneigh_entry
*n
);
83 static void pndisc_destructor(struct pneigh_entry
*n
);
84 static void pndisc_redo(struct sk_buff
*skb
);
86 static const struct neigh_ops ndisc_generic_ops
= {
88 .solicit
= ndisc_solicit
,
89 .error_report
= ndisc_error_report
,
90 .output
= neigh_resolve_output
,
91 .connected_output
= neigh_connected_output
,
94 static const struct neigh_ops ndisc_hh_ops
= {
96 .solicit
= ndisc_solicit
,
97 .error_report
= ndisc_error_report
,
98 .output
= neigh_resolve_output
,
99 .connected_output
= neigh_resolve_output
,
103 static const struct neigh_ops ndisc_direct_ops
= {
105 .output
= neigh_direct_output
,
106 .connected_output
= neigh_direct_output
,
109 struct neigh_table nd_tbl
= {
111 .key_len
= sizeof(struct in6_addr
),
112 .protocol
= cpu_to_be16(ETH_P_IPV6
),
114 .key_eq
= ndisc_key_eq
,
115 .constructor
= ndisc_constructor
,
116 .pconstructor
= pndisc_constructor
,
117 .pdestructor
= pndisc_destructor
,
118 .proxy_redo
= pndisc_redo
,
122 .reachable_time
= ND_REACHABLE_TIME
,
124 [NEIGH_VAR_MCAST_PROBES
] = 3,
125 [NEIGH_VAR_UCAST_PROBES
] = 3,
126 [NEIGH_VAR_RETRANS_TIME
] = ND_RETRANS_TIMER
,
127 [NEIGH_VAR_BASE_REACHABLE_TIME
] = ND_REACHABLE_TIME
,
128 [NEIGH_VAR_DELAY_PROBE_TIME
] = 5 * HZ
,
129 [NEIGH_VAR_GC_STALETIME
] = 60 * HZ
,
130 [NEIGH_VAR_QUEUE_LEN_BYTES
] = SK_WMEM_MAX
,
131 [NEIGH_VAR_PROXY_QLEN
] = 64,
132 [NEIGH_VAR_ANYCAST_DELAY
] = 1 * HZ
,
133 [NEIGH_VAR_PROXY_DELAY
] = (8 * HZ
) / 10,
136 .gc_interval
= 30 * HZ
,
141 EXPORT_SYMBOL_GPL(nd_tbl
);
143 void __ndisc_fill_addr_option(struct sk_buff
*skb
, int type
, void *data
,
144 int data_len
, int pad
)
146 int space
= __ndisc_opt_addr_space(data_len
, pad
);
147 u8
*opt
= skb_put(skb
, space
);
152 memset(opt
+ 2, 0, pad
);
156 memcpy(opt
+2, data
, data_len
);
161 memset(opt
, 0, space
);
163 EXPORT_SYMBOL_GPL(__ndisc_fill_addr_option
);
165 static inline void ndisc_fill_addr_option(struct sk_buff
*skb
, int type
,
166 void *data
, u8 icmp6_type
)
168 __ndisc_fill_addr_option(skb
, type
, data
, skb
->dev
->addr_len
,
169 ndisc_addr_option_pad(skb
->dev
->type
));
170 ndisc_ops_fill_addr_option(skb
->dev
, skb
, icmp6_type
);
173 static inline void ndisc_fill_redirect_addr_option(struct sk_buff
*skb
,
177 ndisc_fill_addr_option(skb
, ND_OPT_TARGET_LL_ADDR
, ha
, NDISC_REDIRECT
);
178 ndisc_ops_fill_redirect_addr_option(skb
->dev
, skb
, ops_data
);
181 static struct nd_opt_hdr
*ndisc_next_option(struct nd_opt_hdr
*cur
,
182 struct nd_opt_hdr
*end
)
185 if (!cur
|| !end
|| cur
>= end
)
187 type
= cur
->nd_opt_type
;
189 cur
= ((void *)cur
) + (cur
->nd_opt_len
<< 3);
190 } while (cur
< end
&& cur
->nd_opt_type
!= type
);
191 return cur
<= end
&& cur
->nd_opt_type
== type
? cur
: NULL
;
194 static inline int ndisc_is_useropt(const struct net_device
*dev
,
195 struct nd_opt_hdr
*opt
)
197 return opt
->nd_opt_type
== ND_OPT_RDNSS
||
198 opt
->nd_opt_type
== ND_OPT_DNSSL
||
199 ndisc_ops_is_useropt(dev
, opt
->nd_opt_type
);
202 static struct nd_opt_hdr
*ndisc_next_useropt(const struct net_device
*dev
,
203 struct nd_opt_hdr
*cur
,
204 struct nd_opt_hdr
*end
)
206 if (!cur
|| !end
|| cur
>= end
)
209 cur
= ((void *)cur
) + (cur
->nd_opt_len
<< 3);
210 } while (cur
< end
&& !ndisc_is_useropt(dev
, cur
));
211 return cur
<= end
&& ndisc_is_useropt(dev
, cur
) ? cur
: NULL
;
214 struct ndisc_options
*ndisc_parse_options(const struct net_device
*dev
,
215 u8
*opt
, int opt_len
,
216 struct ndisc_options
*ndopts
)
218 struct nd_opt_hdr
*nd_opt
= (struct nd_opt_hdr
*)opt
;
220 if (!nd_opt
|| opt_len
< 0 || !ndopts
)
222 memset(ndopts
, 0, sizeof(*ndopts
));
225 if (opt_len
< sizeof(struct nd_opt_hdr
))
227 l
= nd_opt
->nd_opt_len
<< 3;
228 if (opt_len
< l
|| l
== 0)
230 if (ndisc_ops_parse_options(dev
, nd_opt
, ndopts
))
232 switch (nd_opt
->nd_opt_type
) {
233 case ND_OPT_SOURCE_LL_ADDR
:
234 case ND_OPT_TARGET_LL_ADDR
:
237 case ND_OPT_REDIRECT_HDR
:
238 if (ndopts
->nd_opt_array
[nd_opt
->nd_opt_type
]) {
240 "%s: duplicated ND6 option found: type=%d\n",
241 __func__
, nd_opt
->nd_opt_type
);
243 ndopts
->nd_opt_array
[nd_opt
->nd_opt_type
] = nd_opt
;
246 case ND_OPT_PREFIX_INFO
:
247 ndopts
->nd_opts_pi_end
= nd_opt
;
248 if (!ndopts
->nd_opt_array
[nd_opt
->nd_opt_type
])
249 ndopts
->nd_opt_array
[nd_opt
->nd_opt_type
] = nd_opt
;
251 #ifdef CONFIG_IPV6_ROUTE_INFO
252 case ND_OPT_ROUTE_INFO
:
253 ndopts
->nd_opts_ri_end
= nd_opt
;
254 if (!ndopts
->nd_opts_ri
)
255 ndopts
->nd_opts_ri
= nd_opt
;
259 if (ndisc_is_useropt(dev
, nd_opt
)) {
260 ndopts
->nd_useropts_end
= nd_opt
;
261 if (!ndopts
->nd_useropts
)
262 ndopts
->nd_useropts
= nd_opt
;
265 * Unknown options must be silently ignored,
266 * to accommodate future extension to the
270 "%s: ignored unsupported option; type=%d, len=%d\n",
278 nd_opt
= ((void *)nd_opt
) + l
;
283 int ndisc_mc_map(const struct in6_addr
*addr
, char *buf
, struct net_device
*dev
, int dir
)
287 case ARPHRD_IEEE802
: /* Not sure. Check it later. --ANK */
289 ipv6_eth_mc_map(addr
, buf
);
292 ipv6_arcnet_mc_map(addr
, buf
);
294 case ARPHRD_INFINIBAND
:
295 ipv6_ib_mc_map(addr
, dev
->broadcast
, buf
);
298 return ipv6_ipgre_mc_map(addr
, dev
->broadcast
, buf
);
301 memcpy(buf
, dev
->broadcast
, dev
->addr_len
);
307 EXPORT_SYMBOL(ndisc_mc_map
);
309 static u32
ndisc_hash(const void *pkey
,
310 const struct net_device
*dev
,
313 return ndisc_hashfn(pkey
, dev
, hash_rnd
);
316 static bool ndisc_key_eq(const struct neighbour
*n
, const void *pkey
)
318 return neigh_key_eq128(n
, pkey
);
321 static int ndisc_constructor(struct neighbour
*neigh
)
323 struct in6_addr
*addr
= (struct in6_addr
*)&neigh
->primary_key
;
324 struct net_device
*dev
= neigh
->dev
;
325 struct inet6_dev
*in6_dev
;
326 struct neigh_parms
*parms
;
327 bool is_multicast
= ipv6_addr_is_multicast(addr
);
329 in6_dev
= in6_dev_get(dev
);
334 parms
= in6_dev
->nd_parms
;
335 __neigh_parms_put(neigh
->parms
);
336 neigh
->parms
= neigh_parms_clone(parms
);
338 neigh
->type
= is_multicast
? RTN_MULTICAST
: RTN_UNICAST
;
339 if (!dev
->header_ops
) {
340 neigh
->nud_state
= NUD_NOARP
;
341 neigh
->ops
= &ndisc_direct_ops
;
342 neigh
->output
= neigh_direct_output
;
345 neigh
->nud_state
= NUD_NOARP
;
346 ndisc_mc_map(addr
, neigh
->ha
, dev
, 1);
347 } else if (dev
->flags
&(IFF_NOARP
|IFF_LOOPBACK
)) {
348 neigh
->nud_state
= NUD_NOARP
;
349 memcpy(neigh
->ha
, dev
->dev_addr
, dev
->addr_len
);
350 if (dev
->flags
&IFF_LOOPBACK
)
351 neigh
->type
= RTN_LOCAL
;
352 } else if (dev
->flags
&IFF_POINTOPOINT
) {
353 neigh
->nud_state
= NUD_NOARP
;
354 memcpy(neigh
->ha
, dev
->broadcast
, dev
->addr_len
);
356 if (dev
->header_ops
->cache
)
357 neigh
->ops
= &ndisc_hh_ops
;
359 neigh
->ops
= &ndisc_generic_ops
;
360 if (neigh
->nud_state
&NUD_VALID
)
361 neigh
->output
= neigh
->ops
->connected_output
;
363 neigh
->output
= neigh
->ops
->output
;
365 in6_dev_put(in6_dev
);
369 static int pndisc_constructor(struct pneigh_entry
*n
)
371 struct in6_addr
*addr
= (struct in6_addr
*)&n
->key
;
372 struct in6_addr maddr
;
373 struct net_device
*dev
= n
->dev
;
375 if (!dev
|| !__in6_dev_get(dev
))
377 addrconf_addr_solict_mult(addr
, &maddr
);
378 ipv6_dev_mc_inc(dev
, &maddr
);
382 static void pndisc_destructor(struct pneigh_entry
*n
)
384 struct in6_addr
*addr
= (struct in6_addr
*)&n
->key
;
385 struct in6_addr maddr
;
386 struct net_device
*dev
= n
->dev
;
388 if (!dev
|| !__in6_dev_get(dev
))
390 addrconf_addr_solict_mult(addr
, &maddr
);
391 ipv6_dev_mc_dec(dev
, &maddr
);
394 static struct sk_buff
*ndisc_alloc_skb(struct net_device
*dev
,
397 int hlen
= LL_RESERVED_SPACE(dev
);
398 int tlen
= dev
->needed_tailroom
;
399 struct sock
*sk
= dev_net(dev
)->ipv6
.ndisc_sk
;
402 skb
= alloc_skb(hlen
+ sizeof(struct ipv6hdr
) + len
+ tlen
, GFP_ATOMIC
);
404 ND_PRINTK(0, err
, "ndisc: %s failed to allocate an skb\n",
409 skb
->protocol
= htons(ETH_P_IPV6
);
412 skb_reserve(skb
, hlen
+ sizeof(struct ipv6hdr
));
413 skb_reset_transport_header(skb
);
415 /* Manually assign socket ownership as we avoid calling
416 * sock_alloc_send_pskb() to bypass wmem buffer limits
418 skb_set_owner_w(skb
, sk
);
423 static void ip6_nd_hdr(struct sk_buff
*skb
,
424 const struct in6_addr
*saddr
,
425 const struct in6_addr
*daddr
,
426 int hop_limit
, int len
)
430 skb_push(skb
, sizeof(*hdr
));
431 skb_reset_network_header(skb
);
434 ip6_flow_hdr(hdr
, 0, 0);
436 hdr
->payload_len
= htons(len
);
437 hdr
->nexthdr
= IPPROTO_ICMPV6
;
438 hdr
->hop_limit
= hop_limit
;
444 static void ndisc_send_skb(struct sk_buff
*skb
,
445 const struct in6_addr
*daddr
,
446 const struct in6_addr
*saddr
)
448 struct dst_entry
*dst
= skb_dst(skb
);
449 struct net
*net
= dev_net(skb
->dev
);
450 struct sock
*sk
= net
->ipv6
.ndisc_sk
;
451 struct inet6_dev
*idev
;
453 struct icmp6hdr
*icmp6h
= icmp6_hdr(skb
);
456 type
= icmp6h
->icmp6_type
;
460 int oif
= skb
->dev
->ifindex
;
462 icmpv6_flow_init(sk
, &fl6
, type
, saddr
, daddr
, oif
);
463 dst
= icmp6_dst_alloc(skb
->dev
, &fl6
);
469 skb_dst_set(skb
, dst
);
472 icmp6h
->icmp6_cksum
= csum_ipv6_magic(saddr
, daddr
, skb
->len
,
477 ip6_nd_hdr(skb
, saddr
, daddr
, inet6_sk(sk
)->hop_limit
, skb
->len
);
480 idev
= __in6_dev_get(dst
->dev
);
481 IP6_UPD_PO_STATS(net
, idev
, IPSTATS_MIB_OUT
, skb
->len
);
483 err
= NF_HOOK(NFPROTO_IPV6
, NF_INET_LOCAL_OUT
,
484 net
, sk
, skb
, NULL
, dst
->dev
,
487 ICMP6MSGOUT_INC_STATS(net
, idev
, type
);
488 ICMP6_INC_STATS(net
, idev
, ICMP6_MIB_OUTMSGS
);
494 void ndisc_send_na(struct net_device
*dev
, const struct in6_addr
*daddr
,
495 const struct in6_addr
*solicited_addr
,
496 bool router
, bool solicited
, bool override
, bool inc_opt
)
499 struct in6_addr tmpaddr
;
500 struct inet6_ifaddr
*ifp
;
501 const struct in6_addr
*src_addr
;
505 /* for anycast or proxy, solicited_addr != src_addr */
506 ifp
= ipv6_get_ifaddr(dev_net(dev
), solicited_addr
, dev
, 1);
508 src_addr
= solicited_addr
;
509 if (ifp
->flags
& IFA_F_OPTIMISTIC
)
511 inc_opt
|= ifp
->idev
->cnf
.force_tllao
;
514 if (ipv6_dev_get_saddr(dev_net(dev
), dev
, daddr
,
515 inet6_sk(dev_net(dev
)->ipv6
.ndisc_sk
)->srcprefs
,
524 optlen
+= ndisc_opt_addr_space(dev
,
525 NDISC_NEIGHBOUR_ADVERTISEMENT
);
527 skb
= ndisc_alloc_skb(dev
, sizeof(*msg
) + optlen
);
531 msg
= skb_put(skb
, sizeof(*msg
));
532 *msg
= (struct nd_msg
) {
534 .icmp6_type
= NDISC_NEIGHBOUR_ADVERTISEMENT
,
535 .icmp6_router
= router
,
536 .icmp6_solicited
= solicited
,
537 .icmp6_override
= override
,
539 .target
= *solicited_addr
,
543 ndisc_fill_addr_option(skb
, ND_OPT_TARGET_LL_ADDR
,
545 NDISC_NEIGHBOUR_ADVERTISEMENT
);
547 ndisc_send_skb(skb
, daddr
, src_addr
);
550 static void ndisc_send_unsol_na(struct net_device
*dev
)
552 struct inet6_dev
*idev
;
553 struct inet6_ifaddr
*ifa
;
555 idev
= in6_dev_get(dev
);
559 read_lock_bh(&idev
->lock
);
560 list_for_each_entry(ifa
, &idev
->addr_list
, if_list
) {
561 /* skip tentative addresses until dad completes */
562 if (ifa
->flags
& IFA_F_TENTATIVE
&&
563 !(ifa
->flags
& IFA_F_OPTIMISTIC
))
566 ndisc_send_na(dev
, &in6addr_linklocal_allnodes
, &ifa
->addr
,
567 /*router=*/ !!idev
->cnf
.forwarding
,
568 /*solicited=*/ false, /*override=*/ true,
571 read_unlock_bh(&idev
->lock
);
576 void ndisc_send_ns(struct net_device
*dev
, const struct in6_addr
*solicit
,
577 const struct in6_addr
*daddr
, const struct in6_addr
*saddr
,
581 struct in6_addr addr_buf
;
582 int inc_opt
= dev
->addr_len
;
587 if (ipv6_get_lladdr(dev
, &addr_buf
,
588 (IFA_F_TENTATIVE
|IFA_F_OPTIMISTIC
)))
593 if (ipv6_addr_any(saddr
))
596 optlen
+= ndisc_opt_addr_space(dev
,
597 NDISC_NEIGHBOUR_SOLICITATION
);
601 skb
= ndisc_alloc_skb(dev
, sizeof(*msg
) + optlen
);
605 msg
= skb_put(skb
, sizeof(*msg
));
606 *msg
= (struct nd_msg
) {
608 .icmp6_type
= NDISC_NEIGHBOUR_SOLICITATION
,
614 ndisc_fill_addr_option(skb
, ND_OPT_SOURCE_LL_ADDR
,
616 NDISC_NEIGHBOUR_SOLICITATION
);
618 u8
*opt
= skb_put(skb
, 8);
620 opt
[0] = ND_OPT_NONCE
;
622 memcpy(opt
+ 2, &nonce
, 6);
625 ndisc_send_skb(skb
, daddr
, saddr
);
628 void ndisc_send_rs(struct net_device
*dev
, const struct in6_addr
*saddr
,
629 const struct in6_addr
*daddr
)
633 int send_sllao
= dev
->addr_len
;
636 #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
638 * According to section 2.2 of RFC 4429, we must not
639 * send router solicitations with a sllao from
640 * optimistic addresses, but we may send the solicitation
641 * if we don't include the sllao. So here we check
642 * if our address is optimistic, and if so, we
643 * suppress the inclusion of the sllao.
646 struct inet6_ifaddr
*ifp
= ipv6_get_ifaddr(dev_net(dev
), saddr
,
649 if (ifp
->flags
& IFA_F_OPTIMISTIC
) {
659 optlen
+= ndisc_opt_addr_space(dev
, NDISC_ROUTER_SOLICITATION
);
661 skb
= ndisc_alloc_skb(dev
, sizeof(*msg
) + optlen
);
665 msg
= skb_put(skb
, sizeof(*msg
));
666 *msg
= (struct rs_msg
) {
668 .icmp6_type
= NDISC_ROUTER_SOLICITATION
,
673 ndisc_fill_addr_option(skb
, ND_OPT_SOURCE_LL_ADDR
,
675 NDISC_ROUTER_SOLICITATION
);
677 ndisc_send_skb(skb
, daddr
, saddr
);
681 static void ndisc_error_report(struct neighbour
*neigh
, struct sk_buff
*skb
)
684 * "The sender MUST return an ICMP
685 * destination unreachable"
687 dst_link_failure(skb
);
691 /* Called with locked neigh: either read or both */
693 static void ndisc_solicit(struct neighbour
*neigh
, struct sk_buff
*skb
)
695 struct in6_addr
*saddr
= NULL
;
696 struct in6_addr mcaddr
;
697 struct net_device
*dev
= neigh
->dev
;
698 struct in6_addr
*target
= (struct in6_addr
*)&neigh
->primary_key
;
699 int probes
= atomic_read(&neigh
->probes
);
701 if (skb
&& ipv6_chk_addr_and_flags(dev_net(dev
), &ipv6_hdr(skb
)->saddr
,
703 IFA_F_TENTATIVE
|IFA_F_OPTIMISTIC
))
704 saddr
= &ipv6_hdr(skb
)->saddr
;
705 probes
-= NEIGH_VAR(neigh
->parms
, UCAST_PROBES
);
707 if (!(neigh
->nud_state
& NUD_VALID
)) {
709 "%s: trying to ucast probe in NUD_INVALID: %pI6\n",
712 ndisc_send_ns(dev
, target
, target
, saddr
, 0);
713 } else if ((probes
-= NEIGH_VAR(neigh
->parms
, APP_PROBES
)) < 0) {
716 addrconf_addr_solict_mult(target
, &mcaddr
);
717 ndisc_send_ns(dev
, target
, &mcaddr
, saddr
, 0);
721 static int pndisc_is_router(const void *pkey
,
722 struct net_device
*dev
)
724 struct pneigh_entry
*n
;
727 read_lock_bh(&nd_tbl
.lock
);
728 n
= __pneigh_lookup(&nd_tbl
, dev_net(dev
), pkey
, dev
);
730 ret
= !!(n
->flags
& NTF_ROUTER
);
731 read_unlock_bh(&nd_tbl
.lock
);
736 void ndisc_update(const struct net_device
*dev
, struct neighbour
*neigh
,
737 const u8
*lladdr
, u8
new, u32 flags
, u8 icmp6_type
,
738 struct ndisc_options
*ndopts
)
740 neigh_update(neigh
, lladdr
, new, flags
, 0);
741 /* report ndisc ops about neighbour update */
742 ndisc_ops_update(dev
, neigh
, flags
, icmp6_type
, ndopts
);
745 static void ndisc_recv_ns(struct sk_buff
*skb
)
747 struct nd_msg
*msg
= (struct nd_msg
*)skb_transport_header(skb
);
748 const struct in6_addr
*saddr
= &ipv6_hdr(skb
)->saddr
;
749 const struct in6_addr
*daddr
= &ipv6_hdr(skb
)->daddr
;
751 u32 ndoptlen
= skb_tail_pointer(skb
) - (skb_transport_header(skb
) +
752 offsetof(struct nd_msg
, opt
));
753 struct ndisc_options ndopts
;
754 struct net_device
*dev
= skb
->dev
;
755 struct inet6_ifaddr
*ifp
;
756 struct inet6_dev
*idev
= NULL
;
757 struct neighbour
*neigh
;
758 int dad
= ipv6_addr_any(saddr
);
763 if (skb
->len
< sizeof(struct nd_msg
)) {
764 ND_PRINTK(2, warn
, "NS: packet too short\n");
768 if (ipv6_addr_is_multicast(&msg
->target
)) {
769 ND_PRINTK(2, warn
, "NS: multicast target address\n");
775 * DAD has to be destined for solicited node multicast address.
777 if (dad
&& !ipv6_addr_is_solict_mult(daddr
)) {
778 ND_PRINTK(2, warn
, "NS: bad DAD packet (wrong destination)\n");
782 if (!ndisc_parse_options(dev
, msg
->opt
, ndoptlen
, &ndopts
)) {
783 ND_PRINTK(2, warn
, "NS: invalid ND options\n");
787 if (ndopts
.nd_opts_src_lladdr
) {
788 lladdr
= ndisc_opt_addr_data(ndopts
.nd_opts_src_lladdr
, dev
);
791 "NS: invalid link-layer address length\n");
796 * If the IP source address is the unspecified address,
797 * there MUST NOT be source link-layer address option
802 "NS: bad DAD packet (link-layer address option)\n");
806 if (ndopts
.nd_opts_nonce
&& ndopts
.nd_opts_nonce
->nd_opt_len
== 1)
807 memcpy(&nonce
, (u8
*)(ndopts
.nd_opts_nonce
+ 1), 6);
809 inc
= ipv6_addr_is_multicast(daddr
);
811 ifp
= ipv6_get_ifaddr(dev_net(dev
), &msg
->target
, dev
, 1);
814 if (ifp
->flags
& (IFA_F_TENTATIVE
|IFA_F_OPTIMISTIC
)) {
816 if (nonce
!= 0 && ifp
->dad_nonce
== nonce
) {
817 u8
*np
= (u8
*)&nonce
;
818 /* Matching nonce if looped back */
820 "%s: IPv6 DAD loopback for address %pI6c nonce %pM ignored\n",
821 ifp
->idev
->dev
->name
,
826 * We are colliding with another node
828 * so fail our DAD process
830 addrconf_dad_failure(ifp
);
834 * This is not a dad solicitation.
835 * If we are an optimistic node,
837 * Otherwise, we should ignore it.
839 if (!(ifp
->flags
& IFA_F_OPTIMISTIC
))
846 struct net
*net
= dev_net(dev
);
848 /* perhaps an address on the master device */
849 if (netif_is_l3_slave(dev
)) {
850 struct net_device
*mdev
;
852 mdev
= netdev_master_upper_dev_get_rcu(dev
);
854 ifp
= ipv6_get_ifaddr(net
, &msg
->target
, mdev
, 1);
860 idev
= in6_dev_get(dev
);
862 /* XXX: count this drop? */
866 if (ipv6_chk_acast_addr(net
, dev
, &msg
->target
) ||
867 (idev
->cnf
.forwarding
&&
868 (net
->ipv6
.devconf_all
->proxy_ndp
|| idev
->cnf
.proxy_ndp
) &&
869 (is_router
= pndisc_is_router(&msg
->target
, dev
)) >= 0)) {
870 if (!(NEIGH_CB(skb
)->flags
& LOCALLY_ENQUEUED
) &&
871 skb
->pkt_type
!= PACKET_HOST
&&
873 NEIGH_VAR(idev
->nd_parms
, PROXY_DELAY
) != 0) {
875 * for anycast or proxy,
876 * sender should delay its response
877 * by a random time between 0 and
878 * MAX_ANYCAST_DELAY_TIME seconds.
879 * (RFC2461) -- yoshfuji
881 struct sk_buff
*n
= skb_clone(skb
, GFP_ATOMIC
);
883 pneigh_enqueue(&nd_tbl
, idev
->nd_parms
, n
);
891 is_router
= idev
->cnf
.forwarding
;
894 ndisc_send_na(dev
, &in6addr_linklocal_allnodes
, &msg
->target
,
895 !!is_router
, false, (ifp
!= NULL
), true);
900 NEIGH_CACHE_STAT_INC(&nd_tbl
, rcv_probes_mcast
);
902 NEIGH_CACHE_STAT_INC(&nd_tbl
, rcv_probes_ucast
);
905 * update / create cache entry
906 * for the source address
908 neigh
= __neigh_lookup(&nd_tbl
, saddr
, dev
,
909 !inc
|| lladdr
|| !dev
->addr_len
);
911 ndisc_update(dev
, neigh
, lladdr
, NUD_STALE
,
912 NEIGH_UPDATE_F_WEAK_OVERRIDE
|
913 NEIGH_UPDATE_F_OVERRIDE
,
914 NDISC_NEIGHBOUR_SOLICITATION
, &ndopts
);
915 if (neigh
|| !dev
->header_ops
) {
916 ndisc_send_na(dev
, saddr
, &msg
->target
, !!is_router
,
917 true, (ifp
!= NULL
&& inc
), inc
);
919 neigh_release(neigh
);
929 static void ndisc_recv_na(struct sk_buff
*skb
)
931 struct nd_msg
*msg
= (struct nd_msg
*)skb_transport_header(skb
);
932 struct in6_addr
*saddr
= &ipv6_hdr(skb
)->saddr
;
933 const struct in6_addr
*daddr
= &ipv6_hdr(skb
)->daddr
;
935 u32 ndoptlen
= skb_tail_pointer(skb
) - (skb_transport_header(skb
) +
936 offsetof(struct nd_msg
, opt
));
937 struct ndisc_options ndopts
;
938 struct net_device
*dev
= skb
->dev
;
939 struct inet6_dev
*idev
= __in6_dev_get(dev
);
940 struct inet6_ifaddr
*ifp
;
941 struct neighbour
*neigh
;
943 if (skb
->len
< sizeof(struct nd_msg
)) {
944 ND_PRINTK(2, warn
, "NA: packet too short\n");
948 if (ipv6_addr_is_multicast(&msg
->target
)) {
949 ND_PRINTK(2, warn
, "NA: target address is multicast\n");
953 if (ipv6_addr_is_multicast(daddr
) &&
954 msg
->icmph
.icmp6_solicited
) {
955 ND_PRINTK(2, warn
, "NA: solicited NA is multicasted\n");
959 /* For some 802.11 wireless deployments (and possibly other networks),
960 * there will be a NA proxy and unsolicitd packets are attacks
961 * and thus should not be accepted.
963 if (!msg
->icmph
.icmp6_solicited
&& idev
&&
964 idev
->cnf
.drop_unsolicited_na
)
967 if (!ndisc_parse_options(dev
, msg
->opt
, ndoptlen
, &ndopts
)) {
968 ND_PRINTK(2, warn
, "NS: invalid ND option\n");
971 if (ndopts
.nd_opts_tgt_lladdr
) {
972 lladdr
= ndisc_opt_addr_data(ndopts
.nd_opts_tgt_lladdr
, dev
);
975 "NA: invalid link-layer address length\n");
979 ifp
= ipv6_get_ifaddr(dev_net(dev
), &msg
->target
, dev
, 1);
981 if (skb
->pkt_type
!= PACKET_LOOPBACK
982 && (ifp
->flags
& IFA_F_TENTATIVE
)) {
983 addrconf_dad_failure(ifp
);
986 /* What should we make now? The advertisement
987 is invalid, but ndisc specs say nothing
988 about it. It could be misconfiguration, or
989 an smart proxy agent tries to help us :-)
991 We should not print the error if NA has been
992 received from loopback - it is just our own
993 unsolicited advertisement.
995 if (skb
->pkt_type
!= PACKET_LOOPBACK
)
997 "NA: someone advertises our address %pI6 on %s!\n",
998 &ifp
->addr
, ifp
->idev
->dev
->name
);
1002 neigh
= neigh_lookup(&nd_tbl
, &msg
->target
, dev
);
1005 u8 old_flags
= neigh
->flags
;
1006 struct net
*net
= dev_net(dev
);
1008 if (neigh
->nud_state
& NUD_FAILED
)
1012 * Don't update the neighbor cache entry on a proxy NA from
1013 * ourselves because either the proxied node is off link or it
1014 * has already sent a NA to us.
1016 if (lladdr
&& !memcmp(lladdr
, dev
->dev_addr
, dev
->addr_len
) &&
1017 net
->ipv6
.devconf_all
->forwarding
&& net
->ipv6
.devconf_all
->proxy_ndp
&&
1018 pneigh_lookup(&nd_tbl
, net
, &msg
->target
, dev
, 0)) {
1019 /* XXX: idev->cnf.proxy_ndp */
1023 ndisc_update(dev
, neigh
, lladdr
,
1024 msg
->icmph
.icmp6_solicited
? NUD_REACHABLE
: NUD_STALE
,
1025 NEIGH_UPDATE_F_WEAK_OVERRIDE
|
1026 (msg
->icmph
.icmp6_override
? NEIGH_UPDATE_F_OVERRIDE
: 0)|
1027 NEIGH_UPDATE_F_OVERRIDE_ISROUTER
|
1028 (msg
->icmph
.icmp6_router
? NEIGH_UPDATE_F_ISROUTER
: 0),
1029 NDISC_NEIGHBOUR_ADVERTISEMENT
, &ndopts
);
1031 if ((old_flags
& ~neigh
->flags
) & NTF_ROUTER
) {
1033 * Change: router to host
1035 rt6_clean_tohost(dev_net(dev
), saddr
);
1039 neigh_release(neigh
);
1043 static void ndisc_recv_rs(struct sk_buff
*skb
)
1045 struct rs_msg
*rs_msg
= (struct rs_msg
*)skb_transport_header(skb
);
1046 unsigned long ndoptlen
= skb
->len
- sizeof(*rs_msg
);
1047 struct neighbour
*neigh
;
1048 struct inet6_dev
*idev
;
1049 const struct in6_addr
*saddr
= &ipv6_hdr(skb
)->saddr
;
1050 struct ndisc_options ndopts
;
1053 if (skb
->len
< sizeof(*rs_msg
))
1056 idev
= __in6_dev_get(skb
->dev
);
1058 ND_PRINTK(1, err
, "RS: can't find in6 device\n");
1062 /* Don't accept RS if we're not in router mode */
1063 if (!idev
->cnf
.forwarding
)
1067 * Don't update NCE if src = ::;
1068 * this implies that the source node has no ip address assigned yet.
1070 if (ipv6_addr_any(saddr
))
1073 /* Parse ND options */
1074 if (!ndisc_parse_options(skb
->dev
, rs_msg
->opt
, ndoptlen
, &ndopts
)) {
1075 ND_PRINTK(2, notice
, "NS: invalid ND option, ignored\n");
1079 if (ndopts
.nd_opts_src_lladdr
) {
1080 lladdr
= ndisc_opt_addr_data(ndopts
.nd_opts_src_lladdr
,
1086 neigh
= __neigh_lookup(&nd_tbl
, saddr
, skb
->dev
, 1);
1088 ndisc_update(skb
->dev
, neigh
, lladdr
, NUD_STALE
,
1089 NEIGH_UPDATE_F_WEAK_OVERRIDE
|
1090 NEIGH_UPDATE_F_OVERRIDE
|
1091 NEIGH_UPDATE_F_OVERRIDE_ISROUTER
,
1092 NDISC_ROUTER_SOLICITATION
, &ndopts
);
1093 neigh_release(neigh
);
1099 static void ndisc_ra_useropt(struct sk_buff
*ra
, struct nd_opt_hdr
*opt
)
1101 struct icmp6hdr
*icmp6h
= (struct icmp6hdr
*)skb_transport_header(ra
);
1102 struct sk_buff
*skb
;
1103 struct nlmsghdr
*nlh
;
1104 struct nduseroptmsg
*ndmsg
;
1105 struct net
*net
= dev_net(ra
->dev
);
1107 int base_size
= NLMSG_ALIGN(sizeof(struct nduseroptmsg
)
1108 + (opt
->nd_opt_len
<< 3));
1109 size_t msg_size
= base_size
+ nla_total_size(sizeof(struct in6_addr
));
1111 skb
= nlmsg_new(msg_size
, GFP_ATOMIC
);
1117 nlh
= nlmsg_put(skb
, 0, 0, RTM_NEWNDUSEROPT
, base_size
, 0);
1119 goto nla_put_failure
;
1122 ndmsg
= nlmsg_data(nlh
);
1123 ndmsg
->nduseropt_family
= AF_INET6
;
1124 ndmsg
->nduseropt_ifindex
= ra
->dev
->ifindex
;
1125 ndmsg
->nduseropt_icmp_type
= icmp6h
->icmp6_type
;
1126 ndmsg
->nduseropt_icmp_code
= icmp6h
->icmp6_code
;
1127 ndmsg
->nduseropt_opts_len
= opt
->nd_opt_len
<< 3;
1129 memcpy(ndmsg
+ 1, opt
, opt
->nd_opt_len
<< 3);
1131 if (nla_put_in6_addr(skb
, NDUSEROPT_SRCADDR
, &ipv6_hdr(ra
)->saddr
))
1132 goto nla_put_failure
;
1133 nlmsg_end(skb
, nlh
);
1135 rtnl_notify(skb
, net
, 0, RTNLGRP_ND_USEROPT
, NULL
, GFP_ATOMIC
);
1142 rtnl_set_sk_err(net
, RTNLGRP_ND_USEROPT
, err
);
1145 static void ndisc_router_discovery(struct sk_buff
*skb
)
1147 struct ra_msg
*ra_msg
= (struct ra_msg
*)skb_transport_header(skb
);
1148 struct neighbour
*neigh
= NULL
;
1149 struct inet6_dev
*in6_dev
;
1150 struct rt6_info
*rt
= NULL
;
1152 struct ndisc_options ndopts
;
1154 unsigned int pref
= 0;
1156 bool send_ifinfo_notify
= false;
1158 __u8
*opt
= (__u8
*)(ra_msg
+ 1);
1160 optlen
= (skb_tail_pointer(skb
) - skb_transport_header(skb
)) -
1161 sizeof(struct ra_msg
);
1164 "RA: %s, dev: %s\n",
1165 __func__
, skb
->dev
->name
);
1166 if (!(ipv6_addr_type(&ipv6_hdr(skb
)->saddr
) & IPV6_ADDR_LINKLOCAL
)) {
1167 ND_PRINTK(2, warn
, "RA: source address is not link-local\n");
1171 ND_PRINTK(2, warn
, "RA: packet too short\n");
1175 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1176 if (skb
->ndisc_nodetype
== NDISC_NODETYPE_HOST
) {
1177 ND_PRINTK(2, warn
, "RA: from host or unauthorized router\n");
1183 * set the RA_RECV flag in the interface
1186 in6_dev
= __in6_dev_get(skb
->dev
);
1188 ND_PRINTK(0, err
, "RA: can't find inet6 device for %s\n",
1193 if (!ndisc_parse_options(skb
->dev
, opt
, optlen
, &ndopts
)) {
1194 ND_PRINTK(2, warn
, "RA: invalid ND options\n");
1198 if (!ipv6_accept_ra(in6_dev
)) {
1200 "RA: %s, did not accept ra for dev: %s\n",
1201 __func__
, skb
->dev
->name
);
1202 goto skip_linkparms
;
1205 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1206 /* skip link-specific parameters from interior routers */
1207 if (skb
->ndisc_nodetype
== NDISC_NODETYPE_NODEFAULT
) {
1209 "RA: %s, nodetype is NODEFAULT, dev: %s\n",
1210 __func__
, skb
->dev
->name
);
1211 goto skip_linkparms
;
1215 if (in6_dev
->if_flags
& IF_RS_SENT
) {
1217 * flag that an RA was received after an RS was sent
1218 * out on this interface.
1220 in6_dev
->if_flags
|= IF_RA_RCVD
;
1224 * Remember the managed/otherconf flags from most recently
1225 * received RA message (RFC 2462) -- yoshfuji
1227 old_if_flags
= in6_dev
->if_flags
;
1228 in6_dev
->if_flags
= (in6_dev
->if_flags
& ~(IF_RA_MANAGED
|
1230 (ra_msg
->icmph
.icmp6_addrconf_managed
?
1231 IF_RA_MANAGED
: 0) |
1232 (ra_msg
->icmph
.icmp6_addrconf_other
?
1233 IF_RA_OTHERCONF
: 0);
1235 if (old_if_flags
!= in6_dev
->if_flags
)
1236 send_ifinfo_notify
= true;
1238 if (!in6_dev
->cnf
.accept_ra_defrtr
) {
1240 "RA: %s, defrtr is false for dev: %s\n",
1241 __func__
, skb
->dev
->name
);
1245 /* Do not accept RA with source-addr found on local machine unless
1246 * accept_ra_from_local is set to true.
1248 if (!in6_dev
->cnf
.accept_ra_from_local
&&
1249 ipv6_chk_addr(dev_net(in6_dev
->dev
), &ipv6_hdr(skb
)->saddr
,
1252 "RA from local address detected on dev: %s: default router ignored\n",
1257 lifetime
= ntohs(ra_msg
->icmph
.icmp6_rt_lifetime
);
1259 #ifdef CONFIG_IPV6_ROUTER_PREF
1260 pref
= ra_msg
->icmph
.icmp6_router_pref
;
1261 /* 10b is handled as if it were 00b (medium) */
1262 if (pref
== ICMPV6_ROUTER_PREF_INVALID
||
1263 !in6_dev
->cnf
.accept_ra_rtr_pref
)
1264 pref
= ICMPV6_ROUTER_PREF_MEDIUM
;
1267 rt
= rt6_get_dflt_router(&ipv6_hdr(skb
)->saddr
, skb
->dev
);
1270 neigh
= dst_neigh_lookup(&rt
->dst
, &ipv6_hdr(skb
)->saddr
);
1273 "RA: %s got default router without neighbour\n",
1279 if (rt
&& lifetime
== 0) {
1284 ND_PRINTK(3, info
, "RA: rt: %p lifetime: %d, for dev: %s\n",
1285 rt
, lifetime
, skb
->dev
->name
);
1286 if (!rt
&& lifetime
) {
1287 ND_PRINTK(3, info
, "RA: adding default router\n");
1289 rt
= rt6_add_dflt_router(&ipv6_hdr(skb
)->saddr
, skb
->dev
, pref
);
1292 "RA: %s failed to add default route\n",
1297 neigh
= dst_neigh_lookup(&rt
->dst
, &ipv6_hdr(skb
)->saddr
);
1300 "RA: %s got default router without neighbour\n",
1305 neigh
->flags
|= NTF_ROUTER
;
1307 rt
->rt6i_flags
= (rt
->rt6i_flags
& ~RTF_PREF_MASK
) | RTF_PREF(pref
);
1311 rt6_set_expires(rt
, jiffies
+ (HZ
* lifetime
));
1312 if (in6_dev
->cnf
.accept_ra_min_hop_limit
< 256 &&
1313 ra_msg
->icmph
.icmp6_hop_limit
) {
1314 if (in6_dev
->cnf
.accept_ra_min_hop_limit
<= ra_msg
->icmph
.icmp6_hop_limit
) {
1315 in6_dev
->cnf
.hop_limit
= ra_msg
->icmph
.icmp6_hop_limit
;
1317 dst_metric_set(&rt
->dst
, RTAX_HOPLIMIT
,
1318 ra_msg
->icmph
.icmp6_hop_limit
);
1320 ND_PRINTK(2, warn
, "RA: Got route advertisement with lower hop_limit than minimum\n");
1327 * Update Reachable Time and Retrans Timer
1330 if (in6_dev
->nd_parms
) {
1331 unsigned long rtime
= ntohl(ra_msg
->retrans_timer
);
1333 if (rtime
&& rtime
/1000 < MAX_SCHEDULE_TIMEOUT
/HZ
) {
1334 rtime
= (rtime
*HZ
)/1000;
1337 NEIGH_VAR_SET(in6_dev
->nd_parms
, RETRANS_TIME
, rtime
);
1338 in6_dev
->tstamp
= jiffies
;
1339 send_ifinfo_notify
= true;
1342 rtime
= ntohl(ra_msg
->reachable_time
);
1343 if (rtime
&& rtime
/1000 < MAX_SCHEDULE_TIMEOUT
/(3*HZ
)) {
1344 rtime
= (rtime
*HZ
)/1000;
1349 if (rtime
!= NEIGH_VAR(in6_dev
->nd_parms
, BASE_REACHABLE_TIME
)) {
1350 NEIGH_VAR_SET(in6_dev
->nd_parms
,
1351 BASE_REACHABLE_TIME
, rtime
);
1352 NEIGH_VAR_SET(in6_dev
->nd_parms
,
1353 GC_STALETIME
, 3 * rtime
);
1354 in6_dev
->nd_parms
->reachable_time
= neigh_rand_reach_time(rtime
);
1355 in6_dev
->tstamp
= jiffies
;
1356 send_ifinfo_notify
= true;
1362 * Send a notify if RA changed managed/otherconf flags or timer settings
1364 if (send_ifinfo_notify
)
1365 inet6_ifinfo_notify(RTM_NEWLINK
, in6_dev
);
1374 neigh
= __neigh_lookup(&nd_tbl
, &ipv6_hdr(skb
)->saddr
,
1378 if (ndopts
.nd_opts_src_lladdr
) {
1379 lladdr
= ndisc_opt_addr_data(ndopts
.nd_opts_src_lladdr
,
1383 "RA: invalid link-layer address length\n");
1387 ndisc_update(skb
->dev
, neigh
, lladdr
, NUD_STALE
,
1388 NEIGH_UPDATE_F_WEAK_OVERRIDE
|
1389 NEIGH_UPDATE_F_OVERRIDE
|
1390 NEIGH_UPDATE_F_OVERRIDE_ISROUTER
|
1391 NEIGH_UPDATE_F_ISROUTER
,
1392 NDISC_ROUTER_ADVERTISEMENT
, &ndopts
);
1395 if (!ipv6_accept_ra(in6_dev
)) {
1397 "RA: %s, accept_ra is false for dev: %s\n",
1398 __func__
, skb
->dev
->name
);
1402 #ifdef CONFIG_IPV6_ROUTE_INFO
1403 if (!in6_dev
->cnf
.accept_ra_from_local
&&
1404 ipv6_chk_addr(dev_net(in6_dev
->dev
), &ipv6_hdr(skb
)->saddr
,
1407 "RA from local address detected on dev: %s: router info ignored.\n",
1409 goto skip_routeinfo
;
1412 if (in6_dev
->cnf
.accept_ra_rtr_pref
&& ndopts
.nd_opts_ri
) {
1413 struct nd_opt_hdr
*p
;
1414 for (p
= ndopts
.nd_opts_ri
;
1416 p
= ndisc_next_option(p
, ndopts
.nd_opts_ri_end
)) {
1417 struct route_info
*ri
= (struct route_info
*)p
;
1418 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1419 if (skb
->ndisc_nodetype
== NDISC_NODETYPE_NODEFAULT
&&
1420 ri
->prefix_len
== 0)
1423 if (ri
->prefix_len
== 0 &&
1424 !in6_dev
->cnf
.accept_ra_defrtr
)
1426 if (ri
->prefix_len
< in6_dev
->cnf
.accept_ra_rt_info_min_plen
)
1428 if (ri
->prefix_len
> in6_dev
->cnf
.accept_ra_rt_info_max_plen
)
1430 rt6_route_rcv(skb
->dev
, (u8
*)p
, (p
->nd_opt_len
) << 3,
1431 &ipv6_hdr(skb
)->saddr
);
1438 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1439 /* skip link-specific ndopts from interior routers */
1440 if (skb
->ndisc_nodetype
== NDISC_NODETYPE_NODEFAULT
) {
1442 "RA: %s, nodetype is NODEFAULT (interior routes), dev: %s\n",
1443 __func__
, skb
->dev
->name
);
1448 if (in6_dev
->cnf
.accept_ra_pinfo
&& ndopts
.nd_opts_pi
) {
1449 struct nd_opt_hdr
*p
;
1450 for (p
= ndopts
.nd_opts_pi
;
1452 p
= ndisc_next_option(p
, ndopts
.nd_opts_pi_end
)) {
1453 addrconf_prefix_rcv(skb
->dev
, (u8
*)p
,
1454 (p
->nd_opt_len
) << 3,
1455 ndopts
.nd_opts_src_lladdr
!= NULL
);
1459 if (ndopts
.nd_opts_mtu
&& in6_dev
->cnf
.accept_ra_mtu
) {
1463 memcpy(&n
, ((u8
*)(ndopts
.nd_opts_mtu
+1))+2, sizeof(mtu
));
1466 if (mtu
< IPV6_MIN_MTU
|| mtu
> skb
->dev
->mtu
) {
1467 ND_PRINTK(2, warn
, "RA: invalid mtu: %d\n", mtu
);
1468 } else if (in6_dev
->cnf
.mtu6
!= mtu
) {
1469 in6_dev
->cnf
.mtu6
= mtu
;
1472 dst_metric_set(&rt
->dst
, RTAX_MTU
, mtu
);
1474 rt6_mtu_change(skb
->dev
, mtu
);
1478 if (ndopts
.nd_useropts
) {
1479 struct nd_opt_hdr
*p
;
1480 for (p
= ndopts
.nd_useropts
;
1482 p
= ndisc_next_useropt(skb
->dev
, p
,
1483 ndopts
.nd_useropts_end
)) {
1484 ndisc_ra_useropt(skb
, p
);
1488 if (ndopts
.nd_opts_tgt_lladdr
|| ndopts
.nd_opts_rh
) {
1489 ND_PRINTK(2, warn
, "RA: invalid RA options\n");
1494 neigh_release(neigh
);
1497 static void ndisc_redirect_rcv(struct sk_buff
*skb
)
1500 struct ndisc_options ndopts
;
1501 struct rd_msg
*msg
= (struct rd_msg
*)skb_transport_header(skb
);
1502 u32 ndoptlen
= skb_tail_pointer(skb
) - (skb_transport_header(skb
) +
1503 offsetof(struct rd_msg
, opt
));
1505 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1506 switch (skb
->ndisc_nodetype
) {
1507 case NDISC_NODETYPE_HOST
:
1508 case NDISC_NODETYPE_NODEFAULT
:
1510 "Redirect: from host or unauthorized router\n");
1515 if (!(ipv6_addr_type(&ipv6_hdr(skb
)->saddr
) & IPV6_ADDR_LINKLOCAL
)) {
1517 "Redirect: source address is not link-local\n");
1521 if (!ndisc_parse_options(skb
->dev
, msg
->opt
, ndoptlen
, &ndopts
))
1524 if (!ndopts
.nd_opts_rh
) {
1525 ip6_redirect_no_header(skb
, dev_net(skb
->dev
),
1526 skb
->dev
->ifindex
, 0);
1530 hdr
= (u8
*)ndopts
.nd_opts_rh
;
1532 if (!pskb_pull(skb
, hdr
- skb_transport_header(skb
)))
1535 icmpv6_notify(skb
, NDISC_REDIRECT
, 0, 0);
1538 static void ndisc_fill_redirect_hdr_option(struct sk_buff
*skb
,
1539 struct sk_buff
*orig_skb
,
1542 u8
*opt
= skb_put(skb
, rd_len
);
1545 *(opt
++) = ND_OPT_REDIRECT_HDR
;
1546 *(opt
++) = (rd_len
>> 3);
1549 skb_copy_bits(orig_skb
, skb_network_offset(orig_skb
), opt
,
1553 void ndisc_send_redirect(struct sk_buff
*skb
, const struct in6_addr
*target
)
1555 struct net_device
*dev
= skb
->dev
;
1556 struct net
*net
= dev_net(dev
);
1557 struct sock
*sk
= net
->ipv6
.ndisc_sk
;
1559 struct inet_peer
*peer
;
1560 struct sk_buff
*buff
;
1562 struct in6_addr saddr_buf
;
1563 struct rt6_info
*rt
;
1564 struct dst_entry
*dst
;
1567 u8 ha_buf
[MAX_ADDR_LEN
], *ha
= NULL
,
1568 ops_data_buf
[NDISC_OPS_REDIRECT_DATA_SPACE
], *ops_data
= NULL
;
1571 if (netif_is_l3_master(skb
->dev
)) {
1572 dev
= __dev_get_by_index(dev_net(skb
->dev
), IPCB(skb
)->iif
);
1577 if (ipv6_get_lladdr(dev
, &saddr_buf
, IFA_F_TENTATIVE
)) {
1578 ND_PRINTK(2, warn
, "Redirect: no link-local address on %s\n",
1583 if (!ipv6_addr_equal(&ipv6_hdr(skb
)->daddr
, target
) &&
1584 ipv6_addr_type(target
) != (IPV6_ADDR_UNICAST
|IPV6_ADDR_LINKLOCAL
)) {
1586 "Redirect: target address is not link-local unicast\n");
1590 icmpv6_flow_init(sk
, &fl6
, NDISC_REDIRECT
,
1591 &saddr_buf
, &ipv6_hdr(skb
)->saddr
, dev
->ifindex
);
1593 dst
= ip6_route_output(net
, NULL
, &fl6
);
1598 dst
= xfrm_lookup(net
, dst
, flowi6_to_flowi(&fl6
), NULL
, 0);
1602 rt
= (struct rt6_info
*) dst
;
1604 if (rt
->rt6i_flags
& RTF_GATEWAY
) {
1606 "Redirect: destination is not a neighbour\n");
1609 peer
= inet_getpeer_v6(net
->ipv6
.peers
, &ipv6_hdr(skb
)->saddr
, 1);
1610 ret
= inet_peer_xrlim_allow(peer
, 1*HZ
);
1616 if (dev
->addr_len
) {
1617 struct neighbour
*neigh
= dst_neigh_lookup(skb_dst(skb
), target
);
1620 "Redirect: no neigh for target address\n");
1624 read_lock_bh(&neigh
->lock
);
1625 if (neigh
->nud_state
& NUD_VALID
) {
1626 memcpy(ha_buf
, neigh
->ha
, dev
->addr_len
);
1627 read_unlock_bh(&neigh
->lock
);
1629 optlen
+= ndisc_redirect_opt_addr_space(dev
, neigh
,
1633 read_unlock_bh(&neigh
->lock
);
1635 neigh_release(neigh
);
1638 rd_len
= min_t(unsigned int,
1639 IPV6_MIN_MTU
- sizeof(struct ipv6hdr
) - sizeof(*msg
) - optlen
,
1644 buff
= ndisc_alloc_skb(dev
, sizeof(*msg
) + optlen
);
1648 msg
= skb_put(buff
, sizeof(*msg
));
1649 *msg
= (struct rd_msg
) {
1651 .icmp6_type
= NDISC_REDIRECT
,
1654 .dest
= ipv6_hdr(skb
)->daddr
,
1658 * include target_address option
1662 ndisc_fill_redirect_addr_option(buff
, ha
, ops_data
);
1665 * build redirect option and copy skb over to the new packet.
1669 ndisc_fill_redirect_hdr_option(buff
, skb
, rd_len
);
1671 skb_dst_set(buff
, dst
);
1672 ndisc_send_skb(buff
, &ipv6_hdr(skb
)->saddr
, &saddr_buf
);
1679 static void pndisc_redo(struct sk_buff
*skb
)
1685 static bool ndisc_suppress_frag_ndisc(struct sk_buff
*skb
)
1687 struct inet6_dev
*idev
= __in6_dev_get(skb
->dev
);
1691 if (IP6CB(skb
)->flags
& IP6SKB_FRAGMENTED
&&
1692 idev
->cnf
.suppress_frag_ndisc
) {
1693 net_warn_ratelimited("Received fragmented ndisc packet. Carefully consider disabling suppress_frag_ndisc.\n");
1699 int ndisc_rcv(struct sk_buff
*skb
)
1703 if (ndisc_suppress_frag_ndisc(skb
))
1706 if (skb_linearize(skb
))
1709 msg
= (struct nd_msg
*)skb_transport_header(skb
);
1711 __skb_push(skb
, skb
->data
- skb_transport_header(skb
));
1713 if (ipv6_hdr(skb
)->hop_limit
!= 255) {
1714 ND_PRINTK(2, warn
, "NDISC: invalid hop-limit: %d\n",
1715 ipv6_hdr(skb
)->hop_limit
);
1719 if (msg
->icmph
.icmp6_code
!= 0) {
1720 ND_PRINTK(2, warn
, "NDISC: invalid ICMPv6 code: %d\n",
1721 msg
->icmph
.icmp6_code
);
1725 switch (msg
->icmph
.icmp6_type
) {
1726 case NDISC_NEIGHBOUR_SOLICITATION
:
1727 memset(NEIGH_CB(skb
), 0, sizeof(struct neighbour_cb
));
1731 case NDISC_NEIGHBOUR_ADVERTISEMENT
:
1735 case NDISC_ROUTER_SOLICITATION
:
1739 case NDISC_ROUTER_ADVERTISEMENT
:
1740 ndisc_router_discovery(skb
);
1743 case NDISC_REDIRECT
:
1744 ndisc_redirect_rcv(skb
);
1751 static int ndisc_netdev_event(struct notifier_block
*this, unsigned long event
, void *ptr
)
1753 struct net_device
*dev
= netdev_notifier_info_to_dev(ptr
);
1754 struct netdev_notifier_change_info
*change_info
;
1755 struct net
*net
= dev_net(dev
);
1756 struct inet6_dev
*idev
;
1759 case NETDEV_CHANGEADDR
:
1760 neigh_changeaddr(&nd_tbl
, dev
);
1761 fib6_run_gc(0, net
, false);
1764 idev
= in6_dev_get(dev
);
1767 if (idev
->cnf
.ndisc_notify
||
1768 net
->ipv6
.devconf_all
->ndisc_notify
)
1769 ndisc_send_unsol_na(dev
);
1774 if (change_info
->flags_changed
& IFF_NOARP
)
1775 neigh_changeaddr(&nd_tbl
, dev
);
1778 neigh_ifdown(&nd_tbl
, dev
);
1779 fib6_run_gc(0, net
, false);
1781 case NETDEV_NOTIFY_PEERS
:
1782 ndisc_send_unsol_na(dev
);
1791 static struct notifier_block ndisc_netdev_notifier
= {
1792 .notifier_call
= ndisc_netdev_event
,
1793 .priority
= ADDRCONF_NOTIFY_PRIORITY
- 5,
1796 #ifdef CONFIG_SYSCTL
1797 static void ndisc_warn_deprecated_sysctl(struct ctl_table
*ctl
,
1798 const char *func
, const char *dev_name
)
1800 static char warncomm
[TASK_COMM_LEN
];
1802 if (strcmp(warncomm
, current
->comm
) && warned
< 5) {
1803 strcpy(warncomm
, current
->comm
);
1804 pr_warn("process `%s' is using deprecated sysctl (%s) net.ipv6.neigh.%s.%s - use net.ipv6.neigh.%s.%s_ms instead\n",
1806 dev_name
, ctl
->procname
,
1807 dev_name
, ctl
->procname
);
1812 int ndisc_ifinfo_sysctl_change(struct ctl_table
*ctl
, int write
, void __user
*buffer
, size_t *lenp
, loff_t
*ppos
)
1814 struct net_device
*dev
= ctl
->extra1
;
1815 struct inet6_dev
*idev
;
1818 if ((strcmp(ctl
->procname
, "retrans_time") == 0) ||
1819 (strcmp(ctl
->procname
, "base_reachable_time") == 0))
1820 ndisc_warn_deprecated_sysctl(ctl
, "syscall", dev
? dev
->name
: "default");
1822 if (strcmp(ctl
->procname
, "retrans_time") == 0)
1823 ret
= neigh_proc_dointvec(ctl
, write
, buffer
, lenp
, ppos
);
1825 else if (strcmp(ctl
->procname
, "base_reachable_time") == 0)
1826 ret
= neigh_proc_dointvec_jiffies(ctl
, write
,
1827 buffer
, lenp
, ppos
);
1829 else if ((strcmp(ctl
->procname
, "retrans_time_ms") == 0) ||
1830 (strcmp(ctl
->procname
, "base_reachable_time_ms") == 0))
1831 ret
= neigh_proc_dointvec_ms_jiffies(ctl
, write
,
1832 buffer
, lenp
, ppos
);
1836 if (write
&& ret
== 0 && dev
&& (idev
= in6_dev_get(dev
)) != NULL
) {
1837 if (ctl
->data
== &NEIGH_VAR(idev
->nd_parms
, BASE_REACHABLE_TIME
))
1838 idev
->nd_parms
->reachable_time
=
1839 neigh_rand_reach_time(NEIGH_VAR(idev
->nd_parms
, BASE_REACHABLE_TIME
));
1840 idev
->tstamp
= jiffies
;
1841 inet6_ifinfo_notify(RTM_NEWLINK
, idev
);
1850 static int __net_init
ndisc_net_init(struct net
*net
)
1852 struct ipv6_pinfo
*np
;
1856 err
= inet_ctl_sock_create(&sk
, PF_INET6
,
1857 SOCK_RAW
, IPPROTO_ICMPV6
, net
);
1860 "NDISC: Failed to initialize the control socket (err %d)\n",
1865 net
->ipv6
.ndisc_sk
= sk
;
1868 np
->hop_limit
= 255;
1869 /* Do not loopback ndisc messages */
1875 static void __net_exit
ndisc_net_exit(struct net
*net
)
1877 inet_ctl_sock_destroy(net
->ipv6
.ndisc_sk
);
1880 static struct pernet_operations ndisc_net_ops
= {
1881 .init
= ndisc_net_init
,
1882 .exit
= ndisc_net_exit
,
1885 int __init
ndisc_init(void)
1889 err
= register_pernet_subsys(&ndisc_net_ops
);
1893 * Initialize the neighbour table
1895 neigh_table_init(NEIGH_ND_TABLE
, &nd_tbl
);
1897 #ifdef CONFIG_SYSCTL
1898 err
= neigh_sysctl_register(NULL
, &nd_tbl
.parms
,
1899 ndisc_ifinfo_sysctl_change
);
1901 goto out_unregister_pernet
;
1906 #ifdef CONFIG_SYSCTL
1907 out_unregister_pernet
:
1908 unregister_pernet_subsys(&ndisc_net_ops
);
1913 int __init
ndisc_late_init(void)
1915 return register_netdevice_notifier(&ndisc_netdev_notifier
);
1918 void ndisc_late_cleanup(void)
1920 unregister_netdevice_notifier(&ndisc_netdev_notifier
);
1923 void ndisc_cleanup(void)
1925 #ifdef CONFIG_SYSCTL
1926 neigh_sysctl_unregister(&nd_tbl
.parms
);
1928 neigh_table_clear(NEIGH_ND_TABLE
, &nd_tbl
);
1929 unregister_pernet_subsys(&ndisc_net_ops
);