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>
37 #include <linux/sched.h>
38 #include <linux/net.h>
39 #include <linux/in6.h>
43 #include <linux/slab.h>
45 #include <linux/sysctl.h>
49 #include <linux/if_arp.h>
50 #include <linux/ipv6.h>
51 #include <linux/icmpv6.h>
65 #include <linux/rtnetlink.h>
72 #include <linux/netfilter.h>
73 #include <linux/netfilter_ipv6.h>
78 #define ND_PRINTK(val, level, fmt, ...) \
80 if (val <= ND_DEBUG) \
81 net_##level##_ratelimited(fmt, ##__VA_ARGS__); \
84 static u32 ndisc_hash(
const void *
pkey,
87 static int ndisc_constructor(
struct neighbour *neigh);
94 static const struct neigh_ops ndisc_generic_ops = {
96 .solicit = ndisc_solicit,
97 .error_report = ndisc_error_report,
102 static const struct neigh_ops ndisc_hh_ops = {
104 .solicit = ndisc_solicit,
105 .error_report = ndisc_error_report,
111 static const struct neigh_ops ndisc_direct_ops = {
121 .constructor = ndisc_constructor,
122 .pconstructor = pndisc_constructor,
123 .pdestructor = pndisc_destructor,
124 .proxy_redo = pndisc_redo,
130 .gc_staletime = 60 *
HZ,
132 .delay_probe_time = 5 *
HZ,
133 .queue_len_bytes = 64*1024,
136 .anycast_delay = 1 *
HZ,
137 .proxy_delay = (8 *
HZ) / 10,
140 .gc_interval = 30 *
HZ,
146 static inline int ndisc_opt_addr_space(
struct net_device *
dev)
152 unsigned short addr_type)
155 int pad = ndisc_addr_option_pad(addr_type);
164 memcpy(opt+2, data, data_len);
167 if ((space -= data_len) > 0)
176 if (!cur || !end || cur >= end)
185 static inline int ndisc_is_useropt(
struct nd_opt_hdr *opt)
194 if (!cur || !end || cur >= end)
198 }
while(cur < end && !ndisc_is_useropt(cur));
199 return cur <= end && ndisc_is_useropt(cur) ? cur :
NULL;
207 if (!nd_opt || opt_len < 0 || !ndopts)
209 memset(ndopts, 0,
sizeof(*ndopts));
215 if (opt_len < l || l == 0)
224 "%s: duplicated ND6 option found: type=%d\n",
231 ndopts->nd_opts_pi_end = nd_opt;
235 #ifdef CONFIG_IPV6_ROUTE_INFO
237 ndopts->nd_opts_ri_end = nd_opt;
238 if (!ndopts->nd_opts_ri)
239 ndopts->nd_opts_ri = nd_opt;
243 if (ndisc_is_useropt(nd_opt)) {
254 "%s: ignored unsupported option; type=%d, len=%d\n",
261 nd_opt = ((
void *)nd_opt) +
l;
272 ipv6_eth_mc_map(addr, buf);
275 ipv6_arcnet_mc_map(addr, buf);
278 ipv6_ib_mc_map(addr, dev->
broadcast, buf);
281 return ipv6_ipgre_mc_map(addr, dev->
broadcast, buf);
293 static u32 ndisc_hash(
const void *
pkey,
297 return ndisc_hashfn(pkey, dev, hash_rnd);
300 static int ndisc_constructor(
struct neighbour *neigh)
306 bool is_multicast = ipv6_addr_is_multicast(addr);
308 in6_dev = in6_dev_get(dev);
309 if (in6_dev ==
NULL) {
313 parms = in6_dev->nd_parms;
314 __neigh_parms_put(neigh->
parms);
320 neigh->
ops = &ndisc_direct_ops;
336 neigh->
ops = &ndisc_hh_ops;
338 neigh->
ops = &ndisc_generic_ops;
340 neigh->
output = neigh->
ops->connected_output;
344 in6_dev_put(in6_dev);
354 if (dev ==
NULL || __in6_dev_get(dev) ==
NULL)
356 addrconf_addr_solict_mult(addr, &maddr);
367 if (dev ==
NULL || __in6_dev_get(dev) ==
NULL)
369 addrconf_addr_solict_mult(addr, &maddr);
380 struct net *
net = dev_net(dev);
381 struct sock *
sk = net->ipv6.ndisc_sk;
395 len += ndisc_opt_addr_space(dev);
402 ND_PRINTK(0, err,
"ND: %s failed to allocate an skb, err=%d\n",
407 skb_reserve(skb, hlen);
413 hdr = (
struct icmp6hdr *)skb_transport_header(skb);
414 memcpy(hdr, icmp6h,
sizeof(*hdr));
416 opt = skb_transport_header(skb) +
sizeof(
struct icmp6hdr);
419 opt +=
sizeof(*target);
423 ndisc_fill_addr_option(opt, llinfo, dev->
dev_addr,
445 struct net *
net = dev_net(dev);
446 struct sock *
sk = net->ipv6.ndisc_sk;
460 skb_dst_set(skb, dst);
463 idev = __in6_dev_get(dst->
dev);
481 static void __ndisc_send(
struct net_device *dev,
499 const struct in6_addr *solicited_addr,
500 int router,
int solicited,
int override,
int inc_opt)
512 src_addr = solicited_addr;
515 inc_opt |= ifp->
idev->cnf.force_tllao;
519 inet6_sk(dev_net(dev)->ipv6.ndisc_sk)->srcprefs,
525 icmp6h.icmp6_router = router;
526 icmp6h.icmp6_solicited = solicited;
527 icmp6h.icmp6_override =
override;
529 __ndisc_send(dev, neigh, daddr, src_addr,
530 &icmp6h, solicited_addr,
534 static void ndisc_send_unsol_na(
struct net_device *dev)
540 idev = in6_dev_get(dev);
546 ndisc_send_na(dev,
NULL, &mcaddr, &ifa->
addr,
547 !!idev->
cnf.forwarding,
572 __ndisc_send(dev, neigh, daddr, saddr,
585 #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
607 __ndisc_send(dev,
NULL, daddr, saddr,
613 static void ndisc_error_report(
struct neighbour *neigh,
struct sk_buff *skb)
619 dst_link_failure(skb);
633 if (skb &&
ipv6_chk_addr(dev_net(dev), &ipv6_hdr(skb)->saddr, dev, 1))
634 saddr = &ipv6_hdr(skb)->saddr;
636 if ((probes -= neigh->
parms->ucast_probes) < 0) {
639 "%s: trying to ucast probe in NUD_INVALID: %pI6\n",
643 }
else if ((probes -= neigh->
parms->app_probes) < 0) {
648 addrconf_addr_solict_mult(target, &mcaddr);
653 static int pndisc_is_router(
const void *
pkey,
668 static void ndisc_recv_ns(
struct sk_buff *skb)
671 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
672 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr;
681 int dad = ipv6_addr_any(saddr);
685 if (ipv6_addr_is_multicast(&msg->
target)) {
695 !(daddr->s6_addr32[0] ==
htonl(0xff020000) &&
696 daddr->s6_addr32[1] ==
htonl(0x00000000) &&
697 daddr->s6_addr32[2] ==
htonl(0x00000001) &&
698 daddr->s6_addr [12] == 0xff )) {
699 ND_PRINTK(2,
warn,
"NS: bad DAD packet (wrong destination)\n");
708 if (ndopts.nd_opts_src_lladdr) {
709 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr, dev);
712 "NS: invalid link-layer address length\n");
723 "NS: bad DAD packet (link-layer address option)\n");
728 inc = ipv6_addr_is_multicast(daddr);
756 struct net *
net = dev_net(dev);
758 idev = in6_dev_get(dev);
765 (idev->
cnf.forwarding &&
766 (net->ipv6.devconf_all->proxy_ndp || idev->
cnf.proxy_ndp) &&
767 (is_router = pndisc_is_router(&msg->
target, dev)) >= 0)) {
789 is_router = !!idev->
cnf.forwarding;
793 is_router, 0, (ifp !=
NULL), 1);
806 neigh = __neigh_lookup(&nd_tbl, saddr, dev,
813 ndisc_send_na(dev, neigh, saddr, &msg->
target,
815 1, (ifp !=
NULL && inc), inc);
817 neigh_release(neigh);
827 static void ndisc_recv_na(
struct sk_buff *skb)
829 struct nd_msg *msg = (
struct nd_msg *)skb_transport_header(skb);
830 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
831 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr;
845 if (ipv6_addr_is_multicast(&msg->
target)) {
850 if (ipv6_addr_is_multicast(daddr) &&
851 msg->
icmph.icmp6_solicited) {
860 if (ndopts.nd_opts_tgt_lladdr) {
861 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_tgt_lladdr, dev);
864 "NA: invalid link-layer address length\n");
886 "NA: someone advertises our address %pI6 on %s!\n",
895 struct net *net = dev_net(dev);
906 net->ipv6.devconf_all->forwarding && net->ipv6.devconf_all->proxy_ndp &&
930 neigh_release(neigh);
934 static void ndisc_recv_rs(
struct sk_buff *skb)
936 struct rs_msg *
rs_msg = (
struct rs_msg *)skb_transport_header(skb);
937 unsigned long ndoptlen = skb->
len -
sizeof(*rs_msg);
940 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
944 if (skb->
len <
sizeof(*rs_msg))
947 idev = __in6_dev_get(skb->
dev);
954 if (!idev->
cnf.forwarding)
961 if (ipv6_addr_any(saddr))
966 ND_PRINTK(2, notice,
"NS: invalid ND option, ignored\n");
970 if (ndopts.nd_opts_src_lladdr) {
971 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr,
977 neigh = __neigh_lookup(&nd_tbl, saddr, skb->
dev, 1);
983 neigh_release(neigh);
995 struct net *net = dev_net(ra->
dev);
1009 goto nla_put_failure;
1012 ndmsg = nlmsg_data(nlh);
1022 &ipv6_hdr(ra)->saddr))
1023 goto nla_put_failure;
1024 nlmsg_end(skb, nlh);
1036 static inline int accept_ra(
struct inet6_dev *in6_dev)
1042 if (in6_dev->
cnf.forwarding && in6_dev->
cnf.accept_ra < 2)
1045 return in6_dev->
cnf.accept_ra;
1048 static void ndisc_router_discovery(
struct sk_buff *skb)
1050 struct ra_msg *
ra_msg = (
struct ra_msg *)skb_transport_header(skb);
1057 unsigned int pref = 0;
1064 ND_PRINTK(2,
warn,
"RA: source address is not link-local\n");
1072 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1074 ND_PRINTK(2,
warn,
"RA: from host or unauthorized router\n");
1083 in6_dev = __in6_dev_get(skb->
dev);
1084 if (in6_dev ==
NULL) {
1085 ND_PRINTK(0, err,
"RA: can't find inet6 device for %s\n",
1095 if (!accept_ra(in6_dev))
1096 goto skip_linkparms;
1098 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1101 goto skip_linkparms;
1118 (ra_msg->
icmph.icmp6_addrconf_managed ?
1120 (ra_msg->
icmph.icmp6_addrconf_other ?
1123 if (!in6_dev->
cnf.accept_ra_defrtr)
1129 lifetime =
ntohs(ra_msg->
icmph.icmp6_rt_lifetime);
1131 #ifdef CONFIG_IPV6_ROUTER_PREF
1132 pref = ra_msg->
icmph.icmp6_router_pref;
1135 !in6_dev->
cnf.accept_ra_rtr_pref)
1142 neigh = dst_neigh_lookup(&rt->
dst, &ipv6_hdr(skb)->saddr);
1145 "RA: %s got default router without neighbour\n",
1151 if (rt && lifetime == 0) {
1156 if (rt ==
NULL && lifetime) {
1162 "RA: %s failed to add default route\n",
1167 neigh = dst_neigh_lookup(&rt->
dst, &ipv6_hdr(skb)->saddr);
1168 if (neigh ==
NULL) {
1170 "RA: %s got default router without neighbour\n",
1181 rt6_set_expires(rt, jiffies + (
HZ * lifetime));
1182 if (ra_msg->
icmph.icmp6_hop_limit) {
1183 in6_dev->
cnf.hop_limit = ra_msg->
icmph.icmp6_hop_limit;
1186 ra_msg->
icmph.icmp6_hop_limit);
1199 rtime = (rtime*
HZ)/1000;
1209 rtime = (rtime*
HZ)/1000;
1214 if (rtime != in6_dev->
nd_parms->base_reachable_time) {
1231 neigh = __neigh_lookup(&nd_tbl, &ipv6_hdr(skb)->saddr,
1235 if (ndopts.nd_opts_src_lladdr) {
1236 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr,
1240 "RA: invalid link-layer address length\n");
1251 if (!accept_ra(in6_dev))
1254 #ifdef CONFIG_IPV6_ROUTE_INFO
1256 goto skip_routeinfo;
1258 if (in6_dev->
cnf.accept_ra_rtr_pref && ndopts.nd_opts_ri) {
1260 for (p = ndopts.nd_opts_ri;
1262 p = ndisc_next_option(p, ndopts.nd_opts_ri_end)) {
1264 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1269 if (ri->
prefix_len > in6_dev->
cnf.accept_ra_rt_info_max_plen)
1272 &ipv6_hdr(skb)->saddr);
1279 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1285 if (in6_dev->
cnf.accept_ra_pinfo && ndopts.nd_opts_pi) {
1287 for (p = ndopts.nd_opts_pi;
1289 p = ndisc_next_option(p, ndopts.nd_opts_pi_end)) {
1292 ndopts.nd_opts_src_lladdr !=
NULL);
1296 if (ndopts.nd_opts_mtu) {
1300 memcpy(&n, ((
u8*)(ndopts.nd_opts_mtu+1))+2,
sizeof(mtu));
1303 if (mtu < IPV6_MIN_MTU || mtu > skb->
dev->mtu) {
1305 }
else if (in6_dev->
cnf.mtu6 != mtu) {
1306 in6_dev->
cnf.mtu6 = mtu;
1315 if (ndopts.nd_useropts) {
1317 for (p = ndopts.nd_useropts;
1319 p = ndisc_next_useropt(p, ndopts.nd_useropts_end)) {
1320 ndisc_ra_useropt(skb, p);
1324 if (ndopts.nd_opts_tgt_lladdr || ndopts.nd_opts_rh) {
1331 neigh_release(neigh);
1334 static void ndisc_redirect_rcv(
struct sk_buff *skb)
1336 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1337 switch (skb->ndisc_nodetype) {
1341 "Redirect: from host or unauthorized router\n");
1346 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) {
1348 "Redirect: source address is not link-local\n");
1358 struct net *net = dev_net(dev);
1359 struct sock *
sk = net->ipv6.ndisc_sk;
1378 ND_PRINTK(2,
warn,
"Redirect: no link-local address on %s\n",
1383 if (!ipv6_addr_equal(&ipv6_hdr(skb)->daddr, target) &&
1386 "Redirect: target address is not link-local unicast\n");
1391 &saddr_buf, &ipv6_hdr(skb)->saddr, dev->
ifindex);
1406 "Redirect: destination is not a neighbour\n");
1409 peer = inet_getpeer_v6(net->ipv6.peers, &rt->rt6i_dst.addr, 1);
1417 struct neighbour *neigh = dst_neigh_lookup(skb_dst(skb), target);
1420 "Redirect: no neigh for target address\n");
1429 len += ndisc_opt_addr_space(dev);
1433 neigh_release(neigh);
1436 rd_len =
min_t(
unsigned int,
1449 "Redirect: %s failed to allocate an skb, err=%d\n",
1454 skb_reserve(buff, hlen);
1455 ip6_nd_hdr(sk, buff, dev, &saddr_buf, &ipv6_hdr(skb)->saddr,
1458 skb_set_transport_header(buff, skb_tail_pointer(buff) - buff->
data);
1460 icmph = icmp6_hdr(buff);
1469 addrp = (
struct in6_addr *)(icmph + 1);
1472 *addrp = ipv6_hdr(skb)->daddr;
1474 opt = (
u8*) (addrp + 1);
1490 *(opt++) = (rd_len >> 3);
1493 memcpy(opt, ipv6_hdr(skb), rd_len - 8);
1499 skb_dst_set(buff, dst);
1501 idev = __in6_dev_get(dst->
dev);
1517 static void pndisc_redo(
struct sk_buff *skb)
1527 if (!pskb_may_pull(skb, skb->
len))
1530 msg = (
struct nd_msg *)skb_transport_header(skb);
1532 __skb_push(skb, skb->
data - skb_transport_header(skb));
1540 if (msg->
icmph.icmp6_code != 0) {
1542 msg->
icmph.icmp6_code);
1548 switch (msg->
icmph.icmp6_type) {
1562 ndisc_router_discovery(skb);
1566 ndisc_redirect_rcv(skb);
1576 struct net *net = dev_net(dev);
1588 ndisc_send_unsol_na(dev);
1598 .notifier_call = ndisc_netdev_event,
1601 #ifdef CONFIG_SYSCTL
1602 static void ndisc_warn_deprecated_sysctl(
struct ctl_table *
ctl,
1603 const char *
func,
const char *dev_name)
1609 pr_warn(
"process `%s' is using deprecated sysctl (%s) net.ipv6.neigh.%s.%s - use net.ipv6.neigh.%s.%s_ms instead\n",
1617 int ndisc_ifinfo_sysctl_change(
struct ctl_table *ctl,
int write,
void __user *
buffer,
size_t *lenp, loff_t *ppos)
1625 ndisc_warn_deprecated_sysctl(ctl,
"syscall", dev ? dev->
name :
"default");
1632 buffer, lenp, ppos);
1637 buffer, lenp, ppos);
1641 if (write && ret == 0 && dev && (idev = in6_dev_get(dev)) !=
NULL) {
1654 static int __net_init ndisc_net_init(
struct net *net)
1664 "NDISC: Failed to initialize the control socket (err %d)\n",
1669 net->ipv6.ndisc_sk =
sk;
1679 static void __net_exit ndisc_net_exit(
struct net *net)
1681 inet_ctl_sock_destroy(net->ipv6.ndisc_sk);
1685 .init = ndisc_net_init,
1686 .exit = ndisc_net_exit,
1701 #ifdef CONFIG_SYSCTL
1703 &ndisc_ifinfo_sysctl_change);
1705 goto out_unregister_pernet;
1709 goto out_unregister_sysctl;
1713 out_unregister_sysctl:
1714 #ifdef CONFIG_SYSCTL
1716 out_unregister_pernet:
1725 #ifdef CONFIG_SYSCTL