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_RDNSS || in ndisc_is_useropt()
201 opt->nd_opt_type == ND_OPT_DNSSL || in ndisc_is_useropt()
202 opt->nd_opt_type == ND_OPT_CAPTIVE_PORTAL || in ndisc_is_useropt()
203 opt->nd_opt_type == ND_OPT_PREF64 || in ndisc_is_useropt()
204 ndisc_ops_is_useropt(dev, opt->nd_opt_type); in ndisc_is_useropt()
214 cur = ((void *)cur) + (cur->nd_opt_len << 3); in ndisc_next_useropt()
232 l = nd_opt->nd_opt_len << 3; in ndisc_parse_options()
237 switch (nd_opt->nd_opt_type) { in ndisc_parse_options()
243 if (ndopts->nd_opt_array[nd_opt->nd_opt_type]) { in ndisc_parse_options()
246 __func__, nd_opt->nd_opt_type); in ndisc_parse_options()
248 ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt; in ndisc_parse_options()
252 ndopts->nd_opts_pi_end = nd_opt; in ndisc_parse_options()
253 if (!ndopts->nd_opt_array[nd_opt->nd_opt_type]) in ndisc_parse_options()
254 ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt; in ndisc_parse_options()
258 ndopts->nd_opts_ri_end = nd_opt; in ndisc_parse_options()
259 if (!ndopts->nd_opts_ri) in ndisc_parse_options()
260 ndopts->nd_opts_ri = nd_opt; in ndisc_parse_options()
265 ndopts->nd_useropts_end = nd_opt; in ndisc_parse_options()
266 if (!ndopts->nd_useropts) in ndisc_parse_options()
267 ndopts->nd_useropts = nd_opt; in ndisc_parse_options()
277 nd_opt->nd_opt_type, in ndisc_parse_options()
278 nd_opt->nd_opt_len); in ndisc_parse_options()
282 opt_len -= l; in ndisc_parse_options()
290 switch (dev->type) { in ndisc_mc_map()
292 case ARPHRD_IEEE802: /* Not sure. Check it later. --ANK */ in ndisc_mc_map()
300 ipv6_ib_mc_map(addr, dev->broadcast, buf); in ndisc_mc_map()
303 return ipv6_ipgre_mc_map(addr, dev->broadcast, buf); in ndisc_mc_map()
306 memcpy(buf, dev->broadcast, dev->addr_len); in ndisc_mc_map()
310 return -EINVAL; in ndisc_mc_map()
328 struct in6_addr *addr = (struct in6_addr *)&neigh->primary_key; in ndisc_constructor()
329 struct net_device *dev = neigh->dev; in ndisc_constructor()
336 return -EINVAL; in ndisc_constructor()
339 parms = in6_dev->nd_parms; in ndisc_constructor()
340 __neigh_parms_put(neigh->parms); in ndisc_constructor()
341 neigh->parms = neigh_parms_clone(parms); in ndisc_constructor()
343 neigh->type = is_multicast ? RTN_MULTICAST : RTN_UNICAST; in ndisc_constructor()
344 if (!dev->header_ops) { in ndisc_constructor()
345 neigh->nud_state = NUD_NOARP; in ndisc_constructor()
346 neigh->ops = &ndisc_direct_ops; in ndisc_constructor()
347 neigh->output = neigh_direct_output; in ndisc_constructor()
350 neigh->nud_state = NUD_NOARP; in ndisc_constructor()
351 ndisc_mc_map(addr, neigh->ha, dev, 1); in ndisc_constructor()
352 } else if (dev->flags&(IFF_NOARP|IFF_LOOPBACK)) { in ndisc_constructor()
353 neigh->nud_state = NUD_NOARP; in ndisc_constructor()
354 memcpy(neigh->ha, dev->dev_addr, dev->addr_len); in ndisc_constructor()
355 if (dev->flags&IFF_LOOPBACK) in ndisc_constructor()
356 neigh->type = RTN_LOCAL; in ndisc_constructor()
357 } else if (dev->flags&IFF_POINTOPOINT) { in ndisc_constructor()
358 neigh->nud_state = NUD_NOARP; in ndisc_constructor()
359 memcpy(neigh->ha, dev->broadcast, dev->addr_len); in ndisc_constructor()
361 if (dev->header_ops->cache) in ndisc_constructor()
362 neigh->ops = &ndisc_hh_ops; in ndisc_constructor()
364 neigh->ops = &ndisc_generic_ops; in ndisc_constructor()
365 if (neigh->nud_state&NUD_VALID) in ndisc_constructor()
366 neigh->output = neigh->ops->connected_output; in ndisc_constructor()
368 neigh->output = neigh->ops->output; in ndisc_constructor()
376 struct in6_addr *addr = (struct in6_addr *)&n->key; in pndisc_constructor()
378 struct net_device *dev = n->dev; in pndisc_constructor()
381 return -EINVAL; in pndisc_constructor()
389 struct in6_addr *addr = (struct in6_addr *)&n->key; in pndisc_destructor()
391 struct net_device *dev = n->dev; in pndisc_destructor()
405 if (!idev || idev->cnf.disable_ipv6) { in ndisc_allow_add()
417 int tlen = dev->needed_tailroom; in ndisc_alloc_skb()
418 struct sock *sk = dev_net(dev)->ipv6.ndisc_sk; in ndisc_alloc_skb()
428 skb->protocol = htons(ETH_P_IPV6); in ndisc_alloc_skb()
429 skb->dev = dev; in ndisc_alloc_skb()
452 idev = __in6_dev_get(skb->dev); in ip6_nd_hdr()
453 tclass = idev ? idev->cnf.ndisc_tclass : 0; in ip6_nd_hdr()
462 hdr->payload_len = htons(len); in ip6_nd_hdr()
463 hdr->nexthdr = IPPROTO_ICMPV6; in ip6_nd_hdr()
464 hdr->hop_limit = hop_limit; in ip6_nd_hdr()
466 hdr->saddr = *saddr; in ip6_nd_hdr()
467 hdr->daddr = *daddr; in ip6_nd_hdr()
474 struct net *net = dev_net(skb->dev); in ndisc_send_skb()
475 struct sock *sk = net->ipv6.ndisc_sk; in ndisc_send_skb()
481 type = icmp6h->icmp6_type; in ndisc_send_skb()
485 int oif = skb->dev->ifindex; in ndisc_send_skb()
488 dst = icmp6_dst_alloc(skb->dev, &fl6); in ndisc_send_skb()
497 icmp6h->icmp6_cksum = csum_ipv6_magic(saddr, daddr, skb->len, in ndisc_send_skb()
500 skb->len, 0)); in ndisc_send_skb()
502 ip6_nd_hdr(skb, saddr, daddr, inet6_sk(sk)->hop_limit, skb->len); in ndisc_send_skb()
505 idev = __in6_dev_get(dst->dev); in ndisc_send_skb()
506 IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len); in ndisc_send_skb()
509 net, sk, skb, NULL, dst->dev, in ndisc_send_skb()
522 bool router, bool solicited, bool override, bool inc_opt) in ndisc_send_na() argument
535 if (ifp->flags & IFA_F_OPTIMISTIC) in ndisc_send_na()
536 override = false; in ndisc_send_na()
537 inc_opt |= ifp->idev->cnf.force_tllao; in ndisc_send_na()
541 inet6_sk(dev_net(dev)->ipv6.ndisc_sk)->srcprefs, in ndisc_send_na()
547 if (!dev->addr_len) in ndisc_send_na()
563 .icmp6_override = override, in ndisc_send_na()
570 dev->dev_addr, in ndisc_send_na()
585 read_lock_bh(&idev->lock); in ndisc_send_unsol_na()
586 list_for_each_entry(ifa, &idev->addr_list, if_list) { in ndisc_send_unsol_na()
588 if (ifa->flags & IFA_F_TENTATIVE && in ndisc_send_unsol_na()
589 !(ifa->flags & IFA_F_OPTIMISTIC)) in ndisc_send_unsol_na()
592 ndisc_send_na(dev, &in6addr_linklocal_allnodes, &ifa->addr, in ndisc_send_unsol_na()
593 /*router=*/ !!idev->cnf.forwarding, in ndisc_send_unsol_na()
594 /*solicited=*/ false, /*override=*/ true, in ndisc_send_unsol_na()
597 read_unlock_bh(&idev->lock); in ndisc_send_unsol_na()
605 int inc_opt = dev->addr_len; in ndisc_ns_create()
635 dev->dev_addr, in ndisc_ns_create()
674 int send_sllao = dev->addr_len; in ndisc_send_rs()
690 if (ifp->flags & IFA_F_OPTIMISTIC) { in ndisc_send_rs()
715 dev->dev_addr, in ndisc_send_rs()
738 struct net_device *dev = neigh->dev; in ndisc_solicit()
739 struct in6_addr *target = (struct in6_addr *)&neigh->primary_key; in ndisc_solicit()
740 int probes = atomic_read(&neigh->probes); in ndisc_solicit()
742 if (skb && ipv6_chk_addr_and_flags(dev_net(dev), &ipv6_hdr(skb)->saddr, in ndisc_solicit()
745 saddr = &ipv6_hdr(skb)->saddr; in ndisc_solicit()
746 probes -= NEIGH_VAR(neigh->parms, UCAST_PROBES); in ndisc_solicit()
748 if (!(neigh->nud_state & NUD_VALID)) { in ndisc_solicit()
754 } else if ((probes -= NEIGH_VAR(neigh->parms, APP_PROBES)) < 0) { in ndisc_solicit()
766 int ret = -1; in pndisc_is_router()
771 ret = !!(n->flags & NTF_ROUTER); in pndisc_is_router()
789 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr; in ndisc_recv_ns()
790 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr; in ndisc_recv_ns()
792 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) + in ndisc_recv_ns()
795 struct net_device *dev = skb->dev; in ndisc_recv_ns()
801 int is_router = -1; in ndisc_recv_ns()
804 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()
832 "NS: invalid link-layer address length\n"); in ndisc_recv_ns()
838 * there MUST NOT be source link-layer address option in ndisc_recv_ns()
843 "NS: bad DAD packet (link-layer address option)\n"); in ndisc_recv_ns()
847 if (ndopts.nd_opts_nonce && ndopts.nd_opts_nonce->nd_opt_len == 1) in ndisc_recv_ns()
852 ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1); in ndisc_recv_ns()
855 if (ifp->flags & (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)) { in ndisc_recv_ns()
857 if (nonce != 0 && ifp->dad_nonce == nonce) { in ndisc_recv_ns()
862 ifp->idev->dev->name, in ndisc_recv_ns()
863 &ifp->addr, np); in ndisc_recv_ns()
880 if (!(ifp->flags & IFA_F_OPTIMISTIC)) in ndisc_recv_ns()
885 idev = ifp->idev; in ndisc_recv_ns()
895 ifp = ipv6_get_ifaddr(net, &msg->target, mdev, 1); in ndisc_recv_ns()
907 if (ipv6_chk_acast_addr(net, dev, &msg->target) || in ndisc_recv_ns()
908 (idev->cnf.forwarding && in ndisc_recv_ns()
909 (net->ipv6.devconf_all->proxy_ndp || idev->cnf.proxy_ndp) && in ndisc_recv_ns()
910 (is_router = pndisc_is_router(&msg->target, dev)) >= 0)) { in ndisc_recv_ns()
911 if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) && in ndisc_recv_ns()
912 skb->pkt_type != PACKET_HOST && in ndisc_recv_ns()
914 NEIGH_VAR(idev->nd_parms, PROXY_DELAY) != 0) { in ndisc_recv_ns()
920 * (RFC2461) -- yoshfuji in ndisc_recv_ns()
924 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()
974 switch (idev->cnf.accept_untracked_na) { in accept_untracked_na()
992 struct in6_addr *saddr = &ipv6_hdr(skb)->saddr; in ndisc_recv_na()
993 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr; in ndisc_recv_na()
995 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) + in ndisc_recv_na()
998 struct net_device *dev = skb->dev; in ndisc_recv_na()
1004 if (skb->len < sizeof(struct nd_msg)) { in ndisc_recv_na()
1009 if (ipv6_addr_is_multicast(&msg->target)) { in ndisc_recv_na()
1015 msg->icmph.icmp6_solicited) { in ndisc_recv_na()
1025 if (!msg->icmph.icmp6_solicited && idev && in ndisc_recv_na()
1026 idev->cnf.drop_unsolicited_na) in ndisc_recv_na()
1029 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 (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()
1132 unsigned long ndoptlen = skb->len - sizeof(*rs_msg); in ndisc_recv_rs()
1135 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr; in ndisc_recv_rs()
1139 if (skb->len < sizeof(*rs_msg)) in ndisc_recv_rs()
1142 idev = __in6_dev_get(skb->dev); in ndisc_recv_rs()
1149 if (!idev->cnf.forwarding) in ndisc_recv_rs()
1160 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()
1191 struct net *net = dev_net(ra->dev); in ndisc_ra_useropt()
1194 + (opt->nd_opt_len << 3)); in ndisc_ra_useropt()
1199 err = -ENOBUFS; in ndisc_ra_useropt()
1209 ndmsg->nduseropt_family = AF_INET6; in ndisc_ra_useropt()
1210 ndmsg->nduseropt_ifindex = ra->dev->ifindex; in ndisc_ra_useropt()
1211 ndmsg->nduseropt_icmp_type = icmp6h->icmp6_type; in ndisc_ra_useropt()
1212 ndmsg->nduseropt_icmp_code = icmp6h->icmp6_code; in ndisc_ra_useropt()
1213 ndmsg->nduseropt_opts_len = opt->nd_opt_len << 3; in ndisc_ra_useropt()
1215 memcpy(ndmsg + 1, opt, opt->nd_opt_len << 3); in ndisc_ra_useropt()
1217 if (nla_put_in6_addr(skb, NDUSEROPT_SRCADDR, &ipv6_hdr(ra)->saddr)) in ndisc_ra_useropt()
1226 err = -EMSGSIZE; in ndisc_ra_useropt()
1248 optlen = (skb_tail_pointer(skb) - skb_transport_header(skb)) - in ndisc_router_discovery()
1253 __func__, skb->dev->name); in ndisc_router_discovery()
1254 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) { in ndisc_router_discovery()
1255 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()
1274 in6_dev = __in6_dev_get(skb->dev); in ndisc_router_discovery()
1277 skb->dev->name); in ndisc_router_discovery()
1281 if (!ndisc_parse_options(skb->dev, opt, optlen, &ndopts)) { in ndisc_router_discovery()
1289 __func__, skb->dev->name); in ndisc_router_discovery()
1294 /* skip link-specific parameters from interior routers */ in ndisc_router_discovery()
1295 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) { in ndisc_router_discovery()
1298 __func__, skb->dev->name); in ndisc_router_discovery()
1303 if (in6_dev->if_flags & IF_RS_SENT) { in ndisc_router_discovery()
1308 in6_dev->if_flags |= IF_RA_RCVD; in ndisc_router_discovery()
1313 * received RA message (RFC 2462) -- yoshfuji in ndisc_router_discovery()
1315 old_if_flags = in6_dev->if_flags; in ndisc_router_discovery()
1316 in6_dev->if_flags = (in6_dev->if_flags & ~(IF_RA_MANAGED | in ndisc_router_discovery()
1318 (ra_msg->icmph.icmp6_addrconf_managed ? in ndisc_router_discovery()
1320 (ra_msg->icmph.icmp6_addrconf_other ? in ndisc_router_discovery()
1323 if (old_if_flags != in6_dev->if_flags) in ndisc_router_discovery()
1326 if (!in6_dev->cnf.accept_ra_defrtr) { in ndisc_router_discovery()
1329 __func__, skb->dev->name); in ndisc_router_discovery()
1333 /* Do not accept RA with source-addr found on local machine unless in ndisc_router_discovery()
1336 net = dev_net(in6_dev->dev); in ndisc_router_discovery()
1337 if (!in6_dev->cnf.accept_ra_from_local && in ndisc_router_discovery()
1338 ipv6_chk_addr(net, &ipv6_hdr(skb)->saddr, in6_dev->dev, 0)) { in ndisc_router_discovery()
1341 skb->dev->name); in ndisc_router_discovery()
1345 lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime); 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()
1493 __func__, skb->dev->name); in ndisc_router_discovery()
1498 if (!in6_dev->cnf.accept_ra_from_local && in ndisc_router_discovery()
1499 ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr, in ndisc_router_discovery()
1500 in6_dev->dev, 0)) { in ndisc_router_discovery()
1503 skb->dev->name); in ndisc_router_discovery()
1507 if (in6_dev->cnf.accept_ra_rtr_pref && ndopts.nd_opts_ri) { in ndisc_router_discovery()
1512 struct route_info *ri = (struct route_info *)p; in ndisc_router_discovery() local
1514 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT && in ndisc_router_discovery()
1515 ri->prefix_len == 0) in ndisc_router_discovery()
1518 if (ri->prefix_len == 0 && in ndisc_router_discovery()
1519 !in6_dev->cnf.accept_ra_defrtr) in ndisc_router_discovery()
1521 if (ri->prefix_len < in6_dev->cnf.accept_ra_rt_info_min_plen) in ndisc_router_discovery()
1523 if (ri->prefix_len > in6_dev->cnf.accept_ra_rt_info_max_plen) in ndisc_router_discovery()
1525 rt6_route_rcv(skb->dev, (u8 *)p, (p->nd_opt_len) << 3, in ndisc_router_discovery()
1526 &ipv6_hdr(skb)->saddr); in ndisc_router_discovery()
1534 /* skip link-specific ndopts from interior routers */ in ndisc_router_discovery()
1535 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) { in ndisc_router_discovery()
1538 __func__, skb->dev->name); in ndisc_router_discovery()
1543 if (in6_dev->cnf.accept_ra_pinfo && ndopts.nd_opts_pi) { in ndisc_router_discovery()
1548 addrconf_prefix_rcv(skb->dev, (u8 *)p, in ndisc_router_discovery()
1549 (p->nd_opt_len) << 3, in ndisc_router_discovery()
1554 if (ndopts.nd_opts_mtu && in6_dev->cnf.accept_ra_mtu) { in ndisc_router_discovery()
1561 if (in6_dev->ra_mtu != mtu) { in ndisc_router_discovery()
1562 in6_dev->ra_mtu = mtu; in ndisc_router_discovery()
1566 if (mtu < IPV6_MIN_MTU || mtu > skb->dev->mtu) { in ndisc_router_discovery()
1568 } else if (in6_dev->cnf.mtu6 != mtu) { in ndisc_router_discovery()
1569 in6_dev->cnf.mtu6 = mtu; in ndisc_router_discovery()
1571 rt6_mtu_change(skb->dev, mtu); in ndisc_router_discovery()
1579 p = ndisc_next_useropt(skb->dev, p, in ndisc_router_discovery()
1605 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) + in ndisc_redirect_rcv()
1609 switch (skb->ndisc_nodetype) { in ndisc_redirect_rcv()
1618 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) { in ndisc_redirect_rcv()
1620 "Redirect: source address is not link-local\n"); in ndisc_redirect_rcv()
1624 if (!ndisc_parse_options(skb->dev, msg->opt, ndoptlen, &ndopts)) in ndisc_redirect_rcv()
1628 ip6_redirect_no_header(skb, dev_net(skb->dev), in ndisc_redirect_rcv()
1629 skb->dev->ifindex); in ndisc_redirect_rcv()
1635 if (!pskb_pull(skb, hdr - skb_transport_header(skb))) in ndisc_redirect_rcv()
1653 rd_len - 8); in ndisc_fill_redirect_hdr_option()
1658 struct net_device *dev = skb->dev; in ndisc_send_redirect()
1660 struct sock *sk = net->ipv6.ndisc_sk; in ndisc_send_redirect()
1674 if (netif_is_l3_master(skb->dev)) { in ndisc_send_redirect()
1675 dev = __dev_get_by_index(dev_net(skb->dev), IPCB(skb)->iif); in ndisc_send_redirect()
1681 ND_PRINTK(2, warn, "Redirect: no link-local address on %s\n", in ndisc_send_redirect()
1682 dev->name); in ndisc_send_redirect()
1686 if (!ipv6_addr_equal(&ipv6_hdr(skb)->daddr, target) && in ndisc_send_redirect()
1689 "Redirect: target address is not link-local unicast\n"); in ndisc_send_redirect()
1694 &saddr_buf, &ipv6_hdr(skb)->saddr, dev->ifindex); in ndisc_send_redirect()
1697 if (dst->error) { in ndisc_send_redirect()
1707 if (rt->rt6i_flags & RTF_GATEWAY) { in ndisc_send_redirect()
1712 peer = inet_getpeer_v6(net->ipv6.peers, &ipv6_hdr(skb)->saddr, 1); in ndisc_send_redirect()
1719 if (dev->addr_len) { in ndisc_send_redirect()
1727 read_lock_bh(&neigh->lock); in ndisc_send_redirect()
1728 if (neigh->nud_state & NUD_VALID) { in ndisc_send_redirect()
1729 memcpy(ha_buf, neigh->ha, dev->addr_len); in ndisc_send_redirect()
1730 read_unlock_bh(&neigh->lock); in ndisc_send_redirect()
1736 read_unlock_bh(&neigh->lock); in ndisc_send_redirect()
1742 IPV6_MIN_MTU - sizeof(struct ipv6hdr) - sizeof(*msg) - optlen, in ndisc_send_redirect()
1743 skb->len + 8); in ndisc_send_redirect()
1757 .dest = ipv6_hdr(skb)->daddr, in ndisc_send_redirect()
1775 ndisc_send_skb(buff, &ipv6_hdr(skb)->saddr, &saddr_buf); in ndisc_send_redirect()
1795 struct inet6_dev *idev = __in6_dev_get(skb->dev); in ndisc_suppress_frag_ndisc()
1799 if (IP6CB(skb)->flags & IP6SKB_FRAGMENTED && in ndisc_suppress_frag_ndisc()
1800 idev->cnf.suppress_frag_ndisc) { in ndisc_suppress_frag_ndisc()
1819 __skb_push(skb, skb->data - skb_transport_header(skb)); in ndisc_rcv()
1821 if (ipv6_hdr(skb)->hop_limit != 255) { in ndisc_rcv()
1822 ND_PRINTK(2, warn, "NDISC: invalid hop-limit: %d\n", in ndisc_rcv()
1823 ipv6_hdr(skb)->hop_limit); in ndisc_rcv()
1827 if (msg->icmph.icmp6_code != 0) { in ndisc_rcv()
1829 msg->icmph.icmp6_code); in ndisc_rcv()
1833 switch (msg->icmph.icmp6_type) { in ndisc_rcv()
1876 if (idev->cnf.ndisc_notify || in ndisc_netdev_event()
1877 net->ipv6.devconf_all->ndisc_notify) in ndisc_netdev_event()
1886 evict_nocarrier = idev->cnf.ndisc_evict_nocarrier && in ndisc_netdev_event()
1887 net->ipv6.devconf_all->ndisc_evict_nocarrier; in ndisc_netdev_event()
1892 if (change_info->flags_changed & IFF_NOARP) in ndisc_netdev_event()
1913 .priority = ADDRCONF_NOTIFY_PRIORITY - 5,
1922 if (strcmp(warncomm, current->comm) && warned < 5) { in ndisc_warn_deprecated_sysctl()
1923 strcpy(warncomm, current->comm); in ndisc_warn_deprecated_sysctl()
1924 …pr_warn("process `%s' is using deprecated sysctl (%s) net.ipv6.neigh.%s.%s - use net.ipv6.neigh.%s… in ndisc_warn_deprecated_sysctl()
1926 dev_name, ctl->procname, in ndisc_warn_deprecated_sysctl()
1927 dev_name, ctl->procname); in ndisc_warn_deprecated_sysctl()
1935 struct net_device *dev = ctl->extra1; in ndisc_ifinfo_sysctl_change()
1939 if ((strcmp(ctl->procname, "retrans_time") == 0) || in ndisc_ifinfo_sysctl_change()
1940 (strcmp(ctl->procname, "base_reachable_time") == 0)) in ndisc_ifinfo_sysctl_change()
1941 ndisc_warn_deprecated_sysctl(ctl, "syscall", dev ? dev->name : "default"); in ndisc_ifinfo_sysctl_change()
1943 if (strcmp(ctl->procname, "retrans_time") == 0) in ndisc_ifinfo_sysctl_change()
1946 else if (strcmp(ctl->procname, "base_reachable_time") == 0) in ndisc_ifinfo_sysctl_change()
1950 else if ((strcmp(ctl->procname, "retrans_time_ms") == 0) || in ndisc_ifinfo_sysctl_change()
1951 (strcmp(ctl->procname, "base_reachable_time_ms") == 0)) in ndisc_ifinfo_sysctl_change()
1955 ret = -1; in ndisc_ifinfo_sysctl_change()
1958 if (ctl->data == &NEIGH_VAR(idev->nd_parms, BASE_REACHABLE_TIME)) in ndisc_ifinfo_sysctl_change()
1959 idev->nd_parms->reachable_time = in ndisc_ifinfo_sysctl_change()
1960 neigh_rand_reach_time(NEIGH_VAR(idev->nd_parms, BASE_REACHABLE_TIME)); in ndisc_ifinfo_sysctl_change()
1961 idev->tstamp = jiffies; in ndisc_ifinfo_sysctl_change()
1986 net->ipv6.ndisc_sk = sk; in ndisc_net_init()
1989 np->hop_limit = 255; in ndisc_net_init()
1991 np->mc_loop = 0; in ndisc_net_init()
1998 inet_ctl_sock_destroy(net->ipv6.ndisc_sk); in ndisc_net_exit()