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_6CO || in ndisc_is_useropt()
204 opt->nd_opt_type == ND_OPT_CAPTIVE_PORTAL || in ndisc_is_useropt()
205 opt->nd_opt_type == ND_OPT_PREF64; in ndisc_is_useropt()
215 cur = ((void *)cur) + (cur->nd_opt_len << 3); in ndisc_next_useropt()
234 l = nd_opt->nd_opt_len << 3; in ndisc_parse_options()
239 switch (nd_opt->nd_opt_type) { in ndisc_parse_options()
245 if (ndopts->nd_opt_array[nd_opt->nd_opt_type]) { in ndisc_parse_options()
248 __func__, nd_opt->nd_opt_type); in ndisc_parse_options()
250 ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt; in ndisc_parse_options()
254 ndopts->nd_opts_pi_end = nd_opt; in ndisc_parse_options()
255 if (!ndopts->nd_opt_array[nd_opt->nd_opt_type]) in ndisc_parse_options()
256 ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt; in ndisc_parse_options()
260 ndopts->nd_opts_ri_end = nd_opt; in ndisc_parse_options()
261 if (!ndopts->nd_opts_ri) in ndisc_parse_options()
262 ndopts->nd_opts_ri = nd_opt; in ndisc_parse_options()
269 ndopts->nd_useropts_end = nd_opt; in ndisc_parse_options()
270 if (!ndopts->nd_useropts) in ndisc_parse_options()
271 ndopts->nd_useropts = nd_opt; in ndisc_parse_options()
281 nd_opt->nd_opt_type, in ndisc_parse_options()
282 nd_opt->nd_opt_len); in ndisc_parse_options()
285 opt_len -= l; in ndisc_parse_options()
293 switch (dev->type) { in ndisc_mc_map()
295 case ARPHRD_IEEE802: /* Not sure. Check it later. --ANK */ in ndisc_mc_map()
303 ipv6_ib_mc_map(addr, dev->broadcast, buf); in ndisc_mc_map()
306 return ipv6_ipgre_mc_map(addr, dev->broadcast, buf); in ndisc_mc_map()
309 memcpy(buf, dev->broadcast, dev->addr_len); in ndisc_mc_map()
313 return -EINVAL; in ndisc_mc_map()
331 struct in6_addr *addr = (struct in6_addr *)&neigh->primary_key; in ndisc_constructor()
332 struct net_device *dev = neigh->dev; in ndisc_constructor()
339 return -EINVAL; in ndisc_constructor()
342 parms = in6_dev->nd_parms; in ndisc_constructor()
343 __neigh_parms_put(neigh->parms); in ndisc_constructor()
344 neigh->parms = neigh_parms_clone(parms); in ndisc_constructor()
346 neigh->type = is_multicast ? RTN_MULTICAST : RTN_UNICAST; in ndisc_constructor()
347 if (!dev->header_ops) { in ndisc_constructor()
348 neigh->nud_state = NUD_NOARP; in ndisc_constructor()
349 neigh->ops = &ndisc_direct_ops; in ndisc_constructor()
350 neigh->output = neigh_direct_output; in ndisc_constructor()
353 neigh->nud_state = NUD_NOARP; in ndisc_constructor()
354 ndisc_mc_map(addr, neigh->ha, dev, 1); in ndisc_constructor()
355 } else if (dev->flags&(IFF_NOARP|IFF_LOOPBACK)) { in ndisc_constructor()
356 neigh->nud_state = NUD_NOARP; in ndisc_constructor()
357 memcpy(neigh->ha, dev->dev_addr, dev->addr_len); in ndisc_constructor()
358 if (dev->flags&IFF_LOOPBACK) in ndisc_constructor()
359 neigh->type = RTN_LOCAL; in ndisc_constructor()
360 } else if (dev->flags&IFF_POINTOPOINT) { in ndisc_constructor()
361 neigh->nud_state = NUD_NOARP; in ndisc_constructor()
362 memcpy(neigh->ha, dev->broadcast, dev->addr_len); in ndisc_constructor()
364 if (dev->header_ops->cache) in ndisc_constructor()
365 neigh->ops = &ndisc_hh_ops; in ndisc_constructor()
367 neigh->ops = &ndisc_generic_ops; in ndisc_constructor()
368 if (neigh->nud_state&NUD_VALID) in ndisc_constructor()
369 neigh->output = neigh->ops->connected_output; in ndisc_constructor()
371 neigh->output = neigh->ops->output; in ndisc_constructor()
379 struct in6_addr *addr = (struct in6_addr *)&n->key; in pndisc_constructor()
381 struct net_device *dev = n->dev; in pndisc_constructor()
384 return -EINVAL; in pndisc_constructor()
392 struct in6_addr *addr = (struct in6_addr *)&n->key; in pndisc_destructor()
394 struct net_device *dev = n->dev; in pndisc_destructor()
408 if (!idev || idev->cnf.disable_ipv6) { in ndisc_allow_add()
420 int tlen = dev->needed_tailroom; in ndisc_alloc_skb()
427 skb->protocol = htons(ETH_P_IPV6); in ndisc_alloc_skb()
428 skb->dev = dev; in ndisc_alloc_skb()
437 skb_set_owner_w(skb, dev_net_rcu(dev)->ipv6.ndisc_sk); in ndisc_alloc_skb()
453 idev = __in6_dev_get(skb->dev); in ip6_nd_hdr()
454 tclass = idev ? READ_ONCE(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()
482 type = icmp6h->icmp6_type; in ndisc_send_skb()
486 net = dev_net_rcu(skb->dev); in ndisc_send_skb()
487 sk = net->ipv6.ndisc_sk; in ndisc_send_skb()
490 int oif = skb->dev->ifindex; in ndisc_send_skb()
493 dst = icmp6_dst_alloc(skb->dev, &fl6); in ndisc_send_skb()
503 icmp6h->icmp6_cksum = csum_ipv6_magic(saddr, daddr, skb->len, in ndisc_send_skb()
506 skb->len, 0)); in ndisc_send_skb()
508 ip6_nd_hdr(skb, saddr, daddr, READ_ONCE(inet6_sk(sk)->hop_limit), skb->len); in ndisc_send_skb()
510 idev = __in6_dev_get(dst->dev); in ndisc_send_skb()
514 net, sk, skb, NULL, dst->dev, in ndisc_send_skb()
527 bool router, bool solicited, bool override, bool inc_opt) in ndisc_send_na() argument
540 if (ifp->flags & IFA_F_OPTIMISTIC) in ndisc_send_na()
541 override = false; in ndisc_send_na()
542 inc_opt |= READ_ONCE(ifp->idev->cnf.force_tllao); in ndisc_send_na()
546 inet6_sk(dev_net(dev)->ipv6.ndisc_sk)->srcprefs, in ndisc_send_na()
552 if (!dev->addr_len) in ndisc_send_na()
568 .icmp6_override = override, in ndisc_send_na()
575 dev->dev_addr, in ndisc_send_na()
590 read_lock_bh(&idev->lock); in ndisc_send_unsol_na()
591 list_for_each_entry(ifa, &idev->addr_list, if_list) { in ndisc_send_unsol_na()
593 if (ifa->flags & IFA_F_TENTATIVE && in ndisc_send_unsol_na()
594 !(ifa->flags & IFA_F_OPTIMISTIC)) in ndisc_send_unsol_na()
597 ndisc_send_na(dev, &in6addr_linklocal_allnodes, &ifa->addr, in ndisc_send_unsol_na()
598 /*router=*/ !!idev->cnf.forwarding, in ndisc_send_unsol_na()
599 /*solicited=*/ false, /*override=*/ true, in ndisc_send_unsol_na()
602 read_unlock_bh(&idev->lock); in ndisc_send_unsol_na()
610 int inc_opt = dev->addr_len; in ndisc_ns_create()
640 dev->dev_addr, in ndisc_ns_create()
679 int send_sllao = dev->addr_len; in ndisc_send_rs()
695 if (ifp->flags & IFA_F_OPTIMISTIC) { in ndisc_send_rs()
720 dev->dev_addr, in ndisc_send_rs()
743 struct net_device *dev = neigh->dev; in ndisc_solicit()
744 struct in6_addr *target = (struct in6_addr *)&neigh->primary_key; in ndisc_solicit()
745 int probes = atomic_read(&neigh->probes); in ndisc_solicit()
747 if (skb && ipv6_chk_addr_and_flags(dev_net(dev), &ipv6_hdr(skb)->saddr, in ndisc_solicit()
750 saddr = &ipv6_hdr(skb)->saddr; in ndisc_solicit()
751 probes -= NEIGH_VAR(neigh->parms, UCAST_PROBES); in ndisc_solicit()
753 if (!(READ_ONCE(neigh->nud_state) & NUD_VALID)) { in ndisc_solicit()
759 } else if ((probes -= NEIGH_VAR(neigh->parms, APP_PROBES)) < 0) { in ndisc_solicit()
771 int ret = -1; in pndisc_is_router()
776 ret = !!(n->flags & NTF_ROUTER); in pndisc_is_router()
794 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr; in ndisc_recv_ns()
795 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr; in ndisc_recv_ns()
797 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) + in ndisc_recv_ns()
800 struct net_device *dev = skb->dev; in ndisc_recv_ns()
805 int is_router = -1; in ndisc_recv_ns()
810 if (skb->len < sizeof(struct nd_msg)) in ndisc_recv_ns()
813 if (ipv6_addr_is_multicast(&msg->target)) { in ndisc_recv_ns()
827 if (!ndisc_parse_options(dev, msg->opt, ndoptlen, &ndopts)) in ndisc_recv_ns()
834 "NS: invalid link-layer address length\n"); in ndisc_recv_ns()
840 * there MUST NOT be source link-layer address option in ndisc_recv_ns()
845 "NS: bad DAD packet (link-layer address option)\n"); in ndisc_recv_ns()
849 if (ndopts.nd_opts_nonce && ndopts.nd_opts_nonce->nd_opt_len == 1) in ndisc_recv_ns()
854 ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1); in ndisc_recv_ns()
857 if (ifp->flags & (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)) { in ndisc_recv_ns()
859 if (nonce != 0 && ifp->dad_nonce == nonce) { in ndisc_recv_ns()
864 ifp->idev->dev->name, in ndisc_recv_ns()
865 &ifp->addr, np); in ndisc_recv_ns()
882 if (!(ifp->flags & IFA_F_OPTIMISTIC)) in ndisc_recv_ns()
887 idev = ifp->idev; in ndisc_recv_ns()
897 ifp = ipv6_get_ifaddr(net, &msg->target, mdev, 1); in ndisc_recv_ns()
909 if (ipv6_chk_acast_addr(net, dev, &msg->target) || in ndisc_recv_ns()
910 (READ_ONCE(idev->cnf.forwarding) && in ndisc_recv_ns()
911 (READ_ONCE(net->ipv6.devconf_all->proxy_ndp) || in ndisc_recv_ns()
912 READ_ONCE(idev->cnf.proxy_ndp)) && in ndisc_recv_ns()
913 (is_router = pndisc_is_router(&msg->target, dev)) >= 0)) { in ndisc_recv_ns()
914 if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) && in ndisc_recv_ns()
915 skb->pkt_type != PACKET_HOST && in ndisc_recv_ns()
917 NEIGH_VAR(idev->nd_parms, PROXY_DELAY) != 0) { in ndisc_recv_ns()
923 * (RFC2461) -- yoshfuji in ndisc_recv_ns()
927 pneigh_enqueue(&nd_tbl, idev->nd_parms, n); in ndisc_recv_ns()
937 is_router = READ_ONCE(idev->cnf.forwarding); in ndisc_recv_ns()
940 ndisc_send_na(dev, &in6addr_linklocal_allnodes, &msg->target, in ndisc_recv_ns()
955 !inc || lladdr || !dev->addr_len); in ndisc_recv_ns()
961 if (neigh || !dev->header_ops) { in ndisc_recv_ns()
962 ndisc_send_na(dev, saddr, &msg->target, !!is_router, in ndisc_recv_ns()
981 switch (READ_ONCE(idev->cnf.accept_untracked_na)) { in accept_untracked_na()
999 struct in6_addr *saddr = &ipv6_hdr(skb)->saddr; in ndisc_recv_na()
1000 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr; in ndisc_recv_na()
1002 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) + in ndisc_recv_na()
1005 struct net_device *dev = skb->dev; in ndisc_recv_na()
1012 if (skb->len < sizeof(struct nd_msg)) in ndisc_recv_na()
1015 if (ipv6_addr_is_multicast(&msg->target)) { in ndisc_recv_na()
1021 msg->icmph.icmp6_solicited) { in ndisc_recv_na()
1031 if (!msg->icmph.icmp6_solicited && idev && in ndisc_recv_na()
1032 READ_ONCE(idev->cnf.drop_unsolicited_na)) in ndisc_recv_na()
1035 if (!ndisc_parse_options(dev, msg->opt, ndoptlen, &ndopts)) in ndisc_recv_na()
1042 "NA: invalid link-layer address length\n"); in ndisc_recv_na()
1046 ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1); in ndisc_recv_na()
1048 if (skb->pkt_type != PACKET_LOOPBACK in ndisc_recv_na()
1049 && (ifp->flags & IFA_F_TENTATIVE)) { in ndisc_recv_na()
1056 an smart proxy agent tries to help us :-) in ndisc_recv_na()
1059 received from loopback - it is just our own in ndisc_recv_na()
1062 if (skb->pkt_type != PACKET_LOOPBACK) in ndisc_recv_na()
1065 eth_hdr(skb)->h_source, &ifp->addr, ifp->idev->dev->name); in ndisc_recv_na()
1070 neigh = neigh_lookup(&nd_tbl, &msg->target, dev); in ndisc_recv_na()
1078 * ------- ------ ------ --------- ---------------------- in ndisc_recv_na()
1085 * Note that we don't do a (daddr == all-routers-mcast) check. in ndisc_recv_na()
1087 new_state = msg->icmph.icmp6_solicited ? NUD_REACHABLE : NUD_STALE; in ndisc_recv_na()
1088 if (!neigh && lladdr && idev && READ_ONCE(idev->cnf.forwarding)) { in ndisc_recv_na()
1090 neigh = neigh_create(&nd_tbl, &msg->target, dev); in ndisc_recv_na()
1096 u8 old_flags = neigh->flags; in ndisc_recv_na()
1099 if (READ_ONCE(neigh->nud_state) & NUD_FAILED) in ndisc_recv_na()
1107 if (lladdr && !memcmp(lladdr, dev->dev_addr, dev->addr_len) && in ndisc_recv_na()
1108 READ_ONCE(net->ipv6.devconf_all->forwarding) && in ndisc_recv_na()
1109 READ_ONCE(net->ipv6.devconf_all->proxy_ndp) && in ndisc_recv_na()
1110 pneigh_lookup(&nd_tbl, net, &msg->target, dev, 0)) { in ndisc_recv_na()
1111 /* XXX: idev->cnf.proxy_ndp */ in ndisc_recv_na()
1118 (msg->icmph.icmp6_override ? NEIGH_UPDATE_F_OVERRIDE : 0)| in ndisc_recv_na()
1120 (msg->icmph.icmp6_router ? NEIGH_UPDATE_F_ISROUTER : 0), in ndisc_recv_na()
1123 if ((old_flags & ~neigh->flags) & NTF_ROUTER) { in ndisc_recv_na()
1139 unsigned long ndoptlen = skb->len - sizeof(*rs_msg); in ndisc_recv_rs()
1142 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr; in ndisc_recv_rs()
1147 if (skb->len < sizeof(*rs_msg)) in ndisc_recv_rs()
1150 idev = __in6_dev_get(skb->dev); in ndisc_recv_rs()
1157 if (!READ_ONCE(idev->cnf.forwarding)) in ndisc_recv_rs()
1168 if (!ndisc_parse_options(skb->dev, rs_msg->opt, ndoptlen, &ndopts)) in ndisc_recv_rs()
1173 skb->dev); in ndisc_recv_rs()
1178 neigh = __neigh_lookup(&nd_tbl, saddr, skb->dev, 1); in ndisc_recv_rs()
1180 ndisc_update(skb->dev, neigh, lladdr, NUD_STALE, in ndisc_recv_rs()
1198 struct net *net = dev_net(ra->dev); in ndisc_ra_useropt()
1201 + (opt->nd_opt_len << 3)); in ndisc_ra_useropt()
1206 err = -ENOBUFS; in ndisc_ra_useropt()
1216 ndmsg->nduseropt_family = AF_INET6; in ndisc_ra_useropt()
1217 ndmsg->nduseropt_ifindex = ra->dev->ifindex; in ndisc_ra_useropt()
1218 ndmsg->nduseropt_icmp_type = icmp6h->icmp6_type; in ndisc_ra_useropt()
1219 ndmsg->nduseropt_icmp_code = icmp6h->icmp6_code; in ndisc_ra_useropt()
1220 ndmsg->nduseropt_opts_len = opt->nd_opt_len << 3; in ndisc_ra_useropt()
1222 memcpy(ndmsg + 1, opt, opt->nd_opt_len << 3); in ndisc_ra_useropt()
1224 if (nla_put_in6_addr(skb, NDUSEROPT_SRCADDR, &ipv6_hdr(ra)->saddr)) in ndisc_ra_useropt()
1233 err = -EMSGSIZE; in ndisc_ra_useropt()
1257 optlen = (skb_tail_pointer(skb) - skb_transport_header(skb)) - in ndisc_router_discovery()
1262 __func__, skb->dev->name); in ndisc_router_discovery()
1263 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) { in ndisc_router_discovery()
1264 ND_PRINTK(2, warn, "RA: source address is not link-local\n"); in ndisc_router_discovery()
1271 if (skb->ndisc_nodetype == NDISC_NODETYPE_HOST) { in ndisc_router_discovery()
1277 in6_dev = __in6_dev_get(skb->dev); in ndisc_router_discovery()
1280 skb->dev->name); in ndisc_router_discovery()
1284 if (!ndisc_parse_options(skb->dev, opt, optlen, &ndopts)) in ndisc_router_discovery()
1290 __func__, skb->dev->name); in ndisc_router_discovery()
1295 /* skip link-specific parameters from interior routers */ in ndisc_router_discovery()
1296 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) { in ndisc_router_discovery()
1299 __func__, skb->dev->name); in ndisc_router_discovery()
1304 if (in6_dev->if_flags & IF_RS_SENT) { in ndisc_router_discovery()
1309 in6_dev->if_flags |= IF_RA_RCVD; in ndisc_router_discovery()
1314 * received RA message (RFC 2462) -- yoshfuji in ndisc_router_discovery()
1316 old_if_flags = in6_dev->if_flags; in ndisc_router_discovery()
1317 in6_dev->if_flags = (in6_dev->if_flags & ~(IF_RA_MANAGED | in ndisc_router_discovery()
1319 (ra_msg->icmph.icmp6_addrconf_managed ? in ndisc_router_discovery()
1321 (ra_msg->icmph.icmp6_addrconf_other ? in ndisc_router_discovery()
1324 if (old_if_flags != in6_dev->if_flags) in ndisc_router_discovery()
1327 if (!READ_ONCE(in6_dev->cnf.accept_ra_defrtr)) { in ndisc_router_discovery()
1330 __func__, skb->dev->name); in ndisc_router_discovery()
1334 lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime); in ndisc_router_discovery()
1336 lifetime < READ_ONCE(in6_dev->cnf.accept_ra_min_lft)) { in ndisc_router_discovery()
1339 lifetime, skb->dev->name); in ndisc_router_discovery()
1343 /* Do not accept RA with source-addr found on local machine unless in ndisc_router_discovery()
1346 net = dev_net(in6_dev->dev); in ndisc_router_discovery()
1347 if (!READ_ONCE(in6_dev->cnf.accept_ra_from_local) && in ndisc_router_discovery()
1348 ipv6_chk_addr(net, &ipv6_hdr(skb)->saddr, in6_dev->dev, 0)) { in ndisc_router_discovery()
1351 skb->dev->name); in ndisc_router_discovery()
1356 pref = ra_msg->icmph.icmp6_router_pref; in ndisc_router_discovery()
1359 !READ_ONCE(in6_dev->cnf.accept_ra_rtr_pref)) in ndisc_router_discovery()
1363 rt = rt6_get_dflt_router(net, &ipv6_hdr(skb)->saddr, skb->dev); in ndisc_router_discovery()
1365 neigh = ip6_neigh_lookup(&rt->fib6_nh->fib_nh_gw6, in ndisc_router_discovery()
1366 rt->fib6_nh->fib_nh_dev, NULL, in ndisc_router_discovery()
1367 &ipv6_hdr(skb)->saddr); in ndisc_router_discovery()
1377 defrtr_usr_metric = in6_dev->cnf.ra_defrtr_metric; in ndisc_router_discovery()
1379 if (rt && (lifetime == 0 || rt->fib6_metric != defrtr_usr_metric)) { in ndisc_router_discovery()
1385 rt, lifetime, defrtr_usr_metric, skb->dev->name); in ndisc_router_discovery()
1392 rt = rt6_add_dflt_router(net, &ipv6_hdr(skb)->saddr, in ndisc_router_discovery()
1393 skb->dev, pref, defrtr_usr_metric, in ndisc_router_discovery()
1402 neigh = ip6_neigh_lookup(&rt->fib6_nh->fib_nh_gw6, in ndisc_router_discovery()
1403 rt->fib6_nh->fib_nh_dev, NULL, in ndisc_router_discovery()
1404 &ipv6_hdr(skb)->saddr); in ndisc_router_discovery()
1412 neigh->flags |= NTF_ROUTER; in ndisc_router_discovery()
1413 } else if (rt && IPV6_EXTRACT_PREF(rt->fib6_flags) != pref) { in ndisc_router_discovery()
1417 rt->fib6_flags = (rt->fib6_flags & ~RTF_PREF_MASK) | RTF_PREF(pref); in ndisc_router_discovery()
1422 table = rt->fib6_table; in ndisc_router_discovery()
1423 spin_lock_bh(&table->tb6_lock); in ndisc_router_discovery()
1428 spin_unlock_bh(&table->tb6_lock); in ndisc_router_discovery()
1430 if (READ_ONCE(in6_dev->cnf.accept_ra_min_hop_limit) < 256 && in ndisc_router_discovery()
1431 ra_msg->icmph.icmp6_hop_limit) { in ndisc_router_discovery()
1432 if (READ_ONCE(in6_dev->cnf.accept_ra_min_hop_limit) <= in ndisc_router_discovery()
1433 ra_msg->icmph.icmp6_hop_limit) { in ndisc_router_discovery()
1434 WRITE_ONCE(in6_dev->cnf.hop_limit, in ndisc_router_discovery()
1435 ra_msg->icmph.icmp6_hop_limit); in ndisc_router_discovery()
1437 ra_msg->icmph.icmp6_hop_limit); in ndisc_router_discovery()
1449 if (in6_dev->nd_parms) { in ndisc_router_discovery()
1450 unsigned long rtime = ntohl(ra_msg->retrans_timer); in ndisc_router_discovery()
1456 NEIGH_VAR_SET(in6_dev->nd_parms, RETRANS_TIME, rtime); in ndisc_router_discovery()
1457 in6_dev->tstamp = jiffies; in ndisc_router_discovery()
1461 rtime = ntohl(ra_msg->reachable_time); in ndisc_router_discovery()
1468 if (rtime != NEIGH_VAR(in6_dev->nd_parms, BASE_REACHABLE_TIME)) { in ndisc_router_discovery()
1469 NEIGH_VAR_SET(in6_dev->nd_parms, in ndisc_router_discovery()
1471 NEIGH_VAR_SET(in6_dev->nd_parms, in ndisc_router_discovery()
1473 in6_dev->nd_parms->reachable_time = neigh_rand_reach_time(rtime); in ndisc_router_discovery()
1474 in6_dev->tstamp = jiffies; in ndisc_router_discovery()
1487 neigh = __neigh_lookup(&nd_tbl, &ipv6_hdr(skb)->saddr, in ndisc_router_discovery()
1488 skb->dev, 1); in ndisc_router_discovery()
1493 skb->dev); in ndisc_router_discovery()
1496 "RA: invalid link-layer address length\n"); in ndisc_router_discovery()
1500 ndisc_update(skb->dev, neigh, lladdr, NUD_STALE, in ndisc_router_discovery()
1512 __func__, skb->dev->name); in ndisc_router_discovery()
1517 if (!READ_ONCE(in6_dev->cnf.accept_ra_from_local) && in ndisc_router_discovery()
1518 ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr, in ndisc_router_discovery()
1519 in6_dev->dev, 0)) { in ndisc_router_discovery()
1522 skb->dev->name); in ndisc_router_discovery()
1526 if (READ_ONCE(in6_dev->cnf.accept_ra_rtr_pref) && ndopts.nd_opts_ri) { in ndisc_router_discovery()
1531 struct route_info *ri = (struct route_info *)p; in ndisc_router_discovery() local
1533 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT && in ndisc_router_discovery()
1534 ri->prefix_len == 0) in ndisc_router_discovery()
1537 if (ri->prefix_len == 0 && in ndisc_router_discovery()
1538 !READ_ONCE(in6_dev->cnf.accept_ra_defrtr)) in ndisc_router_discovery()
1540 if (ri->lifetime != 0 && in ndisc_router_discovery()
1541 ntohl(ri->lifetime) < READ_ONCE(in6_dev->cnf.accept_ra_min_lft)) in ndisc_router_discovery()
1543 if (ri->prefix_len < READ_ONCE(in6_dev->cnf.accept_ra_rt_info_min_plen)) in ndisc_router_discovery()
1545 if (ri->prefix_len > READ_ONCE(in6_dev->cnf.accept_ra_rt_info_max_plen)) in ndisc_router_discovery()
1547 rt6_route_rcv(skb->dev, (u8 *)p, (p->nd_opt_len) << 3, in ndisc_router_discovery()
1548 &ipv6_hdr(skb)->saddr); in ndisc_router_discovery()
1556 /* skip link-specific ndopts from interior routers */ in ndisc_router_discovery()
1557 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) { in ndisc_router_discovery()
1560 __func__, skb->dev->name); in ndisc_router_discovery()
1565 if (READ_ONCE(in6_dev->cnf.accept_ra_pinfo) && ndopts.nd_opts_pi) { in ndisc_router_discovery()
1570 addrconf_prefix_rcv(skb->dev, (u8 *)p, in ndisc_router_discovery()
1571 (p->nd_opt_len) << 3, in ndisc_router_discovery()
1576 if (ndopts.nd_opts_mtu && READ_ONCE(in6_dev->cnf.accept_ra_mtu)) { in ndisc_router_discovery()
1583 if (in6_dev->ra_mtu != mtu) { in ndisc_router_discovery()
1584 in6_dev->ra_mtu = mtu; in ndisc_router_discovery()
1588 if (mtu < IPV6_MIN_MTU || mtu > skb->dev->mtu) { in ndisc_router_discovery()
1590 } else if (READ_ONCE(in6_dev->cnf.mtu6) != mtu) { in ndisc_router_discovery()
1591 WRITE_ONCE(in6_dev->cnf.mtu6, mtu); in ndisc_router_discovery()
1593 rt6_mtu_change(skb->dev, mtu); in ndisc_router_discovery()
1601 p = ndisc_next_useropt(skb->dev, p, in ndisc_router_discovery()
1626 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) + in ndisc_redirect_rcv()
1633 switch (skb->ndisc_nodetype) { in ndisc_redirect_rcv()
1642 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) { in ndisc_redirect_rcv()
1644 "Redirect: source address is not link-local\n"); in ndisc_redirect_rcv()
1648 if (!ndisc_parse_options(skb->dev, msg->opt, ndoptlen, &ndopts)) in ndisc_redirect_rcv()
1652 ip6_redirect_no_header(skb, dev_net(skb->dev), in ndisc_redirect_rcv()
1653 skb->dev->ifindex); in ndisc_redirect_rcv()
1659 if (!pskb_pull(skb, hdr - skb_transport_header(skb))) in ndisc_redirect_rcv()
1677 rd_len - 8); in ndisc_fill_redirect_hdr_option()
1682 struct net_device *dev = skb->dev; in ndisc_send_redirect()
1684 struct sock *sk = net->ipv6.ndisc_sk; in ndisc_send_redirect()
1698 if (netif_is_l3_master(skb->dev)) { in ndisc_send_redirect()
1699 dev = dev_get_by_index_rcu(dev_net(skb->dev), IPCB(skb)->iif); in ndisc_send_redirect()
1705 ND_PRINTK(2, warn, "Redirect: no link-local address on %s\n", in ndisc_send_redirect()
1706 dev->name); in ndisc_send_redirect()
1710 if (!ipv6_addr_equal(&ipv6_hdr(skb)->daddr, target) && in ndisc_send_redirect()
1713 "Redirect: target address is not link-local unicast\n"); in ndisc_send_redirect()
1718 &saddr_buf, &ipv6_hdr(skb)->saddr, dev->ifindex); in ndisc_send_redirect()
1721 if (dst->error) { in ndisc_send_redirect()
1731 if (rt->rt6i_flags & RTF_GATEWAY) { in ndisc_send_redirect()
1738 peer = inet_getpeer_v6(net->ipv6.peers, &ipv6_hdr(skb)->saddr); in ndisc_send_redirect()
1745 if (dev->addr_len) { in ndisc_send_redirect()
1753 read_lock_bh(&neigh->lock); in ndisc_send_redirect()
1754 if (neigh->nud_state & NUD_VALID) { in ndisc_send_redirect()
1755 memcpy(ha_buf, neigh->ha, dev->addr_len); in ndisc_send_redirect()
1756 read_unlock_bh(&neigh->lock); in ndisc_send_redirect()
1762 read_unlock_bh(&neigh->lock); in ndisc_send_redirect()
1768 IPV6_MIN_MTU - sizeof(struct ipv6hdr) - sizeof(*msg) - optlen, in ndisc_send_redirect()
1769 skb->len + 8); in ndisc_send_redirect()
1783 .dest = ipv6_hdr(skb)->daddr, in ndisc_send_redirect()
1801 ndisc_send_skb(buff, &ipv6_hdr(skb)->saddr, &saddr_buf); in ndisc_send_redirect()
1822 struct inet6_dev *idev = __in6_dev_get(skb->dev); in ndisc_suppress_frag_ndisc()
1826 if (IP6CB(skb)->flags & IP6SKB_FRAGMENTED && in ndisc_suppress_frag_ndisc()
1827 READ_ONCE(idev->cnf.suppress_frag_ndisc)) { in ndisc_suppress_frag_ndisc()
1847 __skb_push(skb, skb->data - skb_transport_header(skb)); in ndisc_rcv()
1849 if (ipv6_hdr(skb)->hop_limit != 255) { in ndisc_rcv()
1850 ND_PRINTK(2, warn, "NDISC: invalid hop-limit: %d\n", in ndisc_rcv()
1851 ipv6_hdr(skb)->hop_limit); in ndisc_rcv()
1855 if (msg->icmph.icmp6_code != 0) { in ndisc_rcv()
1857 msg->icmph.icmp6_code); in ndisc_rcv()
1861 switch (msg->icmph.icmp6_type) { in ndisc_rcv()
1904 if (READ_ONCE(idev->cnf.ndisc_notify) || in ndisc_netdev_event()
1905 READ_ONCE(net->ipv6.devconf_all->ndisc_notify)) in ndisc_netdev_event()
1914 evict_nocarrier = READ_ONCE(idev->cnf.ndisc_evict_nocarrier) && in ndisc_netdev_event()
1915 READ_ONCE(net->ipv6.devconf_all->ndisc_evict_nocarrier); in ndisc_netdev_event()
1920 if (change_info->flags_changed & IFF_NOARP) in ndisc_netdev_event()
1941 .priority = ADDRCONF_NOTIFY_PRIORITY - 5,
1950 if (strcmp(warncomm, current->comm) && warned < 5) { in ndisc_warn_deprecated_sysctl()
1951 strscpy(warncomm, current->comm); in ndisc_warn_deprecated_sysctl()
1952 …pr_warn("process `%s' is using deprecated sysctl (%s) net.ipv6.neigh.%s.%s - use net.ipv6.neigh.%s… in ndisc_warn_deprecated_sysctl()
1954 dev_name, ctl->procname, in ndisc_warn_deprecated_sysctl()
1955 dev_name, ctl->procname); in ndisc_warn_deprecated_sysctl()
1963 struct net_device *dev = ctl->extra1; in ndisc_ifinfo_sysctl_change()
1967 if ((strcmp(ctl->procname, "retrans_time") == 0) || in ndisc_ifinfo_sysctl_change()
1968 (strcmp(ctl->procname, "base_reachable_time") == 0)) in ndisc_ifinfo_sysctl_change()
1969 ndisc_warn_deprecated_sysctl(ctl, "syscall", dev ? dev->name : "default"); in ndisc_ifinfo_sysctl_change()
1971 if (strcmp(ctl->procname, "retrans_time") == 0) in ndisc_ifinfo_sysctl_change()
1974 else if (strcmp(ctl->procname, "base_reachable_time") == 0) in ndisc_ifinfo_sysctl_change()
1978 else if ((strcmp(ctl->procname, "retrans_time_ms") == 0) || in ndisc_ifinfo_sysctl_change()
1979 (strcmp(ctl->procname, "base_reachable_time_ms") == 0)) in ndisc_ifinfo_sysctl_change()
1983 ret = -1; in ndisc_ifinfo_sysctl_change()
1986 if (ctl->data == &NEIGH_VAR(idev->nd_parms, BASE_REACHABLE_TIME)) in ndisc_ifinfo_sysctl_change()
1987 idev->nd_parms->reachable_time = in ndisc_ifinfo_sysctl_change()
1988 neigh_rand_reach_time(NEIGH_VAR(idev->nd_parms, BASE_REACHABLE_TIME)); in ndisc_ifinfo_sysctl_change()
1989 WRITE_ONCE(idev->tstamp, jiffies); in ndisc_ifinfo_sysctl_change()
2014 net->ipv6.ndisc_sk = sk; in ndisc_net_init()
2017 np->hop_limit = 255; in ndisc_net_init()
2026 inet_ctl_sock_destroy(net->ipv6.ndisc_sk); in ndisc_net_exit()