Lines Matching +full:ri +full:- +full:override
1 // SPDX-License-Identifier: GPL-2.0-or-later
157 space -= pad; in __ndisc_fill_addr_option()
162 space -= data_len; in __ndisc_fill_addr_option()
171 __ndisc_fill_addr_option(skb, type, data, skb->dev->addr_len, in ndisc_fill_addr_option()
172 ndisc_addr_option_pad(skb->dev->type)); in ndisc_fill_addr_option()
173 ndisc_ops_fill_addr_option(skb->dev, skb, icmp6_type); in ndisc_fill_addr_option()
181 ndisc_ops_fill_redirect_addr_option(skb->dev, skb, ops_data); in ndisc_fill_redirect_addr_option()
190 type = cur->nd_opt_type; in ndisc_next_option()
192 cur = ((void *)cur) + (cur->nd_opt_len << 3); in ndisc_next_option()
193 } while (cur < end && cur->nd_opt_type != type); in ndisc_next_option()
194 return cur <= end && cur->nd_opt_type == type ? cur : NULL; in ndisc_next_option()
200 return opt->nd_opt_type == ND_OPT_PREFIX_INFO || in ndisc_is_useropt()
201 opt->nd_opt_type == ND_OPT_RDNSS || in ndisc_is_useropt()
202 opt->nd_opt_type == ND_OPT_DNSSL || in ndisc_is_useropt()
203 opt->nd_opt_type == ND_OPT_CAPTIVE_PORTAL || in ndisc_is_useropt()
204 opt->nd_opt_type == ND_OPT_PREF64 || in ndisc_is_useropt()
205 ndisc_ops_is_useropt(dev, opt->nd_opt_type); in ndisc_is_useropt()
215 cur = ((void *)cur) + (cur->nd_opt_len << 3); in ndisc_next_useropt()
233 l = nd_opt->nd_opt_len << 3; in ndisc_parse_options()
238 switch (nd_opt->nd_opt_type) { in ndisc_parse_options()
244 if (ndopts->nd_opt_array[nd_opt->nd_opt_type]) { in ndisc_parse_options()
247 __func__, nd_opt->nd_opt_type); in ndisc_parse_options()
249 ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt; in ndisc_parse_options()
253 ndopts->nd_opts_pi_end = nd_opt; in ndisc_parse_options()
254 if (!ndopts->nd_opt_array[nd_opt->nd_opt_type]) in ndisc_parse_options()
255 ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt; in ndisc_parse_options()
259 ndopts->nd_opts_ri_end = nd_opt; in ndisc_parse_options()
260 if (!ndopts->nd_opts_ri) in ndisc_parse_options()
261 ndopts->nd_opts_ri = nd_opt; in ndisc_parse_options()
266 ndopts->nd_useropts_end = nd_opt; in ndisc_parse_options()
267 if (!ndopts->nd_useropts) in ndisc_parse_options()
268 ndopts->nd_useropts = nd_opt; in ndisc_parse_options()
278 nd_opt->nd_opt_type, in ndisc_parse_options()
279 nd_opt->nd_opt_len); in ndisc_parse_options()
283 opt_len -= l; in ndisc_parse_options()
291 switch (dev->type) { in ndisc_mc_map()
293 case ARPHRD_IEEE802: /* Not sure. Check it later. --ANK */ in ndisc_mc_map()
301 ipv6_ib_mc_map(addr, dev->broadcast, buf); in ndisc_mc_map()
304 return ipv6_ipgre_mc_map(addr, dev->broadcast, buf); in ndisc_mc_map()
307 memcpy(buf, dev->broadcast, dev->addr_len); in ndisc_mc_map()
311 return -EINVAL; in ndisc_mc_map()
329 struct in6_addr *addr = (struct in6_addr *)&neigh->primary_key; in ndisc_constructor()
330 struct net_device *dev = neigh->dev; in ndisc_constructor()
337 return -EINVAL; in ndisc_constructor()
340 parms = in6_dev->nd_parms; in ndisc_constructor()
341 __neigh_parms_put(neigh->parms); in ndisc_constructor()
342 neigh->parms = neigh_parms_clone(parms); in ndisc_constructor()
344 neigh->type = is_multicast ? RTN_MULTICAST : RTN_UNICAST; in ndisc_constructor()
345 if (!dev->header_ops) { in ndisc_constructor()
346 neigh->nud_state = NUD_NOARP; in ndisc_constructor()
347 neigh->ops = &ndisc_direct_ops; in ndisc_constructor()
348 neigh->output = neigh_direct_output; in ndisc_constructor()
351 neigh->nud_state = NUD_NOARP; in ndisc_constructor()
352 ndisc_mc_map(addr, neigh->ha, dev, 1); in ndisc_constructor()
353 } else if (dev->flags&(IFF_NOARP|IFF_LOOPBACK)) { in ndisc_constructor()
354 neigh->nud_state = NUD_NOARP; in ndisc_constructor()
355 memcpy(neigh->ha, dev->dev_addr, dev->addr_len); in ndisc_constructor()
356 if (dev->flags&IFF_LOOPBACK) in ndisc_constructor()
357 neigh->type = RTN_LOCAL; in ndisc_constructor()
358 } else if (dev->flags&IFF_POINTOPOINT) { in ndisc_constructor()
359 neigh->nud_state = NUD_NOARP; in ndisc_constructor()
360 memcpy(neigh->ha, dev->broadcast, dev->addr_len); in ndisc_constructor()
362 if (dev->header_ops->cache) in ndisc_constructor()
363 neigh->ops = &ndisc_hh_ops; in ndisc_constructor()
365 neigh->ops = &ndisc_generic_ops; in ndisc_constructor()
366 if (neigh->nud_state&NUD_VALID) in ndisc_constructor()
367 neigh->output = neigh->ops->connected_output; in ndisc_constructor()
369 neigh->output = neigh->ops->output; in ndisc_constructor()
377 struct in6_addr *addr = (struct in6_addr *)&n->key; in pndisc_constructor()
379 struct net_device *dev = n->dev; in pndisc_constructor()
382 return -EINVAL; in pndisc_constructor()
390 struct in6_addr *addr = (struct in6_addr *)&n->key; in pndisc_destructor()
392 struct net_device *dev = n->dev; in pndisc_destructor()
406 if (!idev || idev->cnf.disable_ipv6) { in ndisc_allow_add()
418 int tlen = dev->needed_tailroom; in ndisc_alloc_skb()
419 struct sock *sk = dev_net(dev)->ipv6.ndisc_sk; in ndisc_alloc_skb()
429 skb->protocol = htons(ETH_P_IPV6); in ndisc_alloc_skb()
430 skb->dev = dev; in ndisc_alloc_skb()
453 idev = __in6_dev_get(skb->dev); in ip6_nd_hdr()
454 tclass = idev ? idev->cnf.ndisc_tclass : 0; in ip6_nd_hdr()
463 hdr->payload_len = htons(len); in ip6_nd_hdr()
464 hdr->nexthdr = IPPROTO_ICMPV6; in ip6_nd_hdr()
465 hdr->hop_limit = hop_limit; in ip6_nd_hdr()
467 hdr->saddr = *saddr; in ip6_nd_hdr()
468 hdr->daddr = *daddr; in ip6_nd_hdr()
475 struct net *net = dev_net(skb->dev); in ndisc_send_skb()
476 struct sock *sk = net->ipv6.ndisc_sk; in ndisc_send_skb()
482 type = icmp6h->icmp6_type; in ndisc_send_skb()
486 int oif = skb->dev->ifindex; in ndisc_send_skb()
489 dst = icmp6_dst_alloc(skb->dev, &fl6); in ndisc_send_skb()
498 icmp6h->icmp6_cksum = csum_ipv6_magic(saddr, daddr, skb->len, in ndisc_send_skb()
501 skb->len, 0)); in ndisc_send_skb()
503 ip6_nd_hdr(skb, saddr, daddr, READ_ONCE(inet6_sk(sk)->hop_limit), skb->len); in ndisc_send_skb()
506 idev = __in6_dev_get(dst->dev); in ndisc_send_skb()
510 net, sk, skb, NULL, dst->dev, in ndisc_send_skb()
523 bool router, bool solicited, bool override, bool inc_opt) in ndisc_send_na() argument
536 if (ifp->flags & IFA_F_OPTIMISTIC) in ndisc_send_na()
537 override = false; in ndisc_send_na()
538 inc_opt |= ifp->idev->cnf.force_tllao; in ndisc_send_na()
542 inet6_sk(dev_net(dev)->ipv6.ndisc_sk)->srcprefs, in ndisc_send_na()
548 if (!dev->addr_len) in ndisc_send_na()
564 .icmp6_override = override, in ndisc_send_na()
571 dev->dev_addr, in ndisc_send_na()
586 read_lock_bh(&idev->lock); in ndisc_send_unsol_na()
587 list_for_each_entry(ifa, &idev->addr_list, if_list) { in ndisc_send_unsol_na()
589 if (ifa->flags & IFA_F_TENTATIVE && in ndisc_send_unsol_na()
590 !(ifa->flags & IFA_F_OPTIMISTIC)) in ndisc_send_unsol_na()
593 ndisc_send_na(dev, &in6addr_linklocal_allnodes, &ifa->addr, in ndisc_send_unsol_na()
594 /*router=*/ !!idev->cnf.forwarding, in ndisc_send_unsol_na()
595 /*solicited=*/ false, /*override=*/ true, in ndisc_send_unsol_na()
598 read_unlock_bh(&idev->lock); in ndisc_send_unsol_na()
606 int inc_opt = dev->addr_len; in ndisc_ns_create()
636 dev->dev_addr, in ndisc_ns_create()
675 int send_sllao = dev->addr_len; in ndisc_send_rs()
691 if (ifp->flags & IFA_F_OPTIMISTIC) { in ndisc_send_rs()
716 dev->dev_addr, in ndisc_send_rs()
739 struct net_device *dev = neigh->dev; in ndisc_solicit()
740 struct in6_addr *target = (struct in6_addr *)&neigh->primary_key; in ndisc_solicit()
741 int probes = atomic_read(&neigh->probes); in ndisc_solicit()
743 if (skb && ipv6_chk_addr_and_flags(dev_net(dev), &ipv6_hdr(skb)->saddr, in ndisc_solicit()
746 saddr = &ipv6_hdr(skb)->saddr; in ndisc_solicit()
747 probes -= NEIGH_VAR(neigh->parms, UCAST_PROBES); in ndisc_solicit()
749 if (!(READ_ONCE(neigh->nud_state) & NUD_VALID)) { in ndisc_solicit()
755 } else if ((probes -= NEIGH_VAR(neigh->parms, APP_PROBES)) < 0) { in ndisc_solicit()
767 int ret = -1; in pndisc_is_router()
772 ret = !!(n->flags & NTF_ROUTER); in pndisc_is_router()
790 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr; in ndisc_recv_ns()
791 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr; in ndisc_recv_ns()
793 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) + in ndisc_recv_ns()
796 struct net_device *dev = skb->dev; in ndisc_recv_ns()
801 int is_router = -1; in ndisc_recv_ns()
806 if (skb->len < sizeof(struct nd_msg)) in ndisc_recv_ns()
809 if (ipv6_addr_is_multicast(&msg->target)) { in ndisc_recv_ns()
823 if (!ndisc_parse_options(dev, msg->opt, ndoptlen, &ndopts)) in ndisc_recv_ns()
830 "NS: invalid link-layer address length\n"); in ndisc_recv_ns()
836 * there MUST NOT be source link-layer address option in ndisc_recv_ns()
841 "NS: bad DAD packet (link-layer address option)\n"); in ndisc_recv_ns()
845 if (ndopts.nd_opts_nonce && ndopts.nd_opts_nonce->nd_opt_len == 1) in ndisc_recv_ns()
850 ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1); in ndisc_recv_ns()
853 if (ifp->flags & (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)) { in ndisc_recv_ns()
855 if (nonce != 0 && ifp->dad_nonce == nonce) { in ndisc_recv_ns()
860 ifp->idev->dev->name, in ndisc_recv_ns()
861 &ifp->addr, np); in ndisc_recv_ns()
878 if (!(ifp->flags & IFA_F_OPTIMISTIC)) in ndisc_recv_ns()
883 idev = ifp->idev; in ndisc_recv_ns()
893 ifp = ipv6_get_ifaddr(net, &msg->target, mdev, 1); in ndisc_recv_ns()
905 if (ipv6_chk_acast_addr(net, dev, &msg->target) || in ndisc_recv_ns()
906 (idev->cnf.forwarding && in ndisc_recv_ns()
907 (net->ipv6.devconf_all->proxy_ndp || idev->cnf.proxy_ndp) && in ndisc_recv_ns()
908 (is_router = pndisc_is_router(&msg->target, dev)) >= 0)) { in ndisc_recv_ns()
909 if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) && in ndisc_recv_ns()
910 skb->pkt_type != PACKET_HOST && in ndisc_recv_ns()
912 NEIGH_VAR(idev->nd_parms, PROXY_DELAY) != 0) { in ndisc_recv_ns()
918 * (RFC2461) -- yoshfuji in ndisc_recv_ns()
922 pneigh_enqueue(&nd_tbl, idev->nd_parms, n); in ndisc_recv_ns()
932 is_router = idev->cnf.forwarding; in ndisc_recv_ns()
935 ndisc_send_na(dev, &in6addr_linklocal_allnodes, &msg->target, in ndisc_recv_ns()
950 !inc || lladdr || !dev->addr_len); in ndisc_recv_ns()
956 if (neigh || !dev->header_ops) { in ndisc_recv_ns()
957 ndisc_send_na(dev, saddr, &msg->target, !!is_router, in ndisc_recv_ns()
976 switch (idev->cnf.accept_untracked_na) { in accept_untracked_na()
994 struct in6_addr *saddr = &ipv6_hdr(skb)->saddr; in ndisc_recv_na()
995 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr; in ndisc_recv_na()
997 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) + in ndisc_recv_na()
1000 struct net_device *dev = skb->dev; in ndisc_recv_na()
1007 if (skb->len < sizeof(struct nd_msg)) in ndisc_recv_na()
1010 if (ipv6_addr_is_multicast(&msg->target)) { in ndisc_recv_na()
1016 msg->icmph.icmp6_solicited) { in ndisc_recv_na()
1026 if (!msg->icmph.icmp6_solicited && idev && in ndisc_recv_na()
1027 idev->cnf.drop_unsolicited_na) in ndisc_recv_na()
1030 if (!ndisc_parse_options(dev, msg->opt, ndoptlen, &ndopts)) in ndisc_recv_na()
1037 "NA: invalid link-layer address length\n"); in ndisc_recv_na()
1041 ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1); in ndisc_recv_na()
1043 if (skb->pkt_type != PACKET_LOOPBACK in ndisc_recv_na()
1044 && (ifp->flags & IFA_F_TENTATIVE)) { in ndisc_recv_na()
1051 an smart proxy agent tries to help us :-) in ndisc_recv_na()
1054 received from loopback - it is just our own in ndisc_recv_na()
1057 if (skb->pkt_type != PACKET_LOOPBACK) in ndisc_recv_na()
1060 eth_hdr(skb)->h_source, &ifp->addr, ifp->idev->dev->name); in ndisc_recv_na()
1065 neigh = neigh_lookup(&nd_tbl, &msg->target, dev); in ndisc_recv_na()
1073 * ------- ------ ------ --------- ---------------------- in ndisc_recv_na()
1080 * Note that we don't do a (daddr == all-routers-mcast) check. in ndisc_recv_na()
1082 new_state = msg->icmph.icmp6_solicited ? NUD_REACHABLE : NUD_STALE; in ndisc_recv_na()
1083 if (!neigh && lladdr && idev && idev->cnf.forwarding) { in ndisc_recv_na()
1085 neigh = neigh_create(&nd_tbl, &msg->target, dev); in ndisc_recv_na()
1091 u8 old_flags = neigh->flags; in ndisc_recv_na()
1094 if (READ_ONCE(neigh->nud_state) & NUD_FAILED) in ndisc_recv_na()
1102 if (lladdr && !memcmp(lladdr, dev->dev_addr, dev->addr_len) && in ndisc_recv_na()
1103 net->ipv6.devconf_all->forwarding && net->ipv6.devconf_all->proxy_ndp && in ndisc_recv_na()
1104 pneigh_lookup(&nd_tbl, net, &msg->target, dev, 0)) { in ndisc_recv_na()
1105 /* XXX: idev->cnf.proxy_ndp */ in ndisc_recv_na()
1112 (msg->icmph.icmp6_override ? NEIGH_UPDATE_F_OVERRIDE : 0)| in ndisc_recv_na()
1114 (msg->icmph.icmp6_router ? NEIGH_UPDATE_F_ISROUTER : 0), in ndisc_recv_na()
1117 if ((old_flags & ~neigh->flags) & NTF_ROUTER) { in ndisc_recv_na()
1133 unsigned long ndoptlen = skb->len - sizeof(*rs_msg); in ndisc_recv_rs()
1136 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr; in ndisc_recv_rs()
1141 if (skb->len < sizeof(*rs_msg)) in ndisc_recv_rs()
1144 idev = __in6_dev_get(skb->dev); in ndisc_recv_rs()
1151 if (!idev->cnf.forwarding) in ndisc_recv_rs()
1162 if (!ndisc_parse_options(skb->dev, rs_msg->opt, ndoptlen, &ndopts)) in ndisc_recv_rs()
1167 skb->dev); in ndisc_recv_rs()
1172 neigh = __neigh_lookup(&nd_tbl, saddr, skb->dev, 1); in ndisc_recv_rs()
1174 ndisc_update(skb->dev, neigh, lladdr, NUD_STALE, in ndisc_recv_rs()
1192 struct net *net = dev_net(ra->dev); in ndisc_ra_useropt()
1195 + (opt->nd_opt_len << 3)); in ndisc_ra_useropt()
1200 err = -ENOBUFS; in ndisc_ra_useropt()
1210 ndmsg->nduseropt_family = AF_INET6; in ndisc_ra_useropt()
1211 ndmsg->nduseropt_ifindex = ra->dev->ifindex; in ndisc_ra_useropt()
1212 ndmsg->nduseropt_icmp_type = icmp6h->icmp6_type; in ndisc_ra_useropt()
1213 ndmsg->nduseropt_icmp_code = icmp6h->icmp6_code; in ndisc_ra_useropt()
1214 ndmsg->nduseropt_opts_len = opt->nd_opt_len << 3; in ndisc_ra_useropt()
1216 memcpy(ndmsg + 1, opt, opt->nd_opt_len << 3); in ndisc_ra_useropt()
1218 if (nla_put_in6_addr(skb, NDUSEROPT_SRCADDR, &ipv6_hdr(ra)->saddr)) in ndisc_ra_useropt()
1227 err = -EMSGSIZE; in ndisc_ra_useropt()
1250 optlen = (skb_tail_pointer(skb) - skb_transport_header(skb)) - in ndisc_router_discovery()
1255 __func__, skb->dev->name); in ndisc_router_discovery()
1256 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) { in ndisc_router_discovery()
1257 ND_PRINTK(2, warn, "RA: source address is not link-local\n"); in ndisc_router_discovery()
1264 if (skb->ndisc_nodetype == NDISC_NODETYPE_HOST) { in ndisc_router_discovery()
1270 in6_dev = __in6_dev_get(skb->dev); in ndisc_router_discovery()
1273 skb->dev->name); in ndisc_router_discovery()
1277 if (!ndisc_parse_options(skb->dev, opt, optlen, &ndopts)) in ndisc_router_discovery()
1283 __func__, skb->dev->name); in ndisc_router_discovery()
1288 /* skip link-specific parameters from interior routers */ in ndisc_router_discovery()
1289 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) { in ndisc_router_discovery()
1292 __func__, skb->dev->name); in ndisc_router_discovery()
1297 if (in6_dev->if_flags & IF_RS_SENT) { in ndisc_router_discovery()
1302 in6_dev->if_flags |= IF_RA_RCVD; in ndisc_router_discovery()
1307 * received RA message (RFC 2462) -- yoshfuji in ndisc_router_discovery()
1309 old_if_flags = in6_dev->if_flags; in ndisc_router_discovery()
1310 in6_dev->if_flags = (in6_dev->if_flags & ~(IF_RA_MANAGED | in ndisc_router_discovery()
1312 (ra_msg->icmph.icmp6_addrconf_managed ? in ndisc_router_discovery()
1314 (ra_msg->icmph.icmp6_addrconf_other ? in ndisc_router_discovery()
1317 if (old_if_flags != in6_dev->if_flags) in ndisc_router_discovery()
1320 if (!in6_dev->cnf.accept_ra_defrtr) { in ndisc_router_discovery()
1323 __func__, skb->dev->name); in ndisc_router_discovery()
1327 lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime); in ndisc_router_discovery()
1328 if (lifetime != 0 && lifetime < in6_dev->cnf.accept_ra_min_lft) { in ndisc_router_discovery()
1331 lifetime, skb->dev->name); in ndisc_router_discovery()
1335 /* Do not accept RA with source-addr found on local machine unless in ndisc_router_discovery()
1338 net = dev_net(in6_dev->dev); in ndisc_router_discovery()
1339 if (!in6_dev->cnf.accept_ra_from_local && in ndisc_router_discovery()
1340 ipv6_chk_addr(net, &ipv6_hdr(skb)->saddr, in6_dev->dev, 0)) { in ndisc_router_discovery()
1343 skb->dev->name); in ndisc_router_discovery()
1348 pref = ra_msg->icmph.icmp6_router_pref; in ndisc_router_discovery()
1351 !in6_dev->cnf.accept_ra_rtr_pref) in ndisc_router_discovery()
1355 rt = rt6_get_dflt_router(net, &ipv6_hdr(skb)->saddr, skb->dev); in ndisc_router_discovery()
1357 neigh = ip6_neigh_lookup(&rt->fib6_nh->fib_nh_gw6, in ndisc_router_discovery()
1358 rt->fib6_nh->fib_nh_dev, NULL, in ndisc_router_discovery()
1359 &ipv6_hdr(skb)->saddr); in ndisc_router_discovery()
1369 defrtr_usr_metric = in6_dev->cnf.ra_defrtr_metric; in ndisc_router_discovery()
1371 if (rt && (lifetime == 0 || rt->fib6_metric != defrtr_usr_metric)) { in ndisc_router_discovery()
1377 rt, lifetime, defrtr_usr_metric, skb->dev->name); in ndisc_router_discovery()
1384 rt = rt6_add_dflt_router(net, &ipv6_hdr(skb)->saddr, in ndisc_router_discovery()
1385 skb->dev, pref, defrtr_usr_metric); in ndisc_router_discovery()
1393 neigh = ip6_neigh_lookup(&rt->fib6_nh->fib_nh_gw6, in ndisc_router_discovery()
1394 rt->fib6_nh->fib_nh_dev, NULL, in ndisc_router_discovery()
1395 &ipv6_hdr(skb)->saddr); in ndisc_router_discovery()
1403 neigh->flags |= NTF_ROUTER; in ndisc_router_discovery()
1404 } else if (rt && IPV6_EXTRACT_PREF(rt->fib6_flags) != pref) { in ndisc_router_discovery()
1408 rt->fib6_flags = (rt->fib6_flags & ~RTF_PREF_MASK) | RTF_PREF(pref); in ndisc_router_discovery()
1414 if (in6_dev->cnf.accept_ra_min_hop_limit < 256 && in ndisc_router_discovery()
1415 ra_msg->icmph.icmp6_hop_limit) { in ndisc_router_discovery()
1416 if (in6_dev->cnf.accept_ra_min_hop_limit <= ra_msg->icmph.icmp6_hop_limit) { in ndisc_router_discovery()
1417 in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit; in ndisc_router_discovery()
1419 ra_msg->icmph.icmp6_hop_limit); in ndisc_router_discovery()
1431 if (in6_dev->nd_parms) { in ndisc_router_discovery()
1432 unsigned long rtime = ntohl(ra_msg->retrans_timer); in ndisc_router_discovery()
1438 NEIGH_VAR_SET(in6_dev->nd_parms, RETRANS_TIME, rtime); in ndisc_router_discovery()
1439 in6_dev->tstamp = jiffies; in ndisc_router_discovery()
1443 rtime = ntohl(ra_msg->reachable_time); in ndisc_router_discovery()
1450 if (rtime != NEIGH_VAR(in6_dev->nd_parms, BASE_REACHABLE_TIME)) { in ndisc_router_discovery()
1451 NEIGH_VAR_SET(in6_dev->nd_parms, in ndisc_router_discovery()
1453 NEIGH_VAR_SET(in6_dev->nd_parms, in ndisc_router_discovery()
1455 in6_dev->nd_parms->reachable_time = neigh_rand_reach_time(rtime); in ndisc_router_discovery()
1456 in6_dev->tstamp = jiffies; in ndisc_router_discovery()
1469 neigh = __neigh_lookup(&nd_tbl, &ipv6_hdr(skb)->saddr, in ndisc_router_discovery()
1470 skb->dev, 1); in ndisc_router_discovery()
1475 skb->dev); in ndisc_router_discovery()
1478 "RA: invalid link-layer address length\n"); in ndisc_router_discovery()
1482 ndisc_update(skb->dev, neigh, lladdr, NUD_STALE, in ndisc_router_discovery()
1494 __func__, skb->dev->name); in ndisc_router_discovery()
1499 if (!in6_dev->cnf.accept_ra_from_local && in ndisc_router_discovery()
1500 ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr, in ndisc_router_discovery()
1501 in6_dev->dev, 0)) { in ndisc_router_discovery()
1504 skb->dev->name); in ndisc_router_discovery()
1508 if (in6_dev->cnf.accept_ra_rtr_pref && ndopts.nd_opts_ri) { in ndisc_router_discovery()
1513 struct route_info *ri = (struct route_info *)p; in ndisc_router_discovery() local
1515 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT && in ndisc_router_discovery()
1516 ri->prefix_len == 0) in ndisc_router_discovery()
1519 if (ri->prefix_len == 0 && in ndisc_router_discovery()
1520 !in6_dev->cnf.accept_ra_defrtr) in ndisc_router_discovery()
1522 if (ri->lifetime != 0 && in ndisc_router_discovery()
1523 ntohl(ri->lifetime) < in6_dev->cnf.accept_ra_min_lft) in ndisc_router_discovery()
1525 if (ri->prefix_len < in6_dev->cnf.accept_ra_rt_info_min_plen) in ndisc_router_discovery()
1527 if (ri->prefix_len > in6_dev->cnf.accept_ra_rt_info_max_plen) in ndisc_router_discovery()
1529 rt6_route_rcv(skb->dev, (u8 *)p, (p->nd_opt_len) << 3, in ndisc_router_discovery()
1530 &ipv6_hdr(skb)->saddr); in ndisc_router_discovery()
1538 /* skip link-specific ndopts from interior routers */ in ndisc_router_discovery()
1539 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) { in ndisc_router_discovery()
1542 __func__, skb->dev->name); in ndisc_router_discovery()
1547 if (in6_dev->cnf.accept_ra_pinfo && ndopts.nd_opts_pi) { in ndisc_router_discovery()
1552 addrconf_prefix_rcv(skb->dev, (u8 *)p, in ndisc_router_discovery()
1553 (p->nd_opt_len) << 3, in ndisc_router_discovery()
1558 if (ndopts.nd_opts_mtu && in6_dev->cnf.accept_ra_mtu) { in ndisc_router_discovery()
1565 if (in6_dev->ra_mtu != mtu) { in ndisc_router_discovery()
1566 in6_dev->ra_mtu = mtu; in ndisc_router_discovery()
1570 if (mtu < IPV6_MIN_MTU || mtu > skb->dev->mtu) { in ndisc_router_discovery()
1572 } else if (in6_dev->cnf.mtu6 != mtu) { in ndisc_router_discovery()
1573 in6_dev->cnf.mtu6 = mtu; in ndisc_router_discovery()
1575 rt6_mtu_change(skb->dev, mtu); in ndisc_router_discovery()
1583 p = ndisc_next_useropt(skb->dev, p, in ndisc_router_discovery()
1608 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) + in ndisc_redirect_rcv()
1615 switch (skb->ndisc_nodetype) { in ndisc_redirect_rcv()
1624 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) { in ndisc_redirect_rcv()
1626 "Redirect: source address is not link-local\n"); in ndisc_redirect_rcv()
1630 if (!ndisc_parse_options(skb->dev, msg->opt, ndoptlen, &ndopts)) in ndisc_redirect_rcv()
1634 ip6_redirect_no_header(skb, dev_net(skb->dev), in ndisc_redirect_rcv()
1635 skb->dev->ifindex); in ndisc_redirect_rcv()
1641 if (!pskb_pull(skb, hdr - skb_transport_header(skb))) in ndisc_redirect_rcv()
1659 rd_len - 8); in ndisc_fill_redirect_hdr_option()
1664 struct net_device *dev = skb->dev; in ndisc_send_redirect()
1666 struct sock *sk = net->ipv6.ndisc_sk; in ndisc_send_redirect()
1680 if (netif_is_l3_master(skb->dev)) { in ndisc_send_redirect()
1681 dev = __dev_get_by_index(dev_net(skb->dev), IPCB(skb)->iif); in ndisc_send_redirect()
1687 ND_PRINTK(2, warn, "Redirect: no link-local address on %s\n", in ndisc_send_redirect()
1688 dev->name); in ndisc_send_redirect()
1692 if (!ipv6_addr_equal(&ipv6_hdr(skb)->daddr, target) && in ndisc_send_redirect()
1695 "Redirect: target address is not link-local unicast\n"); in ndisc_send_redirect()
1700 &saddr_buf, &ipv6_hdr(skb)->saddr, dev->ifindex); in ndisc_send_redirect()
1703 if (dst->error) { in ndisc_send_redirect()
1713 if (rt->rt6i_flags & RTF_GATEWAY) { in ndisc_send_redirect()
1718 peer = inet_getpeer_v6(net->ipv6.peers, &ipv6_hdr(skb)->saddr, 1); in ndisc_send_redirect()
1725 if (dev->addr_len) { in ndisc_send_redirect()
1733 read_lock_bh(&neigh->lock); in ndisc_send_redirect()
1734 if (neigh->nud_state & NUD_VALID) { in ndisc_send_redirect()
1735 memcpy(ha_buf, neigh->ha, dev->addr_len); in ndisc_send_redirect()
1736 read_unlock_bh(&neigh->lock); in ndisc_send_redirect()
1742 read_unlock_bh(&neigh->lock); in ndisc_send_redirect()
1748 IPV6_MIN_MTU - sizeof(struct ipv6hdr) - sizeof(*msg) - optlen, in ndisc_send_redirect()
1749 skb->len + 8); in ndisc_send_redirect()
1763 .dest = ipv6_hdr(skb)->daddr, in ndisc_send_redirect()
1781 ndisc_send_skb(buff, &ipv6_hdr(skb)->saddr, &saddr_buf); in ndisc_send_redirect()
1802 struct inet6_dev *idev = __in6_dev_get(skb->dev); in ndisc_suppress_frag_ndisc()
1806 if (IP6CB(skb)->flags & IP6SKB_FRAGMENTED && in ndisc_suppress_frag_ndisc()
1807 idev->cnf.suppress_frag_ndisc) { in ndisc_suppress_frag_ndisc()
1827 __skb_push(skb, skb->data - skb_transport_header(skb)); in ndisc_rcv()
1829 if (ipv6_hdr(skb)->hop_limit != 255) { in ndisc_rcv()
1830 ND_PRINTK(2, warn, "NDISC: invalid hop-limit: %d\n", in ndisc_rcv()
1831 ipv6_hdr(skb)->hop_limit); in ndisc_rcv()
1835 if (msg->icmph.icmp6_code != 0) { in ndisc_rcv()
1837 msg->icmph.icmp6_code); in ndisc_rcv()
1841 switch (msg->icmph.icmp6_type) { in ndisc_rcv()
1884 if (idev->cnf.ndisc_notify || in ndisc_netdev_event()
1885 net->ipv6.devconf_all->ndisc_notify) in ndisc_netdev_event()
1894 evict_nocarrier = idev->cnf.ndisc_evict_nocarrier && in ndisc_netdev_event()
1895 net->ipv6.devconf_all->ndisc_evict_nocarrier; in ndisc_netdev_event()
1900 if (change_info->flags_changed & IFF_NOARP) in ndisc_netdev_event()
1921 .priority = ADDRCONF_NOTIFY_PRIORITY - 5,
1930 if (strcmp(warncomm, current->comm) && warned < 5) { in ndisc_warn_deprecated_sysctl()
1931 strcpy(warncomm, current->comm); in ndisc_warn_deprecated_sysctl()
1932 …pr_warn("process `%s' is using deprecated sysctl (%s) net.ipv6.neigh.%s.%s - use net.ipv6.neigh.%s… in ndisc_warn_deprecated_sysctl()
1934 dev_name, ctl->procname, in ndisc_warn_deprecated_sysctl()
1935 dev_name, ctl->procname); in ndisc_warn_deprecated_sysctl()
1943 struct net_device *dev = ctl->extra1; in ndisc_ifinfo_sysctl_change()
1947 if ((strcmp(ctl->procname, "retrans_time") == 0) || in ndisc_ifinfo_sysctl_change()
1948 (strcmp(ctl->procname, "base_reachable_time") == 0)) in ndisc_ifinfo_sysctl_change()
1949 ndisc_warn_deprecated_sysctl(ctl, "syscall", dev ? dev->name : "default"); in ndisc_ifinfo_sysctl_change()
1951 if (strcmp(ctl->procname, "retrans_time") == 0) in ndisc_ifinfo_sysctl_change()
1954 else if (strcmp(ctl->procname, "base_reachable_time") == 0) in ndisc_ifinfo_sysctl_change()
1958 else if ((strcmp(ctl->procname, "retrans_time_ms") == 0) || in ndisc_ifinfo_sysctl_change()
1959 (strcmp(ctl->procname, "base_reachable_time_ms") == 0)) in ndisc_ifinfo_sysctl_change()
1963 ret = -1; in ndisc_ifinfo_sysctl_change()
1966 if (ctl->data == &NEIGH_VAR(idev->nd_parms, BASE_REACHABLE_TIME)) in ndisc_ifinfo_sysctl_change()
1967 idev->nd_parms->reachable_time = in ndisc_ifinfo_sysctl_change()
1968 neigh_rand_reach_time(NEIGH_VAR(idev->nd_parms, BASE_REACHABLE_TIME)); in ndisc_ifinfo_sysctl_change()
1969 idev->tstamp = jiffies; in ndisc_ifinfo_sysctl_change()
1994 net->ipv6.ndisc_sk = sk; in ndisc_net_init()
1997 np->hop_limit = 255; in ndisc_net_init()
2006 inet_ctl_sock_destroy(net->ipv6.ndisc_sk); in ndisc_net_exit()