• Home
  • Raw
  • Download

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_PREFIX_INFO || in ndisc_is_useropt()
200 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()
424 skb->protocol = htons(ETH_P_IPV6); in ndisc_alloc_skb()
425 skb->dev = dev; in ndisc_alloc_skb()
434 skb_set_owner_w(skb, dev_net_rcu(dev)->ipv6.ndisc_sk); in ndisc_alloc_skb()
450 idev = __in6_dev_get(skb->dev); in ip6_nd_hdr()
451 tclass = idev ? idev->cnf.ndisc_tclass : 0; in ip6_nd_hdr()
460 hdr->payload_len = htons(len); in ip6_nd_hdr()
461 hdr->nexthdr = IPPROTO_ICMPV6; in ip6_nd_hdr()
462 hdr->hop_limit = hop_limit; in ip6_nd_hdr()
464 hdr->saddr = *saddr; in ip6_nd_hdr()
465 hdr->daddr = *daddr; in ip6_nd_hdr()
480 type = icmp6h->icmp6_type; in ndisc_send_skb()
484 net = dev_net_rcu(skb->dev); in ndisc_send_skb()
485 sk = net->ipv6.ndisc_sk; in ndisc_send_skb()
488 int oif = skb->dev->ifindex; in ndisc_send_skb()
491 dst = icmp6_dst_alloc(skb->dev, &fl6); in ndisc_send_skb()
501 icmp6h->icmp6_cksum = csum_ipv6_magic(saddr, daddr, skb->len, in ndisc_send_skb()
504 skb->len, 0)); in ndisc_send_skb()
506 ip6_nd_hdr(skb, saddr, daddr, inet6_sk(sk)->hop_limit, skb->len); in ndisc_send_skb()
508 idev = __in6_dev_get(dst->dev); in ndisc_send_skb()
509 IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len); in ndisc_send_skb()
512 net, sk, skb, NULL, dst->dev, in ndisc_send_skb()
524 bool router, bool solicited, bool override, bool inc_opt) in ndisc_send_na() argument
537 if (ifp->flags & IFA_F_OPTIMISTIC) in ndisc_send_na()
538 override = false; in ndisc_send_na()
539 inc_opt |= ifp->idev->cnf.force_tllao; in ndisc_send_na()
543 inet6_sk(dev_net(dev)->ipv6.ndisc_sk)->srcprefs, in ndisc_send_na()
549 if (!dev->addr_len) in ndisc_send_na()
565 .icmp6_override = override, in ndisc_send_na()
572 dev->dev_addr, in ndisc_send_na()
587 read_lock_bh(&idev->lock); in ndisc_send_unsol_na()
588 list_for_each_entry(ifa, &idev->addr_list, if_list) { in ndisc_send_unsol_na()
590 if (ifa->flags & IFA_F_TENTATIVE && in ndisc_send_unsol_na()
591 !(ifa->flags & IFA_F_OPTIMISTIC)) in ndisc_send_unsol_na()
594 ndisc_send_na(dev, &in6addr_linklocal_allnodes, &ifa->addr, in ndisc_send_unsol_na()
595 /*router=*/ !!idev->cnf.forwarding, in ndisc_send_unsol_na()
596 /*solicited=*/ false, /*override=*/ true, in ndisc_send_unsol_na()
599 read_unlock_bh(&idev->lock); in ndisc_send_unsol_na()
610 int inc_opt = dev->addr_len; in ndisc_send_ns()
643 dev->dev_addr, in ndisc_send_ns()
661 int send_sllao = dev->addr_len; in ndisc_send_rs()
677 if (ifp->flags & IFA_F_OPTIMISTIC) { in ndisc_send_rs()
702 dev->dev_addr, in ndisc_send_rs()
725 struct net_device *dev = neigh->dev; in ndisc_solicit()
726 struct in6_addr *target = (struct in6_addr *)&neigh->primary_key; in ndisc_solicit()
727 int probes = atomic_read(&neigh->probes); in ndisc_solicit()
729 if (skb && ipv6_chk_addr_and_flags(dev_net(dev), &ipv6_hdr(skb)->saddr, in ndisc_solicit()
732 saddr = &ipv6_hdr(skb)->saddr; in ndisc_solicit()
733 probes -= NEIGH_VAR(neigh->parms, UCAST_PROBES); in ndisc_solicit()
735 if (!(neigh->nud_state & NUD_VALID)) { in ndisc_solicit()
741 } else if ((probes -= NEIGH_VAR(neigh->parms, APP_PROBES)) < 0) { in ndisc_solicit()
753 int ret = -1; in pndisc_is_router()
758 ret = !!(n->flags & NTF_ROUTER); in pndisc_is_router()
776 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr; in ndisc_recv_ns()
777 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr; in ndisc_recv_ns()
779 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) + in ndisc_recv_ns()
782 struct net_device *dev = skb->dev; in ndisc_recv_ns()
788 int is_router = -1; in ndisc_recv_ns()
791 if (skb->len < sizeof(struct nd_msg)) { in ndisc_recv_ns()
796 if (ipv6_addr_is_multicast(&msg->target)) { in ndisc_recv_ns()
810 if (!ndisc_parse_options(dev, msg->opt, ndoptlen, &ndopts)) { in ndisc_recv_ns()
819 "NS: invalid link-layer address length\n"); in ndisc_recv_ns()
825 * there MUST NOT be source link-layer address option in ndisc_recv_ns()
830 "NS: bad DAD packet (link-layer address option)\n"); in ndisc_recv_ns()
834 if (ndopts.nd_opts_nonce && ndopts.nd_opts_nonce->nd_opt_len == 1) in ndisc_recv_ns()
839 ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1); in ndisc_recv_ns()
842 if (ifp->flags & (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)) { in ndisc_recv_ns()
844 if (nonce != 0 && ifp->dad_nonce == nonce) { in ndisc_recv_ns()
849 ifp->idev->dev->name, in ndisc_recv_ns()
850 &ifp->addr, np); in ndisc_recv_ns()
867 if (!(ifp->flags & IFA_F_OPTIMISTIC)) in ndisc_recv_ns()
872 idev = ifp->idev; in ndisc_recv_ns()
882 ifp = ipv6_get_ifaddr(net, &msg->target, mdev, 1); in ndisc_recv_ns()
894 if (ipv6_chk_acast_addr(net, dev, &msg->target) || in ndisc_recv_ns()
895 (idev->cnf.forwarding && in ndisc_recv_ns()
896 (net->ipv6.devconf_all->proxy_ndp || idev->cnf.proxy_ndp) && in ndisc_recv_ns()
897 (is_router = pndisc_is_router(&msg->target, dev)) >= 0)) { in ndisc_recv_ns()
898 if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) && in ndisc_recv_ns()
899 skb->pkt_type != PACKET_HOST && in ndisc_recv_ns()
901 NEIGH_VAR(idev->nd_parms, PROXY_DELAY) != 0) { in ndisc_recv_ns()
907 * (RFC2461) -- yoshfuji in ndisc_recv_ns()
911 pneigh_enqueue(&nd_tbl, idev->nd_parms, n); in ndisc_recv_ns()
919 is_router = idev->cnf.forwarding; in ndisc_recv_ns()
922 ndisc_send_na(dev, &in6addr_linklocal_allnodes, &msg->target, in ndisc_recv_ns()
937 !inc || lladdr || !dev->addr_len); in ndisc_recv_ns()
943 if (neigh || !dev->header_ops) { in ndisc_recv_ns()
944 ndisc_send_na(dev, saddr, &msg->target, !!is_router, in ndisc_recv_ns()
960 struct in6_addr *saddr = &ipv6_hdr(skb)->saddr; in ndisc_recv_na()
961 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr; in ndisc_recv_na()
963 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) + in ndisc_recv_na()
966 struct net_device *dev = skb->dev; in ndisc_recv_na()
971 if (skb->len < sizeof(struct nd_msg)) { in ndisc_recv_na()
976 if (ipv6_addr_is_multicast(&msg->target)) { in ndisc_recv_na()
982 msg->icmph.icmp6_solicited) { in ndisc_recv_na()
991 if (!msg->icmph.icmp6_solicited && idev && in ndisc_recv_na()
992 idev->cnf.drop_unsolicited_na) in ndisc_recv_na()
995 if (!ndisc_parse_options(dev, msg->opt, ndoptlen, &ndopts)) { in ndisc_recv_na()
1003 "NA: invalid link-layer address length\n"); in ndisc_recv_na()
1007 ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1); in ndisc_recv_na()
1009 if (skb->pkt_type != PACKET_LOOPBACK in ndisc_recv_na()
1010 && (ifp->flags & IFA_F_TENTATIVE)) { in ndisc_recv_na()
1017 an smart proxy agent tries to help us :-) in ndisc_recv_na()
1020 received from loopback - it is just our own in ndisc_recv_na()
1023 if (skb->pkt_type != PACKET_LOOPBACK) in ndisc_recv_na()
1026 eth_hdr(skb)->h_source, &ifp->addr, ifp->idev->dev->name); in ndisc_recv_na()
1030 neigh = neigh_lookup(&nd_tbl, &msg->target, dev); in ndisc_recv_na()
1033 u8 old_flags = neigh->flags; in ndisc_recv_na()
1036 if (neigh->nud_state & NUD_FAILED) in ndisc_recv_na()
1044 if (lladdr && !memcmp(lladdr, dev->dev_addr, dev->addr_len) && in ndisc_recv_na()
1045 net->ipv6.devconf_all->forwarding && net->ipv6.devconf_all->proxy_ndp && in ndisc_recv_na()
1046 pneigh_lookup(&nd_tbl, net, &msg->target, dev, 0)) { in ndisc_recv_na()
1047 /* XXX: idev->cnf.proxy_ndp */ in ndisc_recv_na()
1052 msg->icmph.icmp6_solicited ? NUD_REACHABLE : NUD_STALE, in ndisc_recv_na()
1054 (msg->icmph.icmp6_override ? NEIGH_UPDATE_F_OVERRIDE : 0)| in ndisc_recv_na()
1056 (msg->icmph.icmp6_router ? NEIGH_UPDATE_F_ISROUTER : 0), in ndisc_recv_na()
1059 if ((old_flags & ~neigh->flags) & NTF_ROUTER) { in ndisc_recv_na()
1074 unsigned long ndoptlen = skb->len - sizeof(*rs_msg); in ndisc_recv_rs()
1077 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr; in ndisc_recv_rs()
1081 if (skb->len < sizeof(*rs_msg)) in ndisc_recv_rs()
1084 idev = __in6_dev_get(skb->dev); in ndisc_recv_rs()
1091 if (!idev->cnf.forwarding) in ndisc_recv_rs()
1102 if (!ndisc_parse_options(skb->dev, rs_msg->opt, ndoptlen, &ndopts)) { in ndisc_recv_rs()
1109 skb->dev); in ndisc_recv_rs()
1114 neigh = __neigh_lookup(&nd_tbl, saddr, skb->dev, 1); in ndisc_recv_rs()
1116 ndisc_update(skb->dev, neigh, lladdr, NUD_STALE, in ndisc_recv_rs()
1133 struct net *net = dev_net(ra->dev); in ndisc_ra_useropt()
1136 + (opt->nd_opt_len << 3)); in ndisc_ra_useropt()
1141 err = -ENOBUFS; in ndisc_ra_useropt()
1151 ndmsg->nduseropt_family = AF_INET6; in ndisc_ra_useropt()
1152 ndmsg->nduseropt_ifindex = ra->dev->ifindex; in ndisc_ra_useropt()
1153 ndmsg->nduseropt_icmp_type = icmp6h->icmp6_type; in ndisc_ra_useropt()
1154 ndmsg->nduseropt_icmp_code = icmp6h->icmp6_code; in ndisc_ra_useropt()
1155 ndmsg->nduseropt_opts_len = opt->nd_opt_len << 3; in ndisc_ra_useropt()
1157 memcpy(ndmsg + 1, opt, opt->nd_opt_len << 3); in ndisc_ra_useropt()
1159 if (nla_put_in6_addr(skb, NDUSEROPT_SRCADDR, &ipv6_hdr(ra)->saddr)) in ndisc_ra_useropt()
1168 err = -EMSGSIZE; in ndisc_ra_useropt()
1189 optlen = (skb_tail_pointer(skb) - skb_transport_header(skb)) - in ndisc_router_discovery()
1194 __func__, skb->dev->name); in ndisc_router_discovery()
1195 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) { in ndisc_router_discovery()
1196 ND_PRINTK(2, warn, "RA: source address is not link-local\n"); in ndisc_router_discovery()
1205 if (skb->ndisc_nodetype == NDISC_NODETYPE_HOST) { in ndisc_router_discovery()
1215 in6_dev = __in6_dev_get(skb->dev); in ndisc_router_discovery()
1218 skb->dev->name); in ndisc_router_discovery()
1222 if (!ndisc_parse_options(skb->dev, opt, optlen, &ndopts)) { in ndisc_router_discovery()
1230 __func__, skb->dev->name); in ndisc_router_discovery()
1235 /* skip link-specific parameters from interior routers */ in ndisc_router_discovery()
1236 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) { in ndisc_router_discovery()
1239 __func__, skb->dev->name); in ndisc_router_discovery()
1244 if (in6_dev->if_flags & IF_RS_SENT) { in ndisc_router_discovery()
1249 in6_dev->if_flags |= IF_RA_RCVD; in ndisc_router_discovery()
1254 * received RA message (RFC 2462) -- yoshfuji in ndisc_router_discovery()
1256 old_if_flags = in6_dev->if_flags; in ndisc_router_discovery()
1257 in6_dev->if_flags = (in6_dev->if_flags & ~(IF_RA_MANAGED | in ndisc_router_discovery()
1259 (ra_msg->icmph.icmp6_addrconf_managed ? in ndisc_router_discovery()
1261 (ra_msg->icmph.icmp6_addrconf_other ? in ndisc_router_discovery()
1264 if (old_if_flags != in6_dev->if_flags) in ndisc_router_discovery()
1267 if (!in6_dev->cnf.accept_ra_defrtr) { in ndisc_router_discovery()
1270 __func__, skb->dev->name); in ndisc_router_discovery()
1274 lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime); in ndisc_router_discovery()
1275 if (lifetime != 0 && lifetime < in6_dev->cnf.accept_ra_min_lft) { in ndisc_router_discovery()
1278 lifetime, skb->dev->name); in ndisc_router_discovery()
1282 /* Do not accept RA with source-addr found on local machine unless in ndisc_router_discovery()
1285 net = dev_net(in6_dev->dev); in ndisc_router_discovery()
1286 if (!in6_dev->cnf.accept_ra_from_local && in ndisc_router_discovery()
1287 ipv6_chk_addr(net, &ipv6_hdr(skb)->saddr, in6_dev->dev, 0)) { in ndisc_router_discovery()
1290 skb->dev->name); in ndisc_router_discovery()
1295 pref = ra_msg->icmph.icmp6_router_pref; in ndisc_router_discovery()
1298 !in6_dev->cnf.accept_ra_rtr_pref) in ndisc_router_discovery()
1302 rt = rt6_get_dflt_router(net, &ipv6_hdr(skb)->saddr, skb->dev); in ndisc_router_discovery()
1304 neigh = ip6_neigh_lookup(&rt->fib6_nh->fib_nh_gw6, in ndisc_router_discovery()
1305 rt->fib6_nh->fib_nh_dev, NULL, in ndisc_router_discovery()
1306 &ipv6_hdr(skb)->saddr); in ndisc_router_discovery()
1321 rt, lifetime, skb->dev->name); in ndisc_router_discovery()
1325 rt = rt6_add_dflt_router(net, &ipv6_hdr(skb)->saddr, in ndisc_router_discovery()
1326 skb->dev, pref); in ndisc_router_discovery()
1334 neigh = ip6_neigh_lookup(&rt->fib6_nh->fib_nh_gw6, in ndisc_router_discovery()
1335 rt->fib6_nh->fib_nh_dev, NULL, in ndisc_router_discovery()
1336 &ipv6_hdr(skb)->saddr); in ndisc_router_discovery()
1344 neigh->flags |= NTF_ROUTER; in ndisc_router_discovery()
1346 rt->fib6_flags = (rt->fib6_flags & ~RTF_PREF_MASK) | RTF_PREF(pref); in ndisc_router_discovery()
1351 if (in6_dev->cnf.accept_ra_min_hop_limit < 256 && in ndisc_router_discovery()
1352 ra_msg->icmph.icmp6_hop_limit) { in ndisc_router_discovery()
1353 if (in6_dev->cnf.accept_ra_min_hop_limit <= ra_msg->icmph.icmp6_hop_limit) { in ndisc_router_discovery()
1354 in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit; in ndisc_router_discovery()
1356 ra_msg->icmph.icmp6_hop_limit); in ndisc_router_discovery()
1368 if (in6_dev->nd_parms) { in ndisc_router_discovery()
1369 unsigned long rtime = ntohl(ra_msg->retrans_timer); in ndisc_router_discovery()
1375 NEIGH_VAR_SET(in6_dev->nd_parms, RETRANS_TIME, rtime); in ndisc_router_discovery()
1376 in6_dev->tstamp = jiffies; in ndisc_router_discovery()
1380 rtime = ntohl(ra_msg->reachable_time); in ndisc_router_discovery()
1387 if (rtime != NEIGH_VAR(in6_dev->nd_parms, BASE_REACHABLE_TIME)) { in ndisc_router_discovery()
1388 NEIGH_VAR_SET(in6_dev->nd_parms, in ndisc_router_discovery()
1390 NEIGH_VAR_SET(in6_dev->nd_parms, in ndisc_router_discovery()
1392 in6_dev->nd_parms->reachable_time = neigh_rand_reach_time(rtime); in ndisc_router_discovery()
1393 in6_dev->tstamp = jiffies; in ndisc_router_discovery()
1412 neigh = __neigh_lookup(&nd_tbl, &ipv6_hdr(skb)->saddr, in ndisc_router_discovery()
1413 skb->dev, 1); in ndisc_router_discovery()
1418 skb->dev); in ndisc_router_discovery()
1421 "RA: invalid link-layer address length\n"); in ndisc_router_discovery()
1425 ndisc_update(skb->dev, neigh, lladdr, NUD_STALE, in ndisc_router_discovery()
1436 __func__, skb->dev->name); in ndisc_router_discovery()
1441 if (!in6_dev->cnf.accept_ra_from_local && in ndisc_router_discovery()
1442 ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr, in ndisc_router_discovery()
1443 in6_dev->dev, 0)) { in ndisc_router_discovery()
1446 skb->dev->name); in ndisc_router_discovery()
1450 if (in6_dev->cnf.accept_ra_rtr_pref && ndopts.nd_opts_ri) { in ndisc_router_discovery()
1455 struct route_info *ri = (struct route_info *)p; in ndisc_router_discovery() local
1457 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT && in ndisc_router_discovery()
1458 ri->prefix_len == 0) in ndisc_router_discovery()
1461 if (ri->prefix_len == 0 && in ndisc_router_discovery()
1462 !in6_dev->cnf.accept_ra_defrtr) in ndisc_router_discovery()
1464 if (ri->lifetime != 0 && in ndisc_router_discovery()
1465 ntohl(ri->lifetime) < in6_dev->cnf.accept_ra_min_lft) in ndisc_router_discovery()
1467 if (ri->prefix_len < in6_dev->cnf.accept_ra_rt_info_min_plen) in ndisc_router_discovery()
1469 if (ri->prefix_len > in6_dev->cnf.accept_ra_rt_info_max_plen) in ndisc_router_discovery()
1471 rt6_route_rcv(skb->dev, (u8 *)p, (p->nd_opt_len) << 3, in ndisc_router_discovery()
1472 &ipv6_hdr(skb)->saddr); in ndisc_router_discovery()
1480 /* skip link-specific ndopts from interior routers */ in ndisc_router_discovery()
1481 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) { in ndisc_router_discovery()
1484 __func__, skb->dev->name); in ndisc_router_discovery()
1489 if (in6_dev->cnf.accept_ra_pinfo && ndopts.nd_opts_pi) { in ndisc_router_discovery()
1494 addrconf_prefix_rcv(skb->dev, (u8 *)p, in ndisc_router_discovery()
1495 (p->nd_opt_len) << 3, in ndisc_router_discovery()
1500 if (ndopts.nd_opts_mtu && in6_dev->cnf.accept_ra_mtu) { in ndisc_router_discovery()
1507 if (mtu < IPV6_MIN_MTU || mtu > skb->dev->mtu) { in ndisc_router_discovery()
1509 } else if (in6_dev->cnf.mtu6 != mtu) { in ndisc_router_discovery()
1510 in6_dev->cnf.mtu6 = mtu; in ndisc_router_discovery()
1512 rt6_mtu_change(skb->dev, mtu); in ndisc_router_discovery()
1520 p = ndisc_next_useropt(skb->dev, p, in ndisc_router_discovery()
1540 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) + in ndisc_redirect_rcv()
1544 switch (skb->ndisc_nodetype) { in ndisc_redirect_rcv()
1553 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) { in ndisc_redirect_rcv()
1555 "Redirect: source address is not link-local\n"); in ndisc_redirect_rcv()
1559 if (!ndisc_parse_options(skb->dev, msg->opt, ndoptlen, &ndopts)) in ndisc_redirect_rcv()
1563 ip6_redirect_no_header(skb, dev_net(skb->dev), in ndisc_redirect_rcv()
1564 skb->dev->ifindex); in ndisc_redirect_rcv()
1570 if (!pskb_pull(skb, hdr - skb_transport_header(skb))) in ndisc_redirect_rcv()
1588 rd_len - 8); in ndisc_fill_redirect_hdr_option()
1593 struct net_device *dev = skb->dev; in ndisc_send_redirect()
1595 struct sock *sk = net->ipv6.ndisc_sk; in ndisc_send_redirect()
1609 if (netif_is_l3_master(skb->dev)) { in ndisc_send_redirect()
1610 dev = __dev_get_by_index(dev_net(skb->dev), IPCB(skb)->iif); in ndisc_send_redirect()
1616 ND_PRINTK(2, warn, "Redirect: no link-local address on %s\n", in ndisc_send_redirect()
1617 dev->name); in ndisc_send_redirect()
1621 if (!ipv6_addr_equal(&ipv6_hdr(skb)->daddr, target) && in ndisc_send_redirect()
1624 "Redirect: target address is not link-local unicast\n"); in ndisc_send_redirect()
1629 &saddr_buf, &ipv6_hdr(skb)->saddr, dev->ifindex); in ndisc_send_redirect()
1632 if (dst->error) { in ndisc_send_redirect()
1642 if (rt->rt6i_flags & RTF_GATEWAY) { in ndisc_send_redirect()
1647 peer = inet_getpeer_v6(net->ipv6.peers, &ipv6_hdr(skb)->saddr, 1); in ndisc_send_redirect()
1654 if (dev->addr_len) { in ndisc_send_redirect()
1662 read_lock_bh(&neigh->lock); in ndisc_send_redirect()
1663 if (neigh->nud_state & NUD_VALID) { in ndisc_send_redirect()
1664 memcpy(ha_buf, neigh->ha, dev->addr_len); in ndisc_send_redirect()
1665 read_unlock_bh(&neigh->lock); in ndisc_send_redirect()
1671 read_unlock_bh(&neigh->lock); in ndisc_send_redirect()
1677 IPV6_MIN_MTU - sizeof(struct ipv6hdr) - sizeof(*msg) - optlen, in ndisc_send_redirect()
1678 skb->len + 8); in ndisc_send_redirect()
1692 .dest = ipv6_hdr(skb)->daddr, in ndisc_send_redirect()
1710 ndisc_send_skb(buff, &ipv6_hdr(skb)->saddr, &saddr_buf); in ndisc_send_redirect()
1730 struct inet6_dev *idev = __in6_dev_get(skb->dev); in ndisc_suppress_frag_ndisc()
1734 if (IP6CB(skb)->flags & IP6SKB_FRAGMENTED && in ndisc_suppress_frag_ndisc()
1735 idev->cnf.suppress_frag_ndisc) { in ndisc_suppress_frag_ndisc()
1754 __skb_push(skb, skb->data - skb_transport_header(skb)); in ndisc_rcv()
1756 if (ipv6_hdr(skb)->hop_limit != 255) { in ndisc_rcv()
1757 ND_PRINTK(2, warn, "NDISC: invalid hop-limit: %d\n", in ndisc_rcv()
1758 ipv6_hdr(skb)->hop_limit); in ndisc_rcv()
1762 if (msg->icmph.icmp6_code != 0) { in ndisc_rcv()
1764 msg->icmph.icmp6_code); in ndisc_rcv()
1768 switch (msg->icmph.icmp6_type) { in ndisc_rcv()
1810 if (idev->cnf.ndisc_notify || in ndisc_netdev_event()
1811 net->ipv6.devconf_all->ndisc_notify) in ndisc_netdev_event()
1817 if (change_info->flags_changed & IFF_NOARP) in ndisc_netdev_event()
1838 .priority = ADDRCONF_NOTIFY_PRIORITY - 5,
1847 if (strcmp(warncomm, current->comm) && warned < 5) { in ndisc_warn_deprecated_sysctl()
1848 strcpy(warncomm, current->comm); in ndisc_warn_deprecated_sysctl()
1849 …pr_warn("process `%s' is using deprecated sysctl (%s) net.ipv6.neigh.%s.%s - use net.ipv6.neigh.%s… in ndisc_warn_deprecated_sysctl()
1851 dev_name, ctl->procname, in ndisc_warn_deprecated_sysctl()
1852 dev_name, ctl->procname); in ndisc_warn_deprecated_sysctl()
1860 struct net_device *dev = ctl->extra1; in ndisc_ifinfo_sysctl_change()
1864 if ((strcmp(ctl->procname, "retrans_time") == 0) || in ndisc_ifinfo_sysctl_change()
1865 (strcmp(ctl->procname, "base_reachable_time") == 0)) in ndisc_ifinfo_sysctl_change()
1866 ndisc_warn_deprecated_sysctl(ctl, "syscall", dev ? dev->name : "default"); in ndisc_ifinfo_sysctl_change()
1868 if (strcmp(ctl->procname, "retrans_time") == 0) in ndisc_ifinfo_sysctl_change()
1871 else if (strcmp(ctl->procname, "base_reachable_time") == 0) in ndisc_ifinfo_sysctl_change()
1875 else if ((strcmp(ctl->procname, "retrans_time_ms") == 0) || in ndisc_ifinfo_sysctl_change()
1876 (strcmp(ctl->procname, "base_reachable_time_ms") == 0)) in ndisc_ifinfo_sysctl_change()
1880 ret = -1; in ndisc_ifinfo_sysctl_change()
1883 if (ctl->data == &NEIGH_VAR(idev->nd_parms, BASE_REACHABLE_TIME)) in ndisc_ifinfo_sysctl_change()
1884 idev->nd_parms->reachable_time = in ndisc_ifinfo_sysctl_change()
1885 neigh_rand_reach_time(NEIGH_VAR(idev->nd_parms, BASE_REACHABLE_TIME)); in ndisc_ifinfo_sysctl_change()
1886 idev->tstamp = jiffies; in ndisc_ifinfo_sysctl_change()
1911 net->ipv6.ndisc_sk = sk; in ndisc_net_init()
1914 np->hop_limit = 255; in ndisc_net_init()
1916 np->mc_loop = 0; in ndisc_net_init()
1923 inet_ctl_sock_destroy(net->ipv6.ndisc_sk); in ndisc_net_exit()