Lines Matching +full:ri +full:- +full:override

1 // SPDX-License-Identifier: GPL-2.0-or-later
156 space -= pad; in __ndisc_fill_addr_option()
161 space -= data_len; in __ndisc_fill_addr_option()
170 __ndisc_fill_addr_option(skb, type, data, skb->dev->addr_len, in ndisc_fill_addr_option()
171 ndisc_addr_option_pad(skb->dev->type)); in ndisc_fill_addr_option()
172 ndisc_ops_fill_addr_option(skb->dev, skb, icmp6_type); in ndisc_fill_addr_option()
180 ndisc_ops_fill_redirect_addr_option(skb->dev, skb, ops_data); in ndisc_fill_redirect_addr_option()
189 type = cur->nd_opt_type; in ndisc_next_option()
191 cur = ((void *)cur) + (cur->nd_opt_len << 3); in ndisc_next_option()
192 } while (cur < end && cur->nd_opt_type != type); in ndisc_next_option()
193 return cur <= end && cur->nd_opt_type == type ? cur : NULL; in ndisc_next_option()
199 return opt->nd_opt_type == ND_OPT_RDNSS || in ndisc_is_useropt()
200 opt->nd_opt_type == ND_OPT_DNSSL || in ndisc_is_useropt()
201 opt->nd_opt_type == ND_OPT_CAPTIVE_PORTAL || in ndisc_is_useropt()
202 opt->nd_opt_type == ND_OPT_PREF64 || in ndisc_is_useropt()
203 ndisc_ops_is_useropt(dev, opt->nd_opt_type); in ndisc_is_useropt()
213 cur = ((void *)cur) + (cur->nd_opt_len << 3); in ndisc_next_useropt()
231 l = nd_opt->nd_opt_len << 3; in ndisc_parse_options()
236 switch (nd_opt->nd_opt_type) { in ndisc_parse_options()
242 if (ndopts->nd_opt_array[nd_opt->nd_opt_type]) { in ndisc_parse_options()
245 __func__, nd_opt->nd_opt_type); in ndisc_parse_options()
247 ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt; in ndisc_parse_options()
251 ndopts->nd_opts_pi_end = nd_opt; in ndisc_parse_options()
252 if (!ndopts->nd_opt_array[nd_opt->nd_opt_type]) in ndisc_parse_options()
253 ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt; in ndisc_parse_options()
257 ndopts->nd_opts_ri_end = nd_opt; in ndisc_parse_options()
258 if (!ndopts->nd_opts_ri) in ndisc_parse_options()
259 ndopts->nd_opts_ri = nd_opt; in ndisc_parse_options()
264 ndopts->nd_useropts_end = nd_opt; in ndisc_parse_options()
265 if (!ndopts->nd_useropts) in ndisc_parse_options()
266 ndopts->nd_useropts = nd_opt; in ndisc_parse_options()
276 nd_opt->nd_opt_type, in ndisc_parse_options()
277 nd_opt->nd_opt_len); in ndisc_parse_options()
281 opt_len -= l; in ndisc_parse_options()
289 switch (dev->type) { in ndisc_mc_map()
291 case ARPHRD_IEEE802: /* Not sure. Check it later. --ANK */ in ndisc_mc_map()
299 ipv6_ib_mc_map(addr, dev->broadcast, buf); in ndisc_mc_map()
302 return ipv6_ipgre_mc_map(addr, dev->broadcast, buf); in ndisc_mc_map()
305 memcpy(buf, dev->broadcast, dev->addr_len); in ndisc_mc_map()
309 return -EINVAL; in ndisc_mc_map()
327 struct in6_addr *addr = (struct in6_addr *)&neigh->primary_key; in ndisc_constructor()
328 struct net_device *dev = neigh->dev; in ndisc_constructor()
335 return -EINVAL; in ndisc_constructor()
338 parms = in6_dev->nd_parms; in ndisc_constructor()
339 __neigh_parms_put(neigh->parms); in ndisc_constructor()
340 neigh->parms = neigh_parms_clone(parms); in ndisc_constructor()
342 neigh->type = is_multicast ? RTN_MULTICAST : RTN_UNICAST; in ndisc_constructor()
343 if (!dev->header_ops) { in ndisc_constructor()
344 neigh->nud_state = NUD_NOARP; in ndisc_constructor()
345 neigh->ops = &ndisc_direct_ops; in ndisc_constructor()
346 neigh->output = neigh_direct_output; in ndisc_constructor()
349 neigh->nud_state = NUD_NOARP; in ndisc_constructor()
350 ndisc_mc_map(addr, neigh->ha, dev, 1); in ndisc_constructor()
351 } else if (dev->flags&(IFF_NOARP|IFF_LOOPBACK)) { in ndisc_constructor()
352 neigh->nud_state = NUD_NOARP; in ndisc_constructor()
353 memcpy(neigh->ha, dev->dev_addr, dev->addr_len); in ndisc_constructor()
354 if (dev->flags&IFF_LOOPBACK) in ndisc_constructor()
355 neigh->type = RTN_LOCAL; in ndisc_constructor()
356 } else if (dev->flags&IFF_POINTOPOINT) { in ndisc_constructor()
357 neigh->nud_state = NUD_NOARP; in ndisc_constructor()
358 memcpy(neigh->ha, dev->broadcast, dev->addr_len); in ndisc_constructor()
360 if (dev->header_ops->cache) in ndisc_constructor()
361 neigh->ops = &ndisc_hh_ops; in ndisc_constructor()
363 neigh->ops = &ndisc_generic_ops; in ndisc_constructor()
364 if (neigh->nud_state&NUD_VALID) in ndisc_constructor()
365 neigh->output = neigh->ops->connected_output; in ndisc_constructor()
367 neigh->output = neigh->ops->output; in ndisc_constructor()
375 struct in6_addr *addr = (struct in6_addr *)&n->key; in pndisc_constructor()
377 struct net_device *dev = n->dev; in pndisc_constructor()
380 return -EINVAL; in pndisc_constructor()
388 struct in6_addr *addr = (struct in6_addr *)&n->key; in pndisc_destructor()
390 struct net_device *dev = n->dev; in pndisc_destructor()
404 if (!idev || idev->cnf.disable_ipv6) { in ndisc_allow_add()
416 int tlen = dev->needed_tailroom; in ndisc_alloc_skb()
417 struct sock *sk = dev_net(dev)->ipv6.ndisc_sk; in ndisc_alloc_skb()
427 skb->protocol = htons(ETH_P_IPV6); in ndisc_alloc_skb()
428 skb->dev = dev; in ndisc_alloc_skb()
451 idev = __in6_dev_get(skb->dev); in ip6_nd_hdr()
452 tclass = idev ? idev->cnf.ndisc_tclass : 0; in ip6_nd_hdr()
461 hdr->payload_len = htons(len); in ip6_nd_hdr()
462 hdr->nexthdr = IPPROTO_ICMPV6; in ip6_nd_hdr()
463 hdr->hop_limit = hop_limit; in ip6_nd_hdr()
465 hdr->saddr = *saddr; in ip6_nd_hdr()
466 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()
521 bool router, bool solicited, bool override, bool inc_opt) in ndisc_send_na() argument
534 if (ifp->flags & IFA_F_OPTIMISTIC) in ndisc_send_na()
535 override = false; in ndisc_send_na()
536 inc_opt |= ifp->idev->cnf.force_tllao; in ndisc_send_na()
540 inet6_sk(dev_net(dev)->ipv6.ndisc_sk)->srcprefs, in ndisc_send_na()
546 if (!dev->addr_len) in ndisc_send_na()
562 .icmp6_override = override, in ndisc_send_na()
569 dev->dev_addr, in ndisc_send_na()
584 read_lock_bh(&idev->lock); in ndisc_send_unsol_na()
585 list_for_each_entry(ifa, &idev->addr_list, if_list) { in ndisc_send_unsol_na()
587 if (ifa->flags & IFA_F_TENTATIVE && in ndisc_send_unsol_na()
588 !(ifa->flags & IFA_F_OPTIMISTIC)) in ndisc_send_unsol_na()
591 ndisc_send_na(dev, &in6addr_linklocal_allnodes, &ifa->addr, in ndisc_send_unsol_na()
592 /*router=*/ !!idev->cnf.forwarding, in ndisc_send_unsol_na()
593 /*solicited=*/ false, /*override=*/ true, in ndisc_send_unsol_na()
596 read_unlock_bh(&idev->lock); in ndisc_send_unsol_na()
607 int inc_opt = dev->addr_len; in ndisc_send_ns()
640 dev->dev_addr, in ndisc_send_ns()
658 int send_sllao = dev->addr_len; in ndisc_send_rs()
674 if (ifp->flags & IFA_F_OPTIMISTIC) { in ndisc_send_rs()
699 dev->dev_addr, in ndisc_send_rs()
722 struct net_device *dev = neigh->dev; in ndisc_solicit()
723 struct in6_addr *target = (struct in6_addr *)&neigh->primary_key; in ndisc_solicit()
724 int probes = atomic_read(&neigh->probes); in ndisc_solicit()
726 if (skb && ipv6_chk_addr_and_flags(dev_net(dev), &ipv6_hdr(skb)->saddr, in ndisc_solicit()
729 saddr = &ipv6_hdr(skb)->saddr; in ndisc_solicit()
730 probes -= NEIGH_VAR(neigh->parms, UCAST_PROBES); in ndisc_solicit()
732 if (!(neigh->nud_state & NUD_VALID)) { in ndisc_solicit()
738 } else if ((probes -= NEIGH_VAR(neigh->parms, APP_PROBES)) < 0) { in ndisc_solicit()
750 int ret = -1; in pndisc_is_router()
755 ret = !!(n->flags & NTF_ROUTER); in pndisc_is_router()
773 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr; in ndisc_recv_ns()
774 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr; in ndisc_recv_ns()
776 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) + in ndisc_recv_ns()
779 struct net_device *dev = skb->dev; in ndisc_recv_ns()
785 int is_router = -1; in ndisc_recv_ns()
788 if (skb->len < sizeof(struct nd_msg)) { in ndisc_recv_ns()
793 if (ipv6_addr_is_multicast(&msg->target)) { in ndisc_recv_ns()
807 if (!ndisc_parse_options(dev, msg->opt, ndoptlen, &ndopts)) { in ndisc_recv_ns()
816 "NS: invalid link-layer address length\n"); in ndisc_recv_ns()
822 * there MUST NOT be source link-layer address option in ndisc_recv_ns()
827 "NS: bad DAD packet (link-layer address option)\n"); in ndisc_recv_ns()
831 if (ndopts.nd_opts_nonce && ndopts.nd_opts_nonce->nd_opt_len == 1) in ndisc_recv_ns()
836 ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1); in ndisc_recv_ns()
839 if (ifp->flags & (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)) { in ndisc_recv_ns()
841 if (nonce != 0 && ifp->dad_nonce == nonce) { in ndisc_recv_ns()
846 ifp->idev->dev->name, in ndisc_recv_ns()
847 &ifp->addr, np); in ndisc_recv_ns()
864 if (!(ifp->flags & IFA_F_OPTIMISTIC)) in ndisc_recv_ns()
869 idev = ifp->idev; in ndisc_recv_ns()
879 ifp = ipv6_get_ifaddr(net, &msg->target, mdev, 1); in ndisc_recv_ns()
891 if (ipv6_chk_acast_addr(net, dev, &msg->target) || in ndisc_recv_ns()
892 (idev->cnf.forwarding && in ndisc_recv_ns()
893 (net->ipv6.devconf_all->proxy_ndp || idev->cnf.proxy_ndp) && in ndisc_recv_ns()
894 (is_router = pndisc_is_router(&msg->target, dev)) >= 0)) { in ndisc_recv_ns()
895 if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) && in ndisc_recv_ns()
896 skb->pkt_type != PACKET_HOST && in ndisc_recv_ns()
898 NEIGH_VAR(idev->nd_parms, PROXY_DELAY) != 0) { in ndisc_recv_ns()
904 * (RFC2461) -- yoshfuji in ndisc_recv_ns()
908 pneigh_enqueue(&nd_tbl, idev->nd_parms, n); in ndisc_recv_ns()
916 is_router = idev->cnf.forwarding; in ndisc_recv_ns()
919 ndisc_send_na(dev, &in6addr_linklocal_allnodes, &msg->target, in ndisc_recv_ns()
934 !inc || lladdr || !dev->addr_len); in ndisc_recv_ns()
940 if (neigh || !dev->header_ops) { in ndisc_recv_ns()
941 ndisc_send_na(dev, saddr, &msg->target, !!is_router, in ndisc_recv_ns()
957 struct in6_addr *saddr = &ipv6_hdr(skb)->saddr; in ndisc_recv_na()
958 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr; in ndisc_recv_na()
960 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) + in ndisc_recv_na()
963 struct net_device *dev = skb->dev; in ndisc_recv_na()
968 if (skb->len < sizeof(struct nd_msg)) { in ndisc_recv_na()
973 if (ipv6_addr_is_multicast(&msg->target)) { in ndisc_recv_na()
979 msg->icmph.icmp6_solicited) { in ndisc_recv_na()
988 if (!msg->icmph.icmp6_solicited && idev && in ndisc_recv_na()
989 idev->cnf.drop_unsolicited_na) in ndisc_recv_na()
992 if (!ndisc_parse_options(dev, msg->opt, ndoptlen, &ndopts)) { in ndisc_recv_na()
1000 "NA: invalid link-layer address length\n"); in ndisc_recv_na()
1004 ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1); in ndisc_recv_na()
1006 if (skb->pkt_type != PACKET_LOOPBACK in ndisc_recv_na()
1007 && (ifp->flags & IFA_F_TENTATIVE)) { in ndisc_recv_na()
1014 an smart proxy agent tries to help us :-) in ndisc_recv_na()
1017 received from loopback - it is just our own in ndisc_recv_na()
1020 if (skb->pkt_type != PACKET_LOOPBACK) in ndisc_recv_na()
1023 eth_hdr(skb)->h_source, &ifp->addr, ifp->idev->dev->name); in ndisc_recv_na()
1027 neigh = neigh_lookup(&nd_tbl, &msg->target, dev); in ndisc_recv_na()
1030 u8 old_flags = neigh->flags; in ndisc_recv_na()
1033 if (neigh->nud_state & NUD_FAILED) in ndisc_recv_na()
1041 if (lladdr && !memcmp(lladdr, dev->dev_addr, dev->addr_len) && in ndisc_recv_na()
1042 net->ipv6.devconf_all->forwarding && net->ipv6.devconf_all->proxy_ndp && in ndisc_recv_na()
1043 pneigh_lookup(&nd_tbl, net, &msg->target, dev, 0)) { in ndisc_recv_na()
1044 /* XXX: idev->cnf.proxy_ndp */ in ndisc_recv_na()
1049 msg->icmph.icmp6_solicited ? NUD_REACHABLE : NUD_STALE, in ndisc_recv_na()
1051 (msg->icmph.icmp6_override ? NEIGH_UPDATE_F_OVERRIDE : 0)| in ndisc_recv_na()
1053 (msg->icmph.icmp6_router ? NEIGH_UPDATE_F_ISROUTER : 0), in ndisc_recv_na()
1056 if ((old_flags & ~neigh->flags) & NTF_ROUTER) { in ndisc_recv_na()
1071 unsigned long ndoptlen = skb->len - sizeof(*rs_msg); in ndisc_recv_rs()
1074 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr; in ndisc_recv_rs()
1078 if (skb->len < sizeof(*rs_msg)) in ndisc_recv_rs()
1081 idev = __in6_dev_get(skb->dev); in ndisc_recv_rs()
1088 if (!idev->cnf.forwarding) in ndisc_recv_rs()
1099 if (!ndisc_parse_options(skb->dev, rs_msg->opt, ndoptlen, &ndopts)) { in ndisc_recv_rs()
1106 skb->dev); in ndisc_recv_rs()
1111 neigh = __neigh_lookup(&nd_tbl, saddr, skb->dev, 1); in ndisc_recv_rs()
1113 ndisc_update(skb->dev, neigh, lladdr, NUD_STALE, in ndisc_recv_rs()
1130 struct net *net = dev_net(ra->dev); in ndisc_ra_useropt()
1133 + (opt->nd_opt_len << 3)); in ndisc_ra_useropt()
1138 err = -ENOBUFS; in ndisc_ra_useropt()
1148 ndmsg->nduseropt_family = AF_INET6; in ndisc_ra_useropt()
1149 ndmsg->nduseropt_ifindex = ra->dev->ifindex; in ndisc_ra_useropt()
1150 ndmsg->nduseropt_icmp_type = icmp6h->icmp6_type; in ndisc_ra_useropt()
1151 ndmsg->nduseropt_icmp_code = icmp6h->icmp6_code; in ndisc_ra_useropt()
1152 ndmsg->nduseropt_opts_len = opt->nd_opt_len << 3; in ndisc_ra_useropt()
1154 memcpy(ndmsg + 1, opt, opt->nd_opt_len << 3); in ndisc_ra_useropt()
1156 if (nla_put_in6_addr(skb, NDUSEROPT_SRCADDR, &ipv6_hdr(ra)->saddr)) in ndisc_ra_useropt()
1165 err = -EMSGSIZE; in ndisc_ra_useropt()
1186 optlen = (skb_tail_pointer(skb) - skb_transport_header(skb)) - in ndisc_router_discovery()
1191 __func__, skb->dev->name); in ndisc_router_discovery()
1192 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) { in ndisc_router_discovery()
1193 ND_PRINTK(2, warn, "RA: source address is not link-local\n"); in ndisc_router_discovery()
1202 if (skb->ndisc_nodetype == NDISC_NODETYPE_HOST) { in ndisc_router_discovery()
1212 in6_dev = __in6_dev_get(skb->dev); in ndisc_router_discovery()
1215 skb->dev->name); in ndisc_router_discovery()
1219 if (!ndisc_parse_options(skb->dev, opt, optlen, &ndopts)) { in ndisc_router_discovery()
1227 __func__, skb->dev->name); in ndisc_router_discovery()
1232 /* skip link-specific parameters from interior routers */ in ndisc_router_discovery()
1233 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) { in ndisc_router_discovery()
1236 __func__, skb->dev->name); in ndisc_router_discovery()
1241 if (in6_dev->if_flags & IF_RS_SENT) { in ndisc_router_discovery()
1246 in6_dev->if_flags |= IF_RA_RCVD; in ndisc_router_discovery()
1251 * received RA message (RFC 2462) -- yoshfuji in ndisc_router_discovery()
1253 old_if_flags = in6_dev->if_flags; in ndisc_router_discovery()
1254 in6_dev->if_flags = (in6_dev->if_flags & ~(IF_RA_MANAGED | in ndisc_router_discovery()
1256 (ra_msg->icmph.icmp6_addrconf_managed ? in ndisc_router_discovery()
1258 (ra_msg->icmph.icmp6_addrconf_other ? in ndisc_router_discovery()
1261 if (old_if_flags != in6_dev->if_flags) in ndisc_router_discovery()
1264 if (!in6_dev->cnf.accept_ra_defrtr) { in ndisc_router_discovery()
1267 __func__, skb->dev->name); in ndisc_router_discovery()
1271 /* Do not accept RA with source-addr found on local machine unless in ndisc_router_discovery()
1274 net = dev_net(in6_dev->dev); in ndisc_router_discovery()
1275 if (!in6_dev->cnf.accept_ra_from_local && in ndisc_router_discovery()
1276 ipv6_chk_addr(net, &ipv6_hdr(skb)->saddr, in6_dev->dev, 0)) { in ndisc_router_discovery()
1279 skb->dev->name); in ndisc_router_discovery()
1283 lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime); in ndisc_router_discovery()
1286 pref = ra_msg->icmph.icmp6_router_pref; in ndisc_router_discovery()
1289 !in6_dev->cnf.accept_ra_rtr_pref) in ndisc_router_discovery()
1293 rt = rt6_get_dflt_router(net, &ipv6_hdr(skb)->saddr, skb->dev); in ndisc_router_discovery()
1295 neigh = ip6_neigh_lookup(&rt->fib6_nh->fib_nh_gw6, in ndisc_router_discovery()
1296 rt->fib6_nh->fib_nh_dev, NULL, in ndisc_router_discovery()
1297 &ipv6_hdr(skb)->saddr); in ndisc_router_discovery()
1312 rt, lifetime, skb->dev->name); in ndisc_router_discovery()
1316 rt = rt6_add_dflt_router(net, &ipv6_hdr(skb)->saddr, in ndisc_router_discovery()
1317 skb->dev, pref); in ndisc_router_discovery()
1325 neigh = ip6_neigh_lookup(&rt->fib6_nh->fib_nh_gw6, in ndisc_router_discovery()
1326 rt->fib6_nh->fib_nh_dev, NULL, in ndisc_router_discovery()
1327 &ipv6_hdr(skb)->saddr); in ndisc_router_discovery()
1335 neigh->flags |= NTF_ROUTER; in ndisc_router_discovery()
1337 rt->fib6_flags = (rt->fib6_flags & ~RTF_PREF_MASK) | RTF_PREF(pref); in ndisc_router_discovery()
1342 if (in6_dev->cnf.accept_ra_min_hop_limit < 256 && in ndisc_router_discovery()
1343 ra_msg->icmph.icmp6_hop_limit) { in ndisc_router_discovery()
1344 if (in6_dev->cnf.accept_ra_min_hop_limit <= ra_msg->icmph.icmp6_hop_limit) { in ndisc_router_discovery()
1345 in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit; in ndisc_router_discovery()
1347 ra_msg->icmph.icmp6_hop_limit); in ndisc_router_discovery()
1359 if (in6_dev->nd_parms) { in ndisc_router_discovery()
1360 unsigned long rtime = ntohl(ra_msg->retrans_timer); in ndisc_router_discovery()
1366 NEIGH_VAR_SET(in6_dev->nd_parms, RETRANS_TIME, rtime); in ndisc_router_discovery()
1367 in6_dev->tstamp = jiffies; in ndisc_router_discovery()
1371 rtime = ntohl(ra_msg->reachable_time); in ndisc_router_discovery()
1378 if (rtime != NEIGH_VAR(in6_dev->nd_parms, BASE_REACHABLE_TIME)) { in ndisc_router_discovery()
1379 NEIGH_VAR_SET(in6_dev->nd_parms, in ndisc_router_discovery()
1381 NEIGH_VAR_SET(in6_dev->nd_parms, in ndisc_router_discovery()
1383 in6_dev->nd_parms->reachable_time = neigh_rand_reach_time(rtime); in ndisc_router_discovery()
1384 in6_dev->tstamp = jiffies; in ndisc_router_discovery()
1403 neigh = __neigh_lookup(&nd_tbl, &ipv6_hdr(skb)->saddr, in ndisc_router_discovery()
1404 skb->dev, 1); in ndisc_router_discovery()
1409 skb->dev); in ndisc_router_discovery()
1412 "RA: invalid link-layer address length\n"); in ndisc_router_discovery()
1416 ndisc_update(skb->dev, neigh, lladdr, NUD_STALE, in ndisc_router_discovery()
1427 __func__, skb->dev->name); in ndisc_router_discovery()
1432 if (!in6_dev->cnf.accept_ra_from_local && in ndisc_router_discovery()
1433 ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr, in ndisc_router_discovery()
1434 in6_dev->dev, 0)) { in ndisc_router_discovery()
1437 skb->dev->name); in ndisc_router_discovery()
1441 if (in6_dev->cnf.accept_ra_rtr_pref && ndopts.nd_opts_ri) { in ndisc_router_discovery()
1446 struct route_info *ri = (struct route_info *)p; in ndisc_router_discovery() local
1448 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT && in ndisc_router_discovery()
1449 ri->prefix_len == 0) in ndisc_router_discovery()
1452 if (ri->prefix_len == 0 && in ndisc_router_discovery()
1453 !in6_dev->cnf.accept_ra_defrtr) in ndisc_router_discovery()
1455 if (ri->prefix_len < in6_dev->cnf.accept_ra_rt_info_min_plen) in ndisc_router_discovery()
1457 if (ri->prefix_len > in6_dev->cnf.accept_ra_rt_info_max_plen) in ndisc_router_discovery()
1459 rt6_route_rcv(skb->dev, (u8 *)p, (p->nd_opt_len) << 3, in ndisc_router_discovery()
1460 &ipv6_hdr(skb)->saddr); in ndisc_router_discovery()
1468 /* skip link-specific ndopts from interior routers */ in ndisc_router_discovery()
1469 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) { in ndisc_router_discovery()
1472 __func__, skb->dev->name); in ndisc_router_discovery()
1477 if (in6_dev->cnf.accept_ra_pinfo && ndopts.nd_opts_pi) { in ndisc_router_discovery()
1482 addrconf_prefix_rcv(skb->dev, (u8 *)p, in ndisc_router_discovery()
1483 (p->nd_opt_len) << 3, in ndisc_router_discovery()
1488 if (ndopts.nd_opts_mtu && in6_dev->cnf.accept_ra_mtu) { in ndisc_router_discovery()
1495 if (mtu < IPV6_MIN_MTU || mtu > skb->dev->mtu) { in ndisc_router_discovery()
1497 } else if (in6_dev->cnf.mtu6 != mtu) { in ndisc_router_discovery()
1498 in6_dev->cnf.mtu6 = mtu; in ndisc_router_discovery()
1500 rt6_mtu_change(skb->dev, mtu); in ndisc_router_discovery()
1508 p = ndisc_next_useropt(skb->dev, p, in ndisc_router_discovery()
1528 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) + in ndisc_redirect_rcv()
1532 switch (skb->ndisc_nodetype) { in ndisc_redirect_rcv()
1541 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) { in ndisc_redirect_rcv()
1543 "Redirect: source address is not link-local\n"); in ndisc_redirect_rcv()
1547 if (!ndisc_parse_options(skb->dev, msg->opt, ndoptlen, &ndopts)) in ndisc_redirect_rcv()
1551 ip6_redirect_no_header(skb, dev_net(skb->dev), in ndisc_redirect_rcv()
1552 skb->dev->ifindex); in ndisc_redirect_rcv()
1558 if (!pskb_pull(skb, hdr - skb_transport_header(skb))) in ndisc_redirect_rcv()
1576 rd_len - 8); in ndisc_fill_redirect_hdr_option()
1581 struct net_device *dev = skb->dev; in ndisc_send_redirect()
1583 struct sock *sk = net->ipv6.ndisc_sk; in ndisc_send_redirect()
1597 if (netif_is_l3_master(skb->dev)) { in ndisc_send_redirect()
1598 dev = __dev_get_by_index(dev_net(skb->dev), IPCB(skb)->iif); in ndisc_send_redirect()
1604 ND_PRINTK(2, warn, "Redirect: no link-local address on %s\n", in ndisc_send_redirect()
1605 dev->name); in ndisc_send_redirect()
1609 if (!ipv6_addr_equal(&ipv6_hdr(skb)->daddr, target) && in ndisc_send_redirect()
1612 "Redirect: target address is not link-local unicast\n"); in ndisc_send_redirect()
1617 &saddr_buf, &ipv6_hdr(skb)->saddr, dev->ifindex); in ndisc_send_redirect()
1620 if (dst->error) { in ndisc_send_redirect()
1630 if (rt->rt6i_flags & RTF_GATEWAY) { in ndisc_send_redirect()
1635 peer = inet_getpeer_v6(net->ipv6.peers, &ipv6_hdr(skb)->saddr, 1); in ndisc_send_redirect()
1642 if (dev->addr_len) { in ndisc_send_redirect()
1650 read_lock_bh(&neigh->lock); in ndisc_send_redirect()
1651 if (neigh->nud_state & NUD_VALID) { in ndisc_send_redirect()
1652 memcpy(ha_buf, neigh->ha, dev->addr_len); in ndisc_send_redirect()
1653 read_unlock_bh(&neigh->lock); in ndisc_send_redirect()
1659 read_unlock_bh(&neigh->lock); in ndisc_send_redirect()
1665 IPV6_MIN_MTU - sizeof(struct ipv6hdr) - sizeof(*msg) - optlen, in ndisc_send_redirect()
1666 skb->len + 8); in ndisc_send_redirect()
1680 .dest = ipv6_hdr(skb)->daddr, in ndisc_send_redirect()
1698 ndisc_send_skb(buff, &ipv6_hdr(skb)->saddr, &saddr_buf); in ndisc_send_redirect()
1718 struct inet6_dev *idev = __in6_dev_get(skb->dev); in ndisc_suppress_frag_ndisc()
1722 if (IP6CB(skb)->flags & IP6SKB_FRAGMENTED && in ndisc_suppress_frag_ndisc()
1723 idev->cnf.suppress_frag_ndisc) { in ndisc_suppress_frag_ndisc()
1742 __skb_push(skb, skb->data - skb_transport_header(skb)); in ndisc_rcv()
1744 if (ipv6_hdr(skb)->hop_limit != 255) { in ndisc_rcv()
1745 ND_PRINTK(2, warn, "NDISC: invalid hop-limit: %d\n", in ndisc_rcv()
1746 ipv6_hdr(skb)->hop_limit); in ndisc_rcv()
1750 if (msg->icmph.icmp6_code != 0) { in ndisc_rcv()
1752 msg->icmph.icmp6_code); in ndisc_rcv()
1756 switch (msg->icmph.icmp6_type) { in ndisc_rcv()
1798 if (idev->cnf.ndisc_notify || in ndisc_netdev_event()
1799 net->ipv6.devconf_all->ndisc_notify) in ndisc_netdev_event()
1805 if (change_info->flags_changed & IFF_NOARP) in ndisc_netdev_event()
1826 .priority = ADDRCONF_NOTIFY_PRIORITY - 5,
1835 if (strcmp(warncomm, current->comm) && warned < 5) { in ndisc_warn_deprecated_sysctl()
1836 strcpy(warncomm, current->comm); in ndisc_warn_deprecated_sysctl()
1837 …pr_warn("process `%s' is using deprecated sysctl (%s) net.ipv6.neigh.%s.%s - use net.ipv6.neigh.%s… in ndisc_warn_deprecated_sysctl()
1839 dev_name, ctl->procname, in ndisc_warn_deprecated_sysctl()
1840 dev_name, ctl->procname); in ndisc_warn_deprecated_sysctl()
1848 struct net_device *dev = ctl->extra1; in ndisc_ifinfo_sysctl_change()
1852 if ((strcmp(ctl->procname, "retrans_time") == 0) || in ndisc_ifinfo_sysctl_change()
1853 (strcmp(ctl->procname, "base_reachable_time") == 0)) in ndisc_ifinfo_sysctl_change()
1854 ndisc_warn_deprecated_sysctl(ctl, "syscall", dev ? dev->name : "default"); in ndisc_ifinfo_sysctl_change()
1856 if (strcmp(ctl->procname, "retrans_time") == 0) in ndisc_ifinfo_sysctl_change()
1859 else if (strcmp(ctl->procname, "base_reachable_time") == 0) in ndisc_ifinfo_sysctl_change()
1863 else if ((strcmp(ctl->procname, "retrans_time_ms") == 0) || in ndisc_ifinfo_sysctl_change()
1864 (strcmp(ctl->procname, "base_reachable_time_ms") == 0)) in ndisc_ifinfo_sysctl_change()
1868 ret = -1; in ndisc_ifinfo_sysctl_change()
1871 if (ctl->data == &NEIGH_VAR(idev->nd_parms, BASE_REACHABLE_TIME)) in ndisc_ifinfo_sysctl_change()
1872 idev->nd_parms->reachable_time = in ndisc_ifinfo_sysctl_change()
1873 neigh_rand_reach_time(NEIGH_VAR(idev->nd_parms, BASE_REACHABLE_TIME)); in ndisc_ifinfo_sysctl_change()
1874 idev->tstamp = jiffies; in ndisc_ifinfo_sysctl_change()
1899 net->ipv6.ndisc_sk = sk; in ndisc_net_init()
1902 np->hop_limit = 255; in ndisc_net_init()
1904 np->mc_loop = 0; in ndisc_net_init()
1911 inet_ctl_sock_destroy(net->ipv6.ndisc_sk); in ndisc_net_exit()