Lines Matching +full:route +full:- +full:ptp

1 // SPDX-License-Identifier: GPL-2.0-or-later
53 #include <linux/route.h>
102 return (cstamp - INITIAL_JIFFIES) * 100UL / HZ; in cstamp_delta()
308 if (del_timer(&idev->rs_timer)) in addrconf_del_rs_timer()
314 if (cancel_delayed_work(&ifp->dad_work)) in addrconf_del_dad_work()
321 if (!timer_pending(&idev->rs_timer)) in addrconf_mod_rs_timer()
323 mod_timer(&idev->rs_timer, jiffies + when); in addrconf_mod_rs_timer()
330 if (mod_delayed_work(addrconf_wq, &ifp->dad_work, delay)) in addrconf_mod_dad_work()
338 idev->stats.ipv6 = alloc_percpu(struct ipstats_mib); in snmp6_alloc_dev()
339 if (!idev->stats.ipv6) in snmp6_alloc_dev()
344 addrconf_stats = per_cpu_ptr(idev->stats.ipv6, i); in snmp6_alloc_dev()
345 u64_stats_init(&addrconf_stats->syncp); in snmp6_alloc_dev()
349 idev->stats.icmpv6dev = kzalloc(sizeof(struct icmpv6_mib_device), in snmp6_alloc_dev()
351 if (!idev->stats.icmpv6dev) in snmp6_alloc_dev()
353 idev->stats.icmpv6msgdev = kzalloc(sizeof(struct icmpv6msg_mib_device), in snmp6_alloc_dev()
355 if (!idev->stats.icmpv6msgdev) in snmp6_alloc_dev()
361 kfree(idev->stats.icmpv6dev); in snmp6_alloc_dev()
363 free_percpu(idev->stats.ipv6); in snmp6_alloc_dev()
365 return -ENOMEM; in snmp6_alloc_dev()
371 int err = -ENOMEM; in ipv6_add_dev()
375 if (dev->mtu < IPV6_MIN_MTU) in ipv6_add_dev()
376 return ERR_PTR(-EINVAL); in ipv6_add_dev()
382 rwlock_init(&ndev->lock); in ipv6_add_dev()
383 ndev->dev = dev; in ipv6_add_dev()
384 INIT_LIST_HEAD(&ndev->addr_list); in ipv6_add_dev()
385 timer_setup(&ndev->rs_timer, addrconf_rs_timer, 0); in ipv6_add_dev()
386 memcpy(&ndev->cnf, dev_net(dev)->ipv6.devconf_dflt, sizeof(ndev->cnf)); in ipv6_add_dev()
388 if (ndev->cnf.stable_secret.initialized) in ipv6_add_dev()
389 ndev->cnf.addr_gen_mode = IN6_ADDR_GEN_MODE_STABLE_PRIVACY; in ipv6_add_dev()
391 ndev->cnf.mtu6 = dev->mtu; in ipv6_add_dev()
392 ndev->nd_parms = neigh_parms_alloc(dev, &nd_tbl); in ipv6_add_dev()
393 if (!ndev->nd_parms) { in ipv6_add_dev()
397 if (ndev->cnf.forwarding) in ipv6_add_dev()
405 neigh_parms_release(&nd_tbl, ndev->nd_parms); in ipv6_add_dev()
413 __func__, dev->name); in ipv6_add_dev()
418 refcount_set(&ndev->refcnt, 1); in ipv6_add_dev()
420 if (dev->flags & (IFF_NOARP | IFF_LOOPBACK)) in ipv6_add_dev()
421 ndev->cnf.accept_dad = -1; in ipv6_add_dev()
424 if (dev->type == ARPHRD_SIT && (dev->priv_flags & IFF_ISATAP)) { in ipv6_add_dev()
425 pr_info("%s: Disabled Multicast RS\n", dev->name); in ipv6_add_dev()
426 ndev->cnf.rtr_solicits = 0; in ipv6_add_dev()
430 INIT_LIST_HEAD(&ndev->tempaddr_list); in ipv6_add_dev()
431 ndev->desync_factor = U32_MAX; in ipv6_add_dev()
432 if ((dev->flags&IFF_LOOPBACK) || in ipv6_add_dev()
433 dev->type == ARPHRD_TUNNEL || in ipv6_add_dev()
434 dev->type == ARPHRD_TUNNEL6 || in ipv6_add_dev()
435 dev->type == ARPHRD_SIT || in ipv6_add_dev()
436 dev->type == ARPHRD_NONE) { in ipv6_add_dev()
437 ndev->cnf.use_tempaddr = -1; in ipv6_add_dev()
440 ndev->token = in6addr_any; in ipv6_add_dev()
443 ndev->if_flags |= IF_READY; in ipv6_add_dev()
446 ndev->tstamp = jiffies; in ipv6_add_dev()
454 rcu_assign_pointer(dev->ip6_ptr, ndev); in ipv6_add_dev()
456 /* Join interface-local all-node multicast group */ in ipv6_add_dev()
459 /* Join all-node multicast group */ in ipv6_add_dev()
462 /* Join all-router multicast group if forwarding is set */ in ipv6_add_dev()
463 if (ndev->cnf.forwarding && (dev->flags & IFF_MULTICAST)) in ipv6_add_dev()
469 neigh_parms_release(&nd_tbl, ndev->nd_parms); in ipv6_add_dev()
470 ndev->dead = 1; in ipv6_add_dev()
488 if (dev->flags&IFF_UP) in ipv6_find_idev()
529 return -EMSGSIZE; in inet6_netconf_fill_devconf()
535 ncm->ncm_family = AF_INET6; in inet6_netconf_fill_devconf()
544 nla_put_s32(skb, NETCONFA_FORWARDING, devconf->forwarding) < 0) in inet6_netconf_fill_devconf()
549 atomic_read(&devconf->mc_forwarding)) < 0) in inet6_netconf_fill_devconf()
553 nla_put_s32(skb, NETCONFA_PROXY_NEIGH, devconf->proxy_ndp) < 0) in inet6_netconf_fill_devconf()
558 devconf->ignore_routes_with_linkdown) < 0) in inet6_netconf_fill_devconf()
567 return -EMSGSIZE; in inet6_netconf_fill_devconf()
574 int err = -ENOBUFS; in inet6_netconf_notify_devconf()
583 /* -EMSGSIZE implies BUG in inet6_netconf_msgsize_devconf() */ in inet6_netconf_notify_devconf()
584 WARN_ON(err == -EMSGSIZE); in inet6_netconf_notify_devconf()
608 if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(struct netconfmsg))) { in inet6_netconf_valid_get_req()
610 return -EINVAL; in inet6_netconf_valid_get_req()
633 return -EINVAL; in inet6_netconf_valid_get_req()
644 struct net *net = sock_net(in_skb->sk); in inet6_netconf_get_devconf()
658 return -EINVAL; in inet6_netconf_get_devconf()
660 err = -EINVAL; in inet6_netconf_get_devconf()
664 devconf = net->ipv6.devconf_all; in inet6_netconf_get_devconf()
667 devconf = net->ipv6.devconf_dflt; in inet6_netconf_get_devconf()
672 return -EINVAL; in inet6_netconf_get_devconf()
676 devconf = &in6_dev->cnf; in inet6_netconf_get_devconf()
680 err = -ENOBUFS; in inet6_netconf_get_devconf()
687 nlh->nlmsg_seq, RTM_NEWNETCONF, 0, in inet6_netconf_get_devconf()
690 /* -EMSGSIZE implies BUG in inet6_netconf_msgsize_devconf() */ in inet6_netconf_get_devconf()
691 WARN_ON(err == -EMSGSIZE); in inet6_netconf_get_devconf()
707 const struct nlmsghdr *nlh = cb->nlh; in inet6_netconf_dump_devconf()
708 struct net *net = sock_net(skb->sk); in inet6_netconf_dump_devconf()
715 if (cb->strict_check) { in inet6_netconf_dump_devconf()
716 struct netlink_ext_ack *extack = cb->extack; in inet6_netconf_dump_devconf()
719 if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*ncm))) { in inet6_netconf_dump_devconf()
721 return -EINVAL; in inet6_netconf_dump_devconf()
726 return -EINVAL; in inet6_netconf_dump_devconf()
730 s_h = cb->args[0]; in inet6_netconf_dump_devconf()
731 s_idx = idx = cb->args[1]; in inet6_netconf_dump_devconf()
735 head = &net->dev_index_head[h]; in inet6_netconf_dump_devconf()
737 cb->seq = atomic_read(&net->ipv6.dev_addr_genid) ^ in inet6_netconf_dump_devconf()
738 net->dev_base_seq; in inet6_netconf_dump_devconf()
746 if (inet6_netconf_fill_devconf(skb, dev->ifindex, in inet6_netconf_dump_devconf()
747 &idev->cnf, in inet6_netconf_dump_devconf()
748 NETLINK_CB(cb->skb).portid, in inet6_netconf_dump_devconf()
749 nlh->nlmsg_seq, in inet6_netconf_dump_devconf()
764 net->ipv6.devconf_all, in inet6_netconf_dump_devconf()
765 NETLINK_CB(cb->skb).portid, in inet6_netconf_dump_devconf()
766 nlh->nlmsg_seq, in inet6_netconf_dump_devconf()
775 net->ipv6.devconf_dflt, in inet6_netconf_dump_devconf()
776 NETLINK_CB(cb->skb).portid, in inet6_netconf_dump_devconf()
777 nlh->nlmsg_seq, in inet6_netconf_dump_devconf()
785 cb->args[0] = h; in inet6_netconf_dump_devconf()
786 cb->args[1] = idx; in inet6_netconf_dump_devconf()
788 return skb->len; in inet6_netconf_dump_devconf()
800 dev = idev->dev; in dev_forward_change()
801 if (idev->cnf.forwarding) in dev_forward_change()
803 if (dev->flags & IFF_MULTICAST) { in dev_forward_change()
804 if (idev->cnf.forwarding) { in dev_forward_change()
815 read_lock_bh(&idev->lock); in dev_forward_change()
816 list_for_each_entry(ifa, &idev->addr_list, if_list) { in dev_forward_change()
817 if (ifa->flags&IFA_F_TENTATIVE) in dev_forward_change()
819 list_add_tail(&ifa->if_list_aux, &tmp_addr_list); in dev_forward_change()
821 read_unlock_bh(&idev->lock); in dev_forward_change()
826 list_del(&ifa->if_list_aux); in dev_forward_change()
827 if (idev->cnf.forwarding) in dev_forward_change()
835 dev->ifindex, &idev->cnf); in dev_forward_change()
847 int changed = (!idev->cnf.forwarding) ^ (!newf); in addrconf_forward_change()
848 idev->cnf.forwarding = newf; in addrconf_forward_change()
863 net = (struct net *)table->extra2; in addrconf_fixup_forwarding()
867 if (p == &net->ipv6.devconf_dflt->forwarding) { in addrconf_fixup_forwarding()
872 net->ipv6.devconf_dflt); in addrconf_fixup_forwarding()
877 if (p == &net->ipv6.devconf_all->forwarding) { in addrconf_fixup_forwarding()
878 int old_dflt = net->ipv6.devconf_dflt->forwarding; in addrconf_fixup_forwarding()
880 net->ipv6.devconf_dflt->forwarding = newf; in addrconf_fixup_forwarding()
885 net->ipv6.devconf_dflt); in addrconf_fixup_forwarding()
892 net->ipv6.devconf_all); in addrconf_fixup_forwarding()
894 dev_forward_change((struct inet6_dev *)table->extra1); in addrconf_fixup_forwarding()
910 int changed = (!idev->cnf.ignore_routes_with_linkdown) ^ (!newf); in addrconf_linkdown_change()
912 idev->cnf.ignore_routes_with_linkdown = newf; in addrconf_linkdown_change()
917 dev->ifindex, in addrconf_linkdown_change()
918 &idev->cnf); in addrconf_linkdown_change()
931 net = (struct net *)table->extra2; in addrconf_fixup_linkdown()
935 if (p == &net->ipv6.devconf_dflt->ignore_routes_with_linkdown) { in addrconf_fixup_linkdown()
941 net->ipv6.devconf_dflt); in addrconf_fixup_linkdown()
946 if (p == &net->ipv6.devconf_all->ignore_routes_with_linkdown) { in addrconf_fixup_linkdown()
947 net->ipv6.devconf_dflt->ignore_routes_with_linkdown = newf; in addrconf_fixup_linkdown()
954 net->ipv6.devconf_all); in addrconf_fixup_linkdown()
966 WARN_ON(!hlist_unhashed(&ifp->addr_lst)); in inet6_ifa_finish_destroy()
972 in6_dev_put(ifp->idev); in inet6_ifa_finish_destroy()
974 if (cancel_delayed_work(&ifp->dad_work)) in inet6_ifa_finish_destroy()
978 if (ifp->state != INET6_IFADDR_STATE_DEAD) { in inet6_ifa_finish_destroy()
990 int ifp_scope = ipv6_addr_src_scope(&ifp->addr); in ipv6_link_dev_addr()
993 * Each device address list is sorted in order of scope - in ipv6_link_dev_addr()
996 list_for_each(p, &idev->addr_list) { in ipv6_link_dev_addr()
999 if (ifp_scope >= ipv6_addr_src_scope(&ifa->addr)) in ipv6_link_dev_addr()
1003 list_add_tail_rcu(&ifp->if_list, p); in ipv6_link_dev_addr()
1019 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_same_addr()
1021 if (ipv6_addr_equal(&ifp->addr, addr)) { in ipv6_chk_same_addr()
1022 if (!dev || ifp->idev->dev == dev) in ipv6_chk_same_addr()
1031 unsigned int hash = inet6_addr_hash(dev_net(dev), &ifa->addr); in ipv6_add_addr_hash()
1037 if (ipv6_chk_same_addr(dev_net(dev), &ifa->addr, dev, hash)) { in ipv6_add_addr_hash()
1039 err = -EEXIST; in ipv6_add_addr_hash()
1041 hlist_add_head_rcu(&ifa->addr_lst, &inet6_addr_lst[hash]); in ipv6_add_addr_hash()
1056 int addr_type = ipv6_addr_type(cfg->pfx); in ipv6_add_addr()
1057 struct net *net = dev_net(idev->dev); in ipv6_add_addr()
1064 !(cfg->ifa_flags & IFA_F_MCAUTOJOIN)) || in ipv6_add_addr()
1065 (!(idev->dev->flags & IFF_LOOPBACK) && in ipv6_add_addr()
1066 !netif_is_l3_master(idev->dev) && in ipv6_add_addr()
1068 return ERR_PTR(-EADDRNOTAVAIL); in ipv6_add_addr()
1070 if (idev->dead) { in ipv6_add_addr()
1071 err = -ENODEV; /*XXX*/ in ipv6_add_addr()
1075 if (idev->cnf.disable_ipv6) { in ipv6_add_addr()
1076 err = -EACCES; in ipv6_add_addr()
1085 .i6vi_addr = *cfg->pfx, in ipv6_add_addr()
1098 err = -ENOBUFS; in ipv6_add_addr()
1102 f6i = addrconf_f6i_alloc(net, idev, cfg->pfx, false, gfp_flags); in ipv6_add_addr()
1109 neigh_parms_data_state_setall(idev->nd_parms); in ipv6_add_addr()
1111 ifa->addr = *cfg->pfx; in ipv6_add_addr()
1112 if (cfg->peer_pfx) in ipv6_add_addr()
1113 ifa->peer_addr = *cfg->peer_pfx; in ipv6_add_addr()
1115 spin_lock_init(&ifa->lock); in ipv6_add_addr()
1116 INIT_DELAYED_WORK(&ifa->dad_work, addrconf_dad_work); in ipv6_add_addr()
1117 INIT_HLIST_NODE(&ifa->addr_lst); in ipv6_add_addr()
1118 ifa->scope = cfg->scope; in ipv6_add_addr()
1119 ifa->prefix_len = cfg->plen; in ipv6_add_addr()
1120 ifa->rt_priority = cfg->rt_priority; in ipv6_add_addr()
1121 ifa->flags = cfg->ifa_flags; in ipv6_add_addr()
1123 if (!(cfg->ifa_flags & IFA_F_NODAD)) in ipv6_add_addr()
1124 ifa->flags |= IFA_F_TENTATIVE; in ipv6_add_addr()
1125 ifa->valid_lft = cfg->valid_lft; in ipv6_add_addr()
1126 ifa->prefered_lft = cfg->preferred_lft; in ipv6_add_addr()
1127 ifa->cstamp = ifa->tstamp = jiffies; in ipv6_add_addr()
1128 ifa->tokenized = false; in ipv6_add_addr()
1130 ifa->rt = f6i; in ipv6_add_addr()
1132 ifa->idev = idev; in ipv6_add_addr()
1136 refcount_set(&ifa->refcnt, 1); in ipv6_add_addr()
1140 err = ipv6_add_addr_hash(idev->dev, ifa); in ipv6_add_addr()
1146 write_lock(&idev->lock); in ipv6_add_addr()
1151 if (ifa->flags&IFA_F_TEMPORARY) { in ipv6_add_addr()
1152 list_add(&ifa->tmp_list, &idev->tempaddr_list); in ipv6_add_addr()
1157 write_unlock(&idev->lock); in ipv6_add_addr()
1167 if (ifa->idev) in ipv6_add_addr()
1168 in6_dev_put(ifa->idev); in ipv6_add_addr()
1178 CLEANUP_PREFIX_RT_NOP, /* no cleanup action for prefix route */
1179 CLEANUP_PREFIX_RT_DEL, /* delete the prefix route */
1180 CLEANUP_PREFIX_RT_EXPIRE, /* update the lifetime of the prefix route */
1184 * Check, whether the prefix for ifp would still need a prefix route
1205 struct inet6_dev *idev = ifp->idev; in check_cleanup_prefix_route()
1211 list_for_each_entry(ifa, &idev->addr_list, if_list) { in check_cleanup_prefix_route()
1214 if (ifa->prefix_len != ifp->prefix_len || in check_cleanup_prefix_route()
1215 !ipv6_prefix_equal(&ifa->addr, &ifp->addr, in check_cleanup_prefix_route()
1216 ifp->prefix_len)) in check_cleanup_prefix_route()
1218 if (ifa->flags & (IFA_F_PERMANENT | IFA_F_NOPREFIXROUTE)) in check_cleanup_prefix_route()
1223 spin_lock(&ifa->lock); in check_cleanup_prefix_route()
1225 lifetime = addrconf_timeout_fixup(ifa->valid_lft, HZ); in check_cleanup_prefix_route()
1231 if (time_before(*expires, ifa->tstamp + lifetime * HZ)) in check_cleanup_prefix_route()
1232 *expires = ifa->tstamp + lifetime * HZ; in check_cleanup_prefix_route()
1233 spin_unlock(&ifa->lock); in check_cleanup_prefix_route()
1245 f6i = addrconf_get_prefix_route(del_peer ? &ifp->peer_addr : &ifp->addr, in cleanup_prefix_route()
1246 ifp->prefix_len, in cleanup_prefix_route()
1247 ifp->idev->dev, 0, RTF_DEFAULT, true); in cleanup_prefix_route()
1250 ip6_del_rt(dev_net(ifp->idev->dev), f6i, false); in cleanup_prefix_route()
1252 if (!(f6i->fib6_flags & RTF_EXPIRES)) in cleanup_prefix_route()
1270 spin_lock_bh(&ifp->lock); in ipv6_del_addr()
1271 state = ifp->state; in ipv6_del_addr()
1272 ifp->state = INET6_IFADDR_STATE_DEAD; in ipv6_del_addr()
1273 spin_unlock_bh(&ifp->lock); in ipv6_del_addr()
1279 hlist_del_init_rcu(&ifp->addr_lst); in ipv6_del_addr()
1282 write_lock_bh(&ifp->idev->lock); in ipv6_del_addr()
1284 if (ifp->flags&IFA_F_TEMPORARY) { in ipv6_del_addr()
1285 list_del(&ifp->tmp_list); in ipv6_del_addr()
1286 if (ifp->ifpub) { in ipv6_del_addr()
1287 in6_ifa_put(ifp->ifpub); in ipv6_del_addr()
1288 ifp->ifpub = NULL; in ipv6_del_addr()
1293 if (ifp->flags & IFA_F_PERMANENT && !(ifp->flags & IFA_F_NOPREFIXROUTE)) in ipv6_del_addr()
1296 list_del_rcu(&ifp->if_list); in ipv6_del_addr()
1299 write_unlock_bh(&ifp->idev->lock); in ipv6_del_addr()
1320 struct inet6_dev *idev = ifp->idev; in ipv6_create_tempaddr()
1331 write_lock_bh(&idev->lock); in ipv6_create_tempaddr()
1335 if (idev->cnf.use_tempaddr <= 0) { in ipv6_create_tempaddr()
1336 write_unlock_bh(&idev->lock); in ipv6_create_tempaddr()
1339 ret = -1; in ipv6_create_tempaddr()
1342 spin_lock_bh(&ifp->lock); in ipv6_create_tempaddr()
1343 if (ifp->regen_count++ >= idev->cnf.regen_max_retry) { in ipv6_create_tempaddr()
1344 idev->cnf.use_tempaddr = -1; /*XXX*/ in ipv6_create_tempaddr()
1345 spin_unlock_bh(&ifp->lock); in ipv6_create_tempaddr()
1346 write_unlock_bh(&idev->lock); in ipv6_create_tempaddr()
1347 pr_warn("%s: regeneration time exceeded - disabled temporary address support\n", in ipv6_create_tempaddr()
1350 ret = -1; in ipv6_create_tempaddr()
1354 memcpy(addr.s6_addr, ifp->addr.s6_addr, 8); in ipv6_create_tempaddr()
1357 age = (now - ifp->tstamp) / HZ; in ipv6_create_tempaddr()
1359 regen_advance = idev->cnf.regen_max_retry * in ipv6_create_tempaddr()
1360 idev->cnf.dad_transmits * in ipv6_create_tempaddr()
1361 max(NEIGH_VAR(idev->nd_parms, RETRANS_TIME), HZ/100) / HZ; in ipv6_create_tempaddr()
1364 * idev->desync_factor if it's larger in ipv6_create_tempaddr()
1366 cnf_temp_preferred_lft = READ_ONCE(idev->cnf.temp_prefered_lft); in ipv6_create_tempaddr()
1368 idev->cnf.max_desync_factor, in ipv6_create_tempaddr()
1369 cnf_temp_preferred_lft - regen_advance); in ipv6_create_tempaddr()
1371 if (unlikely(idev->desync_factor > max_desync_factor)) { in ipv6_create_tempaddr()
1373 get_random_bytes(&idev->desync_factor, in ipv6_create_tempaddr()
1374 sizeof(idev->desync_factor)); in ipv6_create_tempaddr()
1375 idev->desync_factor %= max_desync_factor; in ipv6_create_tempaddr()
1377 idev->desync_factor = 0; in ipv6_create_tempaddr()
1382 cfg.valid_lft = min_t(__u32, ifp->valid_lft, in ipv6_create_tempaddr()
1383 idev->cnf.temp_valid_lft + age); in ipv6_create_tempaddr()
1384 cfg.preferred_lft = cnf_temp_preferred_lft + age - idev->desync_factor; in ipv6_create_tempaddr()
1385 cfg.preferred_lft = min_t(__u32, ifp->prefered_lft, cfg.preferred_lft); in ipv6_create_tempaddr()
1387 cfg.plen = ifp->prefix_len; in ipv6_create_tempaddr()
1388 tmp_tstamp = ifp->tstamp; in ipv6_create_tempaddr()
1389 spin_unlock_bh(&ifp->lock); in ipv6_create_tempaddr()
1391 write_unlock_bh(&idev->lock); in ipv6_create_tempaddr()
1400 age = (now - tmp_tstamp + ADDRCONF_TIMER_FUZZ_MINUS) / HZ; in ipv6_create_tempaddr()
1404 ret = -1; in ipv6_create_tempaddr()
1410 if (ifp->flags & IFA_F_OPTIMISTIC) in ipv6_create_tempaddr()
1421 write_lock_bh(&idev->lock); in ipv6_create_tempaddr()
1425 spin_lock_bh(&ift->lock); in ipv6_create_tempaddr()
1426 ift->ifpub = ifp; in ipv6_create_tempaddr()
1427 ift->cstamp = now; in ipv6_create_tempaddr()
1428 ift->tstamp = tmp_tstamp; in ipv6_create_tempaddr()
1429 spin_unlock_bh(&ift->lock); in ipv6_create_tempaddr()
1490 if (!net->ipv6.devconf_all->optimistic_dad && !idev->cnf.optimistic_dad) in ipv6_use_optimistic_addr()
1492 if (!net->ipv6.devconf_all->use_optimistic && !idev->cnf.use_optimistic) in ipv6_use_optimistic_addr()
1507 if (!net->ipv6.devconf_all->optimistic_dad && !idev->cnf.optimistic_dad) in ipv6_allow_optimistic_dad()
1523 if (i <= score->rule) { in ipv6_get_saddr_eval()
1526 ret = score->scopedist; in ipv6_get_saddr_eval()
1529 ret = score->matchlen; in ipv6_get_saddr_eval()
1532 ret = !!test_bit(i, score->scorebits); in ipv6_get_saddr_eval()
1540 ret = !!score->ifa; in ipv6_get_saddr_eval()
1544 ret = ipv6_addr_equal(&score->ifa->addr, dst->addr); in ipv6_get_saddr_eval()
1551 * -1 | d 15 in ipv6_get_saddr_eval()
1552 * ---+--+-+---> scope in ipv6_get_saddr_eval()
1555 * B-d | \ in ipv6_get_saddr_eval()
1556 * | \ <- smaller scope is better if in ipv6_get_saddr_eval()
1557 * B-15 | \ if scope is enough for destination. in ipv6_get_saddr_eval()
1558 * | ret = B - scope (-1 <= scope >= d <= 15). in ipv6_get_saddr_eval()
1559 * d-C-1 | / in ipv6_get_saddr_eval()
1560 * |/ <- greater is better in ipv6_get_saddr_eval()
1561 * -C / if scope is not enough for destination. in ipv6_get_saddr_eval()
1562 * /| ret = scope - C (-1 <= d < scope <= 15). in ipv6_get_saddr_eval()
1564 * d - C - 1 < B -15 (for all -1 <= d <= 15). in ipv6_get_saddr_eval()
1565 * C > d + 14 - B >= 15 + 14 - B = 29 - B. in ipv6_get_saddr_eval()
1568 ret = __ipv6_addr_src_scope(score->addr_type); in ipv6_get_saddr_eval()
1569 if (ret >= dst->scope) in ipv6_get_saddr_eval()
1570 ret = -ret; in ipv6_get_saddr_eval()
1572 ret -= 128; /* 30 is enough */ in ipv6_get_saddr_eval()
1573 score->scopedist = ret; in ipv6_get_saddr_eval()
1580 if (!ipv6_use_optimistic_addr(net, score->ifa->idev)) in ipv6_get_saddr_eval()
1582 ret = ipv6_saddr_preferred(score->addr_type) || in ipv6_get_saddr_eval()
1583 !(score->ifa->flags & avoid); in ipv6_get_saddr_eval()
1590 int prefhome = !(dst->prefs & IPV6_PREFER_SRC_COA); in ipv6_get_saddr_eval()
1591 ret = !(score->ifa->flags & IFA_F_HOMEADDRESS) ^ prefhome; in ipv6_get_saddr_eval()
1597 ret = (!dst->ifindex || in ipv6_get_saddr_eval()
1598 dst->ifindex == score->ifa->idev->dev->ifindex); in ipv6_get_saddr_eval()
1603 &score->ifa->addr, score->addr_type, in ipv6_get_saddr_eval()
1604 score->ifa->idev->dev->ifindex) == dst->label; in ipv6_get_saddr_eval()
1611 int preftmp = dst->prefs & (IPV6_PREFER_SRC_PUBLIC|IPV6_PREFER_SRC_TMP) ? in ipv6_get_saddr_eval()
1612 !!(dst->prefs & IPV6_PREFER_SRC_TMP) : in ipv6_get_saddr_eval()
1613 score->ifa->idev->cnf.use_tempaddr >= 2; in ipv6_get_saddr_eval()
1614 ret = (!(score->ifa->flags & IFA_F_TEMPORARY)) ^ preftmp; in ipv6_get_saddr_eval()
1618 /* Rule 8-: Prefer ORCHID vs ORCHID or in ipv6_get_saddr_eval()
1619 * non-ORCHID vs non-ORCHID in ipv6_get_saddr_eval()
1621 ret = !(ipv6_addr_orchid(&score->ifa->addr) ^ in ipv6_get_saddr_eval()
1622 ipv6_addr_orchid(dst->addr)); in ipv6_get_saddr_eval()
1626 ret = ipv6_addr_diff(&score->ifa->addr, dst->addr); in ipv6_get_saddr_eval()
1627 if (ret > score->ifa->prefix_len) in ipv6_get_saddr_eval()
1628 ret = score->ifa->prefix_len; in ipv6_get_saddr_eval()
1629 score->matchlen = ret; in ipv6_get_saddr_eval()
1636 ret = !(score->ifa->flags & IFA_F_OPTIMISTIC); in ipv6_get_saddr_eval()
1644 __set_bit(i, score->scorebits); in ipv6_get_saddr_eval()
1645 score->rule = i; in ipv6_get_saddr_eval()
1656 struct ipv6_saddr_score *score = &scores[1 - hiscore_idx], *hiscore = &scores[hiscore_idx]; in __ipv6_dev_get_saddr()
1658 list_for_each_entry_rcu(score->ifa, &idev->addr_list, if_list) { in __ipv6_dev_get_saddr()
1662 * - Tentative Address (RFC2462 section 5.4) in __ipv6_dev_get_saddr()
1663 * - A tentative address is not considered in __ipv6_dev_get_saddr()
1666 * - Candidate Source Address (section 4) in __ipv6_dev_get_saddr()
1667 * - In any case, anycast addresses, multicast in __ipv6_dev_get_saddr()
1671 if ((score->ifa->flags & IFA_F_TENTATIVE) && in __ipv6_dev_get_saddr()
1672 (!(score->ifa->flags & IFA_F_OPTIMISTIC))) in __ipv6_dev_get_saddr()
1675 score->addr_type = __ipv6_addr_type(&score->ifa->addr); in __ipv6_dev_get_saddr()
1677 if (unlikely(score->addr_type == IPV6_ADDR_ANY || in __ipv6_dev_get_saddr()
1678 score->addr_type & IPV6_ADDR_MULTICAST)) { in __ipv6_dev_get_saddr()
1680 idev->dev->name); in __ipv6_dev_get_saddr()
1684 score->rule = -1; in __ipv6_dev_get_saddr()
1685 bitmap_zero(score->scorebits, IPV6_SADDR_RULE_MAX); in __ipv6_dev_get_saddr()
1695 score->scopedist > 0) { in __ipv6_dev_get_saddr()
1709 hiscore_idx = 1 - hiscore_idx; in __ipv6_dev_get_saddr()
1712 score->ifa = hiscore->ifa; in __ipv6_dev_get_saddr()
1759 dst.ifindex = dst_dev ? dst_dev->ifindex : 0; in ipv6_dev_get_saddr()
1764 scores[hiscore_idx].rule = -1; in ipv6_dev_get_saddr()
1770 * - multicast and link-local destination address, in ipv6_dev_get_saddr()
1775 * (- For site-local destination addresses, the in ipv6_dev_get_saddr()
1780 * - "It is RECOMMENDED that the candidate source addresses in ipv6_dev_get_saddr()
1789 (idev && idev->cnf.use_oif_addrs_only)) { in ipv6_dev_get_saddr()
1807 master_idx = master->ifindex; in ipv6_dev_get_saddr()
1832 if (!hiscore->ifa) in ipv6_dev_get_saddr()
1833 ret = -EADDRNOTAVAIL; in ipv6_dev_get_saddr()
1835 *saddr = hiscore->ifa->addr; in ipv6_dev_get_saddr()
1846 int err = -EADDRNOTAVAIL; in __ipv6_get_lladdr()
1848 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) { in __ipv6_get_lladdr()
1849 if (ifp->scope > IFA_LINK) in __ipv6_get_lladdr()
1851 if (ifp->scope == IFA_LINK && in __ipv6_get_lladdr()
1852 !(ifp->flags & banned_flags)) { in __ipv6_get_lladdr()
1853 *addr = ifp->addr; in __ipv6_get_lladdr()
1865 int err = -EADDRNOTAVAIL; in ipv6_get_lladdr()
1870 read_lock_bh(&idev->lock); in ipv6_get_lladdr()
1872 read_unlock_bh(&idev->lock); in ipv6_get_lladdr()
1884 list_for_each_entry_rcu(ifp, &idev->addr_list, if_list) in ipv6_count_addresses()
1924 ndev = ifp->idev->dev; in __ipv6_chk_addr_and_flags()
1934 ifp_flags = (ifp->flags&IFA_F_OPTIMISTIC) in __ipv6_chk_addr_and_flags()
1935 ? (ifp->flags&~IFA_F_TENTATIVE) in __ipv6_chk_addr_and_flags()
1936 : ifp->flags; in __ipv6_chk_addr_and_flags()
1937 if (ipv6_addr_equal(&ifp->addr, addr) && in __ipv6_chk_addr_and_flags()
1940 !(ifp->scope&(IFA_LINK|IFA_HOST) || strict))) { in __ipv6_chk_addr_and_flags()
1973 list_for_each_entry_rcu(ifa, &idev->addr_list, if_list) { in ipv6_chk_custom_prefix()
1974 ret = ipv6_prefix_equal(addr, &ifa->addr, prefix_len); in ipv6_chk_custom_prefix()
1995 list_for_each_entry_rcu(ifa, &idev->addr_list, if_list) { in ipv6_chk_prefix()
1996 onlink = ipv6_prefix_equal(addr, &ifa->addr, in ipv6_chk_prefix()
1997 ifa->prefix_len); in ipv6_chk_prefix()
2008 * ipv6_dev_find - find the first device with a given source address.
2030 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_get_ifaddr()
2032 if (ipv6_addr_equal(&ifp->addr, addr)) { in ipv6_get_ifaddr()
2033 if (!dev || ifp->idev->dev == dev || in ipv6_get_ifaddr()
2034 !(ifp->scope&(IFA_LINK|IFA_HOST) || strict)) { in ipv6_get_ifaddr()
2051 ifp->flags |= IFA_F_DADFAILED; in addrconf_dad_stop()
2053 if (ifp->flags&IFA_F_TEMPORARY) { in addrconf_dad_stop()
2055 spin_lock_bh(&ifp->lock); in addrconf_dad_stop()
2056 ifpub = ifp->ifpub; in addrconf_dad_stop()
2059 spin_unlock_bh(&ifp->lock); in addrconf_dad_stop()
2063 spin_unlock_bh(&ifp->lock); in addrconf_dad_stop()
2066 } else if (ifp->flags&IFA_F_PERMANENT || !dad_failed) { in addrconf_dad_stop()
2067 spin_lock_bh(&ifp->lock); in addrconf_dad_stop()
2069 ifp->flags |= IFA_F_TENTATIVE; in addrconf_dad_stop()
2071 ifp->flags &= ~IFA_F_OPTIMISTIC; in addrconf_dad_stop()
2072 spin_unlock_bh(&ifp->lock); in addrconf_dad_stop()
2083 int err = -ENOENT; in addrconf_dad_end()
2085 spin_lock_bh(&ifp->lock); in addrconf_dad_end()
2086 if (ifp->state == INET6_IFADDR_STATE_DAD) { in addrconf_dad_end()
2087 ifp->state = INET6_IFADDR_STATE_POSTDAD; in addrconf_dad_end()
2090 spin_unlock_bh(&ifp->lock); in addrconf_dad_end()
2097 struct inet6_dev *idev = ifp->idev; in addrconf_dad_failure()
2098 struct net *net = dev_net(ifp->idev->dev); in addrconf_dad_failure()
2106 ifp->idev->dev->name, &ifp->addr, eth_hdr(skb)->h_source); in addrconf_dad_failure()
2108 spin_lock_bh(&ifp->lock); in addrconf_dad_failure()
2110 if (ifp->flags & IFA_F_STABLE_PRIVACY) { in addrconf_dad_failure()
2113 int retries = ifp->stable_privacy_retry + 1; in addrconf_dad_failure()
2116 .plen = ifp->prefix_len, in addrconf_dad_failure()
2117 .ifa_flags = ifp->flags, in addrconf_dad_failure()
2118 .valid_lft = ifp->valid_lft, in addrconf_dad_failure()
2119 .preferred_lft = ifp->prefered_lft, in addrconf_dad_failure()
2120 .scope = ifp->scope, in addrconf_dad_failure()
2123 if (retries > net->ipv6.sysctl.idgen_retries) { in addrconf_dad_failure()
2125 ifp->idev->dev->name); in addrconf_dad_failure()
2129 new_addr = ifp->addr; in addrconf_dad_failure()
2134 spin_unlock_bh(&ifp->lock); in addrconf_dad_failure()
2136 if (idev->cnf.max_addresses && in addrconf_dad_failure()
2138 idev->cnf.max_addresses) in addrconf_dad_failure()
2142 ifp->idev->dev->name); in addrconf_dad_failure()
2148 spin_lock_bh(&ifp2->lock); in addrconf_dad_failure()
2149 ifp2->stable_privacy_retry = retries; in addrconf_dad_failure()
2150 ifp2->state = INET6_IFADDR_STATE_PREDAD; in addrconf_dad_failure()
2151 spin_unlock_bh(&ifp2->lock); in addrconf_dad_failure()
2153 addrconf_mod_dad_work(ifp2, net->ipv6.sysctl.idgen_delay); in addrconf_dad_failure()
2156 spin_lock_bh(&ifp->lock); in addrconf_dad_failure()
2161 ifp->state = INET6_IFADDR_STATE_ERRDAD; in addrconf_dad_failure()
2162 spin_unlock_bh(&ifp->lock); in addrconf_dad_failure()
2174 if (dev->flags&(IFF_LOOPBACK|IFF_NOARP)) in addrconf_join_solict()
2186 if (idev->dev->flags&(IFF_LOOPBACK|IFF_NOARP)) in addrconf_leave_solict()
2198 if (ifp->prefix_len >= 127) /* RFC 6164 */ in addrconf_join_anycast()
2200 ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len); in addrconf_join_anycast()
2203 __ipv6_dev_ac_inc(ifp->idev, &addr); in addrconf_join_anycast()
2211 if (ifp->prefix_len >= 127) /* RFC 6164 */ in addrconf_leave_anycast()
2213 ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len); in addrconf_leave_anycast()
2216 __ipv6_dev_ac_dec(ifp->idev, &addr); in addrconf_leave_anycast()
2221 switch (dev->addr_len) { in addrconf_ifid_6lowpan()
2223 memcpy(eui, dev->dev_addr, 3); in addrconf_ifid_6lowpan()
2226 memcpy(eui + 5, dev->dev_addr + 3, 3); in addrconf_ifid_6lowpan()
2229 memcpy(eui, dev->dev_addr, EUI64_ADDR_LEN); in addrconf_ifid_6lowpan()
2233 return -1; in addrconf_ifid_6lowpan()
2243 if (dev->addr_len != FWNET_ALEN) in addrconf_ifid_ieee1394()
2244 return -1; in addrconf_ifid_ieee1394()
2246 ha = (union fwnet_hwaddr *)dev->dev_addr; in addrconf_ifid_ieee1394()
2248 memcpy(eui, &ha->uc.uniq_id, sizeof(ha->uc.uniq_id)); in addrconf_ifid_ieee1394()
2255 /* XXX: inherit EUI-64 from other interface -- yoshfuji */ in addrconf_ifid_arcnet()
2256 if (dev->addr_len != ARCNET_ALEN) in addrconf_ifid_arcnet()
2257 return -1; in addrconf_ifid_arcnet()
2259 eui[7] = *(u8 *)dev->dev_addr; in addrconf_ifid_arcnet()
2265 if (dev->addr_len != INFINIBAND_ALEN) in addrconf_ifid_infiniband()
2266 return -1; in addrconf_ifid_infiniband()
2267 memcpy(eui, dev->dev_addr + 12, 8); in addrconf_ifid_infiniband()
2275 return -1; in __ipv6_isatap_ifid()
2291 if (dev->priv_flags & IFF_ISATAP) in addrconf_ifid_sit()
2292 return __ipv6_isatap_ifid(eui, *(__be32 *)dev->dev_addr); in addrconf_ifid_sit()
2293 return -1; in addrconf_ifid_sit()
2298 return __ipv6_isatap_ifid(eui, *(__be32 *)dev->dev_addr); in addrconf_ifid_gre()
2303 memcpy(eui, dev->perm_addr, 3); in addrconf_ifid_ip6tnl()
2304 memcpy(eui + 5, dev->perm_addr + 3, 3); in addrconf_ifid_ip6tnl()
2313 switch (dev->type) { in ipv6_generate_eui64()
2335 return -1; in ipv6_generate_eui64()
2340 int err = -1; in ipv6_inherit_eui64()
2343 read_lock_bh(&idev->lock); in ipv6_inherit_eui64()
2344 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) { in ipv6_inherit_eui64()
2345 if (ifp->scope > IFA_LINK) in ipv6_inherit_eui64()
2347 if (ifp->scope == IFA_LINK && !(ifp->flags&IFA_F_TENTATIVE)) { in ipv6_inherit_eui64()
2348 memcpy(eui, ifp->addr.s6_addr+8, 8); in ipv6_inherit_eui64()
2353 read_unlock_bh(&idev->lock); in ipv6_inherit_eui64()
2358 * draft-ietf-6man-rfc4941bis, Section 3.3.1
2364 get_random_bytes(&addr->s6_addr[8], 8); in ipv6_gen_rnd_iid()
2366 /* <draft-ietf-6man-rfc4941bis-08.txt>, Section 3.3.1: in ipv6_gen_rnd_iid()
2369 * - Reserved IPv6 Interface Identifers in ipv6_gen_rnd_iid()
2370 * - XXX: already assigned to an address on the device in ipv6_gen_rnd_iid()
2373 /* Subnet-router anycast: 0000:0000:0000:0000 */ in ipv6_gen_rnd_iid()
2374 if (!(addr->s6_addr32[2] | addr->s6_addr32[3])) in ipv6_gen_rnd_iid()
2377 /* IANA Ethernet block: 0200:5EFF:FE00:0000-0200:5EFF:FE00:5212 in ipv6_gen_rnd_iid()
2379 * IANA Ethernet block: 0200:5EFF:FE00:5214-0200:5EFF:FEFF:FFFF in ipv6_gen_rnd_iid()
2381 if (ntohl(addr->s6_addr32[2]) == 0x02005eff && in ipv6_gen_rnd_iid()
2382 (ntohl(addr->s6_addr32[3]) & 0Xff000000) == 0xfe000000) in ipv6_gen_rnd_iid()
2386 if (ntohl(addr->s6_addr32[2]) == 0xfdffffff && in ipv6_gen_rnd_iid()
2387 ntohl(addr->s6_addr32[3]) >= 0Xffffff80) in ipv6_gen_rnd_iid()
2399 sysctl = idev->cnf.accept_ra_rt_table; in addrconf_rt_table()
2405 table = (unsigned) dev->ifindex + (-sysctl); in addrconf_rt_table()
2412 * Add prefix route.
2423 .fc_ifindex = dev->ifindex, in addrconf_prefix_route()
2434 /* Prevent useless cloning on PtP SIT. in addrconf_prefix_route()
2436 class of non-broadcast devices need not cloning. in addrconf_prefix_route()
2439 if (dev->type == ARPHRD_SIT && (dev->flags & IFF_POINTOPOINT)) in addrconf_prefix_route()
2463 fn = fib6_locate(&table->tb6_root, pfx, plen, NULL, 0, true); in addrconf_get_prefix_route()
2469 if (rt->nh) in addrconf_get_prefix_route()
2472 if (rt->fib6_nh->fib_nh_dev->ifindex != dev->ifindex) in addrconf_get_prefix_route()
2474 if (no_gw && rt->fib6_nh->fib_nh_gw_family) in addrconf_get_prefix_route()
2476 if ((rt->fib6_flags & flags) != flags) in addrconf_get_prefix_route()
2478 if ((rt->fib6_flags & noflags) != 0) in addrconf_get_prefix_route()
2490 /* Create "default" multicast route to the interface */
2497 .fc_ifindex = dev->ifindex, in addrconf_add_mroute()
2520 if (idev->cnf.disable_ipv6) in addrconf_add_dev()
2521 return ERR_PTR(-EACCES); in addrconf_add_dev()
2523 /* Add default multicast route */ in addrconf_add_dev()
2524 if (!(dev->flags & IFF_LOOPBACK) && !netif_is_l3_master(dev)) in addrconf_add_dev()
2538 read_lock_bh(&idev->lock); in manage_tempaddrs()
2540 list_for_each_entry(ift, &idev->tempaddr_list, tmp_list) { in manage_tempaddrs()
2543 if (ifp != ift->ifpub) in manage_tempaddrs()
2552 * (TEMP_PREFERRED_LIFETIME - DESYNC_FACTOR), respectively. in manage_tempaddrs()
2554 age = (now - ift->cstamp) / HZ; in manage_tempaddrs()
2555 max_valid = idev->cnf.temp_valid_lft - age; in manage_tempaddrs()
2559 max_prefered = idev->cnf.temp_prefered_lft - in manage_tempaddrs()
2560 idev->desync_factor - age; in manage_tempaddrs()
2570 spin_lock(&ift->lock); in manage_tempaddrs()
2571 flags = ift->flags; in manage_tempaddrs()
2572 ift->valid_lft = valid_lft; in manage_tempaddrs()
2573 ift->prefered_lft = prefered_lft; in manage_tempaddrs()
2574 ift->tstamp = now; in manage_tempaddrs()
2576 ift->flags &= ~IFA_F_DEPRECATED; in manage_tempaddrs()
2578 spin_unlock(&ift->lock); in manage_tempaddrs()
2583 if ((create || list_empty(&idev->tempaddr_list)) && in manage_tempaddrs()
2584 idev->cnf.use_tempaddr > 0) { in manage_tempaddrs()
2590 read_unlock_bh(&idev->lock); in manage_tempaddrs()
2593 read_unlock_bh(&idev->lock); in manage_tempaddrs()
2599 return idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_STABLE_PRIVACY || in is_addr_mode_generate_stable()
2600 idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_RANDOM; in is_addr_mode_generate_stable()
2614 int max_addresses = in6_dev->cnf.max_addresses; in addrconf_prefix_rcv_add_addr()
2617 .plen = pinfo->prefix_len, in addrconf_prefix_rcv_add_addr()
2625 if ((net->ipv6.devconf_all->optimistic_dad || in addrconf_prefix_rcv_add_addr()
2626 in6_dev->cnf.optimistic_dad) && in addrconf_prefix_rcv_add_addr()
2627 !net->ipv6.devconf_all->forwarding && sllao) in addrconf_prefix_rcv_add_addr()
2639 return -1; in addrconf_prefix_rcv_add_addr()
2642 spin_lock_bh(&ifp->lock); in addrconf_prefix_rcv_add_addr()
2643 ifp->flags |= IFA_F_MANAGETEMPADDR; in addrconf_prefix_rcv_add_addr()
2644 ifp->cstamp = jiffies; in addrconf_prefix_rcv_add_addr()
2645 ifp->tokenized = tokenized; in addrconf_prefix_rcv_add_addr()
2646 spin_unlock_bh(&ifp->lock); in addrconf_prefix_rcv_add_addr()
2656 spin_lock_bh(&ifp->lock); in addrconf_prefix_rcv_add_addr()
2658 if (ifp->valid_lft > (now - ifp->tstamp) / HZ) in addrconf_prefix_rcv_add_addr()
2659 stored_lft = ifp->valid_lft - (now - ifp->tstamp) / HZ; in addrconf_prefix_rcv_add_addr()
2681 ifp->valid_lft = valid_lft; in addrconf_prefix_rcv_add_addr()
2682 ifp->prefered_lft = prefered_lft; in addrconf_prefix_rcv_add_addr()
2683 ifp->tstamp = now; in addrconf_prefix_rcv_add_addr()
2684 flags = ifp->flags; in addrconf_prefix_rcv_add_addr()
2685 ifp->flags &= ~IFA_F_DEPRECATED; in addrconf_prefix_rcv_add_addr()
2686 spin_unlock_bh(&ifp->lock); in addrconf_prefix_rcv_add_addr()
2691 spin_unlock_bh(&ifp->lock); in addrconf_prefix_rcv_add_addr()
2725 addr_type = ipv6_addr_type(&pinfo->prefix); in addrconf_prefix_rcv()
2730 valid_lft = ntohl(pinfo->valid); in addrconf_prefix_rcv()
2731 prefered_lft = ntohl(pinfo->prefered); in addrconf_prefix_rcv()
2742 dev->name); in addrconf_prefix_rcv()
2748 * 1) Add routes for on-link prefixes in addrconf_prefix_rcv()
2752 if (pinfo->onlink) { in addrconf_prefix_rcv()
2769 rt = addrconf_get_prefix_route(&pinfo->prefix, in addrconf_prefix_rcv()
2770 pinfo->prefix_len, in addrconf_prefix_rcv()
2776 /* Autoconf prefix route */ in addrconf_prefix_rcv()
2794 addrconf_prefix_route(&pinfo->prefix, pinfo->prefix_len, in addrconf_prefix_rcv()
2803 if (pinfo->autoconf && in6_dev->cnf.autoconf) { in addrconf_prefix_rcv()
2807 if (pinfo->prefix_len == 64) { in addrconf_prefix_rcv()
2808 memcpy(&addr, &pinfo->prefix, 8); in addrconf_prefix_rcv()
2810 if (!ipv6_addr_any(&in6_dev->token)) { in addrconf_prefix_rcv()
2811 read_lock_bh(&in6_dev->lock); in addrconf_prefix_rcv()
2813 in6_dev->token.s6_addr + 8, 8); in addrconf_prefix_rcv()
2814 read_unlock_bh(&in6_dev->lock); in addrconf_prefix_rcv()
2830 pinfo->prefix_len); in addrconf_prefix_rcv()
2862 if (!(ipv6_addr_type(&ireq->ifr6_addr) & IPV6_ADDR_COMPATv4)) in addrconf_set_sit_dstaddr()
2863 return -EADDRNOTAVAIL; in addrconf_set_sit_dstaddr()
2865 p.iph.daddr = ireq->ifr6_addr.s6_addr32[3]; in addrconf_set_sit_dstaddr()
2871 if (!dev->netdev_ops->ndo_tunnel_ctl) in addrconf_set_sit_dstaddr()
2872 return -EOPNOTSUPP; in addrconf_set_sit_dstaddr()
2873 err = dev->netdev_ops->ndo_tunnel_ctl(dev, &p, SIOCADDTUNNEL); in addrconf_set_sit_dstaddr()
2879 return -ENOBUFS; in addrconf_set_sit_dstaddr()
2892 int err = -ENODEV; in addrconf_set_dstaddr()
2895 return -ENODEV; in addrconf_set_dstaddr()
2897 return -EFAULT; in addrconf_set_dstaddr()
2901 if (dev && dev->type == ARPHRD_SIT) in addrconf_set_dstaddr()
2940 if (cfg->plen > 128) in inet6_addr_add()
2941 return -EINVAL; in inet6_addr_add()
2944 if (!cfg->valid_lft || cfg->preferred_lft > cfg->valid_lft) in inet6_addr_add()
2945 return -EINVAL; in inet6_addr_add()
2947 if (cfg->ifa_flags & IFA_F_MANAGETEMPADDR && cfg->plen != 64) in inet6_addr_add()
2948 return -EINVAL; in inet6_addr_add()
2952 return -ENODEV; in inet6_addr_add()
2958 if (cfg->ifa_flags & IFA_F_MCAUTOJOIN) { in inet6_addr_add()
2959 int ret = ipv6_mc_config(net->ipv6.mc_autojoin_sk, in inet6_addr_add()
2960 true, cfg->pfx, ifindex); in inet6_addr_add()
2966 cfg->scope = ipv6_addr_scope(cfg->pfx); in inet6_addr_add()
2968 timeout = addrconf_timeout_fixup(cfg->valid_lft, HZ); in inet6_addr_add()
2971 cfg->valid_lft = timeout; in inet6_addr_add()
2976 cfg->ifa_flags |= IFA_F_PERMANENT; in inet6_addr_add()
2979 timeout = addrconf_timeout_fixup(cfg->preferred_lft, HZ); in inet6_addr_add()
2982 cfg->ifa_flags |= IFA_F_DEPRECATED; in inet6_addr_add()
2983 cfg->preferred_lft = timeout; in inet6_addr_add()
2988 if (!(cfg->ifa_flags & IFA_F_NOPREFIXROUTE)) { in inet6_addr_add()
2989 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, in inet6_addr_add()
2990 ifp->rt_priority, dev, expires, in inet6_addr_add()
2997 if (!(ifp->flags & (IFA_F_OPTIMISTIC | IFA_F_NODAD))) in inet6_addr_add()
3005 if (cfg->ifa_flags & IFA_F_MANAGETEMPADDR) in inet6_addr_add()
3006 manage_tempaddrs(idev, ifp, cfg->valid_lft, in inet6_addr_add()
3007 cfg->preferred_lft, true, jiffies); in inet6_addr_add()
3011 } else if (cfg->ifa_flags & IFA_F_MCAUTOJOIN) { in inet6_addr_add()
3012 ipv6_mc_config(net->ipv6.mc_autojoin_sk, false, in inet6_addr_add()
3013 cfg->pfx, ifindex); in inet6_addr_add()
3027 return -EINVAL; in inet6_addr_del()
3031 return -ENODEV; in inet6_addr_del()
3035 return -ENXIO; in inet6_addr_del()
3037 read_lock_bh(&idev->lock); in inet6_addr_del()
3038 list_for_each_entry(ifp, &idev->addr_list, if_list) { in inet6_addr_del()
3039 if (ifp->prefix_len == plen && in inet6_addr_del()
3040 ipv6_addr_equal(pfx, &ifp->addr)) { in inet6_addr_del()
3042 read_unlock_bh(&idev->lock); in inet6_addr_del()
3044 if (!(ifp->flags & IFA_F_TEMPORARY) && in inet6_addr_del()
3051 ipv6_mc_config(net->ipv6.mc_autojoin_sk, in inet6_addr_del()
3052 false, pfx, dev->ifindex); in inet6_addr_del()
3057 read_unlock_bh(&idev->lock); in inet6_addr_del()
3058 return -EADDRNOTAVAIL; in inet6_addr_del()
3072 if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) in addrconf_add_ifaddr()
3073 return -EPERM; in addrconf_add_ifaddr()
3076 return -EFAULT; in addrconf_add_ifaddr()
3092 if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) in addrconf_del_ifaddr()
3093 return -EPERM; in addrconf_del_ifaddr()
3096 return -EFAULT; in addrconf_del_ifaddr()
3120 spin_lock_bh(&ifp->lock); in add_addr()
3121 ifp->flags &= ~IFA_F_TENTATIVE; in add_addr()
3122 spin_unlock_bh(&ifp->lock); in add_addr()
3123 rt_genid_bump_ipv6(dev_net(idev->dev)); in add_addr()
3134 struct net *net = dev_net(idev->dev); in sit_add_v4_addrs()
3141 memcpy(&addr.s6_addr32[3], idev->dev->dev_addr, 4); in sit_add_v4_addrs()
3143 if (idev->dev->flags&IFF_POINTOPOINT) { in sit_add_v4_addrs()
3144 if (idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_NONE) in sit_add_v4_addrs()
3158 addrconf_prefix_route(&addr, plen, 0, idev->dev, 0, pflags, in sit_add_v4_addrs()
3165 if (in_dev && (dev->flags & IFF_UP)) { in sit_add_v4_addrs()
3170 addr.s6_addr32[3] = ifa->ifa_local; in sit_add_v4_addrs()
3172 if (ifa->ifa_scope == RT_SCOPE_LINK) in sit_add_v4_addrs()
3174 if (ifa->ifa_scope >= RT_SCOPE_HOST) { in sit_add_v4_addrs()
3175 if (idev->dev->flags&IFF_POINTOPOINT) in sit_add_v4_addrs()
3181 addrconf_prefix_route(&addr, plen, 0, idev->dev, in sit_add_v4_addrs()
3220 if ((dev_net(idev->dev)->ipv6.devconf_all->optimistic_dad || in addrconf_add_linklocal()
3221 idev->cnf.optimistic_dad) && in addrconf_add_linklocal()
3222 !dev_net(idev->dev)->ipv6.devconf_all->forwarding) in addrconf_add_linklocal()
3228 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, 0, idev->dev, in addrconf_add_linklocal()
3272 struct net *net = dev_net(idev->dev); in ipv6_generate_stable_address()
3276 if (idev->cnf.stable_secret.initialized) in ipv6_generate_stable_address()
3277 secret = idev->cnf.stable_secret.secret; in ipv6_generate_stable_address()
3278 else if (net->ipv6.devconf_dflt->stable_secret.initialized) in ipv6_generate_stable_address()
3279 secret = net->ipv6.devconf_dflt->stable_secret.secret; in ipv6_generate_stable_address()
3281 return -1; in ipv6_generate_stable_address()
3289 memcpy(data.hwaddr, idev->dev->perm_addr, idev->dev->addr_len); in ipv6_generate_stable_address()
3290 data.prefix[0] = address->s6_addr32[0]; in ipv6_generate_stable_address()
3291 data.prefix[1] = address->s6_addr32[1]; in ipv6_generate_stable_address()
3305 if (dad_count > dev_net(idev->dev)->ipv6.sysctl.idgen_retries) in ipv6_generate_stable_address()
3306 return -1; in ipv6_generate_stable_address()
3316 struct ipv6_stable_secret *s = &idev->cnf.stable_secret; in ipv6_gen_mode_random_init()
3318 if (s->initialized) in ipv6_gen_mode_random_init()
3320 s = &idev->cnf.stable_secret; in ipv6_gen_mode_random_init()
3321 get_random_bytes(&s->secret, sizeof(s->secret)); in ipv6_gen_mode_random_init()
3322 s->initialized = true; in ipv6_gen_mode_random_init()
3330 if (netif_is_l3_master(idev->dev)) in addrconf_addr_gen()
3334 if (idev->dev->flags & IFF_SLAVE) in addrconf_addr_gen()
3339 switch (idev->cnf.addr_gen_mode) { in addrconf_addr_gen()
3348 addrconf_prefix_route(&addr, 64, 0, idev->dev, in addrconf_addr_gen()
3356 if (ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) == 0) in addrconf_addr_gen()
3359 addrconf_prefix_route(&addr, 64, 0, idev->dev, in addrconf_addr_gen()
3376 if ((dev->type != ARPHRD_ETHER) && in addrconf_dev_config()
3377 (dev->type != ARPHRD_FDDI) && in addrconf_dev_config()
3378 (dev->type != ARPHRD_ARCNET) && in addrconf_dev_config()
3379 (dev->type != ARPHRD_INFINIBAND) && in addrconf_dev_config()
3380 (dev->type != ARPHRD_IEEE1394) && in addrconf_dev_config()
3381 (dev->type != ARPHRD_TUNNEL6) && in addrconf_dev_config()
3382 (dev->type != ARPHRD_6LOWPAN) && in addrconf_dev_config()
3383 (dev->type != ARPHRD_IP6GRE) && in addrconf_dev_config()
3384 (dev->type != ARPHRD_IPGRE) && in addrconf_dev_config()
3385 (dev->type != ARPHRD_TUNNEL) && in addrconf_dev_config()
3386 (dev->type != ARPHRD_NONE) && in addrconf_dev_config()
3387 (dev->type != ARPHRD_RAWIP)) { in addrconf_dev_config()
3390 if (!IS_ERR_OR_NULL(idev) && dev->flags & IFF_UP && in addrconf_dev_config()
3391 dev->flags & IFF_MULTICAST) in addrconf_dev_config()
3405 if (dev->type == ARPHRD_NONE && in addrconf_dev_config()
3406 idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_EUI64) in addrconf_dev_config()
3407 idev->cnf.addr_gen_mode = IN6_ADDR_GEN_MODE_RANDOM; in addrconf_dev_config()
3431 if (dev->priv_flags & IFF_ISATAP) { in addrconf_sit_config()
3438 if (dev->flags&IFF_POINTOPOINT) in addrconf_sit_config()
3457 if (dev->flags & IFF_POINTOPOINT) in addrconf_gre_config()
3466 /* !fib6_node means the host route was removed from the in fixup_permanent_addr()
3468 * case regenerate the host route. in fixup_permanent_addr()
3470 if (!ifp->rt || !ifp->rt->fib6_node) { in fixup_permanent_addr()
3473 f6i = addrconf_f6i_alloc(net, idev, &ifp->addr, false, in fixup_permanent_addr()
3478 /* ifp->rt can be accessed outside of rtnl */ in fixup_permanent_addr()
3479 spin_lock(&ifp->lock); in fixup_permanent_addr()
3480 prev = ifp->rt; in fixup_permanent_addr()
3481 ifp->rt = f6i; in fixup_permanent_addr()
3482 spin_unlock(&ifp->lock); in fixup_permanent_addr()
3487 if (!(ifp->flags & IFA_F_NOPREFIXROUTE)) { in fixup_permanent_addr()
3488 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, in fixup_permanent_addr()
3489 ifp->rt_priority, idev->dev, 0, 0, in fixup_permanent_addr()
3493 if (ifp->state == INET6_IFADDR_STATE_PREDAD) in fixup_permanent_addr()
3508 write_lock_bh(&idev->lock); in addrconf_permanent_addr()
3510 list_for_each_entry_safe(ifp, tmp, &idev->addr_list, if_list) { in addrconf_permanent_addr()
3511 if ((ifp->flags & IFA_F_PERMANENT) && in addrconf_permanent_addr()
3513 write_unlock_bh(&idev->lock); in addrconf_permanent_addr()
3516 write_lock_bh(&idev->lock); in addrconf_permanent_addr()
3518 net_info_ratelimited("%s: Failed to add prefix route for address %pI6c; dropping\n", in addrconf_permanent_addr()
3519 idev->dev->name, &ifp->addr); in addrconf_permanent_addr()
3523 write_unlock_bh(&idev->lock); in addrconf_permanent_addr()
3539 if (!idev && dev->mtu >= IPV6_MIN_MTU) { in addrconf_notify()
3548 if (dev->mtu < IPV6_MIN_MTU) { in addrconf_notify()
3549 addrconf_ifdown(dev, dev != net->loopback_dev); in addrconf_notify()
3554 rt6_mtu_change(dev, dev->mtu); in addrconf_notify()
3555 idev->cnf.mtu6 = dev->mtu; in addrconf_notify()
3565 if (!(idev->if_flags & IF_READY)) in addrconf_notify()
3572 if (dev->flags & IFF_SLAVE) in addrconf_notify()
3575 if (idev && idev->cnf.disable_ipv6) in addrconf_notify()
3585 dev->name); in addrconf_notify()
3589 if (!idev && dev->mtu >= IPV6_MIN_MTU) in addrconf_notify()
3593 idev->if_flags |= IF_READY; in addrconf_notify()
3604 if (idev->if_flags & IF_READY) { in addrconf_notify()
3605 /* device is already configured - in addrconf_notify()
3612 if (change_info->flags_changed & IFF_NOARP) in addrconf_notify()
3617 idev->if_flags |= IF_READY; in addrconf_notify()
3621 dev->name); in addrconf_notify()
3626 switch (dev->type) { in addrconf_notify()
3658 if (idev->cnf.mtu6 != dev->mtu && in addrconf_notify()
3659 dev->mtu >= IPV6_MIN_MTU) { in addrconf_notify()
3660 rt6_mtu_change(dev, dev->mtu); in addrconf_notify()
3661 idev->cnf.mtu6 = dev->mtu; in addrconf_notify()
3663 idev->tstamp = jiffies; in addrconf_notify()
3670 if (dev->mtu < IPV6_MIN_MTU) in addrconf_notify()
3671 addrconf_ifdown(dev, dev != net->loopback_dev); in addrconf_notify()
3710 if (info->upper_dev && netif_is_l3_master(info->upper_dev)) in addrconf_notify()
3761 return -ENODEV; in addrconf_ifdown()
3768 idev->dead = 1; in addrconf_ifdown()
3771 RCU_INIT_POINTER(dev->ip6_ptr, NULL); in addrconf_ifdown()
3781 if (!unregister && !idev->cnf.disable_ipv6) { in addrconf_ifdown()
3783 int _keep_addr = net->ipv6.devconf_all->keep_addr_on_down; in addrconf_ifdown()
3786 _keep_addr = idev->cnf.keep_addr_on_down; in addrconf_ifdown()
3798 if (ifa->idev == idev) { in addrconf_ifdown()
3804 !(ifa->flags & IFA_F_PERMANENT) || in addrconf_ifdown()
3805 addr_is_local(&ifa->addr)) { in addrconf_ifdown()
3806 hlist_del_init_rcu(&ifa->addr_lst); in addrconf_ifdown()
3814 write_lock_bh(&idev->lock); in addrconf_ifdown()
3821 was_ready = idev->if_flags & IF_READY; in addrconf_ifdown()
3823 idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD|IF_READY); in addrconf_ifdown()
3826 while (!list_empty(&idev->tempaddr_list)) { in addrconf_ifdown()
3827 ifa = list_first_entry(&idev->tempaddr_list, in addrconf_ifdown()
3829 list_del(&ifa->tmp_list); in addrconf_ifdown()
3830 write_unlock_bh(&idev->lock); in addrconf_ifdown()
3831 spin_lock_bh(&ifa->lock); in addrconf_ifdown()
3833 if (ifa->ifpub) { in addrconf_ifdown()
3834 in6_ifa_put(ifa->ifpub); in addrconf_ifdown()
3835 ifa->ifpub = NULL; in addrconf_ifdown()
3837 spin_unlock_bh(&ifa->lock); in addrconf_ifdown()
3839 write_lock_bh(&idev->lock); in addrconf_ifdown()
3842 list_for_each_entry(ifa, &idev->addr_list, if_list) in addrconf_ifdown()
3843 list_add_tail(&ifa->if_list_aux, &tmp_addr_list); in addrconf_ifdown()
3844 write_unlock_bh(&idev->lock); in addrconf_ifdown()
3852 list_del(&ifa->if_list_aux); in addrconf_ifdown()
3856 keep = keep_addr && (ifa->flags & IFA_F_PERMANENT) && in addrconf_ifdown()
3857 !addr_is_local(&ifa->addr); in addrconf_ifdown()
3859 spin_lock_bh(&ifa->lock); in addrconf_ifdown()
3864 ifa->state = INET6_IFADDR_STATE_PREDAD; in addrconf_ifdown()
3865 if (!(ifa->flags & IFA_F_NODAD)) in addrconf_ifdown()
3866 ifa->flags |= IFA_F_TENTATIVE; in addrconf_ifdown()
3868 rt = ifa->rt; in addrconf_ifdown()
3869 ifa->rt = NULL; in addrconf_ifdown()
3871 state = ifa->state; in addrconf_ifdown()
3872 ifa->state = INET6_IFADDR_STATE_DEAD; in addrconf_ifdown()
3875 spin_unlock_bh(&ifa->lock); in addrconf_ifdown()
3884 if (idev->cnf.forwarding) in addrconf_ifdown()
3886 addrconf_leave_solict(ifa->idev, &ifa->addr); in addrconf_ifdown()
3890 write_lock_bh(&idev->lock); in addrconf_ifdown()
3891 list_del_rcu(&ifa->if_list); in addrconf_ifdown()
3892 write_unlock_bh(&idev->lock); in addrconf_ifdown()
3905 idev->tstamp = jiffies; in addrconf_ifdown()
3910 neigh_parms_release(&nd_tbl, idev->nd_parms); in addrconf_ifdown()
3920 struct net_device *dev = idev->dev; in addrconf_rs_timer()
3923 write_lock(&idev->lock); in addrconf_rs_timer()
3924 if (idev->dead || !(idev->if_flags & IF_READY)) in addrconf_rs_timer()
3931 if (idev->if_flags & IF_RA_RCVD) in addrconf_rs_timer()
3934 if (idev->rs_probes++ < idev->cnf.rtr_solicits || idev->cnf.rtr_solicits < 0) { in addrconf_rs_timer()
3935 write_unlock(&idev->lock); in addrconf_rs_timer()
3942 write_lock(&idev->lock); in addrconf_rs_timer()
3943 idev->rs_interval = rfc3315_s14_backoff_update( in addrconf_rs_timer()
3944 idev->rs_interval, idev->cnf.rtr_solicit_max_interval); in addrconf_rs_timer()
3946 addrconf_mod_rs_timer(idev, (idev->rs_probes == in addrconf_rs_timer()
3947 idev->cnf.rtr_solicits) ? in addrconf_rs_timer()
3948 idev->cnf.rtr_solicit_delay : in addrconf_rs_timer()
3949 idev->rs_interval); in addrconf_rs_timer()
3952 * Note: we do not support deprecated "all on-link" in addrconf_rs_timer()
3955 pr_debug("%s: no IPv6 routers present\n", idev->dev->name); in addrconf_rs_timer()
3959 write_unlock(&idev->lock); in addrconf_rs_timer()
3970 struct inet6_dev *idev = ifp->idev; in addrconf_dad_kick()
3973 if (ifp->flags & IFA_F_OPTIMISTIC) in addrconf_dad_kick()
3976 rand_num = prandom_u32() % (idev->cnf.rtr_solicit_delay ? : 1); in addrconf_dad_kick()
3979 if (idev->cnf.enhanced_dad || in addrconf_dad_kick()
3980 dev_net(idev->dev)->ipv6.devconf_all->enhanced_dad) { in addrconf_dad_kick()
3985 ifp->dad_nonce = nonce; in addrconf_dad_kick()
3986 ifp->dad_probes = idev->cnf.dad_transmits; in addrconf_dad_kick()
3992 struct inet6_dev *idev = ifp->idev; in addrconf_dad_begin()
3993 struct net_device *dev = idev->dev; in addrconf_dad_begin()
3997 addrconf_join_solict(dev, &ifp->addr); in addrconf_dad_begin()
3999 prandom_seed((__force u32) ifp->addr.s6_addr32[3]); in addrconf_dad_begin()
4001 read_lock_bh(&idev->lock); in addrconf_dad_begin()
4002 spin_lock(&ifp->lock); in addrconf_dad_begin()
4003 if (ifp->state == INET6_IFADDR_STATE_DEAD) in addrconf_dad_begin()
4007 if (dev->flags&(IFF_NOARP|IFF_LOOPBACK) || in addrconf_dad_begin()
4008 (net->ipv6.devconf_all->accept_dad < 1 && in addrconf_dad_begin()
4009 idev->cnf.accept_dad < 1) || in addrconf_dad_begin()
4010 !(ifp->flags&IFA_F_TENTATIVE) || in addrconf_dad_begin()
4011 ifp->flags & IFA_F_NODAD) { in addrconf_dad_begin()
4014 if (ifp->flags & IFA_F_TENTATIVE && in addrconf_dad_begin()
4015 !(ifp->flags & IFA_F_OPTIMISTIC)) in addrconf_dad_begin()
4017 bump_id = ifp->flags & IFA_F_TENTATIVE; in addrconf_dad_begin()
4018 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED); in addrconf_dad_begin()
4019 spin_unlock(&ifp->lock); in addrconf_dad_begin()
4020 read_unlock_bh(&idev->lock); in addrconf_dad_begin()
4026 if (!(idev->if_flags & IF_READY)) { in addrconf_dad_begin()
4027 spin_unlock(&ifp->lock); in addrconf_dad_begin()
4028 read_unlock_bh(&idev->lock); in addrconf_dad_begin()
4031 * - keep it tentative if it is a permanent address. in addrconf_dad_begin()
4032 * - otherwise, kill it. in addrconf_dad_begin()
4043 if (ifp->flags & IFA_F_OPTIMISTIC) { in addrconf_dad_begin()
4044 ip6_ins_rt(net, ifp->rt); in addrconf_dad_begin()
4055 spin_unlock(&ifp->lock); in addrconf_dad_begin()
4056 read_unlock_bh(&idev->lock); in addrconf_dad_begin()
4065 spin_lock_bh(&ifp->lock); in addrconf_dad_start()
4066 if (ifp->state != INET6_IFADDR_STATE_DEAD) { in addrconf_dad_start()
4067 ifp->state = INET6_IFADDR_STATE_PREDAD; in addrconf_dad_start()
4070 spin_unlock_bh(&ifp->lock); in addrconf_dad_start()
4081 struct inet6_dev *idev = ifp->idev; in addrconf_dad_work()
4093 spin_lock_bh(&ifp->lock); in addrconf_dad_work()
4094 if (ifp->state == INET6_IFADDR_STATE_PREDAD) { in addrconf_dad_work()
4096 ifp->state = INET6_IFADDR_STATE_DAD; in addrconf_dad_work()
4097 } else if (ifp->state == INET6_IFADDR_STATE_ERRDAD) { in addrconf_dad_work()
4099 ifp->state = INET6_IFADDR_STATE_POSTDAD; in addrconf_dad_work()
4101 if ((dev_net(idev->dev)->ipv6.devconf_all->accept_dad > 1 || in addrconf_dad_work()
4102 idev->cnf.accept_dad > 1) && in addrconf_dad_work()
4103 !idev->cnf.disable_ipv6 && in addrconf_dad_work()
4104 !(ifp->flags & IFA_F_STABLE_PRIVACY)) { in addrconf_dad_work()
4110 if (!ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) && in addrconf_dad_work()
4111 ipv6_addr_equal(&ifp->addr, &addr)) { in addrconf_dad_work()
4112 /* DAD failed for link-local based on MAC */ in addrconf_dad_work()
4113 idev->cnf.disable_ipv6 = 1; in addrconf_dad_work()
4116 ifp->idev->dev->name); in addrconf_dad_work()
4121 spin_unlock_bh(&ifp->lock); in addrconf_dad_work()
4130 addrconf_ifdown(idev->dev, false); in addrconf_dad_work()
4134 if (!ifp->dad_probes && addrconf_dad_end(ifp)) in addrconf_dad_work()
4137 write_lock_bh(&idev->lock); in addrconf_dad_work()
4138 if (idev->dead || !(idev->if_flags & IF_READY)) { in addrconf_dad_work()
4139 write_unlock_bh(&idev->lock); in addrconf_dad_work()
4143 spin_lock(&ifp->lock); in addrconf_dad_work()
4144 if (ifp->state == INET6_IFADDR_STATE_DEAD) { in addrconf_dad_work()
4145 spin_unlock(&ifp->lock); in addrconf_dad_work()
4146 write_unlock_bh(&idev->lock); in addrconf_dad_work()
4150 if (ifp->dad_probes == 0) { in addrconf_dad_work()
4157 if (ifp->flags & IFA_F_TENTATIVE && in addrconf_dad_work()
4158 !(ifp->flags & IFA_F_OPTIMISTIC)) in addrconf_dad_work()
4160 bump_id = ifp->flags & IFA_F_TENTATIVE; in addrconf_dad_work()
4161 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED); in addrconf_dad_work()
4162 spin_unlock(&ifp->lock); in addrconf_dad_work()
4163 write_unlock_bh(&idev->lock); in addrconf_dad_work()
4170 ifp->dad_probes--; in addrconf_dad_work()
4172 max(NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME), in addrconf_dad_work()
4174 spin_unlock(&ifp->lock); in addrconf_dad_work()
4175 write_unlock_bh(&idev->lock); in addrconf_dad_work()
4178 addrconf_addr_solict_mult(&ifp->addr, &mcaddr); in addrconf_dad_work()
4179 ndisc_send_ns(ifp->idev->dev, &ifp->addr, &mcaddr, &in6addr_any, in addrconf_dad_work()
4180 ifp->dad_nonce); in addrconf_dad_work()
4186 /* ifp->idev must be at least read locked */
4190 struct inet6_dev *idev = ifp->idev; in ipv6_lonely_lladdr()
4192 list_for_each_entry_reverse(ifpiter, &idev->addr_list, if_list) { in ipv6_lonely_lladdr()
4193 if (ifpiter->scope > IFA_LINK) in ipv6_lonely_lladdr()
4195 if (ifp != ifpiter && ifpiter->scope == IFA_LINK && in ipv6_lonely_lladdr()
4196 (ifpiter->flags & (IFA_F_PERMANENT|IFA_F_TENTATIVE| in ipv6_lonely_lladdr()
4207 struct net_device *dev = ifp->idev->dev; in addrconf_dad_completed()
4223 read_lock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4224 send_mld = ifp->scope == IFA_LINK && ipv6_lonely_lladdr(ifp); in addrconf_dad_completed()
4226 ipv6_accept_ra(ifp->idev) && in addrconf_dad_completed()
4227 ifp->idev->cnf.rtr_solicits != 0 && in addrconf_dad_completed()
4228 (dev->flags & IFF_LOOPBACK) == 0 && in addrconf_dad_completed()
4229 (dev->type != ARPHRD_TUNNEL); in addrconf_dad_completed()
4230 read_unlock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4236 ipv6_mc_dad_complete(ifp->idev); in addrconf_dad_completed()
4240 (ifp->idev->cnf.ndisc_notify || in addrconf_dad_completed()
4241 dev_net(dev)->ipv6.devconf_all->ndisc_notify)) { in addrconf_dad_completed()
4242 ndisc_send_na(dev, &in6addr_linklocal_allnodes, &ifp->addr, in addrconf_dad_completed()
4243 /*router=*/ !!ifp->idev->cnf.forwarding, in addrconf_dad_completed()
4258 write_lock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4259 spin_lock(&ifp->lock); in addrconf_dad_completed()
4260 ifp->idev->rs_interval = rfc3315_s14_backoff_init( in addrconf_dad_completed()
4261 ifp->idev->cnf.rtr_solicit_interval); in addrconf_dad_completed()
4262 ifp->idev->rs_probes = 1; in addrconf_dad_completed()
4263 ifp->idev->if_flags |= IF_RS_SENT; in addrconf_dad_completed()
4264 addrconf_mod_rs_timer(ifp->idev, ifp->idev->rs_interval); in addrconf_dad_completed()
4265 spin_unlock(&ifp->lock); in addrconf_dad_completed()
4266 write_unlock_bh(&ifp->idev->lock); in addrconf_dad_completed()
4275 if (ifp->flags & IFA_F_TEMPORARY) in addrconf_dad_completed()
4283 read_lock_bh(&idev->lock); in addrconf_dad_run()
4284 list_for_each_entry(ifp, &idev->addr_list, if_list) { in addrconf_dad_run()
4285 spin_lock(&ifp->lock); in addrconf_dad_run()
4286 if ((ifp->flags & IFA_F_TENTATIVE && in addrconf_dad_run()
4287 ifp->state == INET6_IFADDR_STATE_DAD) || restart) { in addrconf_dad_run()
4289 ifp->state = INET6_IFADDR_STATE_PREDAD; in addrconf_dad_run()
4292 spin_unlock(&ifp->lock); in addrconf_dad_run()
4294 read_unlock_bh(&idev->lock); in addrconf_dad_run()
4306 struct if6_iter_state *state = seq->private; in if6_get_first()
4313 state->bucket = 0; in if6_get_first()
4314 state->offset = 0; in if6_get_first()
4317 for (; state->bucket < IN6_ADDR_HSIZE; ++state->bucket) { in if6_get_first()
4318 hlist_for_each_entry_rcu(ifa, &inet6_addr_lst[state->bucket], in if6_get_first()
4320 if (!net_eq(dev_net(ifa->idev->dev), net)) in if6_get_first()
4323 if (p < state->offset) { in if6_get_first()
4331 state->offset = 0; in if6_get_first()
4340 struct if6_iter_state *state = seq->private; in if6_get_next()
4344 if (!net_eq(dev_net(ifa->idev->dev), net)) in if6_get_next()
4346 state->offset++; in if6_get_next()
4350 state->offset = 0; in if6_get_next()
4351 while (++state->bucket < IN6_ADDR_HSIZE) { in if6_get_next()
4353 &inet6_addr_lst[state->bucket], addr_lst) { in if6_get_next()
4354 if (!net_eq(dev_net(ifa->idev->dev), net)) in if6_get_next()
4389 &ifp->addr, in if6_seq_show()
4390 ifp->idev->dev->ifindex, in if6_seq_show()
4391 ifp->prefix_len, in if6_seq_show()
4392 ifp->scope, in if6_seq_show()
4393 (u8) ifp->flags, in if6_seq_show()
4394 ifp->idev->dev->name); in if6_seq_show()
4407 if (!proc_create_net("if_inet6", 0444, net->proc_net, &if6_seq_ops, in if6_proc_net_init()
4409 return -ENOMEM; in if6_proc_net_init()
4415 remove_proc_entry("if_inet6", net->proc_net); in if6_proc_net_exit()
4444 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_home_addr()
4446 if (ipv6_addr_equal(&ifp->addr, addr) && in ipv6_chk_home_addr()
4447 (ifp->flags & IFA_F_HOMEADDRESS)) { in ipv6_chk_home_addr()
4484 if (!net_eq(dev_net(ifp->idev->dev), net)) in ipv6_chk_rpl_srh_loop()
4487 if (ipv6_addr_equal(&ifp->addr, addr)) { in ipv6_chk_rpl_srh_loop()
4535 * IFA_F_PERMANENT has a non-infinity life time. in addrconf_verify_rtnl()
4537 if ((ifp->flags & IFA_F_PERMANENT) && in addrconf_verify_rtnl()
4538 (ifp->prefered_lft == INFINITY_LIFE_TIME)) in addrconf_verify_rtnl()
4541 spin_lock(&ifp->lock); in addrconf_verify_rtnl()
4543 age = (now - ifp->tstamp + ADDRCONF_TIMER_FUZZ_MINUS) / HZ; in addrconf_verify_rtnl()
4545 if (ifp->valid_lft != INFINITY_LIFE_TIME && in addrconf_verify_rtnl()
4546 age >= ifp->valid_lft) { in addrconf_verify_rtnl()
4547 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4551 } else if (ifp->prefered_lft == INFINITY_LIFE_TIME) { in addrconf_verify_rtnl()
4552 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4554 } else if (age >= ifp->prefered_lft) { in addrconf_verify_rtnl()
4555 /* jiffies - ifp->tstamp > age >= ifp->prefered_lft */ in addrconf_verify_rtnl()
4558 if (!(ifp->flags&IFA_F_DEPRECATED)) { in addrconf_verify_rtnl()
4560 ifp->flags |= IFA_F_DEPRECATED; in addrconf_verify_rtnl()
4563 if ((ifp->valid_lft != INFINITY_LIFE_TIME) && in addrconf_verify_rtnl()
4564 (time_before(ifp->tstamp + ifp->valid_lft * HZ, next))) in addrconf_verify_rtnl()
4565 next = ifp->tstamp + ifp->valid_lft * HZ; in addrconf_verify_rtnl()
4567 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4576 } else if ((ifp->flags&IFA_F_TEMPORARY) && in addrconf_verify_rtnl()
4577 !(ifp->flags&IFA_F_TENTATIVE)) { in addrconf_verify_rtnl()
4578 unsigned long regen_advance = ifp->idev->cnf.regen_max_retry * in addrconf_verify_rtnl()
4579 ifp->idev->cnf.dad_transmits * in addrconf_verify_rtnl()
4580 max(NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME), HZ/100) / HZ; in addrconf_verify_rtnl()
4582 if (age >= ifp->prefered_lft - regen_advance) { in addrconf_verify_rtnl()
4583 struct inet6_ifaddr *ifpub = ifp->ifpub; in addrconf_verify_rtnl()
4584 if (time_before(ifp->tstamp + ifp->prefered_lft * HZ, next)) in addrconf_verify_rtnl()
4585 next = ifp->tstamp + ifp->prefered_lft * HZ; in addrconf_verify_rtnl()
4586 if (!ifp->regen_count && ifpub) { in addrconf_verify_rtnl()
4587 ifp->regen_count++; in addrconf_verify_rtnl()
4590 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4592 spin_lock(&ifpub->lock); in addrconf_verify_rtnl()
4593 ifpub->regen_count = 0; in addrconf_verify_rtnl()
4594 spin_unlock(&ifpub->lock); in addrconf_verify_rtnl()
4602 } else if (time_before(ifp->tstamp + ifp->prefered_lft * HZ - regen_advance * HZ, next)) in addrconf_verify_rtnl()
4603 next = ifp->tstamp + ifp->prefered_lft * HZ - regen_advance * HZ; in addrconf_verify_rtnl()
4604 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4606 /* ifp->prefered_lft <= ifp->valid_lft */ in addrconf_verify_rtnl()
4607 if (time_before(ifp->tstamp + ifp->prefered_lft * HZ, next)) in addrconf_verify_rtnl()
4608 next = ifp->tstamp + ifp->prefered_lft * HZ; in addrconf_verify_rtnl()
4609 spin_unlock(&ifp->lock); in addrconf_verify_rtnl()
4627 mod_delayed_work(addrconf_wq, &addr_chk_work, next_sched - now); in addrconf_verify_rtnl()
4675 struct net *net = sock_net(skb->sk); in inet6_rtm_deladdr()
4690 return -EINVAL; in inet6_rtm_deladdr()
4692 ifa_flags = tb[IFA_FLAGS] ? nla_get_u32(tb[IFA_FLAGS]) : ifm->ifa_flags; in inet6_rtm_deladdr()
4697 return inet6_addr_del(net, ifm->ifa_index, ifa_flags, pfx, in inet6_rtm_deladdr()
4698 ifm->ifa_prefixlen); in inet6_rtm_deladdr()
4708 f6i = addrconf_get_prefix_route(modify_peer ? &ifp->peer_addr : &ifp->addr, in modify_prefix_route()
4709 ifp->prefix_len, in modify_prefix_route()
4710 ifp->idev->dev, 0, RTF_DEFAULT, true); in modify_prefix_route()
4712 return -ENOENT; in modify_prefix_route()
4714 prio = ifp->rt_priority ? : IP6_RT_PRIO_ADDRCONF; in modify_prefix_route()
4715 if (f6i->fib6_metric != prio) { in modify_prefix_route()
4717 ip6_del_rt(dev_net(ifp->idev->dev), f6i, false); in modify_prefix_route()
4720 addrconf_prefix_route(modify_peer ? &ifp->peer_addr : &ifp->addr, in modify_prefix_route()
4721 ifp->prefix_len, in modify_prefix_route()
4722 ifp->rt_priority, ifp->idev->dev, in modify_prefix_route()
4747 if (!cfg->valid_lft || cfg->preferred_lft > cfg->valid_lft) in inet6_addr_modify()
4748 return -EINVAL; in inet6_addr_modify()
4750 if (cfg->ifa_flags & IFA_F_MANAGETEMPADDR && in inet6_addr_modify()
4751 (ifp->flags & IFA_F_TEMPORARY || ifp->prefix_len != 64)) in inet6_addr_modify()
4752 return -EINVAL; in inet6_addr_modify()
4754 if (!(ifp->flags & IFA_F_TENTATIVE) || ifp->flags & IFA_F_DADFAILED) in inet6_addr_modify()
4755 cfg->ifa_flags &= ~IFA_F_OPTIMISTIC; in inet6_addr_modify()
4757 timeout = addrconf_timeout_fixup(cfg->valid_lft, HZ); in inet6_addr_modify()
4760 cfg->valid_lft = timeout; in inet6_addr_modify()
4765 cfg->ifa_flags |= IFA_F_PERMANENT; in inet6_addr_modify()
4768 timeout = addrconf_timeout_fixup(cfg->preferred_lft, HZ); in inet6_addr_modify()
4771 cfg->ifa_flags |= IFA_F_DEPRECATED; in inet6_addr_modify()
4772 cfg->preferred_lft = timeout; in inet6_addr_modify()
4775 if (cfg->peer_pfx && in inet6_addr_modify()
4776 memcmp(&ifp->peer_addr, cfg->peer_pfx, sizeof(struct in6_addr))) { in inet6_addr_modify()
4777 if (!ipv6_addr_any(&ifp->peer_addr)) in inet6_addr_modify()
4782 spin_lock_bh(&ifp->lock); in inet6_addr_modify()
4783 was_managetempaddr = ifp->flags & IFA_F_MANAGETEMPADDR; in inet6_addr_modify()
4784 had_prefixroute = ifp->flags & IFA_F_PERMANENT && in inet6_addr_modify()
4785 !(ifp->flags & IFA_F_NOPREFIXROUTE); in inet6_addr_modify()
4786 ifp->flags &= ~(IFA_F_DEPRECATED | IFA_F_PERMANENT | IFA_F_NODAD | in inet6_addr_modify()
4789 ifp->flags |= cfg->ifa_flags; in inet6_addr_modify()
4790 ifp->tstamp = jiffies; in inet6_addr_modify()
4791 ifp->valid_lft = cfg->valid_lft; in inet6_addr_modify()
4792 ifp->prefered_lft = cfg->preferred_lft; in inet6_addr_modify()
4794 if (cfg->rt_priority && cfg->rt_priority != ifp->rt_priority) in inet6_addr_modify()
4795 ifp->rt_priority = cfg->rt_priority; in inet6_addr_modify()
4798 ifp->peer_addr = *cfg->peer_pfx; in inet6_addr_modify()
4800 spin_unlock_bh(&ifp->lock); in inet6_addr_modify()
4801 if (!(ifp->flags&IFA_F_TENTATIVE)) in inet6_addr_modify()
4804 if (!(cfg->ifa_flags & IFA_F_NOPREFIXROUTE)) { in inet6_addr_modify()
4805 int rc = -ENOENT; in inet6_addr_modify()
4810 /* prefix route could have been deleted; if so restore it */ in inet6_addr_modify()
4811 if (rc == -ENOENT) { in inet6_addr_modify()
4812 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, in inet6_addr_modify()
4813 ifp->rt_priority, ifp->idev->dev, in inet6_addr_modify()
4817 if (had_prefixroute && !ipv6_addr_any(&ifp->peer_addr)) in inet6_addr_modify()
4820 if (rc == -ENOENT && !ipv6_addr_any(&ifp->peer_addr)) { in inet6_addr_modify()
4821 addrconf_prefix_route(&ifp->peer_addr, ifp->prefix_len, in inet6_addr_modify()
4822 ifp->rt_priority, ifp->idev->dev, in inet6_addr_modify()
4829 write_lock_bh(&ifp->idev->lock); in inet6_addr_modify()
4831 write_unlock_bh(&ifp->idev->lock); in inet6_addr_modify()
4839 if (was_managetempaddr || ifp->flags & IFA_F_MANAGETEMPADDR) { in inet6_addr_modify()
4841 !(ifp->flags & IFA_F_MANAGETEMPADDR)) { in inet6_addr_modify()
4842 cfg->valid_lft = 0; in inet6_addr_modify()
4843 cfg->preferred_lft = 0; in inet6_addr_modify()
4845 manage_tempaddrs(ifp->idev, ifp, cfg->valid_lft, in inet6_addr_modify()
4846 cfg->preferred_lft, !was_managetempaddr, in inet6_addr_modify()
4859 struct net *net = sock_net(skb->sk); in inet6_rtm_newaddr()
4879 return -EINVAL; in inet6_rtm_newaddr()
4882 cfg.plen = ifm->ifa_prefixlen; in inet6_rtm_newaddr()
4893 cfg.valid_lft = ci->ifa_valid; in inet6_rtm_newaddr()
4894 cfg.preferred_lft = ci->ifa_prefered; in inet6_rtm_newaddr()
4897 dev = __dev_get_by_index(net, ifm->ifa_index); in inet6_rtm_newaddr()
4899 return -ENODEV; in inet6_rtm_newaddr()
4904 cfg.ifa_flags = ifm->ifa_flags; in inet6_rtm_newaddr()
4921 return -EINVAL; in inet6_rtm_newaddr()
4930 return inet6_addr_add(net, ifm->ifa_index, &cfg, extack); in inet6_rtm_newaddr()
4933 if (nlh->nlmsg_flags & NLM_F_EXCL || in inet6_rtm_newaddr()
4934 !(nlh->nlmsg_flags & NLM_F_REPLACE)) in inet6_rtm_newaddr()
4935 err = -EEXIST; in inet6_rtm_newaddr()
4950 ifm->ifa_family = AF_INET6; in put_ifaddrmsg()
4951 ifm->ifa_prefixlen = prefixlen; in put_ifaddrmsg()
4952 ifm->ifa_flags = flags; in put_ifaddrmsg()
4953 ifm->ifa_scope = scope; in put_ifaddrmsg()
4954 ifm->ifa_index = ifindex; in put_ifaddrmsg()
5014 nlh = nlmsg_put(skb, args->portid, args->seq, args->event, in inet6_fill_ifaddr()
5015 sizeof(struct ifaddrmsg), args->flags); in inet6_fill_ifaddr()
5017 return -EMSGSIZE; in inet6_fill_ifaddr()
5019 put_ifaddrmsg(nlh, ifa->prefix_len, ifa->flags, rt_scope(ifa->scope), in inet6_fill_ifaddr()
5020 ifa->idev->dev->ifindex); in inet6_fill_ifaddr()
5022 if (args->netnsid >= 0 && in inet6_fill_ifaddr()
5023 nla_put_s32(skb, IFA_TARGET_NETNSID, args->netnsid)) in inet6_fill_ifaddr()
5026 spin_lock_bh(&ifa->lock); in inet6_fill_ifaddr()
5027 if (!((ifa->flags&IFA_F_PERMANENT) && in inet6_fill_ifaddr()
5028 (ifa->prefered_lft == INFINITY_LIFE_TIME))) { in inet6_fill_ifaddr()
5029 preferred = ifa->prefered_lft; in inet6_fill_ifaddr()
5030 valid = ifa->valid_lft; in inet6_fill_ifaddr()
5032 long tval = (jiffies - ifa->tstamp)/HZ; in inet6_fill_ifaddr()
5034 preferred -= tval; in inet6_fill_ifaddr()
5039 valid -= tval; in inet6_fill_ifaddr()
5048 spin_unlock_bh(&ifa->lock); in inet6_fill_ifaddr()
5050 if (!ipv6_addr_any(&ifa->peer_addr)) { in inet6_fill_ifaddr()
5051 if (nla_put_in6_addr(skb, IFA_LOCAL, &ifa->addr) < 0 || in inet6_fill_ifaddr()
5052 nla_put_in6_addr(skb, IFA_ADDRESS, &ifa->peer_addr) < 0) in inet6_fill_ifaddr()
5055 if (nla_put_in6_addr(skb, IFA_ADDRESS, &ifa->addr) < 0) in inet6_fill_ifaddr()
5058 if (ifa->rt_priority && in inet6_fill_ifaddr()
5059 nla_put_u32(skb, IFA_RT_PRIORITY, ifa->rt_priority)) in inet6_fill_ifaddr()
5062 if (put_cacheinfo(skb, ifa->cstamp, ifa->tstamp, preferred, valid) < 0) in inet6_fill_ifaddr()
5065 if (nla_put_u32(skb, IFA_FLAGS, ifa->flags) < 0) in inet6_fill_ifaddr()
5073 return -EMSGSIZE; in inet6_fill_ifaddr()
5081 int ifindex = ifmca->idev->dev->ifindex; in inet6_fill_ifmcaddr()
5083 if (ipv6_addr_scope(&ifmca->mca_addr) & IFA_SITE) in inet6_fill_ifmcaddr()
5086 nlh = nlmsg_put(skb, args->portid, args->seq, args->event, in inet6_fill_ifmcaddr()
5087 sizeof(struct ifaddrmsg), args->flags); in inet6_fill_ifmcaddr()
5089 return -EMSGSIZE; in inet6_fill_ifmcaddr()
5091 if (args->netnsid >= 0 && in inet6_fill_ifmcaddr()
5092 nla_put_s32(skb, IFA_TARGET_NETNSID, args->netnsid)) { in inet6_fill_ifmcaddr()
5094 return -EMSGSIZE; in inet6_fill_ifmcaddr()
5098 if (nla_put_in6_addr(skb, IFA_MULTICAST, &ifmca->mca_addr) < 0 || in inet6_fill_ifmcaddr()
5099 put_cacheinfo(skb, ifmca->mca_cstamp, ifmca->mca_tstamp, in inet6_fill_ifmcaddr()
5102 return -EMSGSIZE; in inet6_fill_ifmcaddr()
5112 struct net_device *dev = fib6_info_nh_dev(ifaca->aca_rt); in inet6_fill_ifacaddr()
5113 int ifindex = dev ? dev->ifindex : 1; in inet6_fill_ifacaddr()
5117 if (ipv6_addr_scope(&ifaca->aca_addr) & IFA_SITE) in inet6_fill_ifacaddr()
5120 nlh = nlmsg_put(skb, args->portid, args->seq, args->event, in inet6_fill_ifacaddr()
5121 sizeof(struct ifaddrmsg), args->flags); in inet6_fill_ifacaddr()
5123 return -EMSGSIZE; in inet6_fill_ifacaddr()
5125 if (args->netnsid >= 0 && in inet6_fill_ifacaddr()
5126 nla_put_s32(skb, IFA_TARGET_NETNSID, args->netnsid)) { in inet6_fill_ifacaddr()
5128 return -EMSGSIZE; in inet6_fill_ifacaddr()
5132 if (nla_put_in6_addr(skb, IFA_ANYCAST, &ifaca->aca_addr) < 0 || in inet6_fill_ifacaddr()
5133 put_cacheinfo(skb, ifaca->aca_cstamp, ifaca->aca_tstamp, in inet6_fill_ifacaddr()
5136 return -EMSGSIZE; in inet6_fill_ifacaddr()
5153 read_lock_bh(&idev->lock); in in6_dump_addrs()
5154 switch (fillargs->type) { in in6_dump_addrs()
5157 fillargs->event = RTM_NEWADDR; in in6_dump_addrs()
5160 list_for_each_entry(ifa, &idev->addr_list, if_list) { in in6_dump_addrs()
5173 fillargs->event = RTM_GETMULTICAST; in in6_dump_addrs()
5176 for (ifmca = idev->mc_list; ifmca; in in6_dump_addrs()
5177 ifmca = ifmca->next, ip_idx++) { in in6_dump_addrs()
5186 fillargs->event = RTM_GETANYCAST; in in6_dump_addrs()
5188 for (ifaca = idev->ac_list; ifaca; in in6_dump_addrs()
5189 ifaca = ifaca->aca_next, ip_idx++) { in in6_dump_addrs()
5200 read_unlock_bh(&idev->lock); in in6_dump_addrs()
5201 cb->args[2] = ip_idx; in in6_dump_addrs()
5210 struct netlink_ext_ack *extack = cb->extack; in inet6_valid_dump_ifaddr_req()
5215 if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*ifm))) { in inet6_valid_dump_ifaddr_req()
5217 return -EINVAL; in inet6_valid_dump_ifaddr_req()
5221 if (ifm->ifa_prefixlen || ifm->ifa_flags || ifm->ifa_scope) { in inet6_valid_dump_ifaddr_req()
5223 return -EINVAL; in inet6_valid_dump_ifaddr_req()
5226 fillargs->ifindex = ifm->ifa_index; in inet6_valid_dump_ifaddr_req()
5227 if (fillargs->ifindex) { in inet6_valid_dump_ifaddr_req()
5228 cb->answer_flags |= NLM_F_DUMP_FILTERED; in inet6_valid_dump_ifaddr_req()
5229 fillargs->flags |= NLM_F_DUMP_FILTERED; in inet6_valid_dump_ifaddr_req()
5244 fillargs->netnsid = nla_get_s32(tb[i]); in inet6_valid_dump_ifaddr_req()
5245 net = rtnl_get_net_ns_capable(sk, fillargs->netnsid); in inet6_valid_dump_ifaddr_req()
5247 fillargs->netnsid = -1; in inet6_valid_dump_ifaddr_req()
5254 return -EINVAL; in inet6_valid_dump_ifaddr_req()
5264 const struct nlmsghdr *nlh = cb->nlh; in inet6_dump_addr()
5266 .portid = NETLINK_CB(cb->skb).portid, in inet6_dump_addr()
5267 .seq = cb->nlh->nlmsg_seq, in inet6_dump_addr()
5269 .netnsid = -1, in inet6_dump_addr()
5272 struct net *net = sock_net(skb->sk); in inet6_dump_addr()
5281 s_h = cb->args[0]; in inet6_dump_addr()
5282 s_idx = idx = cb->args[1]; in inet6_dump_addr()
5283 s_ip_idx = cb->args[2]; in inet6_dump_addr()
5285 if (cb->strict_check) { in inet6_dump_addr()
5287 skb->sk, cb); in inet6_dump_addr()
5295 err = -ENODEV; in inet6_dump_addr()
5310 cb->seq = atomic_read(&tgt_net->ipv6.dev_addr_genid) ^ tgt_net->dev_base_seq; in inet6_dump_addr()
5313 head = &tgt_net->dev_index_head[h]; in inet6_dump_addr()
5332 cb->args[0] = h; in inet6_dump_addr()
5333 cb->args[1] = idx; in inet6_dump_addr()
5338 return skb->len ? : err; in inet6_dump_addr()
5371 if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*ifm))) { in inet6_rtm_valid_getaddr_req()
5373 return -EINVAL; in inet6_rtm_valid_getaddr_req()
5381 if (ifm->ifa_prefixlen || ifm->ifa_flags || ifm->ifa_scope) { in inet6_rtm_valid_getaddr_req()
5383 return -EINVAL; in inet6_rtm_valid_getaddr_req()
5402 return -EINVAL; in inet6_rtm_valid_getaddr_req()
5412 struct net *net = sock_net(in_skb->sk); in inet6_rtm_getaddr()
5415 .seq = nlh->nlmsg_seq, in inet6_rtm_getaddr()
5418 .netnsid = -1, in inet6_rtm_getaddr()
5444 return -EINVAL; in inet6_rtm_getaddr()
5447 if (ifm->ifa_index) in inet6_rtm_getaddr()
5448 dev = dev_get_by_index(tgt_net, ifm->ifa_index); in inet6_rtm_getaddr()
5452 err = -EADDRNOTAVAIL; in inet6_rtm_getaddr()
5458 err = -ENOBUFS; in inet6_rtm_getaddr()
5464 /* -EMSGSIZE implies BUG in inet6_ifaddr_msgsize() */ in inet6_rtm_getaddr()
5465 WARN_ON(err == -EMSGSIZE); in inet6_rtm_getaddr()
5484 struct net *net = dev_net(ifa->idev->dev); in inet6_ifa_notify()
5490 .netnsid = -1, in inet6_ifa_notify()
5492 int err = -ENOBUFS; in inet6_ifa_notify()
5500 /* -EMSGSIZE implies BUG in inet6_ifaddr_msgsize() */ in inet6_ifa_notify()
5501 WARN_ON(err == -EMSGSIZE); in inet6_ifa_notify()
5518 array[DEVCONF_FORWARDING] = cnf->forwarding; in ipv6_store_devconf()
5519 array[DEVCONF_HOPLIMIT] = cnf->hop_limit; in ipv6_store_devconf()
5520 array[DEVCONF_MTU6] = cnf->mtu6; in ipv6_store_devconf()
5521 array[DEVCONF_ACCEPT_RA] = cnf->accept_ra; in ipv6_store_devconf()
5522 array[DEVCONF_ACCEPT_REDIRECTS] = cnf->accept_redirects; in ipv6_store_devconf()
5523 array[DEVCONF_AUTOCONF] = cnf->autoconf; in ipv6_store_devconf()
5524 array[DEVCONF_DAD_TRANSMITS] = cnf->dad_transmits; in ipv6_store_devconf()
5525 array[DEVCONF_RTR_SOLICITS] = cnf->rtr_solicits; in ipv6_store_devconf()
5527 jiffies_to_msecs(cnf->rtr_solicit_interval); in ipv6_store_devconf()
5529 jiffies_to_msecs(cnf->rtr_solicit_max_interval); in ipv6_store_devconf()
5531 jiffies_to_msecs(cnf->rtr_solicit_delay); in ipv6_store_devconf()
5532 array[DEVCONF_FORCE_MLD_VERSION] = cnf->force_mld_version; in ipv6_store_devconf()
5534 jiffies_to_msecs(cnf->mldv1_unsolicited_report_interval); in ipv6_store_devconf()
5536 jiffies_to_msecs(cnf->mldv2_unsolicited_report_interval); in ipv6_store_devconf()
5537 array[DEVCONF_USE_TEMPADDR] = cnf->use_tempaddr; in ipv6_store_devconf()
5538 array[DEVCONF_TEMP_VALID_LFT] = cnf->temp_valid_lft; in ipv6_store_devconf()
5539 array[DEVCONF_TEMP_PREFERED_LFT] = cnf->temp_prefered_lft; in ipv6_store_devconf()
5540 array[DEVCONF_REGEN_MAX_RETRY] = cnf->regen_max_retry; in ipv6_store_devconf()
5541 array[DEVCONF_MAX_DESYNC_FACTOR] = cnf->max_desync_factor; in ipv6_store_devconf()
5542 array[DEVCONF_MAX_ADDRESSES] = cnf->max_addresses; in ipv6_store_devconf()
5543 array[DEVCONF_ACCEPT_RA_DEFRTR] = cnf->accept_ra_defrtr; in ipv6_store_devconf()
5544 array[DEVCONF_ACCEPT_RA_MIN_HOP_LIMIT] = cnf->accept_ra_min_hop_limit; in ipv6_store_devconf()
5545 array[DEVCONF_ACCEPT_RA_PINFO] = cnf->accept_ra_pinfo; in ipv6_store_devconf()
5547 array[DEVCONF_ACCEPT_RA_RTR_PREF] = cnf->accept_ra_rtr_pref; in ipv6_store_devconf()
5549 jiffies_to_msecs(cnf->rtr_probe_interval); in ipv6_store_devconf()
5551 array[DEVCONF_ACCEPT_RA_RT_INFO_MIN_PLEN] = cnf->accept_ra_rt_info_min_plen; in ipv6_store_devconf()
5552 array[DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN] = cnf->accept_ra_rt_info_max_plen; in ipv6_store_devconf()
5555 array[DEVCONF_PROXY_NDP] = cnf->proxy_ndp; in ipv6_store_devconf()
5556 array[DEVCONF_ACCEPT_SOURCE_ROUTE] = cnf->accept_source_route; in ipv6_store_devconf()
5558 array[DEVCONF_OPTIMISTIC_DAD] = cnf->optimistic_dad; in ipv6_store_devconf()
5559 array[DEVCONF_USE_OPTIMISTIC] = cnf->use_optimistic; in ipv6_store_devconf()
5562 array[DEVCONF_MC_FORWARDING] = atomic_read(&cnf->mc_forwarding); in ipv6_store_devconf()
5564 array[DEVCONF_DISABLE_IPV6] = cnf->disable_ipv6; in ipv6_store_devconf()
5565 array[DEVCONF_ACCEPT_DAD] = cnf->accept_dad; in ipv6_store_devconf()
5566 array[DEVCONF_FORCE_TLLAO] = cnf->force_tllao; in ipv6_store_devconf()
5567 array[DEVCONF_NDISC_NOTIFY] = cnf->ndisc_notify; in ipv6_store_devconf()
5568 array[DEVCONF_SUPPRESS_FRAG_NDISC] = cnf->suppress_frag_ndisc; in ipv6_store_devconf()
5569 array[DEVCONF_ACCEPT_RA_FROM_LOCAL] = cnf->accept_ra_from_local; in ipv6_store_devconf()
5570 array[DEVCONF_ACCEPT_RA_MTU] = cnf->accept_ra_mtu; in ipv6_store_devconf()
5571 array[DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN] = cnf->ignore_routes_with_linkdown; in ipv6_store_devconf()
5573 array[DEVCONF_USE_OIF_ADDRS_ONLY] = cnf->use_oif_addrs_only; in ipv6_store_devconf()
5574 array[DEVCONF_DROP_UNICAST_IN_L2_MULTICAST] = cnf->drop_unicast_in_l2_multicast; in ipv6_store_devconf()
5575 array[DEVCONF_DROP_UNSOLICITED_NA] = cnf->drop_unsolicited_na; in ipv6_store_devconf()
5576 array[DEVCONF_KEEP_ADDR_ON_DOWN] = cnf->keep_addr_on_down; in ipv6_store_devconf()
5577 array[DEVCONF_SEG6_ENABLED] = cnf->seg6_enabled; in ipv6_store_devconf()
5579 array[DEVCONF_SEG6_REQUIRE_HMAC] = cnf->seg6_require_hmac; in ipv6_store_devconf()
5581 array[DEVCONF_ENHANCED_DAD] = cnf->enhanced_dad; in ipv6_store_devconf()
5582 array[DEVCONF_ADDR_GEN_MODE] = cnf->addr_gen_mode; in ipv6_store_devconf()
5583 array[DEVCONF_DISABLE_POLICY] = cnf->disable_policy; in ipv6_store_devconf()
5584 array[DEVCONF_NDISC_TCLASS] = cnf->ndisc_tclass; in ipv6_store_devconf()
5585 array[DEVCONF_RPL_SEG_ENABLED] = cnf->rpl_seg_enabled; in ipv6_store_devconf()
5615 int pad = bytes - sizeof(u64) * ICMP6_MIB_MAX; in __snmp6_fill_statsdev()
5631 int pad = bytes - sizeof(u64) * IPSTATS_MIB_MAX; in __snmp6_fill_stats64()
5652 __snmp6_fill_stats64(stats, idev->stats.ipv6, bytes, in snmp6_fill_stats()
5656 __snmp6_fill_statsdev(stats, idev->stats.icmpv6dev->mibs, bytes); in snmp6_fill_stats()
5667 if (nla_put_u32(skb, IFLA_INET6_FLAGS, idev->if_flags)) in inet6_fill_ifla6_attrs()
5670 ci.tstamp = cstamp_delta(idev->tstamp); in inet6_fill_ifla6_attrs()
5671 ci.reachable_time = jiffies_to_msecs(idev->nd_parms->reachable_time); in inet6_fill_ifla6_attrs()
5672 ci.retrans_time = jiffies_to_msecs(NEIGH_VAR(idev->nd_parms, RETRANS_TIME)); in inet6_fill_ifla6_attrs()
5678 ipv6_store_devconf(&idev->cnf, nla_data(nla), nla_len(nla)); in inet6_fill_ifla6_attrs()
5680 /* XXX - MC not implemented */ in inet6_fill_ifla6_attrs()
5698 read_lock_bh(&idev->lock); in inet6_fill_ifla6_attrs()
5699 memcpy(nla_data(nla), idev->token.s6_addr, nla_len(nla)); in inet6_fill_ifla6_attrs()
5700 read_unlock_bh(&idev->lock); in inet6_fill_ifla6_attrs()
5702 if (nla_put_u8(skb, IFLA_INET6_ADDR_GEN_MODE, idev->cnf.addr_gen_mode)) in inet6_fill_ifla6_attrs()
5708 return -EMSGSIZE; in inet6_fill_ifla6_attrs()
5726 return -ENODATA; in inet6_fill_link_af()
5729 return -EMSGSIZE; in inet6_fill_link_af()
5737 struct net_device *dev = idev->dev; in inet6_set_iftoken()
5744 return -EINVAL; in inet6_set_iftoken()
5745 if (dev->flags & (IFF_LOOPBACK | IFF_NOARP)) in inet6_set_iftoken()
5746 return -EINVAL; in inet6_set_iftoken()
5748 return -EINVAL; in inet6_set_iftoken()
5749 if (idev->cnf.rtr_solicits == 0) in inet6_set_iftoken()
5750 return -EINVAL; in inet6_set_iftoken()
5752 write_lock_bh(&idev->lock); in inet6_set_iftoken()
5754 BUILD_BUG_ON(sizeof(token->s6_addr) != 16); in inet6_set_iftoken()
5755 memcpy(idev->token.s6_addr + 8, token->s6_addr + 8, 8); in inet6_set_iftoken()
5757 write_unlock_bh(&idev->lock); in inet6_set_iftoken()
5763 if (!idev->dead && (idev->if_flags & IF_READY) && in inet6_set_iftoken()
5774 write_lock_bh(&idev->lock); in inet6_set_iftoken()
5777 idev->if_flags |= IF_RS_SENT; in inet6_set_iftoken()
5778 idev->rs_interval = rfc3315_s14_backoff_init( in inet6_set_iftoken()
5779 idev->cnf.rtr_solicit_interval); in inet6_set_iftoken()
5780 idev->rs_probes = 1; in inet6_set_iftoken()
5781 addrconf_mod_rs_timer(idev, idev->rs_interval); in inet6_set_iftoken()
5785 list_for_each_entry(ifp, &idev->addr_list, if_list) { in inet6_set_iftoken()
5786 spin_lock(&ifp->lock); in inet6_set_iftoken()
5787 if (ifp->tokenized) { in inet6_set_iftoken()
5788 ifp->valid_lft = 0; in inet6_set_iftoken()
5789 ifp->prefered_lft = 0; in inet6_set_iftoken()
5791 spin_unlock(&ifp->lock); in inet6_set_iftoken()
5794 write_unlock_bh(&idev->lock); in inet6_set_iftoken()
5811 return -EINVAL; in check_addr_gen_mode()
5819 !idev->cnf.stable_secret.initialized && in check_stable_privacy()
5820 !net->ipv6.devconf_dflt->stable_secret.initialized) in check_stable_privacy()
5821 return -EINVAL; in check_stable_privacy()
5835 return -EAFNOSUPPORT; in inet6_validate_link_af()
5844 return -EINVAL; in inet6_validate_link_af()
5850 return -EINVAL; in inet6_validate_link_af()
5852 return -EINVAL; in inet6_validate_link_af()
5865 return -EAFNOSUPPORT; in inet6_set_link_af()
5868 return -EINVAL; in inet6_set_link_af()
5879 idev->cnf.addr_gen_mode = mode; in inet6_set_link_af()
5888 struct net_device *dev = idev->dev; in inet6_fill_ifinfo()
5895 return -EMSGSIZE; in inet6_fill_ifinfo()
5898 hdr->ifi_family = AF_INET6; in inet6_fill_ifinfo()
5899 hdr->__ifi_pad = 0; in inet6_fill_ifinfo()
5900 hdr->ifi_type = dev->type; in inet6_fill_ifinfo()
5901 hdr->ifi_index = dev->ifindex; in inet6_fill_ifinfo()
5902 hdr->ifi_flags = dev_get_flags(dev); in inet6_fill_ifinfo()
5903 hdr->ifi_change = 0; in inet6_fill_ifinfo()
5905 if (nla_put_string(skb, IFLA_IFNAME, dev->name) || in inet6_fill_ifinfo()
5906 (dev->addr_len && in inet6_fill_ifinfo()
5907 nla_put(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr)) || in inet6_fill_ifinfo()
5908 nla_put_u32(skb, IFLA_MTU, dev->mtu) || in inet6_fill_ifinfo()
5909 (dev->ifindex != dev_get_iflink(dev) && in inet6_fill_ifinfo()
5912 netif_running(dev) ? dev->operstate : IF_OPER_DOWN)) in inet6_fill_ifinfo()
5927 return -EMSGSIZE; in inet6_fill_ifinfo()
5935 if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*ifm))) { in inet6_valid_dump_ifinfo()
5937 return -EINVAL; in inet6_valid_dump_ifinfo()
5942 return -EINVAL; in inet6_valid_dump_ifinfo()
5946 if (ifm->__ifi_pad || ifm->ifi_type || ifm->ifi_flags || in inet6_valid_dump_ifinfo()
5947 ifm->ifi_change || ifm->ifi_index) { in inet6_valid_dump_ifinfo()
5949 return -EINVAL; in inet6_valid_dump_ifinfo()
5957 struct net *net = sock_net(skb->sk); in inet6_dump_ifinfo()
5967 if (cb->strict_check) { in inet6_dump_ifinfo()
5968 int err = inet6_valid_dump_ifinfo(cb->nlh, cb->extack); in inet6_dump_ifinfo()
5974 s_h = cb->args[0]; in inet6_dump_ifinfo()
5975 s_idx = cb->args[1]; in inet6_dump_ifinfo()
5980 head = &net->dev_index_head[h]; in inet6_dump_ifinfo()
5988 NETLINK_CB(cb->skb).portid, in inet6_dump_ifinfo()
5989 cb->nlh->nlmsg_seq, in inet6_dump_ifinfo()
5998 cb->args[1] = idx; in inet6_dump_ifinfo()
5999 cb->args[0] = h; in inet6_dump_ifinfo()
6001 return skb->len; in inet6_dump_ifinfo()
6007 struct net *net = dev_net(idev->dev); in inet6_ifinfo_notify()
6008 int err = -ENOBUFS; in inet6_ifinfo_notify()
6016 /* -EMSGSIZE implies BUG in inet6_if_nlmsg_size() */ in inet6_ifinfo_notify()
6017 WARN_ON(err == -EMSGSIZE); in inet6_ifinfo_notify()
6045 return -EMSGSIZE; in inet6_fill_prefix()
6048 pmsg->prefix_family = AF_INET6; in inet6_fill_prefix()
6049 pmsg->prefix_pad1 = 0; in inet6_fill_prefix()
6050 pmsg->prefix_pad2 = 0; in inet6_fill_prefix()
6051 pmsg->prefix_ifindex = idev->dev->ifindex; in inet6_fill_prefix()
6052 pmsg->prefix_len = pinfo->prefix_len; in inet6_fill_prefix()
6053 pmsg->prefix_type = pinfo->type; in inet6_fill_prefix()
6054 pmsg->prefix_pad3 = 0; in inet6_fill_prefix()
6055 pmsg->prefix_flags = 0; in inet6_fill_prefix()
6056 if (pinfo->onlink) in inet6_fill_prefix()
6057 pmsg->prefix_flags |= IF_PREFIX_ONLINK; in inet6_fill_prefix()
6058 if (pinfo->autoconf) in inet6_fill_prefix()
6059 pmsg->prefix_flags |= IF_PREFIX_AUTOCONF; in inet6_fill_prefix()
6061 if (nla_put(skb, PREFIX_ADDRESS, sizeof(pinfo->prefix), &pinfo->prefix)) in inet6_fill_prefix()
6063 ci.preferred_time = ntohl(pinfo->prefered); in inet6_fill_prefix()
6064 ci.valid_time = ntohl(pinfo->valid); in inet6_fill_prefix()
6072 return -EMSGSIZE; in inet6_fill_prefix()
6079 struct net *net = dev_net(idev->dev); in inet6_prefix_notify()
6080 int err = -ENOBUFS; in inet6_prefix_notify()
6088 /* -EMSGSIZE implies BUG in inet6_prefix_nlmsg_size() */ in inet6_prefix_notify()
6089 WARN_ON(err == -EMSGSIZE); in inet6_prefix_notify()
6102 struct net *net = dev_net(ifp->idev->dev); in __ipv6_ifa_notify()
6112 * If the address was optimistic we inserted the route at the in __ipv6_ifa_notify()
6116 * host route, so nothing to insert. That will be fixed when in __ipv6_ifa_notify()
6119 if (ifp->rt && !rcu_access_pointer(ifp->rt->fib6_node)) { in __ipv6_ifa_notify()
6120 ip6_ins_rt(net, ifp->rt); in __ipv6_ifa_notify()
6121 } else if (!ifp->rt && (ifp->idev->dev->flags & IFF_UP)) { in __ipv6_ifa_notify()
6122 pr_warn("BUG: Address %pI6c on device %s is missing its host route.\n", in __ipv6_ifa_notify()
6123 &ifp->addr, ifp->idev->dev->name); in __ipv6_ifa_notify()
6126 if (ifp->idev->cnf.forwarding) in __ipv6_ifa_notify()
6128 if (!ipv6_addr_any(&ifp->peer_addr)) in __ipv6_ifa_notify()
6129 addrconf_prefix_route(&ifp->peer_addr, 128, in __ipv6_ifa_notify()
6130 ifp->rt_priority, ifp->idev->dev, in __ipv6_ifa_notify()
6134 if (ifp->idev->cnf.forwarding) in __ipv6_ifa_notify()
6136 addrconf_leave_solict(ifp->idev, &ifp->addr); in __ipv6_ifa_notify()
6137 if (!ipv6_addr_any(&ifp->peer_addr)) { in __ipv6_ifa_notify()
6140 rt = addrconf_get_prefix_route(&ifp->peer_addr, 128, in __ipv6_ifa_notify()
6141 ifp->idev->dev, 0, 0, in __ipv6_ifa_notify()
6146 if (ifp->rt) { in __ipv6_ifa_notify()
6147 ip6_del_rt(net, ifp->rt, false); in __ipv6_ifa_notify()
6148 ifp->rt = NULL; in __ipv6_ifa_notify()
6153 atomic_inc(&net->ipv6.dev_addr_genid); in __ipv6_ifa_notify()
6159 if (likely(ifp->idev->dead == 0)) in ipv6_ifa_notify()
6169 int *valp = ctl->data; in addrconf_sysctl_forward()
6176 * ctl->data points to idev->cnf.forwarding, we should in addrconf_sysctl_forward()
6194 struct inet6_dev *idev = ctl->extra1; in addrconf_sysctl_mtu()
6200 lctl.extra2 = idev ? &idev->dev->mtu : NULL; in addrconf_sysctl_mtu()
6209 if (!idev || !idev->dev) in dev_disable_change()
6212 netdev_notifier_info_init(&info, idev->dev); in dev_disable_change()
6213 if (idev->cnf.disable_ipv6) in dev_disable_change()
6227 int changed = (!idev->cnf.disable_ipv6) ^ (!newf); in addrconf_disable_change()
6228 idev->cnf.disable_ipv6 = newf; in addrconf_disable_change()
6243 net = (struct net *)table->extra2; in addrconf_disable_ipv6()
6247 if (p == &net->ipv6.devconf_dflt->disable_ipv6) { in addrconf_disable_ipv6()
6252 if (p == &net->ipv6.devconf_all->disable_ipv6) { in addrconf_disable_ipv6()
6253 net->ipv6.devconf_dflt->disable_ipv6 = newf; in addrconf_disable_ipv6()
6256 dev_disable_change((struct inet6_dev *)table->extra1); in addrconf_disable_ipv6()
6265 int *valp = ctl->data; in addrconf_sysctl_disable()
6272 * ctl->data points to idev->cnf.disable_ipv6, we should in addrconf_sysctl_disable()
6290 int *valp = ctl->data; in addrconf_sysctl_proxy_ndp()
6299 struct net *net = ctl->extra2; in addrconf_sysctl_proxy_ndp()
6304 if (valp == &net->ipv6.devconf_dflt->proxy_ndp) in addrconf_sysctl_proxy_ndp()
6308 net->ipv6.devconf_dflt); in addrconf_sysctl_proxy_ndp()
6309 else if (valp == &net->ipv6.devconf_all->proxy_ndp) in addrconf_sysctl_proxy_ndp()
6313 net->ipv6.devconf_all); in addrconf_sysctl_proxy_ndp()
6315 struct inet6_dev *idev = ctl->extra1; in addrconf_sysctl_proxy_ndp()
6319 idev->dev->ifindex, in addrconf_sysctl_proxy_ndp()
6320 &idev->cnf); in addrconf_sysctl_proxy_ndp()
6334 struct inet6_dev *idev = (struct inet6_dev *)ctl->extra1; in addrconf_sysctl_addr_gen_mode()
6335 struct net *net = (struct net *)ctl->extra2; in addrconf_sysctl_addr_gen_mode()
6339 .mode = ctl->mode, in addrconf_sysctl_addr_gen_mode()
6345 new_val = *((u32 *)ctl->data); in addrconf_sysctl_addr_gen_mode()
6353 ret = -EINVAL; in addrconf_sysctl_addr_gen_mode()
6359 ret = -EINVAL; in addrconf_sysctl_addr_gen_mode()
6363 if (idev->cnf.addr_gen_mode != new_val) { in addrconf_sysctl_addr_gen_mode()
6364 idev->cnf.addr_gen_mode = new_val; in addrconf_sysctl_addr_gen_mode()
6365 addrconf_dev_config(idev->dev); in addrconf_sysctl_addr_gen_mode()
6367 } else if (&net->ipv6.devconf_all->addr_gen_mode == ctl->data) { in addrconf_sysctl_addr_gen_mode()
6370 net->ipv6.devconf_dflt->addr_gen_mode = new_val; in addrconf_sysctl_addr_gen_mode()
6374 idev->cnf.addr_gen_mode != new_val) { in addrconf_sysctl_addr_gen_mode()
6375 idev->cnf.addr_gen_mode = new_val; in addrconf_sysctl_addr_gen_mode()
6376 addrconf_dev_config(idev->dev); in addrconf_sysctl_addr_gen_mode()
6381 *((u32 *)ctl->data) = new_val; in addrconf_sysctl_addr_gen_mode()
6398 struct net *net = ctl->extra2; in addrconf_sysctl_stable_secret()
6399 struct ipv6_stable_secret *secret = ctl->data; in addrconf_sysctl_stable_secret()
6401 if (&net->ipv6.devconf_all->stable_secret == ctl->data) in addrconf_sysctl_stable_secret()
6402 return -EIO; in addrconf_sysctl_stable_secret()
6410 if (!write && !secret->initialized) { in addrconf_sysctl_stable_secret()
6411 err = -EIO; in addrconf_sysctl_stable_secret()
6415 err = snprintf(str, sizeof(str), "%pI6", &secret->secret); in addrconf_sysctl_stable_secret()
6417 err = -EIO; in addrconf_sysctl_stable_secret()
6425 if (in6_pton(str, -1, addr.in6_u.u6_addr8, -1, NULL) != 1) { in addrconf_sysctl_stable_secret()
6426 err = -EIO; in addrconf_sysctl_stable_secret()
6430 secret->initialized = true; in addrconf_sysctl_stable_secret()
6431 secret->secret = addr; in addrconf_sysctl_stable_secret()
6433 if (&net->ipv6.devconf_dflt->stable_secret == ctl->data) { in addrconf_sysctl_stable_secret()
6440 idev->cnf.addr_gen_mode = in addrconf_sysctl_stable_secret()
6445 struct inet6_dev *idev = ctl->extra1; in addrconf_sysctl_stable_secret()
6447 idev->cnf.addr_gen_mode = IN6_ADDR_GEN_MODE_STABLE_PRIVACY; in addrconf_sysctl_stable_secret()
6462 int *valp = ctl->data; in addrconf_sysctl_ignore_routes_with_linkdown()
6468 /* ctl->data points to idev->cnf.ignore_routes_when_linkdown in addrconf_sysctl_ignore_routes_with_linkdown()
6488 rt->dst.flags |= DST_NOPOLICY; in addrconf_set_nopolicy()
6490 rt->dst.flags &= ~DST_NOPOLICY; in addrconf_set_nopolicy()
6499 read_lock_bh(&idev->lock); in addrconf_disable_policy_idev()
6500 list_for_each_entry(ifa, &idev->addr_list, if_list) { in addrconf_disable_policy_idev()
6501 spin_lock(&ifa->lock); in addrconf_disable_policy_idev()
6502 if (ifa->rt) { in addrconf_disable_policy_idev()
6504 struct fib6_nh *nh = ifa->rt->fib6_nh; in addrconf_disable_policy_idev()
6508 ifa->rt->dst_nopolicy = val ? true : false; in addrconf_disable_policy_idev()
6509 if (nh->rt6i_pcpu) { in addrconf_disable_policy_idev()
6513 rtp = per_cpu_ptr(nh->rt6i_pcpu, cpu); in addrconf_disable_policy_idev()
6519 spin_unlock(&ifa->lock); in addrconf_disable_policy_idev()
6521 read_unlock_bh(&idev->lock); in addrconf_disable_policy_idev()
6535 net = (struct net *)ctl->extra2; in addrconf_disable_policy()
6536 if (valp == &net->ipv6.devconf_dflt->disable_policy) { in addrconf_disable_policy()
6541 if (valp == &net->ipv6.devconf_all->disable_policy) { in addrconf_disable_policy()
6550 idev = (struct inet6_dev *)ctl->extra1; in addrconf_disable_policy()
6561 int *valp = ctl->data; in addrconf_sysctl_disable_policy()
6580 static int minus_one = -1;
6990 table[i].data += (char *)p - (char *)&ipv6_devconf; in __addrconf_sysctl_register()
7003 p->sysctl_header = register_net_sysctl(net, path, table); in __addrconf_sysctl_register()
7004 if (!p->sysctl_header) in __addrconf_sysctl_register()
7012 ifindex = idev->dev->ifindex; in __addrconf_sysctl_register()
7020 return -ENOBUFS; in __addrconf_sysctl_register()
7028 if (!p->sysctl_header) in __addrconf_sysctl_unregister()
7031 table = p->sysctl_header->ctl_table_arg; in __addrconf_sysctl_unregister()
7032 unregister_net_sysctl_table(p->sysctl_header); in __addrconf_sysctl_unregister()
7033 p->sysctl_header = NULL; in __addrconf_sysctl_unregister()
7043 if (!sysctl_dev_name_is_allowed(idev->dev->name)) in addrconf_sysctl_register()
7044 return -EINVAL; in addrconf_sysctl_register()
7046 err = neigh_sysctl_register(idev->dev, idev->nd_parms, in addrconf_sysctl_register()
7050 err = __addrconf_sysctl_register(dev_net(idev->dev), idev->dev->name, in addrconf_sysctl_register()
7051 idev, &idev->cnf); in addrconf_sysctl_register()
7053 neigh_sysctl_unregister(idev->nd_parms); in addrconf_sysctl_register()
7060 __addrconf_sysctl_unregister(dev_net(idev->dev), &idev->cnf, in addrconf_sysctl_unregister()
7061 idev->dev->ifindex); in addrconf_sysctl_unregister()
7062 neigh_sysctl_unregister(idev->nd_parms); in addrconf_sysctl_unregister()
7070 int err = -ENOMEM; in addrconf_init_net()
7090 memcpy(all, current->nsproxy->net_ns->ipv6.devconf_all, in addrconf_init_net()
7093 current->nsproxy->net_ns->ipv6.devconf_dflt, in addrconf_init_net()
7104 dflt->autoconf = ipv6_defaults.autoconf; in addrconf_init_net()
7105 dflt->disable_ipv6 = ipv6_defaults.disable_ipv6; in addrconf_init_net()
7107 dflt->stable_secret.initialized = false; in addrconf_init_net()
7108 all->stable_secret.initialized = false; in addrconf_init_net()
7110 net->ipv6.devconf_all = all; in addrconf_init_net()
7111 net->ipv6.devconf_dflt = dflt; in addrconf_init_net()
7139 __addrconf_sysctl_unregister(net, net->ipv6.devconf_dflt, in addrconf_exit_net()
7141 __addrconf_sysctl_unregister(net, net->ipv6.devconf_all, in addrconf_exit_net()
7144 kfree(net->ipv6.devconf_dflt); in addrconf_exit_net()
7145 kfree(net->ipv6.devconf_all); in addrconf_exit_net()
7183 err = -ENOMEM; in addrconf_init()
7189 * before it can bring up and give link-local addresses in addrconf_init()
7196 * give link-local addresses to all devices besides loopback_dev in addrconf_init()
7197 * first, then loopback_dev, which cases all the non-loopback_dev in addrconf_init()
7198 * devices to fail to get a link-local address. in addrconf_init()