0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037 #define pr_fmt(fmt) "IPv6: " fmt
0038
0039 #include <linux/errno.h>
0040 #include <linux/types.h>
0041 #include <linux/kernel.h>
0042 #include <linux/sched/signal.h>
0043 #include <linux/socket.h>
0044 #include <linux/sockios.h>
0045 #include <linux/net.h>
0046 #include <linux/inet.h>
0047 #include <linux/in6.h>
0048 #include <linux/netdevice.h>
0049 #include <linux/if_addr.h>
0050 #include <linux/if_arp.h>
0051 #include <linux/if_arcnet.h>
0052 #include <linux/if_infiniband.h>
0053 #include <linux/route.h>
0054 #include <linux/inetdevice.h>
0055 #include <linux/init.h>
0056 #include <linux/slab.h>
0057 #ifdef CONFIG_SYSCTL
0058 #include <linux/sysctl.h>
0059 #endif
0060 #include <linux/capability.h>
0061 #include <linux/delay.h>
0062 #include <linux/notifier.h>
0063 #include <linux/string.h>
0064 #include <linux/hash.h>
0065
0066 #include <net/net_namespace.h>
0067 #include <net/sock.h>
0068 #include <net/snmp.h>
0069
0070 #include <net/6lowpan.h>
0071 #include <net/firewire.h>
0072 #include <net/ipv6.h>
0073 #include <net/protocol.h>
0074 #include <net/ndisc.h>
0075 #include <net/ip6_route.h>
0076 #include <net/addrconf.h>
0077 #include <net/tcp.h>
0078 #include <net/ip.h>
0079 #include <net/netlink.h>
0080 #include <net/pkt_sched.h>
0081 #include <net/l3mdev.h>
0082 #include <linux/if_tunnel.h>
0083 #include <linux/rtnetlink.h>
0084 #include <linux/netconf.h>
0085 #include <linux/random.h>
0086 #include <linux/uaccess.h>
0087 #include <asm/unaligned.h>
0088
0089 #include <linux/proc_fs.h>
0090 #include <linux/seq_file.h>
0091 #include <linux/export.h>
0092 #include <linux/ioam6.h>
0093
0094 #define INFINITY_LIFE_TIME 0xFFFFFFFF
0095
0096 #define IPV6_MAX_STRLEN \
0097 sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")
0098
0099 static inline u32 cstamp_delta(unsigned long cstamp)
0100 {
0101 return (cstamp - INITIAL_JIFFIES) * 100UL / HZ;
0102 }
0103
0104 static inline s32 rfc3315_s14_backoff_init(s32 irt)
0105 {
0106
0107 u64 tmp = (900000 + prandom_u32() % 200001) * (u64)irt;
0108 do_div(tmp, 1000000);
0109 return (s32)tmp;
0110 }
0111
0112 static inline s32 rfc3315_s14_backoff_update(s32 rt, s32 mrt)
0113 {
0114
0115 u64 tmp = (1900000 + prandom_u32() % 200001) * (u64)rt;
0116 do_div(tmp, 1000000);
0117 if ((s32)tmp > mrt) {
0118
0119 tmp = (900000 + prandom_u32() % 200001) * (u64)mrt;
0120 do_div(tmp, 1000000);
0121 }
0122 return (s32)tmp;
0123 }
0124
0125 #ifdef CONFIG_SYSCTL
0126 static int addrconf_sysctl_register(struct inet6_dev *idev);
0127 static void addrconf_sysctl_unregister(struct inet6_dev *idev);
0128 #else
0129 static inline int addrconf_sysctl_register(struct inet6_dev *idev)
0130 {
0131 return 0;
0132 }
0133
0134 static inline void addrconf_sysctl_unregister(struct inet6_dev *idev)
0135 {
0136 }
0137 #endif
0138
0139 static void ipv6_gen_rnd_iid(struct in6_addr *addr);
0140
0141 static int ipv6_generate_eui64(u8 *eui, struct net_device *dev);
0142 static int ipv6_count_addresses(const struct inet6_dev *idev);
0143 static int ipv6_generate_stable_address(struct in6_addr *addr,
0144 u8 dad_count,
0145 const struct inet6_dev *idev);
0146
0147 #define IN6_ADDR_HSIZE_SHIFT 8
0148 #define IN6_ADDR_HSIZE (1 << IN6_ADDR_HSIZE_SHIFT)
0149
0150 static void addrconf_verify(struct net *net);
0151 static void addrconf_verify_rtnl(struct net *net);
0152
0153 static struct workqueue_struct *addrconf_wq;
0154
0155 static void addrconf_join_anycast(struct inet6_ifaddr *ifp);
0156 static void addrconf_leave_anycast(struct inet6_ifaddr *ifp);
0157
0158 static void addrconf_type_change(struct net_device *dev,
0159 unsigned long event);
0160 static int addrconf_ifdown(struct net_device *dev, bool unregister);
0161
0162 static struct fib6_info *addrconf_get_prefix_route(const struct in6_addr *pfx,
0163 int plen,
0164 const struct net_device *dev,
0165 u32 flags, u32 noflags,
0166 bool no_gw);
0167
0168 static void addrconf_dad_start(struct inet6_ifaddr *ifp);
0169 static void addrconf_dad_work(struct work_struct *w);
0170 static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id,
0171 bool send_na);
0172 static void addrconf_dad_run(struct inet6_dev *idev, bool restart);
0173 static void addrconf_rs_timer(struct timer_list *t);
0174 static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa);
0175 static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa);
0176
0177 static void inet6_prefix_notify(int event, struct inet6_dev *idev,
0178 struct prefix_info *pinfo);
0179
0180 static struct ipv6_devconf ipv6_devconf __read_mostly = {
0181 .forwarding = 0,
0182 .hop_limit = IPV6_DEFAULT_HOPLIMIT,
0183 .mtu6 = IPV6_MIN_MTU,
0184 .accept_ra = 1,
0185 .accept_redirects = 1,
0186 .autoconf = 1,
0187 .force_mld_version = 0,
0188 .mldv1_unsolicited_report_interval = 10 * HZ,
0189 .mldv2_unsolicited_report_interval = HZ,
0190 .dad_transmits = 1,
0191 .rtr_solicits = MAX_RTR_SOLICITATIONS,
0192 .rtr_solicit_interval = RTR_SOLICITATION_INTERVAL,
0193 .rtr_solicit_max_interval = RTR_SOLICITATION_MAX_INTERVAL,
0194 .rtr_solicit_delay = MAX_RTR_SOLICITATION_DELAY,
0195 .use_tempaddr = 0,
0196 .temp_valid_lft = TEMP_VALID_LIFETIME,
0197 .temp_prefered_lft = TEMP_PREFERRED_LIFETIME,
0198 .regen_max_retry = REGEN_MAX_RETRY,
0199 .max_desync_factor = MAX_DESYNC_FACTOR,
0200 .max_addresses = IPV6_MAX_ADDRESSES,
0201 .accept_ra_defrtr = 1,
0202 .ra_defrtr_metric = IP6_RT_PRIO_USER,
0203 .accept_ra_from_local = 0,
0204 .accept_ra_min_hop_limit= 1,
0205 .accept_ra_pinfo = 1,
0206 #ifdef CONFIG_IPV6_ROUTER_PREF
0207 .accept_ra_rtr_pref = 1,
0208 .rtr_probe_interval = 60 * HZ,
0209 #ifdef CONFIG_IPV6_ROUTE_INFO
0210 .accept_ra_rt_info_min_plen = 0,
0211 .accept_ra_rt_info_max_plen = 0,
0212 #endif
0213 #endif
0214 .proxy_ndp = 0,
0215 .accept_source_route = 0,
0216 .disable_ipv6 = 0,
0217 .accept_dad = 0,
0218 .suppress_frag_ndisc = 1,
0219 .accept_ra_mtu = 1,
0220 .stable_secret = {
0221 .initialized = false,
0222 },
0223 .use_oif_addrs_only = 0,
0224 .ignore_routes_with_linkdown = 0,
0225 .keep_addr_on_down = 0,
0226 .seg6_enabled = 0,
0227 #ifdef CONFIG_IPV6_SEG6_HMAC
0228 .seg6_require_hmac = 0,
0229 #endif
0230 .enhanced_dad = 1,
0231 .addr_gen_mode = IN6_ADDR_GEN_MODE_EUI64,
0232 .disable_policy = 0,
0233 .rpl_seg_enabled = 0,
0234 .ioam6_enabled = 0,
0235 .ioam6_id = IOAM6_DEFAULT_IF_ID,
0236 .ioam6_id_wide = IOAM6_DEFAULT_IF_ID_WIDE,
0237 .ndisc_evict_nocarrier = 1,
0238 };
0239
0240 static struct ipv6_devconf ipv6_devconf_dflt __read_mostly = {
0241 .forwarding = 0,
0242 .hop_limit = IPV6_DEFAULT_HOPLIMIT,
0243 .mtu6 = IPV6_MIN_MTU,
0244 .accept_ra = 1,
0245 .accept_redirects = 1,
0246 .autoconf = 1,
0247 .force_mld_version = 0,
0248 .mldv1_unsolicited_report_interval = 10 * HZ,
0249 .mldv2_unsolicited_report_interval = HZ,
0250 .dad_transmits = 1,
0251 .rtr_solicits = MAX_RTR_SOLICITATIONS,
0252 .rtr_solicit_interval = RTR_SOLICITATION_INTERVAL,
0253 .rtr_solicit_max_interval = RTR_SOLICITATION_MAX_INTERVAL,
0254 .rtr_solicit_delay = MAX_RTR_SOLICITATION_DELAY,
0255 .use_tempaddr = 0,
0256 .temp_valid_lft = TEMP_VALID_LIFETIME,
0257 .temp_prefered_lft = TEMP_PREFERRED_LIFETIME,
0258 .regen_max_retry = REGEN_MAX_RETRY,
0259 .max_desync_factor = MAX_DESYNC_FACTOR,
0260 .max_addresses = IPV6_MAX_ADDRESSES,
0261 .accept_ra_defrtr = 1,
0262 .ra_defrtr_metric = IP6_RT_PRIO_USER,
0263 .accept_ra_from_local = 0,
0264 .accept_ra_min_hop_limit= 1,
0265 .accept_ra_pinfo = 1,
0266 #ifdef CONFIG_IPV6_ROUTER_PREF
0267 .accept_ra_rtr_pref = 1,
0268 .rtr_probe_interval = 60 * HZ,
0269 #ifdef CONFIG_IPV6_ROUTE_INFO
0270 .accept_ra_rt_info_min_plen = 0,
0271 .accept_ra_rt_info_max_plen = 0,
0272 #endif
0273 #endif
0274 .proxy_ndp = 0,
0275 .accept_source_route = 0,
0276 .disable_ipv6 = 0,
0277 .accept_dad = 1,
0278 .suppress_frag_ndisc = 1,
0279 .accept_ra_mtu = 1,
0280 .stable_secret = {
0281 .initialized = false,
0282 },
0283 .use_oif_addrs_only = 0,
0284 .ignore_routes_with_linkdown = 0,
0285 .keep_addr_on_down = 0,
0286 .seg6_enabled = 0,
0287 #ifdef CONFIG_IPV6_SEG6_HMAC
0288 .seg6_require_hmac = 0,
0289 #endif
0290 .enhanced_dad = 1,
0291 .addr_gen_mode = IN6_ADDR_GEN_MODE_EUI64,
0292 .disable_policy = 0,
0293 .rpl_seg_enabled = 0,
0294 .ioam6_enabled = 0,
0295 .ioam6_id = IOAM6_DEFAULT_IF_ID,
0296 .ioam6_id_wide = IOAM6_DEFAULT_IF_ID_WIDE,
0297 .ndisc_evict_nocarrier = 1,
0298 };
0299
0300
0301 static inline bool addrconf_link_ready(const struct net_device *dev)
0302 {
0303 return netif_oper_up(dev) && !qdisc_tx_is_noop(dev);
0304 }
0305
0306 static void addrconf_del_rs_timer(struct inet6_dev *idev)
0307 {
0308 if (del_timer(&idev->rs_timer))
0309 __in6_dev_put(idev);
0310 }
0311
0312 static void addrconf_del_dad_work(struct inet6_ifaddr *ifp)
0313 {
0314 if (cancel_delayed_work(&ifp->dad_work))
0315 __in6_ifa_put(ifp);
0316 }
0317
0318 static void addrconf_mod_rs_timer(struct inet6_dev *idev,
0319 unsigned long when)
0320 {
0321 if (!timer_pending(&idev->rs_timer))
0322 in6_dev_hold(idev);
0323 mod_timer(&idev->rs_timer, jiffies + when);
0324 }
0325
0326 static void addrconf_mod_dad_work(struct inet6_ifaddr *ifp,
0327 unsigned long delay)
0328 {
0329 in6_ifa_hold(ifp);
0330 if (mod_delayed_work(addrconf_wq, &ifp->dad_work, delay))
0331 in6_ifa_put(ifp);
0332 }
0333
0334 static int snmp6_alloc_dev(struct inet6_dev *idev)
0335 {
0336 int i;
0337
0338 idev->stats.ipv6 = alloc_percpu_gfp(struct ipstats_mib, GFP_KERNEL_ACCOUNT);
0339 if (!idev->stats.ipv6)
0340 goto err_ip;
0341
0342 for_each_possible_cpu(i) {
0343 struct ipstats_mib *addrconf_stats;
0344 addrconf_stats = per_cpu_ptr(idev->stats.ipv6, i);
0345 u64_stats_init(&addrconf_stats->syncp);
0346 }
0347
0348
0349 idev->stats.icmpv6dev = kzalloc(sizeof(struct icmpv6_mib_device),
0350 GFP_KERNEL);
0351 if (!idev->stats.icmpv6dev)
0352 goto err_icmp;
0353 idev->stats.icmpv6msgdev = kzalloc(sizeof(struct icmpv6msg_mib_device),
0354 GFP_KERNEL_ACCOUNT);
0355 if (!idev->stats.icmpv6msgdev)
0356 goto err_icmpmsg;
0357
0358 return 0;
0359
0360 err_icmpmsg:
0361 kfree(idev->stats.icmpv6dev);
0362 err_icmp:
0363 free_percpu(idev->stats.ipv6);
0364 err_ip:
0365 return -ENOMEM;
0366 }
0367
0368 static struct inet6_dev *ipv6_add_dev(struct net_device *dev)
0369 {
0370 struct inet6_dev *ndev;
0371 int err = -ENOMEM;
0372
0373 ASSERT_RTNL();
0374
0375 if (dev->mtu < IPV6_MIN_MTU && dev != blackhole_netdev)
0376 return ERR_PTR(-EINVAL);
0377
0378 ndev = kzalloc(sizeof(*ndev), GFP_KERNEL_ACCOUNT);
0379 if (!ndev)
0380 return ERR_PTR(err);
0381
0382 rwlock_init(&ndev->lock);
0383 ndev->dev = dev;
0384 INIT_LIST_HEAD(&ndev->addr_list);
0385 timer_setup(&ndev->rs_timer, addrconf_rs_timer, 0);
0386 memcpy(&ndev->cnf, dev_net(dev)->ipv6.devconf_dflt, sizeof(ndev->cnf));
0387
0388 if (ndev->cnf.stable_secret.initialized)
0389 ndev->cnf.addr_gen_mode = IN6_ADDR_GEN_MODE_STABLE_PRIVACY;
0390
0391 ndev->cnf.mtu6 = dev->mtu;
0392 ndev->ra_mtu = 0;
0393 ndev->nd_parms = neigh_parms_alloc(dev, &nd_tbl);
0394 if (!ndev->nd_parms) {
0395 kfree(ndev);
0396 return ERR_PTR(err);
0397 }
0398 if (ndev->cnf.forwarding)
0399 dev_disable_lro(dev);
0400
0401 netdev_hold(dev, &ndev->dev_tracker, GFP_KERNEL);
0402
0403 if (snmp6_alloc_dev(ndev) < 0) {
0404 netdev_dbg(dev, "%s: cannot allocate memory for statistics\n",
0405 __func__);
0406 neigh_parms_release(&nd_tbl, ndev->nd_parms);
0407 netdev_put(dev, &ndev->dev_tracker);
0408 kfree(ndev);
0409 return ERR_PTR(err);
0410 }
0411
0412 if (dev != blackhole_netdev) {
0413 if (snmp6_register_dev(ndev) < 0) {
0414 netdev_dbg(dev, "%s: cannot create /proc/net/dev_snmp6/%s\n",
0415 __func__, dev->name);
0416 goto err_release;
0417 }
0418 }
0419
0420 refcount_set(&ndev->refcnt, 1);
0421
0422 if (dev->flags & (IFF_NOARP | IFF_LOOPBACK))
0423 ndev->cnf.accept_dad = -1;
0424
0425 #if IS_ENABLED(CONFIG_IPV6_SIT)
0426 if (dev->type == ARPHRD_SIT && (dev->priv_flags & IFF_ISATAP)) {
0427 pr_info("%s: Disabled Multicast RS\n", dev->name);
0428 ndev->cnf.rtr_solicits = 0;
0429 }
0430 #endif
0431
0432 INIT_LIST_HEAD(&ndev->tempaddr_list);
0433 ndev->desync_factor = U32_MAX;
0434 if ((dev->flags&IFF_LOOPBACK) ||
0435 dev->type == ARPHRD_TUNNEL ||
0436 dev->type == ARPHRD_TUNNEL6 ||
0437 dev->type == ARPHRD_SIT ||
0438 dev->type == ARPHRD_NONE) {
0439 ndev->cnf.use_tempaddr = -1;
0440 }
0441
0442 ndev->token = in6addr_any;
0443
0444 if (netif_running(dev) && addrconf_link_ready(dev))
0445 ndev->if_flags |= IF_READY;
0446
0447 ipv6_mc_init_dev(ndev);
0448 ndev->tstamp = jiffies;
0449 if (dev != blackhole_netdev) {
0450 err = addrconf_sysctl_register(ndev);
0451 if (err) {
0452 ipv6_mc_destroy_dev(ndev);
0453 snmp6_unregister_dev(ndev);
0454 goto err_release;
0455 }
0456 }
0457
0458 rcu_assign_pointer(dev->ip6_ptr, ndev);
0459
0460 if (dev != blackhole_netdev) {
0461
0462 ipv6_dev_mc_inc(dev, &in6addr_interfacelocal_allnodes);
0463
0464
0465 ipv6_dev_mc_inc(dev, &in6addr_linklocal_allnodes);
0466
0467
0468 if (ndev->cnf.forwarding && (dev->flags & IFF_MULTICAST))
0469 ipv6_dev_mc_inc(dev, &in6addr_linklocal_allrouters);
0470 }
0471 return ndev;
0472
0473 err_release:
0474 neigh_parms_release(&nd_tbl, ndev->nd_parms);
0475 ndev->dead = 1;
0476 in6_dev_finish_destroy(ndev);
0477 return ERR_PTR(err);
0478 }
0479
0480 static struct inet6_dev *ipv6_find_idev(struct net_device *dev)
0481 {
0482 struct inet6_dev *idev;
0483
0484 ASSERT_RTNL();
0485
0486 idev = __in6_dev_get(dev);
0487 if (!idev) {
0488 idev = ipv6_add_dev(dev);
0489 if (IS_ERR(idev))
0490 return idev;
0491 }
0492
0493 if (dev->flags&IFF_UP)
0494 ipv6_mc_up(idev);
0495 return idev;
0496 }
0497
0498 static int inet6_netconf_msgsize_devconf(int type)
0499 {
0500 int size = NLMSG_ALIGN(sizeof(struct netconfmsg))
0501 + nla_total_size(4);
0502 bool all = false;
0503
0504 if (type == NETCONFA_ALL)
0505 all = true;
0506
0507 if (all || type == NETCONFA_FORWARDING)
0508 size += nla_total_size(4);
0509 #ifdef CONFIG_IPV6_MROUTE
0510 if (all || type == NETCONFA_MC_FORWARDING)
0511 size += nla_total_size(4);
0512 #endif
0513 if (all || type == NETCONFA_PROXY_NEIGH)
0514 size += nla_total_size(4);
0515
0516 if (all || type == NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN)
0517 size += nla_total_size(4);
0518
0519 return size;
0520 }
0521
0522 static int inet6_netconf_fill_devconf(struct sk_buff *skb, int ifindex,
0523 struct ipv6_devconf *devconf, u32 portid,
0524 u32 seq, int event, unsigned int flags,
0525 int type)
0526 {
0527 struct nlmsghdr *nlh;
0528 struct netconfmsg *ncm;
0529 bool all = false;
0530
0531 nlh = nlmsg_put(skb, portid, seq, event, sizeof(struct netconfmsg),
0532 flags);
0533 if (!nlh)
0534 return -EMSGSIZE;
0535
0536 if (type == NETCONFA_ALL)
0537 all = true;
0538
0539 ncm = nlmsg_data(nlh);
0540 ncm->ncm_family = AF_INET6;
0541
0542 if (nla_put_s32(skb, NETCONFA_IFINDEX, ifindex) < 0)
0543 goto nla_put_failure;
0544
0545 if (!devconf)
0546 goto out;
0547
0548 if ((all || type == NETCONFA_FORWARDING) &&
0549 nla_put_s32(skb, NETCONFA_FORWARDING, devconf->forwarding) < 0)
0550 goto nla_put_failure;
0551 #ifdef CONFIG_IPV6_MROUTE
0552 if ((all || type == NETCONFA_MC_FORWARDING) &&
0553 nla_put_s32(skb, NETCONFA_MC_FORWARDING,
0554 atomic_read(&devconf->mc_forwarding)) < 0)
0555 goto nla_put_failure;
0556 #endif
0557 if ((all || type == NETCONFA_PROXY_NEIGH) &&
0558 nla_put_s32(skb, NETCONFA_PROXY_NEIGH, devconf->proxy_ndp) < 0)
0559 goto nla_put_failure;
0560
0561 if ((all || type == NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN) &&
0562 nla_put_s32(skb, NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN,
0563 devconf->ignore_routes_with_linkdown) < 0)
0564 goto nla_put_failure;
0565
0566 out:
0567 nlmsg_end(skb, nlh);
0568 return 0;
0569
0570 nla_put_failure:
0571 nlmsg_cancel(skb, nlh);
0572 return -EMSGSIZE;
0573 }
0574
0575 void inet6_netconf_notify_devconf(struct net *net, int event, int type,
0576 int ifindex, struct ipv6_devconf *devconf)
0577 {
0578 struct sk_buff *skb;
0579 int err = -ENOBUFS;
0580
0581 skb = nlmsg_new(inet6_netconf_msgsize_devconf(type), GFP_KERNEL);
0582 if (!skb)
0583 goto errout;
0584
0585 err = inet6_netconf_fill_devconf(skb, ifindex, devconf, 0, 0,
0586 event, 0, type);
0587 if (err < 0) {
0588
0589 WARN_ON(err == -EMSGSIZE);
0590 kfree_skb(skb);
0591 goto errout;
0592 }
0593 rtnl_notify(skb, net, 0, RTNLGRP_IPV6_NETCONF, NULL, GFP_KERNEL);
0594 return;
0595 errout:
0596 rtnl_set_sk_err(net, RTNLGRP_IPV6_NETCONF, err);
0597 }
0598
0599 static const struct nla_policy devconf_ipv6_policy[NETCONFA_MAX+1] = {
0600 [NETCONFA_IFINDEX] = { .len = sizeof(int) },
0601 [NETCONFA_FORWARDING] = { .len = sizeof(int) },
0602 [NETCONFA_PROXY_NEIGH] = { .len = sizeof(int) },
0603 [NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN] = { .len = sizeof(int) },
0604 };
0605
0606 static int inet6_netconf_valid_get_req(struct sk_buff *skb,
0607 const struct nlmsghdr *nlh,
0608 struct nlattr **tb,
0609 struct netlink_ext_ack *extack)
0610 {
0611 int i, err;
0612
0613 if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(struct netconfmsg))) {
0614 NL_SET_ERR_MSG_MOD(extack, "Invalid header for netconf get request");
0615 return -EINVAL;
0616 }
0617
0618 if (!netlink_strict_get_check(skb))
0619 return nlmsg_parse_deprecated(nlh, sizeof(struct netconfmsg),
0620 tb, NETCONFA_MAX,
0621 devconf_ipv6_policy, extack);
0622
0623 err = nlmsg_parse_deprecated_strict(nlh, sizeof(struct netconfmsg),
0624 tb, NETCONFA_MAX,
0625 devconf_ipv6_policy, extack);
0626 if (err)
0627 return err;
0628
0629 for (i = 0; i <= NETCONFA_MAX; i++) {
0630 if (!tb[i])
0631 continue;
0632
0633 switch (i) {
0634 case NETCONFA_IFINDEX:
0635 break;
0636 default:
0637 NL_SET_ERR_MSG_MOD(extack, "Unsupported attribute in netconf get request");
0638 return -EINVAL;
0639 }
0640 }
0641
0642 return 0;
0643 }
0644
0645 static int inet6_netconf_get_devconf(struct sk_buff *in_skb,
0646 struct nlmsghdr *nlh,
0647 struct netlink_ext_ack *extack)
0648 {
0649 struct net *net = sock_net(in_skb->sk);
0650 struct nlattr *tb[NETCONFA_MAX+1];
0651 struct inet6_dev *in6_dev = NULL;
0652 struct net_device *dev = NULL;
0653 struct sk_buff *skb;
0654 struct ipv6_devconf *devconf;
0655 int ifindex;
0656 int err;
0657
0658 err = inet6_netconf_valid_get_req(in_skb, nlh, tb, extack);
0659 if (err < 0)
0660 return err;
0661
0662 if (!tb[NETCONFA_IFINDEX])
0663 return -EINVAL;
0664
0665 err = -EINVAL;
0666 ifindex = nla_get_s32(tb[NETCONFA_IFINDEX]);
0667 switch (ifindex) {
0668 case NETCONFA_IFINDEX_ALL:
0669 devconf = net->ipv6.devconf_all;
0670 break;
0671 case NETCONFA_IFINDEX_DEFAULT:
0672 devconf = net->ipv6.devconf_dflt;
0673 break;
0674 default:
0675 dev = dev_get_by_index(net, ifindex);
0676 if (!dev)
0677 return -EINVAL;
0678 in6_dev = in6_dev_get(dev);
0679 if (!in6_dev)
0680 goto errout;
0681 devconf = &in6_dev->cnf;
0682 break;
0683 }
0684
0685 err = -ENOBUFS;
0686 skb = nlmsg_new(inet6_netconf_msgsize_devconf(NETCONFA_ALL), GFP_KERNEL);
0687 if (!skb)
0688 goto errout;
0689
0690 err = inet6_netconf_fill_devconf(skb, ifindex, devconf,
0691 NETLINK_CB(in_skb).portid,
0692 nlh->nlmsg_seq, RTM_NEWNETCONF, 0,
0693 NETCONFA_ALL);
0694 if (err < 0) {
0695
0696 WARN_ON(err == -EMSGSIZE);
0697 kfree_skb(skb);
0698 goto errout;
0699 }
0700 err = rtnl_unicast(skb, net, NETLINK_CB(in_skb).portid);
0701 errout:
0702 if (in6_dev)
0703 in6_dev_put(in6_dev);
0704 dev_put(dev);
0705 return err;
0706 }
0707
0708 static int inet6_netconf_dump_devconf(struct sk_buff *skb,
0709 struct netlink_callback *cb)
0710 {
0711 const struct nlmsghdr *nlh = cb->nlh;
0712 struct net *net = sock_net(skb->sk);
0713 int h, s_h;
0714 int idx, s_idx;
0715 struct net_device *dev;
0716 struct inet6_dev *idev;
0717 struct hlist_head *head;
0718
0719 if (cb->strict_check) {
0720 struct netlink_ext_ack *extack = cb->extack;
0721 struct netconfmsg *ncm;
0722
0723 if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*ncm))) {
0724 NL_SET_ERR_MSG_MOD(extack, "Invalid header for netconf dump request");
0725 return -EINVAL;
0726 }
0727
0728 if (nlmsg_attrlen(nlh, sizeof(*ncm))) {
0729 NL_SET_ERR_MSG_MOD(extack, "Invalid data after header in netconf dump request");
0730 return -EINVAL;
0731 }
0732 }
0733
0734 s_h = cb->args[0];
0735 s_idx = idx = cb->args[1];
0736
0737 for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) {
0738 idx = 0;
0739 head = &net->dev_index_head[h];
0740 rcu_read_lock();
0741 cb->seq = atomic_read(&net->ipv6.dev_addr_genid) ^
0742 net->dev_base_seq;
0743 hlist_for_each_entry_rcu(dev, head, index_hlist) {
0744 if (idx < s_idx)
0745 goto cont;
0746 idev = __in6_dev_get(dev);
0747 if (!idev)
0748 goto cont;
0749
0750 if (inet6_netconf_fill_devconf(skb, dev->ifindex,
0751 &idev->cnf,
0752 NETLINK_CB(cb->skb).portid,
0753 nlh->nlmsg_seq,
0754 RTM_NEWNETCONF,
0755 NLM_F_MULTI,
0756 NETCONFA_ALL) < 0) {
0757 rcu_read_unlock();
0758 goto done;
0759 }
0760 nl_dump_check_consistent(cb, nlmsg_hdr(skb));
0761 cont:
0762 idx++;
0763 }
0764 rcu_read_unlock();
0765 }
0766 if (h == NETDEV_HASHENTRIES) {
0767 if (inet6_netconf_fill_devconf(skb, NETCONFA_IFINDEX_ALL,
0768 net->ipv6.devconf_all,
0769 NETLINK_CB(cb->skb).portid,
0770 nlh->nlmsg_seq,
0771 RTM_NEWNETCONF, NLM_F_MULTI,
0772 NETCONFA_ALL) < 0)
0773 goto done;
0774 else
0775 h++;
0776 }
0777 if (h == NETDEV_HASHENTRIES + 1) {
0778 if (inet6_netconf_fill_devconf(skb, NETCONFA_IFINDEX_DEFAULT,
0779 net->ipv6.devconf_dflt,
0780 NETLINK_CB(cb->skb).portid,
0781 nlh->nlmsg_seq,
0782 RTM_NEWNETCONF, NLM_F_MULTI,
0783 NETCONFA_ALL) < 0)
0784 goto done;
0785 else
0786 h++;
0787 }
0788 done:
0789 cb->args[0] = h;
0790 cb->args[1] = idx;
0791
0792 return skb->len;
0793 }
0794
0795 #ifdef CONFIG_SYSCTL
0796 static void dev_forward_change(struct inet6_dev *idev)
0797 {
0798 struct net_device *dev;
0799 struct inet6_ifaddr *ifa;
0800 LIST_HEAD(tmp_addr_list);
0801
0802 if (!idev)
0803 return;
0804 dev = idev->dev;
0805 if (idev->cnf.forwarding)
0806 dev_disable_lro(dev);
0807 if (dev->flags & IFF_MULTICAST) {
0808 if (idev->cnf.forwarding) {
0809 ipv6_dev_mc_inc(dev, &in6addr_linklocal_allrouters);
0810 ipv6_dev_mc_inc(dev, &in6addr_interfacelocal_allrouters);
0811 ipv6_dev_mc_inc(dev, &in6addr_sitelocal_allrouters);
0812 } else {
0813 ipv6_dev_mc_dec(dev, &in6addr_linklocal_allrouters);
0814 ipv6_dev_mc_dec(dev, &in6addr_interfacelocal_allrouters);
0815 ipv6_dev_mc_dec(dev, &in6addr_sitelocal_allrouters);
0816 }
0817 }
0818
0819 read_lock_bh(&idev->lock);
0820 list_for_each_entry(ifa, &idev->addr_list, if_list) {
0821 if (ifa->flags&IFA_F_TENTATIVE)
0822 continue;
0823 list_add_tail(&ifa->if_list_aux, &tmp_addr_list);
0824 }
0825 read_unlock_bh(&idev->lock);
0826
0827 while (!list_empty(&tmp_addr_list)) {
0828 ifa = list_first_entry(&tmp_addr_list,
0829 struct inet6_ifaddr, if_list_aux);
0830 list_del(&ifa->if_list_aux);
0831 if (idev->cnf.forwarding)
0832 addrconf_join_anycast(ifa);
0833 else
0834 addrconf_leave_anycast(ifa);
0835 }
0836
0837 inet6_netconf_notify_devconf(dev_net(dev), RTM_NEWNETCONF,
0838 NETCONFA_FORWARDING,
0839 dev->ifindex, &idev->cnf);
0840 }
0841
0842
0843 static void addrconf_forward_change(struct net *net, __s32 newf)
0844 {
0845 struct net_device *dev;
0846 struct inet6_dev *idev;
0847
0848 for_each_netdev(net, dev) {
0849 idev = __in6_dev_get(dev);
0850 if (idev) {
0851 int changed = (!idev->cnf.forwarding) ^ (!newf);
0852 idev->cnf.forwarding = newf;
0853 if (changed)
0854 dev_forward_change(idev);
0855 }
0856 }
0857 }
0858
0859 static int addrconf_fixup_forwarding(struct ctl_table *table, int *p, int newf)
0860 {
0861 struct net *net;
0862 int old;
0863
0864 if (!rtnl_trylock())
0865 return restart_syscall();
0866
0867 net = (struct net *)table->extra2;
0868 old = *p;
0869 *p = newf;
0870
0871 if (p == &net->ipv6.devconf_dflt->forwarding) {
0872 if ((!newf) ^ (!old))
0873 inet6_netconf_notify_devconf(net, RTM_NEWNETCONF,
0874 NETCONFA_FORWARDING,
0875 NETCONFA_IFINDEX_DEFAULT,
0876 net->ipv6.devconf_dflt);
0877 rtnl_unlock();
0878 return 0;
0879 }
0880
0881 if (p == &net->ipv6.devconf_all->forwarding) {
0882 int old_dflt = net->ipv6.devconf_dflt->forwarding;
0883
0884 net->ipv6.devconf_dflt->forwarding = newf;
0885 if ((!newf) ^ (!old_dflt))
0886 inet6_netconf_notify_devconf(net, RTM_NEWNETCONF,
0887 NETCONFA_FORWARDING,
0888 NETCONFA_IFINDEX_DEFAULT,
0889 net->ipv6.devconf_dflt);
0890
0891 addrconf_forward_change(net, newf);
0892 if ((!newf) ^ (!old))
0893 inet6_netconf_notify_devconf(net, RTM_NEWNETCONF,
0894 NETCONFA_FORWARDING,
0895 NETCONFA_IFINDEX_ALL,
0896 net->ipv6.devconf_all);
0897 } else if ((!newf) ^ (!old))
0898 dev_forward_change((struct inet6_dev *)table->extra1);
0899 rtnl_unlock();
0900
0901 if (newf)
0902 rt6_purge_dflt_routers(net);
0903 return 1;
0904 }
0905
0906 static void addrconf_linkdown_change(struct net *net, __s32 newf)
0907 {
0908 struct net_device *dev;
0909 struct inet6_dev *idev;
0910
0911 for_each_netdev(net, dev) {
0912 idev = __in6_dev_get(dev);
0913 if (idev) {
0914 int changed = (!idev->cnf.ignore_routes_with_linkdown) ^ (!newf);
0915
0916 idev->cnf.ignore_routes_with_linkdown = newf;
0917 if (changed)
0918 inet6_netconf_notify_devconf(dev_net(dev),
0919 RTM_NEWNETCONF,
0920 NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN,
0921 dev->ifindex,
0922 &idev->cnf);
0923 }
0924 }
0925 }
0926
0927 static int addrconf_fixup_linkdown(struct ctl_table *table, int *p, int newf)
0928 {
0929 struct net *net;
0930 int old;
0931
0932 if (!rtnl_trylock())
0933 return restart_syscall();
0934
0935 net = (struct net *)table->extra2;
0936 old = *p;
0937 *p = newf;
0938
0939 if (p == &net->ipv6.devconf_dflt->ignore_routes_with_linkdown) {
0940 if ((!newf) ^ (!old))
0941 inet6_netconf_notify_devconf(net,
0942 RTM_NEWNETCONF,
0943 NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN,
0944 NETCONFA_IFINDEX_DEFAULT,
0945 net->ipv6.devconf_dflt);
0946 rtnl_unlock();
0947 return 0;
0948 }
0949
0950 if (p == &net->ipv6.devconf_all->ignore_routes_with_linkdown) {
0951 net->ipv6.devconf_dflt->ignore_routes_with_linkdown = newf;
0952 addrconf_linkdown_change(net, newf);
0953 if ((!newf) ^ (!old))
0954 inet6_netconf_notify_devconf(net,
0955 RTM_NEWNETCONF,
0956 NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN,
0957 NETCONFA_IFINDEX_ALL,
0958 net->ipv6.devconf_all);
0959 }
0960 rtnl_unlock();
0961
0962 return 1;
0963 }
0964
0965 #endif
0966
0967
0968 void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp)
0969 {
0970 WARN_ON(!hlist_unhashed(&ifp->addr_lst));
0971
0972 #ifdef NET_REFCNT_DEBUG
0973 pr_debug("%s\n", __func__);
0974 #endif
0975
0976 in6_dev_put(ifp->idev);
0977
0978 if (cancel_delayed_work(&ifp->dad_work))
0979 pr_notice("delayed DAD work was pending while freeing ifa=%p\n",
0980 ifp);
0981
0982 if (ifp->state != INET6_IFADDR_STATE_DEAD) {
0983 pr_warn("Freeing alive inet6 address %p\n", ifp);
0984 return;
0985 }
0986
0987 kfree_rcu(ifp, rcu);
0988 }
0989
0990 static void
0991 ipv6_link_dev_addr(struct inet6_dev *idev, struct inet6_ifaddr *ifp)
0992 {
0993 struct list_head *p;
0994 int ifp_scope = ipv6_addr_src_scope(&ifp->addr);
0995
0996
0997
0998
0999
1000 list_for_each(p, &idev->addr_list) {
1001 struct inet6_ifaddr *ifa
1002 = list_entry(p, struct inet6_ifaddr, if_list);
1003 if (ifp_scope >= ipv6_addr_src_scope(&ifa->addr))
1004 break;
1005 }
1006
1007 list_add_tail_rcu(&ifp->if_list, p);
1008 }
1009
1010 static u32 inet6_addr_hash(const struct net *net, const struct in6_addr *addr)
1011 {
1012 u32 val = ipv6_addr_hash(addr) ^ net_hash_mix(net);
1013
1014 return hash_32(val, IN6_ADDR_HSIZE_SHIFT);
1015 }
1016
1017 static bool ipv6_chk_same_addr(struct net *net, const struct in6_addr *addr,
1018 struct net_device *dev, unsigned int hash)
1019 {
1020 struct inet6_ifaddr *ifp;
1021
1022 hlist_for_each_entry(ifp, &net->ipv6.inet6_addr_lst[hash], addr_lst) {
1023 if (ipv6_addr_equal(&ifp->addr, addr)) {
1024 if (!dev || ifp->idev->dev == dev)
1025 return true;
1026 }
1027 }
1028 return false;
1029 }
1030
1031 static int ipv6_add_addr_hash(struct net_device *dev, struct inet6_ifaddr *ifa)
1032 {
1033 struct net *net = dev_net(dev);
1034 unsigned int hash = inet6_addr_hash(net, &ifa->addr);
1035 int err = 0;
1036
1037 spin_lock(&net->ipv6.addrconf_hash_lock);
1038
1039
1040 if (ipv6_chk_same_addr(net, &ifa->addr, dev, hash)) {
1041 netdev_dbg(dev, "ipv6_add_addr: already assigned\n");
1042 err = -EEXIST;
1043 } else {
1044 hlist_add_head_rcu(&ifa->addr_lst, &net->ipv6.inet6_addr_lst[hash]);
1045 }
1046
1047 spin_unlock(&net->ipv6.addrconf_hash_lock);
1048
1049 return err;
1050 }
1051
1052
1053
1054 static struct inet6_ifaddr *
1055 ipv6_add_addr(struct inet6_dev *idev, struct ifa6_config *cfg,
1056 bool can_block, struct netlink_ext_ack *extack)
1057 {
1058 gfp_t gfp_flags = can_block ? GFP_KERNEL : GFP_ATOMIC;
1059 int addr_type = ipv6_addr_type(cfg->pfx);
1060 struct net *net = dev_net(idev->dev);
1061 struct inet6_ifaddr *ifa = NULL;
1062 struct fib6_info *f6i = NULL;
1063 int err = 0;
1064
1065 if (addr_type == IPV6_ADDR_ANY ||
1066 (addr_type & IPV6_ADDR_MULTICAST &&
1067 !(cfg->ifa_flags & IFA_F_MCAUTOJOIN)) ||
1068 (!(idev->dev->flags & IFF_LOOPBACK) &&
1069 !netif_is_l3_master(idev->dev) &&
1070 addr_type & IPV6_ADDR_LOOPBACK))
1071 return ERR_PTR(-EADDRNOTAVAIL);
1072
1073 if (idev->dead) {
1074 err = -ENODEV;
1075 goto out;
1076 }
1077
1078 if (idev->cnf.disable_ipv6) {
1079 err = -EACCES;
1080 goto out;
1081 }
1082
1083
1084
1085
1086 if (can_block) {
1087 struct in6_validator_info i6vi = {
1088 .i6vi_addr = *cfg->pfx,
1089 .i6vi_dev = idev,
1090 .extack = extack,
1091 };
1092
1093 err = inet6addr_validator_notifier_call_chain(NETDEV_UP, &i6vi);
1094 err = notifier_to_errno(err);
1095 if (err < 0)
1096 goto out;
1097 }
1098
1099 ifa = kzalloc(sizeof(*ifa), gfp_flags | __GFP_ACCOUNT);
1100 if (!ifa) {
1101 err = -ENOBUFS;
1102 goto out;
1103 }
1104
1105 f6i = addrconf_f6i_alloc(net, idev, cfg->pfx, false, gfp_flags);
1106 if (IS_ERR(f6i)) {
1107 err = PTR_ERR(f6i);
1108 f6i = NULL;
1109 goto out;
1110 }
1111
1112 neigh_parms_data_state_setall(idev->nd_parms);
1113
1114 ifa->addr = *cfg->pfx;
1115 if (cfg->peer_pfx)
1116 ifa->peer_addr = *cfg->peer_pfx;
1117
1118 spin_lock_init(&ifa->lock);
1119 INIT_DELAYED_WORK(&ifa->dad_work, addrconf_dad_work);
1120 INIT_HLIST_NODE(&ifa->addr_lst);
1121 ifa->scope = cfg->scope;
1122 ifa->prefix_len = cfg->plen;
1123 ifa->rt_priority = cfg->rt_priority;
1124 ifa->flags = cfg->ifa_flags;
1125 ifa->ifa_proto = cfg->ifa_proto;
1126
1127 if (!(cfg->ifa_flags & IFA_F_NODAD))
1128 ifa->flags |= IFA_F_TENTATIVE;
1129 ifa->valid_lft = cfg->valid_lft;
1130 ifa->prefered_lft = cfg->preferred_lft;
1131 ifa->cstamp = ifa->tstamp = jiffies;
1132 ifa->tokenized = false;
1133
1134 ifa->rt = f6i;
1135
1136 ifa->idev = idev;
1137 in6_dev_hold(idev);
1138
1139
1140 refcount_set(&ifa->refcnt, 1);
1141
1142 rcu_read_lock_bh();
1143
1144 err = ipv6_add_addr_hash(idev->dev, ifa);
1145 if (err < 0) {
1146 rcu_read_unlock_bh();
1147 goto out;
1148 }
1149
1150 write_lock(&idev->lock);
1151
1152
1153 ipv6_link_dev_addr(idev, ifa);
1154
1155 if (ifa->flags&IFA_F_TEMPORARY) {
1156 list_add(&ifa->tmp_list, &idev->tempaddr_list);
1157 in6_ifa_hold(ifa);
1158 }
1159
1160 in6_ifa_hold(ifa);
1161 write_unlock(&idev->lock);
1162
1163 rcu_read_unlock_bh();
1164
1165 inet6addr_notifier_call_chain(NETDEV_UP, ifa);
1166 out:
1167 if (unlikely(err < 0)) {
1168 fib6_info_release(f6i);
1169
1170 if (ifa) {
1171 if (ifa->idev)
1172 in6_dev_put(ifa->idev);
1173 kfree(ifa);
1174 }
1175 ifa = ERR_PTR(err);
1176 }
1177
1178 return ifa;
1179 }
1180
1181 enum cleanup_prefix_rt_t {
1182 CLEANUP_PREFIX_RT_NOP,
1183 CLEANUP_PREFIX_RT_DEL,
1184 CLEANUP_PREFIX_RT_EXPIRE,
1185 };
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205 static enum cleanup_prefix_rt_t
1206 check_cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long *expires)
1207 {
1208 struct inet6_ifaddr *ifa;
1209 struct inet6_dev *idev = ifp->idev;
1210 unsigned long lifetime;
1211 enum cleanup_prefix_rt_t action = CLEANUP_PREFIX_RT_DEL;
1212
1213 *expires = jiffies;
1214
1215 list_for_each_entry(ifa, &idev->addr_list, if_list) {
1216 if (ifa == ifp)
1217 continue;
1218 if (ifa->prefix_len != ifp->prefix_len ||
1219 !ipv6_prefix_equal(&ifa->addr, &ifp->addr,
1220 ifp->prefix_len))
1221 continue;
1222 if (ifa->flags & (IFA_F_PERMANENT | IFA_F_NOPREFIXROUTE))
1223 return CLEANUP_PREFIX_RT_NOP;
1224
1225 action = CLEANUP_PREFIX_RT_EXPIRE;
1226
1227 spin_lock(&ifa->lock);
1228
1229 lifetime = addrconf_timeout_fixup(ifa->valid_lft, HZ);
1230
1231
1232
1233
1234
1235 if (time_before(*expires, ifa->tstamp + lifetime * HZ))
1236 *expires = ifa->tstamp + lifetime * HZ;
1237 spin_unlock(&ifa->lock);
1238 }
1239
1240 return action;
1241 }
1242
1243 static void
1244 cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long expires,
1245 bool del_rt, bool del_peer)
1246 {
1247 struct fib6_info *f6i;
1248
1249 f6i = addrconf_get_prefix_route(del_peer ? &ifp->peer_addr : &ifp->addr,
1250 ifp->prefix_len,
1251 ifp->idev->dev, 0, RTF_DEFAULT, true);
1252 if (f6i) {
1253 if (del_rt)
1254 ip6_del_rt(dev_net(ifp->idev->dev), f6i, false);
1255 else {
1256 if (!(f6i->fib6_flags & RTF_EXPIRES))
1257 fib6_set_expires(f6i, expires);
1258 fib6_info_release(f6i);
1259 }
1260 }
1261 }
1262
1263
1264
1265
1266 static void ipv6_del_addr(struct inet6_ifaddr *ifp)
1267 {
1268 enum cleanup_prefix_rt_t action = CLEANUP_PREFIX_RT_NOP;
1269 struct net *net = dev_net(ifp->idev->dev);
1270 unsigned long expires;
1271 int state;
1272
1273 ASSERT_RTNL();
1274
1275 spin_lock_bh(&ifp->lock);
1276 state = ifp->state;
1277 ifp->state = INET6_IFADDR_STATE_DEAD;
1278 spin_unlock_bh(&ifp->lock);
1279
1280 if (state == INET6_IFADDR_STATE_DEAD)
1281 goto out;
1282
1283 spin_lock_bh(&net->ipv6.addrconf_hash_lock);
1284 hlist_del_init_rcu(&ifp->addr_lst);
1285 spin_unlock_bh(&net->ipv6.addrconf_hash_lock);
1286
1287 write_lock_bh(&ifp->idev->lock);
1288
1289 if (ifp->flags&IFA_F_TEMPORARY) {
1290 list_del(&ifp->tmp_list);
1291 if (ifp->ifpub) {
1292 in6_ifa_put(ifp->ifpub);
1293 ifp->ifpub = NULL;
1294 }
1295 __in6_ifa_put(ifp);
1296 }
1297
1298 if (ifp->flags & IFA_F_PERMANENT && !(ifp->flags & IFA_F_NOPREFIXROUTE))
1299 action = check_cleanup_prefix_route(ifp, &expires);
1300
1301 list_del_rcu(&ifp->if_list);
1302 __in6_ifa_put(ifp);
1303
1304 write_unlock_bh(&ifp->idev->lock);
1305
1306 addrconf_del_dad_work(ifp);
1307
1308 ipv6_ifa_notify(RTM_DELADDR, ifp);
1309
1310 inet6addr_notifier_call_chain(NETDEV_DOWN, ifp);
1311
1312 if (action != CLEANUP_PREFIX_RT_NOP) {
1313 cleanup_prefix_route(ifp, expires,
1314 action == CLEANUP_PREFIX_RT_DEL, false);
1315 }
1316
1317
1318 rt6_remove_prefsrc(ifp);
1319 out:
1320 in6_ifa_put(ifp);
1321 }
1322
1323 static int ipv6_create_tempaddr(struct inet6_ifaddr *ifp, bool block)
1324 {
1325 struct inet6_dev *idev = ifp->idev;
1326 unsigned long tmp_tstamp, age;
1327 unsigned long regen_advance;
1328 unsigned long now = jiffies;
1329 s32 cnf_temp_preferred_lft;
1330 struct inet6_ifaddr *ift;
1331 struct ifa6_config cfg;
1332 long max_desync_factor;
1333 struct in6_addr addr;
1334 int ret = 0;
1335
1336 write_lock_bh(&idev->lock);
1337
1338 retry:
1339 in6_dev_hold(idev);
1340 if (idev->cnf.use_tempaddr <= 0) {
1341 write_unlock_bh(&idev->lock);
1342 pr_info("%s: use_tempaddr is disabled\n", __func__);
1343 in6_dev_put(idev);
1344 ret = -1;
1345 goto out;
1346 }
1347 spin_lock_bh(&ifp->lock);
1348 if (ifp->regen_count++ >= idev->cnf.regen_max_retry) {
1349 idev->cnf.use_tempaddr = -1;
1350 spin_unlock_bh(&ifp->lock);
1351 write_unlock_bh(&idev->lock);
1352 pr_warn("%s: regeneration time exceeded - disabled temporary address support\n",
1353 __func__);
1354 in6_dev_put(idev);
1355 ret = -1;
1356 goto out;
1357 }
1358 in6_ifa_hold(ifp);
1359 memcpy(addr.s6_addr, ifp->addr.s6_addr, 8);
1360 ipv6_gen_rnd_iid(&addr);
1361
1362 age = (now - ifp->tstamp) / HZ;
1363
1364 regen_advance = idev->cnf.regen_max_retry *
1365 idev->cnf.dad_transmits *
1366 max(NEIGH_VAR(idev->nd_parms, RETRANS_TIME), HZ/100) / HZ;
1367
1368
1369
1370
1371 cnf_temp_preferred_lft = READ_ONCE(idev->cnf.temp_prefered_lft);
1372 max_desync_factor = min_t(__u32,
1373 idev->cnf.max_desync_factor,
1374 cnf_temp_preferred_lft - regen_advance);
1375
1376 if (unlikely(idev->desync_factor > max_desync_factor)) {
1377 if (max_desync_factor > 0) {
1378 get_random_bytes(&idev->desync_factor,
1379 sizeof(idev->desync_factor));
1380 idev->desync_factor %= max_desync_factor;
1381 } else {
1382 idev->desync_factor = 0;
1383 }
1384 }
1385
1386 memset(&cfg, 0, sizeof(cfg));
1387 cfg.valid_lft = min_t(__u32, ifp->valid_lft,
1388 idev->cnf.temp_valid_lft + age);
1389 cfg.preferred_lft = cnf_temp_preferred_lft + age - idev->desync_factor;
1390 cfg.preferred_lft = min_t(__u32, ifp->prefered_lft, cfg.preferred_lft);
1391
1392 cfg.plen = ifp->prefix_len;
1393 tmp_tstamp = ifp->tstamp;
1394 spin_unlock_bh(&ifp->lock);
1395
1396 write_unlock_bh(&idev->lock);
1397
1398
1399
1400
1401
1402
1403
1404
1405 age = (now - tmp_tstamp + ADDRCONF_TIMER_FUZZ_MINUS) / HZ;
1406 if (cfg.preferred_lft <= regen_advance + age) {
1407 in6_ifa_put(ifp);
1408 in6_dev_put(idev);
1409 ret = -1;
1410 goto out;
1411 }
1412
1413 cfg.ifa_flags = IFA_F_TEMPORARY;
1414
1415 if (ifp->flags & IFA_F_OPTIMISTIC)
1416 cfg.ifa_flags |= IFA_F_OPTIMISTIC;
1417
1418 cfg.pfx = &addr;
1419 cfg.scope = ipv6_addr_scope(cfg.pfx);
1420
1421 ift = ipv6_add_addr(idev, &cfg, block, NULL);
1422 if (IS_ERR(ift)) {
1423 in6_ifa_put(ifp);
1424 in6_dev_put(idev);
1425 pr_info("%s: retry temporary address regeneration\n", __func__);
1426 write_lock_bh(&idev->lock);
1427 goto retry;
1428 }
1429
1430 spin_lock_bh(&ift->lock);
1431 ift->ifpub = ifp;
1432 ift->cstamp = now;
1433 ift->tstamp = tmp_tstamp;
1434 spin_unlock_bh(&ift->lock);
1435
1436 addrconf_dad_start(ift);
1437 in6_ifa_put(ift);
1438 in6_dev_put(idev);
1439 out:
1440 return ret;
1441 }
1442
1443
1444
1445
1446 enum {
1447 IPV6_SADDR_RULE_INIT = 0,
1448 IPV6_SADDR_RULE_LOCAL,
1449 IPV6_SADDR_RULE_SCOPE,
1450 IPV6_SADDR_RULE_PREFERRED,
1451 #ifdef CONFIG_IPV6_MIP6
1452 IPV6_SADDR_RULE_HOA,
1453 #endif
1454 IPV6_SADDR_RULE_OIF,
1455 IPV6_SADDR_RULE_LABEL,
1456 IPV6_SADDR_RULE_PRIVACY,
1457 IPV6_SADDR_RULE_ORCHID,
1458 IPV6_SADDR_RULE_PREFIX,
1459 #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
1460 IPV6_SADDR_RULE_NOT_OPTIMISTIC,
1461 #endif
1462 IPV6_SADDR_RULE_MAX
1463 };
1464
1465 struct ipv6_saddr_score {
1466 int rule;
1467 int addr_type;
1468 struct inet6_ifaddr *ifa;
1469 DECLARE_BITMAP(scorebits, IPV6_SADDR_RULE_MAX);
1470 int scopedist;
1471 int matchlen;
1472 };
1473
1474 struct ipv6_saddr_dst {
1475 const struct in6_addr *addr;
1476 int ifindex;
1477 int scope;
1478 int label;
1479 unsigned int prefs;
1480 };
1481
1482 static inline int ipv6_saddr_preferred(int type)
1483 {
1484 if (type & (IPV6_ADDR_MAPPED|IPV6_ADDR_COMPATv4|IPV6_ADDR_LOOPBACK))
1485 return 1;
1486 return 0;
1487 }
1488
1489 static bool ipv6_use_optimistic_addr(struct net *net,
1490 struct inet6_dev *idev)
1491 {
1492 #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
1493 if (!idev)
1494 return false;
1495 if (!net->ipv6.devconf_all->optimistic_dad && !idev->cnf.optimistic_dad)
1496 return false;
1497 if (!net->ipv6.devconf_all->use_optimistic && !idev->cnf.use_optimistic)
1498 return false;
1499
1500 return true;
1501 #else
1502 return false;
1503 #endif
1504 }
1505
1506 static bool ipv6_allow_optimistic_dad(struct net *net,
1507 struct inet6_dev *idev)
1508 {
1509 #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
1510 if (!idev)
1511 return false;
1512 if (!net->ipv6.devconf_all->optimistic_dad && !idev->cnf.optimistic_dad)
1513 return false;
1514
1515 return true;
1516 #else
1517 return false;
1518 #endif
1519 }
1520
1521 static int ipv6_get_saddr_eval(struct net *net,
1522 struct ipv6_saddr_score *score,
1523 struct ipv6_saddr_dst *dst,
1524 int i)
1525 {
1526 int ret;
1527
1528 if (i <= score->rule) {
1529 switch (i) {
1530 case IPV6_SADDR_RULE_SCOPE:
1531 ret = score->scopedist;
1532 break;
1533 case IPV6_SADDR_RULE_PREFIX:
1534 ret = score->matchlen;
1535 break;
1536 default:
1537 ret = !!test_bit(i, score->scorebits);
1538 }
1539 goto out;
1540 }
1541
1542 switch (i) {
1543 case IPV6_SADDR_RULE_INIT:
1544
1545 ret = !!score->ifa;
1546 break;
1547 case IPV6_SADDR_RULE_LOCAL:
1548
1549 ret = ipv6_addr_equal(&score->ifa->addr, dst->addr);
1550 break;
1551 case IPV6_SADDR_RULE_SCOPE:
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573 ret = __ipv6_addr_src_scope(score->addr_type);
1574 if (ret >= dst->scope)
1575 ret = -ret;
1576 else
1577 ret -= 128;
1578 score->scopedist = ret;
1579 break;
1580 case IPV6_SADDR_RULE_PREFERRED:
1581 {
1582
1583 u8 avoid = IFA_F_DEPRECATED;
1584
1585 if (!ipv6_use_optimistic_addr(net, score->ifa->idev))
1586 avoid |= IFA_F_OPTIMISTIC;
1587 ret = ipv6_saddr_preferred(score->addr_type) ||
1588 !(score->ifa->flags & avoid);
1589 break;
1590 }
1591 #ifdef CONFIG_IPV6_MIP6
1592 case IPV6_SADDR_RULE_HOA:
1593 {
1594
1595 int prefhome = !(dst->prefs & IPV6_PREFER_SRC_COA);
1596 ret = !(score->ifa->flags & IFA_F_HOMEADDRESS) ^ prefhome;
1597 break;
1598 }
1599 #endif
1600 case IPV6_SADDR_RULE_OIF:
1601
1602 ret = (!dst->ifindex ||
1603 dst->ifindex == score->ifa->idev->dev->ifindex);
1604 break;
1605 case IPV6_SADDR_RULE_LABEL:
1606
1607 ret = ipv6_addr_label(net,
1608 &score->ifa->addr, score->addr_type,
1609 score->ifa->idev->dev->ifindex) == dst->label;
1610 break;
1611 case IPV6_SADDR_RULE_PRIVACY:
1612 {
1613
1614
1615
1616 int preftmp = dst->prefs & (IPV6_PREFER_SRC_PUBLIC|IPV6_PREFER_SRC_TMP) ?
1617 !!(dst->prefs & IPV6_PREFER_SRC_TMP) :
1618 score->ifa->idev->cnf.use_tempaddr >= 2;
1619 ret = (!(score->ifa->flags & IFA_F_TEMPORARY)) ^ preftmp;
1620 break;
1621 }
1622 case IPV6_SADDR_RULE_ORCHID:
1623
1624
1625
1626 ret = !(ipv6_addr_orchid(&score->ifa->addr) ^
1627 ipv6_addr_orchid(dst->addr));
1628 break;
1629 case IPV6_SADDR_RULE_PREFIX:
1630
1631 ret = ipv6_addr_diff(&score->ifa->addr, dst->addr);
1632 if (ret > score->ifa->prefix_len)
1633 ret = score->ifa->prefix_len;
1634 score->matchlen = ret;
1635 break;
1636 #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
1637 case IPV6_SADDR_RULE_NOT_OPTIMISTIC:
1638
1639
1640
1641 ret = !(score->ifa->flags & IFA_F_OPTIMISTIC);
1642 break;
1643 #endif
1644 default:
1645 ret = 0;
1646 }
1647
1648 if (ret)
1649 __set_bit(i, score->scorebits);
1650 score->rule = i;
1651 out:
1652 return ret;
1653 }
1654
1655 static int __ipv6_dev_get_saddr(struct net *net,
1656 struct ipv6_saddr_dst *dst,
1657 struct inet6_dev *idev,
1658 struct ipv6_saddr_score *scores,
1659 int hiscore_idx)
1660 {
1661 struct ipv6_saddr_score *score = &scores[1 - hiscore_idx], *hiscore = &scores[hiscore_idx];
1662
1663 list_for_each_entry_rcu(score->ifa, &idev->addr_list, if_list) {
1664 int i;
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676 if ((score->ifa->flags & IFA_F_TENTATIVE) &&
1677 (!(score->ifa->flags & IFA_F_OPTIMISTIC)))
1678 continue;
1679
1680 score->addr_type = __ipv6_addr_type(&score->ifa->addr);
1681
1682 if (unlikely(score->addr_type == IPV6_ADDR_ANY ||
1683 score->addr_type & IPV6_ADDR_MULTICAST)) {
1684 net_dbg_ratelimited("ADDRCONF: unspecified / multicast address assigned as unicast address on %s",
1685 idev->dev->name);
1686 continue;
1687 }
1688
1689 score->rule = -1;
1690 bitmap_zero(score->scorebits, IPV6_SADDR_RULE_MAX);
1691
1692 for (i = 0; i < IPV6_SADDR_RULE_MAX; i++) {
1693 int minihiscore, miniscore;
1694
1695 minihiscore = ipv6_get_saddr_eval(net, hiscore, dst, i);
1696 miniscore = ipv6_get_saddr_eval(net, score, dst, i);
1697
1698 if (minihiscore > miniscore) {
1699 if (i == IPV6_SADDR_RULE_SCOPE &&
1700 score->scopedist > 0) {
1701
1702
1703
1704
1705
1706
1707
1708
1709 goto out;
1710 }
1711 break;
1712 } else if (minihiscore < miniscore) {
1713 swap(hiscore, score);
1714 hiscore_idx = 1 - hiscore_idx;
1715
1716
1717 score->ifa = hiscore->ifa;
1718
1719 break;
1720 }
1721 }
1722 }
1723 out:
1724 return hiscore_idx;
1725 }
1726
1727 static int ipv6_get_saddr_master(struct net *net,
1728 const struct net_device *dst_dev,
1729 const struct net_device *master,
1730 struct ipv6_saddr_dst *dst,
1731 struct ipv6_saddr_score *scores,
1732 int hiscore_idx)
1733 {
1734 struct inet6_dev *idev;
1735
1736 idev = __in6_dev_get(dst_dev);
1737 if (idev)
1738 hiscore_idx = __ipv6_dev_get_saddr(net, dst, idev,
1739 scores, hiscore_idx);
1740
1741 idev = __in6_dev_get(master);
1742 if (idev)
1743 hiscore_idx = __ipv6_dev_get_saddr(net, dst, idev,
1744 scores, hiscore_idx);
1745
1746 return hiscore_idx;
1747 }
1748
1749 int ipv6_dev_get_saddr(struct net *net, const struct net_device *dst_dev,
1750 const struct in6_addr *daddr, unsigned int prefs,
1751 struct in6_addr *saddr)
1752 {
1753 struct ipv6_saddr_score scores[2], *hiscore;
1754 struct ipv6_saddr_dst dst;
1755 struct inet6_dev *idev;
1756 struct net_device *dev;
1757 int dst_type;
1758 bool use_oif_addr = false;
1759 int hiscore_idx = 0;
1760 int ret = 0;
1761
1762 dst_type = __ipv6_addr_type(daddr);
1763 dst.addr = daddr;
1764 dst.ifindex = dst_dev ? dst_dev->ifindex : 0;
1765 dst.scope = __ipv6_addr_src_scope(dst_type);
1766 dst.label = ipv6_addr_label(net, daddr, dst_type, dst.ifindex);
1767 dst.prefs = prefs;
1768
1769 scores[hiscore_idx].rule = -1;
1770 scores[hiscore_idx].ifa = NULL;
1771
1772 rcu_read_lock();
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790 if (dst_dev) {
1791 idev = __in6_dev_get(dst_dev);
1792 if ((dst_type & IPV6_ADDR_MULTICAST) ||
1793 dst.scope <= IPV6_ADDR_SCOPE_LINKLOCAL ||
1794 (idev && idev->cnf.use_oif_addrs_only)) {
1795 use_oif_addr = true;
1796 }
1797 }
1798
1799 if (use_oif_addr) {
1800 if (idev)
1801 hiscore_idx = __ipv6_dev_get_saddr(net, &dst, idev, scores, hiscore_idx);
1802 } else {
1803 const struct net_device *master;
1804 int master_idx = 0;
1805
1806
1807
1808
1809
1810 master = l3mdev_master_dev_rcu(dst_dev);
1811 if (master) {
1812 master_idx = master->ifindex;
1813
1814 hiscore_idx = ipv6_get_saddr_master(net, dst_dev,
1815 master, &dst,
1816 scores, hiscore_idx);
1817
1818 if (scores[hiscore_idx].ifa)
1819 goto out;
1820 }
1821
1822 for_each_netdev_rcu(net, dev) {
1823
1824
1825
1826 if (l3mdev_master_ifindex_rcu(dev) != master_idx)
1827 continue;
1828 idev = __in6_dev_get(dev);
1829 if (!idev)
1830 continue;
1831 hiscore_idx = __ipv6_dev_get_saddr(net, &dst, idev, scores, hiscore_idx);
1832 }
1833 }
1834
1835 out:
1836 hiscore = &scores[hiscore_idx];
1837 if (!hiscore->ifa)
1838 ret = -EADDRNOTAVAIL;
1839 else
1840 *saddr = hiscore->ifa->addr;
1841
1842 rcu_read_unlock();
1843 return ret;
1844 }
1845 EXPORT_SYMBOL(ipv6_dev_get_saddr);
1846
1847 static int __ipv6_get_lladdr(struct inet6_dev *idev, struct in6_addr *addr,
1848 u32 banned_flags)
1849 {
1850 struct inet6_ifaddr *ifp;
1851 int err = -EADDRNOTAVAIL;
1852
1853 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) {
1854 if (ifp->scope > IFA_LINK)
1855 break;
1856 if (ifp->scope == IFA_LINK &&
1857 !(ifp->flags & banned_flags)) {
1858 *addr = ifp->addr;
1859 err = 0;
1860 break;
1861 }
1862 }
1863 return err;
1864 }
1865
1866 int ipv6_get_lladdr(struct net_device *dev, struct in6_addr *addr,
1867 u32 banned_flags)
1868 {
1869 struct inet6_dev *idev;
1870 int err = -EADDRNOTAVAIL;
1871
1872 rcu_read_lock();
1873 idev = __in6_dev_get(dev);
1874 if (idev) {
1875 read_lock_bh(&idev->lock);
1876 err = __ipv6_get_lladdr(idev, addr, banned_flags);
1877 read_unlock_bh(&idev->lock);
1878 }
1879 rcu_read_unlock();
1880 return err;
1881 }
1882
1883 static int ipv6_count_addresses(const struct inet6_dev *idev)
1884 {
1885 const struct inet6_ifaddr *ifp;
1886 int cnt = 0;
1887
1888 rcu_read_lock();
1889 list_for_each_entry_rcu(ifp, &idev->addr_list, if_list)
1890 cnt++;
1891 rcu_read_unlock();
1892 return cnt;
1893 }
1894
1895 int ipv6_chk_addr(struct net *net, const struct in6_addr *addr,
1896 const struct net_device *dev, int strict)
1897 {
1898 return ipv6_chk_addr_and_flags(net, addr, dev, !dev,
1899 strict, IFA_F_TENTATIVE);
1900 }
1901 EXPORT_SYMBOL(ipv6_chk_addr);
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912 static struct net_device *
1913 __ipv6_chk_addr_and_flags(struct net *net, const struct in6_addr *addr,
1914 const struct net_device *dev, bool skip_dev_check,
1915 int strict, u32 banned_flags)
1916 {
1917 unsigned int hash = inet6_addr_hash(net, addr);
1918 struct net_device *l3mdev, *ndev;
1919 struct inet6_ifaddr *ifp;
1920 u32 ifp_flags;
1921
1922 rcu_read_lock();
1923
1924 l3mdev = l3mdev_master_dev_rcu(dev);
1925 if (skip_dev_check)
1926 dev = NULL;
1927
1928 hlist_for_each_entry_rcu(ifp, &net->ipv6.inet6_addr_lst[hash], addr_lst) {
1929 ndev = ifp->idev->dev;
1930
1931 if (l3mdev_master_dev_rcu(ndev) != l3mdev)
1932 continue;
1933
1934
1935
1936
1937 ifp_flags = (ifp->flags&IFA_F_OPTIMISTIC)
1938 ? (ifp->flags&~IFA_F_TENTATIVE)
1939 : ifp->flags;
1940 if (ipv6_addr_equal(&ifp->addr, addr) &&
1941 !(ifp_flags&banned_flags) &&
1942 (!dev || ndev == dev ||
1943 !(ifp->scope&(IFA_LINK|IFA_HOST) || strict))) {
1944 rcu_read_unlock();
1945 return ndev;
1946 }
1947 }
1948
1949 rcu_read_unlock();
1950 return NULL;
1951 }
1952
1953 int ipv6_chk_addr_and_flags(struct net *net, const struct in6_addr *addr,
1954 const struct net_device *dev, bool skip_dev_check,
1955 int strict, u32 banned_flags)
1956 {
1957 return __ipv6_chk_addr_and_flags(net, addr, dev, skip_dev_check,
1958 strict, banned_flags) ? 1 : 0;
1959 }
1960 EXPORT_SYMBOL(ipv6_chk_addr_and_flags);
1961
1962
1963
1964
1965
1966 bool ipv6_chk_custom_prefix(const struct in6_addr *addr,
1967 const unsigned int prefix_len, struct net_device *dev)
1968 {
1969 const struct inet6_ifaddr *ifa;
1970 const struct inet6_dev *idev;
1971 bool ret = false;
1972
1973 rcu_read_lock();
1974 idev = __in6_dev_get(dev);
1975 if (idev) {
1976 list_for_each_entry_rcu(ifa, &idev->addr_list, if_list) {
1977 ret = ipv6_prefix_equal(addr, &ifa->addr, prefix_len);
1978 if (ret)
1979 break;
1980 }
1981 }
1982 rcu_read_unlock();
1983
1984 return ret;
1985 }
1986 EXPORT_SYMBOL(ipv6_chk_custom_prefix);
1987
1988 int ipv6_chk_prefix(const struct in6_addr *addr, struct net_device *dev)
1989 {
1990 const struct inet6_ifaddr *ifa;
1991 const struct inet6_dev *idev;
1992 int onlink;
1993
1994 onlink = 0;
1995 rcu_read_lock();
1996 idev = __in6_dev_get(dev);
1997 if (idev) {
1998 list_for_each_entry_rcu(ifa, &idev->addr_list, if_list) {
1999 onlink = ipv6_prefix_equal(addr, &ifa->addr,
2000 ifa->prefix_len);
2001 if (onlink)
2002 break;
2003 }
2004 }
2005 rcu_read_unlock();
2006 return onlink;
2007 }
2008 EXPORT_SYMBOL(ipv6_chk_prefix);
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018 struct net_device *ipv6_dev_find(struct net *net, const struct in6_addr *addr,
2019 struct net_device *dev)
2020 {
2021 return __ipv6_chk_addr_and_flags(net, addr, dev, !dev, 1,
2022 IFA_F_TENTATIVE);
2023 }
2024 EXPORT_SYMBOL(ipv6_dev_find);
2025
2026 struct inet6_ifaddr *ipv6_get_ifaddr(struct net *net, const struct in6_addr *addr,
2027 struct net_device *dev, int strict)
2028 {
2029 unsigned int hash = inet6_addr_hash(net, addr);
2030 struct inet6_ifaddr *ifp, *result = NULL;
2031
2032 rcu_read_lock();
2033 hlist_for_each_entry_rcu(ifp, &net->ipv6.inet6_addr_lst[hash], addr_lst) {
2034 if (ipv6_addr_equal(&ifp->addr, addr)) {
2035 if (!dev || ifp->idev->dev == dev ||
2036 !(ifp->scope&(IFA_LINK|IFA_HOST) || strict)) {
2037 result = ifp;
2038 in6_ifa_hold(ifp);
2039 break;
2040 }
2041 }
2042 }
2043 rcu_read_unlock();
2044
2045 return result;
2046 }
2047
2048
2049
2050 static void addrconf_dad_stop(struct inet6_ifaddr *ifp, int dad_failed)
2051 {
2052 if (dad_failed)
2053 ifp->flags |= IFA_F_DADFAILED;
2054
2055 if (ifp->flags&IFA_F_TEMPORARY) {
2056 struct inet6_ifaddr *ifpub;
2057 spin_lock_bh(&ifp->lock);
2058 ifpub = ifp->ifpub;
2059 if (ifpub) {
2060 in6_ifa_hold(ifpub);
2061 spin_unlock_bh(&ifp->lock);
2062 ipv6_create_tempaddr(ifpub, true);
2063 in6_ifa_put(ifpub);
2064 } else {
2065 spin_unlock_bh(&ifp->lock);
2066 }
2067 ipv6_del_addr(ifp);
2068 } else if (ifp->flags&IFA_F_PERMANENT || !dad_failed) {
2069 spin_lock_bh(&ifp->lock);
2070 addrconf_del_dad_work(ifp);
2071 ifp->flags |= IFA_F_TENTATIVE;
2072 if (dad_failed)
2073 ifp->flags &= ~IFA_F_OPTIMISTIC;
2074 spin_unlock_bh(&ifp->lock);
2075 if (dad_failed)
2076 ipv6_ifa_notify(0, ifp);
2077 in6_ifa_put(ifp);
2078 } else {
2079 ipv6_del_addr(ifp);
2080 }
2081 }
2082
2083 static int addrconf_dad_end(struct inet6_ifaddr *ifp)
2084 {
2085 int err = -ENOENT;
2086
2087 spin_lock_bh(&ifp->lock);
2088 if (ifp->state == INET6_IFADDR_STATE_DAD) {
2089 ifp->state = INET6_IFADDR_STATE_POSTDAD;
2090 err = 0;
2091 }
2092 spin_unlock_bh(&ifp->lock);
2093
2094 return err;
2095 }
2096
2097 void addrconf_dad_failure(struct sk_buff *skb, struct inet6_ifaddr *ifp)
2098 {
2099 struct inet6_dev *idev = ifp->idev;
2100 struct net *net = dev_net(idev->dev);
2101
2102 if (addrconf_dad_end(ifp)) {
2103 in6_ifa_put(ifp);
2104 return;
2105 }
2106
2107 net_info_ratelimited("%s: IPv6 duplicate address %pI6c used by %pM detected!\n",
2108 ifp->idev->dev->name, &ifp->addr, eth_hdr(skb)->h_source);
2109
2110 spin_lock_bh(&ifp->lock);
2111
2112 if (ifp->flags & IFA_F_STABLE_PRIVACY) {
2113 struct in6_addr new_addr;
2114 struct inet6_ifaddr *ifp2;
2115 int retries = ifp->stable_privacy_retry + 1;
2116 struct ifa6_config cfg = {
2117 .pfx = &new_addr,
2118 .plen = ifp->prefix_len,
2119 .ifa_flags = ifp->flags,
2120 .valid_lft = ifp->valid_lft,
2121 .preferred_lft = ifp->prefered_lft,
2122 .scope = ifp->scope,
2123 };
2124
2125 if (retries > net->ipv6.sysctl.idgen_retries) {
2126 net_info_ratelimited("%s: privacy stable address generation failed because of DAD conflicts!\n",
2127 ifp->idev->dev->name);
2128 goto errdad;
2129 }
2130
2131 new_addr = ifp->addr;
2132 if (ipv6_generate_stable_address(&new_addr, retries,
2133 idev))
2134 goto errdad;
2135
2136 spin_unlock_bh(&ifp->lock);
2137
2138 if (idev->cnf.max_addresses &&
2139 ipv6_count_addresses(idev) >=
2140 idev->cnf.max_addresses)
2141 goto lock_errdad;
2142
2143 net_info_ratelimited("%s: generating new stable privacy address because of DAD conflict\n",
2144 ifp->idev->dev->name);
2145
2146 ifp2 = ipv6_add_addr(idev, &cfg, false, NULL);
2147 if (IS_ERR(ifp2))
2148 goto lock_errdad;
2149
2150 spin_lock_bh(&ifp2->lock);
2151 ifp2->stable_privacy_retry = retries;
2152 ifp2->state = INET6_IFADDR_STATE_PREDAD;
2153 spin_unlock_bh(&ifp2->lock);
2154
2155 addrconf_mod_dad_work(ifp2, net->ipv6.sysctl.idgen_delay);
2156 in6_ifa_put(ifp2);
2157 lock_errdad:
2158 spin_lock_bh(&ifp->lock);
2159 }
2160
2161 errdad:
2162
2163 ifp->state = INET6_IFADDR_STATE_ERRDAD;
2164 spin_unlock_bh(&ifp->lock);
2165
2166 addrconf_mod_dad_work(ifp, 0);
2167 in6_ifa_put(ifp);
2168 }
2169
2170
2171
2172 void addrconf_join_solict(struct net_device *dev, const struct in6_addr *addr)
2173 {
2174 struct in6_addr maddr;
2175
2176 if (dev->flags&(IFF_LOOPBACK|IFF_NOARP))
2177 return;
2178
2179 addrconf_addr_solict_mult(addr, &maddr);
2180 ipv6_dev_mc_inc(dev, &maddr);
2181 }
2182
2183
2184 void addrconf_leave_solict(struct inet6_dev *idev, const struct in6_addr *addr)
2185 {
2186 struct in6_addr maddr;
2187
2188 if (idev->dev->flags&(IFF_LOOPBACK|IFF_NOARP))
2189 return;
2190
2191 addrconf_addr_solict_mult(addr, &maddr);
2192 __ipv6_dev_mc_dec(idev, &maddr);
2193 }
2194
2195
2196 static void addrconf_join_anycast(struct inet6_ifaddr *ifp)
2197 {
2198 struct in6_addr addr;
2199
2200 if (ifp->prefix_len >= 127)
2201 return;
2202 ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len);
2203 if (ipv6_addr_any(&addr))
2204 return;
2205 __ipv6_dev_ac_inc(ifp->idev, &addr);
2206 }
2207
2208
2209 static void addrconf_leave_anycast(struct inet6_ifaddr *ifp)
2210 {
2211 struct in6_addr addr;
2212
2213 if (ifp->prefix_len >= 127)
2214 return;
2215 ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len);
2216 if (ipv6_addr_any(&addr))
2217 return;
2218 __ipv6_dev_ac_dec(ifp->idev, &addr);
2219 }
2220
2221 static int addrconf_ifid_6lowpan(u8 *eui, struct net_device *dev)
2222 {
2223 switch (dev->addr_len) {
2224 case ETH_ALEN:
2225 memcpy(eui, dev->dev_addr, 3);
2226 eui[3] = 0xFF;
2227 eui[4] = 0xFE;
2228 memcpy(eui + 5, dev->dev_addr + 3, 3);
2229 break;
2230 case EUI64_ADDR_LEN:
2231 memcpy(eui, dev->dev_addr, EUI64_ADDR_LEN);
2232 eui[0] ^= 2;
2233 break;
2234 default:
2235 return -1;
2236 }
2237
2238 return 0;
2239 }
2240
2241 static int addrconf_ifid_ieee1394(u8 *eui, struct net_device *dev)
2242 {
2243 const union fwnet_hwaddr *ha;
2244
2245 if (dev->addr_len != FWNET_ALEN)
2246 return -1;
2247
2248 ha = (const union fwnet_hwaddr *)dev->dev_addr;
2249
2250 memcpy(eui, &ha->uc.uniq_id, sizeof(ha->uc.uniq_id));
2251 eui[0] ^= 2;
2252 return 0;
2253 }
2254
2255 static int addrconf_ifid_arcnet(u8 *eui, struct net_device *dev)
2256 {
2257
2258 if (dev->addr_len != ARCNET_ALEN)
2259 return -1;
2260 memset(eui, 0, 7);
2261 eui[7] = *(u8 *)dev->dev_addr;
2262 return 0;
2263 }
2264
2265 static int addrconf_ifid_infiniband(u8 *eui, struct net_device *dev)
2266 {
2267 if (dev->addr_len != INFINIBAND_ALEN)
2268 return -1;
2269 memcpy(eui, dev->dev_addr + 12, 8);
2270 eui[0] |= 2;
2271 return 0;
2272 }
2273
2274 static int __ipv6_isatap_ifid(u8 *eui, __be32 addr)
2275 {
2276 if (addr == 0)
2277 return -1;
2278 eui[0] = (ipv4_is_zeronet(addr) || ipv4_is_private_10(addr) ||
2279 ipv4_is_loopback(addr) || ipv4_is_linklocal_169(addr) ||
2280 ipv4_is_private_172(addr) || ipv4_is_test_192(addr) ||
2281 ipv4_is_anycast_6to4(addr) || ipv4_is_private_192(addr) ||
2282 ipv4_is_test_198(addr) || ipv4_is_multicast(addr) ||
2283 ipv4_is_lbcast(addr)) ? 0x00 : 0x02;
2284 eui[1] = 0;
2285 eui[2] = 0x5E;
2286 eui[3] = 0xFE;
2287 memcpy(eui + 4, &addr, 4);
2288 return 0;
2289 }
2290
2291 static int addrconf_ifid_sit(u8 *eui, struct net_device *dev)
2292 {
2293 if (dev->priv_flags & IFF_ISATAP)
2294 return __ipv6_isatap_ifid(eui, *(__be32 *)dev->dev_addr);
2295 return -1;
2296 }
2297
2298 static int addrconf_ifid_gre(u8 *eui, struct net_device *dev)
2299 {
2300 return __ipv6_isatap_ifid(eui, *(__be32 *)dev->dev_addr);
2301 }
2302
2303 static int addrconf_ifid_ip6tnl(u8 *eui, struct net_device *dev)
2304 {
2305 memcpy(eui, dev->perm_addr, 3);
2306 memcpy(eui + 5, dev->perm_addr + 3, 3);
2307 eui[3] = 0xFF;
2308 eui[4] = 0xFE;
2309 eui[0] ^= 2;
2310 return 0;
2311 }
2312
2313 static int ipv6_generate_eui64(u8 *eui, struct net_device *dev)
2314 {
2315 switch (dev->type) {
2316 case ARPHRD_ETHER:
2317 case ARPHRD_FDDI:
2318 return addrconf_ifid_eui48(eui, dev);
2319 case ARPHRD_ARCNET:
2320 return addrconf_ifid_arcnet(eui, dev);
2321 case ARPHRD_INFINIBAND:
2322 return addrconf_ifid_infiniband(eui, dev);
2323 case ARPHRD_SIT:
2324 return addrconf_ifid_sit(eui, dev);
2325 case ARPHRD_IPGRE:
2326 case ARPHRD_TUNNEL:
2327 return addrconf_ifid_gre(eui, dev);
2328 case ARPHRD_6LOWPAN:
2329 return addrconf_ifid_6lowpan(eui, dev);
2330 case ARPHRD_IEEE1394:
2331 return addrconf_ifid_ieee1394(eui, dev);
2332 case ARPHRD_TUNNEL6:
2333 case ARPHRD_IP6GRE:
2334 case ARPHRD_RAWIP:
2335 return addrconf_ifid_ip6tnl(eui, dev);
2336 }
2337 return -1;
2338 }
2339
2340 static int ipv6_inherit_eui64(u8 *eui, struct inet6_dev *idev)
2341 {
2342 int err = -1;
2343 struct inet6_ifaddr *ifp;
2344
2345 read_lock_bh(&idev->lock);
2346 list_for_each_entry_reverse(ifp, &idev->addr_list, if_list) {
2347 if (ifp->scope > IFA_LINK)
2348 break;
2349 if (ifp->scope == IFA_LINK && !(ifp->flags&IFA_F_TENTATIVE)) {
2350 memcpy(eui, ifp->addr.s6_addr+8, 8);
2351 err = 0;
2352 break;
2353 }
2354 }
2355 read_unlock_bh(&idev->lock);
2356 return err;
2357 }
2358
2359
2360
2361
2362
2363 static void ipv6_gen_rnd_iid(struct in6_addr *addr)
2364 {
2365 regen:
2366 get_random_bytes(&addr->s6_addr[8], 8);
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376 if (!(addr->s6_addr32[2] | addr->s6_addr32[3]))
2377 goto regen;
2378
2379
2380
2381
2382
2383 if (ntohl(addr->s6_addr32[2]) == 0x02005eff &&
2384 (ntohl(addr->s6_addr32[3]) & 0Xff000000) == 0xfe000000)
2385 goto regen;
2386
2387
2388 if (ntohl(addr->s6_addr32[2]) == 0xfdffffff &&
2389 ntohl(addr->s6_addr32[3]) >= 0Xffffff80)
2390 goto regen;
2391 }
2392
2393
2394
2395
2396
2397 static void
2398 addrconf_prefix_route(struct in6_addr *pfx, int plen, u32 metric,
2399 struct net_device *dev, unsigned long expires,
2400 u32 flags, gfp_t gfp_flags)
2401 {
2402 struct fib6_config cfg = {
2403 .fc_table = l3mdev_fib_table(dev) ? : RT6_TABLE_PREFIX,
2404 .fc_metric = metric ? : IP6_RT_PRIO_ADDRCONF,
2405 .fc_ifindex = dev->ifindex,
2406 .fc_expires = expires,
2407 .fc_dst_len = plen,
2408 .fc_flags = RTF_UP | flags,
2409 .fc_nlinfo.nl_net = dev_net(dev),
2410 .fc_protocol = RTPROT_KERNEL,
2411 .fc_type = RTN_UNICAST,
2412 };
2413
2414 cfg.fc_dst = *pfx;
2415
2416
2417
2418
2419
2420 #if IS_ENABLED(CONFIG_IPV6_SIT)
2421 if (dev->type == ARPHRD_SIT && (dev->flags & IFF_POINTOPOINT))
2422 cfg.fc_flags |= RTF_NONEXTHOP;
2423 #endif
2424
2425 ip6_route_add(&cfg, gfp_flags, NULL);
2426 }
2427
2428
2429 static struct fib6_info *addrconf_get_prefix_route(const struct in6_addr *pfx,
2430 int plen,
2431 const struct net_device *dev,
2432 u32 flags, u32 noflags,
2433 bool no_gw)
2434 {
2435 struct fib6_node *fn;
2436 struct fib6_info *rt = NULL;
2437 struct fib6_table *table;
2438 u32 tb_id = l3mdev_fib_table(dev) ? : RT6_TABLE_PREFIX;
2439
2440 table = fib6_get_table(dev_net(dev), tb_id);
2441 if (!table)
2442 return NULL;
2443
2444 rcu_read_lock();
2445 fn = fib6_locate(&table->tb6_root, pfx, plen, NULL, 0, true);
2446 if (!fn)
2447 goto out;
2448
2449 for_each_fib6_node_rt_rcu(fn) {
2450
2451 if (rt->nh)
2452 continue;
2453
2454 if (rt->fib6_nh->fib_nh_dev->ifindex != dev->ifindex)
2455 continue;
2456 if (no_gw && rt->fib6_nh->fib_nh_gw_family)
2457 continue;
2458 if ((rt->fib6_flags & flags) != flags)
2459 continue;
2460 if ((rt->fib6_flags & noflags) != 0)
2461 continue;
2462 if (!fib6_info_hold_safe(rt))
2463 continue;
2464 break;
2465 }
2466 out:
2467 rcu_read_unlock();
2468 return rt;
2469 }
2470
2471
2472
2473
2474 static void addrconf_add_mroute(struct net_device *dev)
2475 {
2476 struct fib6_config cfg = {
2477 .fc_table = l3mdev_fib_table(dev) ? : RT6_TABLE_LOCAL,
2478 .fc_metric = IP6_RT_PRIO_ADDRCONF,
2479 .fc_ifindex = dev->ifindex,
2480 .fc_dst_len = 8,
2481 .fc_flags = RTF_UP,
2482 .fc_type = RTN_MULTICAST,
2483 .fc_nlinfo.nl_net = dev_net(dev),
2484 .fc_protocol = RTPROT_KERNEL,
2485 };
2486
2487 ipv6_addr_set(&cfg.fc_dst, htonl(0xFF000000), 0, 0, 0);
2488
2489 ip6_route_add(&cfg, GFP_KERNEL, NULL);
2490 }
2491
2492 static struct inet6_dev *addrconf_add_dev(struct net_device *dev)
2493 {
2494 struct inet6_dev *idev;
2495
2496 ASSERT_RTNL();
2497
2498 idev = ipv6_find_idev(dev);
2499 if (IS_ERR(idev))
2500 return idev;
2501
2502 if (idev->cnf.disable_ipv6)
2503 return ERR_PTR(-EACCES);
2504
2505
2506 if (!(dev->flags & IFF_LOOPBACK) && !netif_is_l3_master(dev))
2507 addrconf_add_mroute(dev);
2508
2509 return idev;
2510 }
2511
2512 static void manage_tempaddrs(struct inet6_dev *idev,
2513 struct inet6_ifaddr *ifp,
2514 __u32 valid_lft, __u32 prefered_lft,
2515 bool create, unsigned long now)
2516 {
2517 u32 flags;
2518 struct inet6_ifaddr *ift;
2519
2520 read_lock_bh(&idev->lock);
2521
2522 list_for_each_entry(ift, &idev->tempaddr_list, tmp_list) {
2523 int age, max_valid, max_prefered;
2524
2525 if (ifp != ift->ifpub)
2526 continue;
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536 age = (now - ift->cstamp) / HZ;
2537 max_valid = idev->cnf.temp_valid_lft - age;
2538 if (max_valid < 0)
2539 max_valid = 0;
2540
2541 max_prefered = idev->cnf.temp_prefered_lft -
2542 idev->desync_factor - age;
2543 if (max_prefered < 0)
2544 max_prefered = 0;
2545
2546 if (valid_lft > max_valid)
2547 valid_lft = max_valid;
2548
2549 if (prefered_lft > max_prefered)
2550 prefered_lft = max_prefered;
2551
2552 spin_lock(&ift->lock);
2553 flags = ift->flags;
2554 ift->valid_lft = valid_lft;
2555 ift->prefered_lft = prefered_lft;
2556 ift->tstamp = now;
2557 if (prefered_lft > 0)
2558 ift->flags &= ~IFA_F_DEPRECATED;
2559
2560 spin_unlock(&ift->lock);
2561 if (!(flags&IFA_F_TENTATIVE))
2562 ipv6_ifa_notify(0, ift);
2563 }
2564
2565 if ((create || list_empty(&idev->tempaddr_list)) &&
2566 idev->cnf.use_tempaddr > 0) {
2567
2568
2569
2570
2571
2572 read_unlock_bh(&idev->lock);
2573 ipv6_create_tempaddr(ifp, false);
2574 } else {
2575 read_unlock_bh(&idev->lock);
2576 }
2577 }
2578
2579 static bool is_addr_mode_generate_stable(struct inet6_dev *idev)
2580 {
2581 return idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_STABLE_PRIVACY ||
2582 idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_RANDOM;
2583 }
2584
2585 int addrconf_prefix_rcv_add_addr(struct net *net, struct net_device *dev,
2586 const struct prefix_info *pinfo,
2587 struct inet6_dev *in6_dev,
2588 const struct in6_addr *addr, int addr_type,
2589 u32 addr_flags, bool sllao, bool tokenized,
2590 __u32 valid_lft, u32 prefered_lft)
2591 {
2592 struct inet6_ifaddr *ifp = ipv6_get_ifaddr(net, addr, dev, 1);
2593 int create = 0, update_lft = 0;
2594
2595 if (!ifp && valid_lft) {
2596 int max_addresses = in6_dev->cnf.max_addresses;
2597 struct ifa6_config cfg = {
2598 .pfx = addr,
2599 .plen = pinfo->prefix_len,
2600 .ifa_flags = addr_flags,
2601 .valid_lft = valid_lft,
2602 .preferred_lft = prefered_lft,
2603 .scope = addr_type & IPV6_ADDR_SCOPE_MASK,
2604 .ifa_proto = IFAPROT_KERNEL_RA
2605 };
2606
2607 #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
2608 if ((net->ipv6.devconf_all->optimistic_dad ||
2609 in6_dev->cnf.optimistic_dad) &&
2610 !net->ipv6.devconf_all->forwarding && sllao)
2611 cfg.ifa_flags |= IFA_F_OPTIMISTIC;
2612 #endif
2613
2614
2615
2616
2617 if (!max_addresses ||
2618 ipv6_count_addresses(in6_dev) < max_addresses)
2619 ifp = ipv6_add_addr(in6_dev, &cfg, false, NULL);
2620
2621 if (IS_ERR_OR_NULL(ifp))
2622 return -1;
2623
2624 create = 1;
2625 spin_lock_bh(&ifp->lock);
2626 ifp->flags |= IFA_F_MANAGETEMPADDR;
2627 ifp->cstamp = jiffies;
2628 ifp->tokenized = tokenized;
2629 spin_unlock_bh(&ifp->lock);
2630 addrconf_dad_start(ifp);
2631 }
2632
2633 if (ifp) {
2634 u32 flags;
2635 unsigned long now;
2636 u32 stored_lft;
2637
2638
2639 spin_lock_bh(&ifp->lock);
2640 now = jiffies;
2641 if (ifp->valid_lft > (now - ifp->tstamp) / HZ)
2642 stored_lft = ifp->valid_lft - (now - ifp->tstamp) / HZ;
2643 else
2644 stored_lft = 0;
2645 if (!create && stored_lft) {
2646 const u32 minimum_lft = min_t(u32,
2647 stored_lft, MIN_VALID_LIFETIME);
2648 valid_lft = max(valid_lft, minimum_lft);
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660 update_lft = 1;
2661 }
2662
2663 if (update_lft) {
2664 ifp->valid_lft = valid_lft;
2665 ifp->prefered_lft = prefered_lft;
2666 ifp->tstamp = now;
2667 flags = ifp->flags;
2668 ifp->flags &= ~IFA_F_DEPRECATED;
2669 spin_unlock_bh(&ifp->lock);
2670
2671 if (!(flags&IFA_F_TENTATIVE))
2672 ipv6_ifa_notify(0, ifp);
2673 } else
2674 spin_unlock_bh(&ifp->lock);
2675
2676 manage_tempaddrs(in6_dev, ifp, valid_lft, prefered_lft,
2677 create, now);
2678
2679 in6_ifa_put(ifp);
2680 addrconf_verify(net);
2681 }
2682
2683 return 0;
2684 }
2685 EXPORT_SYMBOL_GPL(addrconf_prefix_rcv_add_addr);
2686
2687 void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len, bool sllao)
2688 {
2689 struct prefix_info *pinfo;
2690 __u32 valid_lft;
2691 __u32 prefered_lft;
2692 int addr_type, err;
2693 u32 addr_flags = 0;
2694 struct inet6_dev *in6_dev;
2695 struct net *net = dev_net(dev);
2696
2697 pinfo = (struct prefix_info *) opt;
2698
2699 if (len < sizeof(struct prefix_info)) {
2700 netdev_dbg(dev, "addrconf: prefix option too short\n");
2701 return;
2702 }
2703
2704
2705
2706
2707
2708 addr_type = ipv6_addr_type(&pinfo->prefix);
2709
2710 if (addr_type & (IPV6_ADDR_MULTICAST|IPV6_ADDR_LINKLOCAL))
2711 return;
2712
2713 valid_lft = ntohl(pinfo->valid);
2714 prefered_lft = ntohl(pinfo->prefered);
2715
2716 if (prefered_lft > valid_lft) {
2717 net_warn_ratelimited("addrconf: prefix option has invalid lifetime\n");
2718 return;
2719 }
2720
2721 in6_dev = in6_dev_get(dev);
2722
2723 if (!in6_dev) {
2724 net_dbg_ratelimited("addrconf: device %s not configured\n",
2725 dev->name);
2726 return;
2727 }
2728
2729
2730
2731
2732
2733
2734
2735 if (pinfo->onlink) {
2736 struct fib6_info *rt;
2737 unsigned long rt_expires;
2738
2739
2740
2741
2742
2743
2744 if (HZ > USER_HZ)
2745 rt_expires = addrconf_timeout_fixup(valid_lft, HZ);
2746 else
2747 rt_expires = addrconf_timeout_fixup(valid_lft, USER_HZ);
2748
2749 if (addrconf_finite_timeout(rt_expires))
2750 rt_expires *= HZ;
2751
2752 rt = addrconf_get_prefix_route(&pinfo->prefix,
2753 pinfo->prefix_len,
2754 dev,
2755 RTF_ADDRCONF | RTF_PREFIX_RT,
2756 RTF_DEFAULT, true);
2757
2758 if (rt) {
2759
2760 if (valid_lft == 0) {
2761 ip6_del_rt(net, rt, false);
2762 rt = NULL;
2763 } else if (addrconf_finite_timeout(rt_expires)) {
2764
2765 fib6_set_expires(rt, jiffies + rt_expires);
2766 } else {
2767 fib6_clean_expires(rt);
2768 }
2769 } else if (valid_lft) {
2770 clock_t expires = 0;
2771 int flags = RTF_ADDRCONF | RTF_PREFIX_RT;
2772 if (addrconf_finite_timeout(rt_expires)) {
2773
2774 flags |= RTF_EXPIRES;
2775 expires = jiffies_to_clock_t(rt_expires);
2776 }
2777 addrconf_prefix_route(&pinfo->prefix, pinfo->prefix_len,
2778 0, dev, expires, flags,
2779 GFP_ATOMIC);
2780 }
2781 fib6_info_release(rt);
2782 }
2783
2784
2785
2786 if (pinfo->autoconf && in6_dev->cnf.autoconf) {
2787 struct in6_addr addr;
2788 bool tokenized = false, dev_addr_generated = false;
2789
2790 if (pinfo->prefix_len == 64) {
2791 memcpy(&addr, &pinfo->prefix, 8);
2792
2793 if (!ipv6_addr_any(&in6_dev->token)) {
2794 read_lock_bh(&in6_dev->lock);
2795 memcpy(addr.s6_addr + 8,
2796 in6_dev->token.s6_addr + 8, 8);
2797 read_unlock_bh(&in6_dev->lock);
2798 tokenized = true;
2799 } else if (is_addr_mode_generate_stable(in6_dev) &&
2800 !ipv6_generate_stable_address(&addr, 0,
2801 in6_dev)) {
2802 addr_flags |= IFA_F_STABLE_PRIVACY;
2803 goto ok;
2804 } else if (ipv6_generate_eui64(addr.s6_addr + 8, dev) &&
2805 ipv6_inherit_eui64(addr.s6_addr + 8, in6_dev)) {
2806 goto put;
2807 } else {
2808 dev_addr_generated = true;
2809 }
2810 goto ok;
2811 }
2812 net_dbg_ratelimited("IPv6 addrconf: prefix with wrong length %d\n",
2813 pinfo->prefix_len);
2814 goto put;
2815
2816 ok:
2817 err = addrconf_prefix_rcv_add_addr(net, dev, pinfo, in6_dev,
2818 &addr, addr_type,
2819 addr_flags, sllao,
2820 tokenized, valid_lft,
2821 prefered_lft);
2822 if (err)
2823 goto put;
2824
2825
2826
2827
2828 ndisc_ops_prefix_rcv_add_addr(net, dev, pinfo, in6_dev, &addr,
2829 addr_type, addr_flags, sllao,
2830 tokenized, valid_lft,
2831 prefered_lft,
2832 dev_addr_generated);
2833 }
2834 inet6_prefix_notify(RTM_NEWPREFIX, in6_dev, pinfo);
2835 put:
2836 in6_dev_put(in6_dev);
2837 }
2838
2839 static int addrconf_set_sit_dstaddr(struct net *net, struct net_device *dev,
2840 struct in6_ifreq *ireq)
2841 {
2842 struct ip_tunnel_parm p = { };
2843 int err;
2844
2845 if (!(ipv6_addr_type(&ireq->ifr6_addr) & IPV6_ADDR_COMPATv4))
2846 return -EADDRNOTAVAIL;
2847
2848 p.iph.daddr = ireq->ifr6_addr.s6_addr32[3];
2849 p.iph.version = 4;
2850 p.iph.ihl = 5;
2851 p.iph.protocol = IPPROTO_IPV6;
2852 p.iph.ttl = 64;
2853
2854 if (!dev->netdev_ops->ndo_tunnel_ctl)
2855 return -EOPNOTSUPP;
2856 err = dev->netdev_ops->ndo_tunnel_ctl(dev, &p, SIOCADDTUNNEL);
2857 if (err)
2858 return err;
2859
2860 dev = __dev_get_by_name(net, p.name);
2861 if (!dev)
2862 return -ENOBUFS;
2863 return dev_open(dev, NULL);
2864 }
2865
2866
2867
2868
2869
2870
2871 int addrconf_set_dstaddr(struct net *net, void __user *arg)
2872 {
2873 struct net_device *dev;
2874 struct in6_ifreq ireq;
2875 int err = -ENODEV;
2876
2877 if (!IS_ENABLED(CONFIG_IPV6_SIT))
2878 return -ENODEV;
2879 if (copy_from_user(&ireq, arg, sizeof(struct in6_ifreq)))
2880 return -EFAULT;
2881
2882 rtnl_lock();
2883 dev = __dev_get_by_index(net, ireq.ifr6_ifindex);
2884 if (dev && dev->type == ARPHRD_SIT)
2885 err = addrconf_set_sit_dstaddr(net, dev, &ireq);
2886 rtnl_unlock();
2887 return err;
2888 }
2889
2890 static int ipv6_mc_config(struct sock *sk, bool join,
2891 const struct in6_addr *addr, int ifindex)
2892 {
2893 int ret;
2894
2895 ASSERT_RTNL();
2896
2897 lock_sock(sk);
2898 if (join)
2899 ret = ipv6_sock_mc_join(sk, ifindex, addr);
2900 else
2901 ret = ipv6_sock_mc_drop(sk, ifindex, addr);
2902 release_sock(sk);
2903
2904 return ret;
2905 }
2906
2907
2908
2909
2910 static int inet6_addr_add(struct net *net, int ifindex,
2911 struct ifa6_config *cfg,
2912 struct netlink_ext_ack *extack)
2913 {
2914 struct inet6_ifaddr *ifp;
2915 struct inet6_dev *idev;
2916 struct net_device *dev;
2917 unsigned long timeout;
2918 clock_t expires;
2919 u32 flags;
2920
2921 ASSERT_RTNL();
2922
2923 if (cfg->plen > 128)
2924 return -EINVAL;
2925
2926
2927 if (!cfg->valid_lft || cfg->preferred_lft > cfg->valid_lft)
2928 return -EINVAL;
2929
2930 if (cfg->ifa_flags & IFA_F_MANAGETEMPADDR && cfg->plen != 64)
2931 return -EINVAL;
2932
2933 dev = __dev_get_by_index(net, ifindex);
2934 if (!dev)
2935 return -ENODEV;
2936
2937 idev = addrconf_add_dev(dev);
2938 if (IS_ERR(idev))
2939 return PTR_ERR(idev);
2940
2941 if (cfg->ifa_flags & IFA_F_MCAUTOJOIN) {
2942 int ret = ipv6_mc_config(net->ipv6.mc_autojoin_sk,
2943 true, cfg->pfx, ifindex);
2944
2945 if (ret < 0)
2946 return ret;
2947 }
2948
2949 cfg->scope = ipv6_addr_scope(cfg->pfx);
2950
2951 timeout = addrconf_timeout_fixup(cfg->valid_lft, HZ);
2952 if (addrconf_finite_timeout(timeout)) {
2953 expires = jiffies_to_clock_t(timeout * HZ);
2954 cfg->valid_lft = timeout;
2955 flags = RTF_EXPIRES;
2956 } else {
2957 expires = 0;
2958 flags = 0;
2959 cfg->ifa_flags |= IFA_F_PERMANENT;
2960 }
2961
2962 timeout = addrconf_timeout_fixup(cfg->preferred_lft, HZ);
2963 if (addrconf_finite_timeout(timeout)) {
2964 if (timeout == 0)
2965 cfg->ifa_flags |= IFA_F_DEPRECATED;
2966 cfg->preferred_lft = timeout;
2967 }
2968
2969 ifp = ipv6_add_addr(idev, cfg, true, extack);
2970 if (!IS_ERR(ifp)) {
2971 if (!(cfg->ifa_flags & IFA_F_NOPREFIXROUTE)) {
2972 addrconf_prefix_route(&ifp->addr, ifp->prefix_len,
2973 ifp->rt_priority, dev, expires,
2974 flags, GFP_KERNEL);
2975 }
2976
2977
2978
2979
2980 if (!(ifp->flags & (IFA_F_OPTIMISTIC | IFA_F_NODAD)))
2981 ipv6_ifa_notify(0, ifp);
2982
2983
2984
2985
2986
2987 addrconf_dad_start(ifp);
2988 if (cfg->ifa_flags & IFA_F_MANAGETEMPADDR)
2989 manage_tempaddrs(idev, ifp, cfg->valid_lft,
2990 cfg->preferred_lft, true, jiffies);
2991 in6_ifa_put(ifp);
2992 addrconf_verify_rtnl(net);
2993 return 0;
2994 } else if (cfg->ifa_flags & IFA_F_MCAUTOJOIN) {
2995 ipv6_mc_config(net->ipv6.mc_autojoin_sk, false,
2996 cfg->pfx, ifindex);
2997 }
2998
2999 return PTR_ERR(ifp);
3000 }
3001
3002 static int inet6_addr_del(struct net *net, int ifindex, u32 ifa_flags,
3003 const struct in6_addr *pfx, unsigned int plen)
3004 {
3005 struct inet6_ifaddr *ifp;
3006 struct inet6_dev *idev;
3007 struct net_device *dev;
3008
3009 if (plen > 128)
3010 return -EINVAL;
3011
3012 dev = __dev_get_by_index(net, ifindex);
3013 if (!dev)
3014 return -ENODEV;
3015
3016 idev = __in6_dev_get(dev);
3017 if (!idev)
3018 return -ENXIO;
3019
3020 read_lock_bh(&idev->lock);
3021 list_for_each_entry(ifp, &idev->addr_list, if_list) {
3022 if (ifp->prefix_len == plen &&
3023 ipv6_addr_equal(pfx, &ifp->addr)) {
3024 in6_ifa_hold(ifp);
3025 read_unlock_bh(&idev->lock);
3026
3027 if (!(ifp->flags & IFA_F_TEMPORARY) &&
3028 (ifa_flags & IFA_F_MANAGETEMPADDR))
3029 manage_tempaddrs(idev, ifp, 0, 0, false,
3030 jiffies);
3031 ipv6_del_addr(ifp);
3032 addrconf_verify_rtnl(net);
3033 if (ipv6_addr_is_multicast(pfx)) {
3034 ipv6_mc_config(net->ipv6.mc_autojoin_sk,
3035 false, pfx, dev->ifindex);
3036 }
3037 return 0;
3038 }
3039 }
3040 read_unlock_bh(&idev->lock);
3041 return -EADDRNOTAVAIL;
3042 }
3043
3044
3045 int addrconf_add_ifaddr(struct net *net, void __user *arg)
3046 {
3047 struct ifa6_config cfg = {
3048 .ifa_flags = IFA_F_PERMANENT,
3049 .preferred_lft = INFINITY_LIFE_TIME,
3050 .valid_lft = INFINITY_LIFE_TIME,
3051 };
3052 struct in6_ifreq ireq;
3053 int err;
3054
3055 if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
3056 return -EPERM;
3057
3058 if (copy_from_user(&ireq, arg, sizeof(struct in6_ifreq)))
3059 return -EFAULT;
3060
3061 cfg.pfx = &ireq.ifr6_addr;
3062 cfg.plen = ireq.ifr6_prefixlen;
3063
3064 rtnl_lock();
3065 err = inet6_addr_add(net, ireq.ifr6_ifindex, &cfg, NULL);
3066 rtnl_unlock();
3067 return err;
3068 }
3069
3070 int addrconf_del_ifaddr(struct net *net, void __user *arg)
3071 {
3072 struct in6_ifreq ireq;
3073 int err;
3074
3075 if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
3076 return -EPERM;
3077
3078 if (copy_from_user(&ireq, arg, sizeof(struct in6_ifreq)))
3079 return -EFAULT;
3080
3081 rtnl_lock();
3082 err = inet6_addr_del(net, ireq.ifr6_ifindex, 0, &ireq.ifr6_addr,
3083 ireq.ifr6_prefixlen);
3084 rtnl_unlock();
3085 return err;
3086 }
3087
3088 static void add_addr(struct inet6_dev *idev, const struct in6_addr *addr,
3089 int plen, int scope, u8 proto)
3090 {
3091 struct inet6_ifaddr *ifp;
3092 struct ifa6_config cfg = {
3093 .pfx = addr,
3094 .plen = plen,
3095 .ifa_flags = IFA_F_PERMANENT,
3096 .valid_lft = INFINITY_LIFE_TIME,
3097 .preferred_lft = INFINITY_LIFE_TIME,
3098 .scope = scope,
3099 .ifa_proto = proto
3100 };
3101
3102 ifp = ipv6_add_addr(idev, &cfg, true, NULL);
3103 if (!IS_ERR(ifp)) {
3104 spin_lock_bh(&ifp->lock);
3105 ifp->flags &= ~IFA_F_TENTATIVE;
3106 spin_unlock_bh(&ifp->lock);
3107 rt_genid_bump_ipv6(dev_net(idev->dev));
3108 ipv6_ifa_notify(RTM_NEWADDR, ifp);
3109 in6_ifa_put(ifp);
3110 }
3111 }
3112
3113 #if IS_ENABLED(CONFIG_IPV6_SIT) || IS_ENABLED(CONFIG_NET_IPGRE) || IS_ENABLED(CONFIG_IPV6_GRE)
3114 static void add_v4_addrs(struct inet6_dev *idev)
3115 {
3116 struct in6_addr addr;
3117 struct net_device *dev;
3118 struct net *net = dev_net(idev->dev);
3119 int scope, plen, offset = 0;
3120 u32 pflags = 0;
3121
3122 ASSERT_RTNL();
3123
3124 memset(&addr, 0, sizeof(struct in6_addr));
3125
3126 if (idev->dev->addr_len == sizeof(struct in6_addr))
3127 offset = sizeof(struct in6_addr) - 4;
3128 memcpy(&addr.s6_addr32[3], idev->dev->dev_addr + offset, 4);
3129
3130 if (idev->dev->flags&IFF_POINTOPOINT) {
3131 if (idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_NONE)
3132 return;
3133
3134 addr.s6_addr32[0] = htonl(0xfe800000);
3135 scope = IFA_LINK;
3136 plen = 64;
3137 } else {
3138 scope = IPV6_ADDR_COMPATv4;
3139 plen = 96;
3140 pflags |= RTF_NONEXTHOP;
3141 }
3142
3143 if (addr.s6_addr32[3]) {
3144 add_addr(idev, &addr, plen, scope, IFAPROT_UNSPEC);
3145 addrconf_prefix_route(&addr, plen, 0, idev->dev, 0, pflags,
3146 GFP_KERNEL);
3147 return;
3148 }
3149
3150 for_each_netdev(net, dev) {
3151 struct in_device *in_dev = __in_dev_get_rtnl(dev);
3152 if (in_dev && (dev->flags & IFF_UP)) {
3153 struct in_ifaddr *ifa;
3154 int flag = scope;
3155
3156 in_dev_for_each_ifa_rtnl(ifa, in_dev) {
3157 addr.s6_addr32[3] = ifa->ifa_local;
3158
3159 if (ifa->ifa_scope == RT_SCOPE_LINK)
3160 continue;
3161 if (ifa->ifa_scope >= RT_SCOPE_HOST) {
3162 if (idev->dev->flags&IFF_POINTOPOINT)
3163 continue;
3164 flag |= IFA_HOST;
3165 }
3166
3167 add_addr(idev, &addr, plen, flag,
3168 IFAPROT_UNSPEC);
3169 addrconf_prefix_route(&addr, plen, 0, idev->dev,
3170 0, pflags, GFP_KERNEL);
3171 }
3172 }
3173 }
3174 }
3175 #endif
3176
3177 static void init_loopback(struct net_device *dev)
3178 {
3179 struct inet6_dev *idev;
3180
3181
3182
3183 ASSERT_RTNL();
3184
3185 idev = ipv6_find_idev(dev);
3186 if (IS_ERR(idev)) {
3187 pr_debug("%s: add_dev failed\n", __func__);
3188 return;
3189 }
3190
3191 add_addr(idev, &in6addr_loopback, 128, IFA_HOST, IFAPROT_KERNEL_LO);
3192 }
3193
3194 void addrconf_add_linklocal(struct inet6_dev *idev,
3195 const struct in6_addr *addr, u32 flags)
3196 {
3197 struct ifa6_config cfg = {
3198 .pfx = addr,
3199 .plen = 64,
3200 .ifa_flags = flags | IFA_F_PERMANENT,
3201 .valid_lft = INFINITY_LIFE_TIME,
3202 .preferred_lft = INFINITY_LIFE_TIME,
3203 .scope = IFA_LINK,
3204 .ifa_proto = IFAPROT_KERNEL_LL
3205 };
3206 struct inet6_ifaddr *ifp;
3207
3208 #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
3209 if ((dev_net(idev->dev)->ipv6.devconf_all->optimistic_dad ||
3210 idev->cnf.optimistic_dad) &&
3211 !dev_net(idev->dev)->ipv6.devconf_all->forwarding)
3212 cfg.ifa_flags |= IFA_F_OPTIMISTIC;
3213 #endif
3214
3215 ifp = ipv6_add_addr(idev, &cfg, true, NULL);
3216 if (!IS_ERR(ifp)) {
3217 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, 0, idev->dev,
3218 0, 0, GFP_ATOMIC);
3219 addrconf_dad_start(ifp);
3220 in6_ifa_put(ifp);
3221 }
3222 }
3223 EXPORT_SYMBOL_GPL(addrconf_add_linklocal);
3224
3225 static bool ipv6_reserved_interfaceid(struct in6_addr address)
3226 {
3227 if ((address.s6_addr32[2] | address.s6_addr32[3]) == 0)
3228 return true;
3229
3230 if (address.s6_addr32[2] == htonl(0x02005eff) &&
3231 ((address.s6_addr32[3] & htonl(0xfe000000)) == htonl(0xfe000000)))
3232 return true;
3233
3234 if (address.s6_addr32[2] == htonl(0xfdffffff) &&
3235 ((address.s6_addr32[3] & htonl(0xffffff80)) == htonl(0xffffff80)))
3236 return true;
3237
3238 return false;
3239 }
3240
3241 static int ipv6_generate_stable_address(struct in6_addr *address,
3242 u8 dad_count,
3243 const struct inet6_dev *idev)
3244 {
3245 static DEFINE_SPINLOCK(lock);
3246 static __u32 digest[SHA1_DIGEST_WORDS];
3247 static __u32 workspace[SHA1_WORKSPACE_WORDS];
3248
3249 static union {
3250 char __data[SHA1_BLOCK_SIZE];
3251 struct {
3252 struct in6_addr secret;
3253 __be32 prefix[2];
3254 unsigned char hwaddr[MAX_ADDR_LEN];
3255 u8 dad_count;
3256 } __packed;
3257 } data;
3258
3259 struct in6_addr secret;
3260 struct in6_addr temp;
3261 struct net *net = dev_net(idev->dev);
3262
3263 BUILD_BUG_ON(sizeof(data.__data) != sizeof(data));
3264
3265 if (idev->cnf.stable_secret.initialized)
3266 secret = idev->cnf.stable_secret.secret;
3267 else if (net->ipv6.devconf_dflt->stable_secret.initialized)
3268 secret = net->ipv6.devconf_dflt->stable_secret.secret;
3269 else
3270 return -1;
3271
3272 retry:
3273 spin_lock_bh(&lock);
3274
3275 sha1_init(digest);
3276 memset(&data, 0, sizeof(data));
3277 memset(workspace, 0, sizeof(workspace));
3278 memcpy(data.hwaddr, idev->dev->perm_addr, idev->dev->addr_len);
3279 data.prefix[0] = address->s6_addr32[0];
3280 data.prefix[1] = address->s6_addr32[1];
3281 data.secret = secret;
3282 data.dad_count = dad_count;
3283
3284 sha1_transform(digest, data.__data, workspace);
3285
3286 temp = *address;
3287 temp.s6_addr32[2] = (__force __be32)digest[0];
3288 temp.s6_addr32[3] = (__force __be32)digest[1];
3289
3290 spin_unlock_bh(&lock);
3291
3292 if (ipv6_reserved_interfaceid(temp)) {
3293 dad_count++;
3294 if (dad_count > dev_net(idev->dev)->ipv6.sysctl.idgen_retries)
3295 return -1;
3296 goto retry;
3297 }
3298
3299 *address = temp;
3300 return 0;
3301 }
3302
3303 static void ipv6_gen_mode_random_init(struct inet6_dev *idev)
3304 {
3305 struct ipv6_stable_secret *s = &idev->cnf.stable_secret;
3306
3307 if (s->initialized)
3308 return;
3309 s = &idev->cnf.stable_secret;
3310 get_random_bytes(&s->secret, sizeof(s->secret));
3311 s->initialized = true;
3312 }
3313
3314 static void addrconf_addr_gen(struct inet6_dev *idev, bool prefix_route)
3315 {
3316 struct in6_addr addr;
3317
3318
3319 if (netif_is_l3_master(idev->dev))
3320 return;
3321
3322
3323 if (idev->dev->flags & IFF_SLAVE)
3324 return;
3325
3326 ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0);
3327
3328 switch (idev->cnf.addr_gen_mode) {
3329 case IN6_ADDR_GEN_MODE_RANDOM:
3330 ipv6_gen_mode_random_init(idev);
3331 fallthrough;
3332 case IN6_ADDR_GEN_MODE_STABLE_PRIVACY:
3333 if (!ipv6_generate_stable_address(&addr, 0, idev))
3334 addrconf_add_linklocal(idev, &addr,
3335 IFA_F_STABLE_PRIVACY);
3336 else if (prefix_route)
3337 addrconf_prefix_route(&addr, 64, 0, idev->dev,
3338 0, 0, GFP_KERNEL);
3339 break;
3340 case IN6_ADDR_GEN_MODE_EUI64:
3341
3342
3343
3344
3345 if (ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) == 0)
3346 addrconf_add_linklocal(idev, &addr, 0);
3347 else if (prefix_route)
3348 addrconf_prefix_route(&addr, 64, 0, idev->dev,
3349 0, 0, GFP_KERNEL);
3350 break;
3351 case IN6_ADDR_GEN_MODE_NONE:
3352 default:
3353
3354 break;
3355 }
3356 }
3357
3358 static void addrconf_dev_config(struct net_device *dev)
3359 {
3360 struct inet6_dev *idev;
3361
3362 ASSERT_RTNL();
3363
3364 if ((dev->type != ARPHRD_ETHER) &&
3365 (dev->type != ARPHRD_FDDI) &&
3366 (dev->type != ARPHRD_ARCNET) &&
3367 (dev->type != ARPHRD_INFINIBAND) &&
3368 (dev->type != ARPHRD_IEEE1394) &&
3369 (dev->type != ARPHRD_TUNNEL6) &&
3370 (dev->type != ARPHRD_6LOWPAN) &&
3371 (dev->type != ARPHRD_TUNNEL) &&
3372 (dev->type != ARPHRD_NONE) &&
3373 (dev->type != ARPHRD_RAWIP)) {
3374
3375 idev = __in6_dev_get(dev);
3376 if (!IS_ERR_OR_NULL(idev) && dev->flags & IFF_UP &&
3377 dev->flags & IFF_MULTICAST)
3378 ipv6_mc_up(idev);
3379 return;
3380 }
3381
3382 idev = addrconf_add_dev(dev);
3383 if (IS_ERR(idev))
3384 return;
3385
3386
3387 if (dev->type == ARPHRD_NONE &&
3388 idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_EUI64)
3389 idev->cnf.addr_gen_mode = IN6_ADDR_GEN_MODE_RANDOM;
3390
3391 addrconf_addr_gen(idev, false);
3392 }
3393
3394 #if IS_ENABLED(CONFIG_IPV6_SIT)
3395 static void addrconf_sit_config(struct net_device *dev)
3396 {
3397 struct inet6_dev *idev;
3398
3399 ASSERT_RTNL();
3400
3401
3402
3403
3404
3405
3406
3407 idev = ipv6_find_idev(dev);
3408 if (IS_ERR(idev)) {
3409 pr_debug("%s: add_dev failed\n", __func__);
3410 return;
3411 }
3412
3413 if (dev->priv_flags & IFF_ISATAP) {
3414 addrconf_addr_gen(idev, false);
3415 return;
3416 }
3417
3418 add_v4_addrs(idev);
3419
3420 if (dev->flags&IFF_POINTOPOINT)
3421 addrconf_add_mroute(dev);
3422 }
3423 #endif
3424
3425 #if IS_ENABLED(CONFIG_NET_IPGRE) || IS_ENABLED(CONFIG_IPV6_GRE)
3426 static void addrconf_gre_config(struct net_device *dev)
3427 {
3428 struct inet6_dev *idev;
3429
3430 ASSERT_RTNL();
3431
3432 idev = ipv6_find_idev(dev);
3433 if (IS_ERR(idev)) {
3434 pr_debug("%s: add_dev failed\n", __func__);
3435 return;
3436 }
3437
3438 if (dev->type == ARPHRD_ETHER) {
3439 addrconf_addr_gen(idev, true);
3440 return;
3441 }
3442
3443 add_v4_addrs(idev);
3444
3445 if (dev->flags & IFF_POINTOPOINT)
3446 addrconf_add_mroute(dev);
3447 }
3448 #endif
3449
3450 static int fixup_permanent_addr(struct net *net,
3451 struct inet6_dev *idev,
3452 struct inet6_ifaddr *ifp)
3453 {
3454
3455
3456
3457
3458 if (!ifp->rt || !ifp->rt->fib6_node) {
3459 struct fib6_info *f6i, *prev;
3460
3461 f6i = addrconf_f6i_alloc(net, idev, &ifp->addr, false,
3462 GFP_ATOMIC);
3463 if (IS_ERR(f6i))
3464 return PTR_ERR(f6i);
3465
3466
3467 spin_lock(&ifp->lock);
3468 prev = ifp->rt;
3469 ifp->rt = f6i;
3470 spin_unlock(&ifp->lock);
3471
3472 fib6_info_release(prev);
3473 }
3474
3475 if (!(ifp->flags & IFA_F_NOPREFIXROUTE)) {
3476 addrconf_prefix_route(&ifp->addr, ifp->prefix_len,
3477 ifp->rt_priority, idev->dev, 0, 0,
3478 GFP_ATOMIC);
3479 }
3480
3481 if (ifp->state == INET6_IFADDR_STATE_PREDAD)
3482 addrconf_dad_start(ifp);
3483
3484 return 0;
3485 }
3486
3487 static void addrconf_permanent_addr(struct net *net, struct net_device *dev)
3488 {
3489 struct inet6_ifaddr *ifp, *tmp;
3490 struct inet6_dev *idev;
3491
3492 idev = __in6_dev_get(dev);
3493 if (!idev)
3494 return;
3495
3496 write_lock_bh(&idev->lock);
3497
3498 list_for_each_entry_safe(ifp, tmp, &idev->addr_list, if_list) {
3499 if ((ifp->flags & IFA_F_PERMANENT) &&
3500 fixup_permanent_addr(net, idev, ifp) < 0) {
3501 write_unlock_bh(&idev->lock);
3502 in6_ifa_hold(ifp);
3503 ipv6_del_addr(ifp);
3504 write_lock_bh(&idev->lock);
3505
3506 net_info_ratelimited("%s: Failed to add prefix route for address %pI6c; dropping\n",
3507 idev->dev->name, &ifp->addr);
3508 }
3509 }
3510
3511 write_unlock_bh(&idev->lock);
3512 }
3513
3514 static int addrconf_notify(struct notifier_block *this, unsigned long event,
3515 void *ptr)
3516 {
3517 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
3518 struct netdev_notifier_change_info *change_info;
3519 struct netdev_notifier_changeupper_info *info;
3520 struct inet6_dev *idev = __in6_dev_get(dev);
3521 struct net *net = dev_net(dev);
3522 int run_pending = 0;
3523 int err;
3524
3525 switch (event) {
3526 case NETDEV_REGISTER:
3527 if (!idev && dev->mtu >= IPV6_MIN_MTU) {
3528 idev = ipv6_add_dev(dev);
3529 if (IS_ERR(idev))
3530 return notifier_from_errno(PTR_ERR(idev));
3531 }
3532 break;
3533
3534 case NETDEV_CHANGEMTU:
3535
3536 if (dev->mtu < IPV6_MIN_MTU) {
3537 addrconf_ifdown(dev, dev != net->loopback_dev);
3538 break;
3539 }
3540
3541 if (idev) {
3542 rt6_mtu_change(dev, dev->mtu);
3543 idev->cnf.mtu6 = dev->mtu;
3544 break;
3545 }
3546
3547
3548 idev = ipv6_add_dev(dev);
3549 if (IS_ERR(idev))
3550 break;
3551
3552
3553 if (!(idev->if_flags & IF_READY))
3554 break;
3555
3556 run_pending = 1;
3557 fallthrough;
3558 case NETDEV_UP:
3559 case NETDEV_CHANGE:
3560 if (idev && idev->cnf.disable_ipv6)
3561 break;
3562
3563 if (dev->flags & IFF_SLAVE) {
3564 if (event == NETDEV_UP && !IS_ERR_OR_NULL(idev) &&
3565 dev->flags & IFF_UP && dev->flags & IFF_MULTICAST)
3566 ipv6_mc_up(idev);
3567 break;
3568 }
3569
3570 if (event == NETDEV_UP) {
3571
3572 addrconf_permanent_addr(net, dev);
3573
3574 if (!addrconf_link_ready(dev)) {
3575
3576 pr_debug("ADDRCONF(NETDEV_UP): %s: link is not ready\n",
3577 dev->name);
3578 break;
3579 }
3580
3581 if (!idev && dev->mtu >= IPV6_MIN_MTU)
3582 idev = ipv6_add_dev(dev);
3583
3584 if (!IS_ERR_OR_NULL(idev)) {
3585 idev->if_flags |= IF_READY;
3586 run_pending = 1;
3587 }
3588 } else if (event == NETDEV_CHANGE) {
3589 if (!addrconf_link_ready(dev)) {
3590
3591 rt6_sync_down_dev(dev, event);
3592 break;
3593 }
3594
3595 if (!IS_ERR_OR_NULL(idev)) {
3596 if (idev->if_flags & IF_READY) {
3597
3598
3599
3600
3601
3602 ipv6_mc_up(idev);
3603 change_info = ptr;
3604 if (change_info->flags_changed & IFF_NOARP)
3605 addrconf_dad_run(idev, true);
3606 rt6_sync_up(dev, RTNH_F_LINKDOWN);
3607 break;
3608 }
3609 idev->if_flags |= IF_READY;
3610 }
3611
3612 pr_info("ADDRCONF(NETDEV_CHANGE): %s: link becomes ready\n",
3613 dev->name);
3614
3615 run_pending = 1;
3616 }
3617
3618 switch (dev->type) {
3619 #if IS_ENABLED(CONFIG_IPV6_SIT)
3620 case ARPHRD_SIT:
3621 addrconf_sit_config(dev);
3622 break;
3623 #endif
3624 #if IS_ENABLED(CONFIG_NET_IPGRE) || IS_ENABLED(CONFIG_IPV6_GRE)
3625 case ARPHRD_IP6GRE:
3626 case ARPHRD_IPGRE:
3627 addrconf_gre_config(dev);
3628 break;
3629 #endif
3630 case ARPHRD_LOOPBACK:
3631 init_loopback(dev);
3632 break;
3633
3634 default:
3635 addrconf_dev_config(dev);
3636 break;
3637 }
3638
3639 if (!IS_ERR_OR_NULL(idev)) {
3640 if (run_pending)
3641 addrconf_dad_run(idev, false);
3642
3643
3644 rt6_sync_up(dev, RTNH_F_DEAD);
3645
3646
3647
3648
3649
3650
3651 if (idev->cnf.mtu6 != dev->mtu &&
3652 dev->mtu >= IPV6_MIN_MTU) {
3653 rt6_mtu_change(dev, dev->mtu);
3654 idev->cnf.mtu6 = dev->mtu;
3655 }
3656 idev->tstamp = jiffies;
3657 inet6_ifinfo_notify(RTM_NEWLINK, idev);
3658
3659
3660
3661
3662
3663 if (dev->mtu < IPV6_MIN_MTU)
3664 addrconf_ifdown(dev, dev != net->loopback_dev);
3665 }
3666 break;
3667
3668 case NETDEV_DOWN:
3669 case NETDEV_UNREGISTER:
3670
3671
3672
3673 addrconf_ifdown(dev, event != NETDEV_DOWN);
3674 break;
3675
3676 case NETDEV_CHANGENAME:
3677 if (idev) {
3678 snmp6_unregister_dev(idev);
3679 addrconf_sysctl_unregister(idev);
3680 err = addrconf_sysctl_register(idev);
3681 if (err)
3682 return notifier_from_errno(err);
3683 err = snmp6_register_dev(idev);
3684 if (err) {
3685 addrconf_sysctl_unregister(idev);
3686 return notifier_from_errno(err);
3687 }
3688 }
3689 break;
3690
3691 case NETDEV_PRE_TYPE_CHANGE:
3692 case NETDEV_POST_TYPE_CHANGE:
3693 if (idev)
3694 addrconf_type_change(dev, event);
3695 break;
3696
3697 case NETDEV_CHANGEUPPER:
3698 info = ptr;
3699
3700
3701
3702
3703 if (info->upper_dev && netif_is_l3_master(info->upper_dev))
3704 addrconf_ifdown(dev, false);
3705 }
3706
3707 return NOTIFY_OK;
3708 }
3709
3710
3711
3712
3713 static struct notifier_block ipv6_dev_notf = {
3714 .notifier_call = addrconf_notify,
3715 .priority = ADDRCONF_NOTIFY_PRIORITY,
3716 };
3717
3718 static void addrconf_type_change(struct net_device *dev, unsigned long event)
3719 {
3720 struct inet6_dev *idev;
3721 ASSERT_RTNL();
3722
3723 idev = __in6_dev_get(dev);
3724
3725 if (event == NETDEV_POST_TYPE_CHANGE)
3726 ipv6_mc_remap(idev);
3727 else if (event == NETDEV_PRE_TYPE_CHANGE)
3728 ipv6_mc_unmap(idev);
3729 }
3730
3731 static bool addr_is_local(const struct in6_addr *addr)
3732 {
3733 return ipv6_addr_type(addr) &
3734 (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_LOOPBACK);
3735 }
3736
3737 static int addrconf_ifdown(struct net_device *dev, bool unregister)
3738 {
3739 unsigned long event = unregister ? NETDEV_UNREGISTER : NETDEV_DOWN;
3740 struct net *net = dev_net(dev);
3741 struct inet6_dev *idev;
3742 struct inet6_ifaddr *ifa;
3743 LIST_HEAD(tmp_addr_list);
3744 bool keep_addr = false;
3745 bool was_ready;
3746 int state, i;
3747
3748 ASSERT_RTNL();
3749
3750 rt6_disable_ip(dev, event);
3751
3752 idev = __in6_dev_get(dev);
3753 if (!idev)
3754 return -ENODEV;
3755
3756
3757
3758
3759
3760 if (unregister) {
3761 idev->dead = 1;
3762
3763
3764 RCU_INIT_POINTER(dev->ip6_ptr, NULL);
3765
3766
3767 snmp6_unregister_dev(idev);
3768
3769 }
3770
3771
3772
3773
3774 if (!unregister && !idev->cnf.disable_ipv6) {
3775
3776 int _keep_addr = net->ipv6.devconf_all->keep_addr_on_down;
3777
3778 if (!_keep_addr)
3779 _keep_addr = idev->cnf.keep_addr_on_down;
3780
3781 keep_addr = (_keep_addr > 0);
3782 }
3783
3784
3785 for (i = 0; i < IN6_ADDR_HSIZE; i++) {
3786 struct hlist_head *h = &net->ipv6.inet6_addr_lst[i];
3787
3788 spin_lock_bh(&net->ipv6.addrconf_hash_lock);
3789 restart:
3790 hlist_for_each_entry_rcu(ifa, h, addr_lst) {
3791 if (ifa->idev == idev) {
3792 addrconf_del_dad_work(ifa);
3793
3794
3795
3796 if (!keep_addr ||
3797 !(ifa->flags & IFA_F_PERMANENT) ||
3798 addr_is_local(&ifa->addr)) {
3799 hlist_del_init_rcu(&ifa->addr_lst);
3800 goto restart;
3801 }
3802 }
3803 }
3804 spin_unlock_bh(&net->ipv6.addrconf_hash_lock);
3805 }
3806
3807 write_lock_bh(&idev->lock);
3808
3809 addrconf_del_rs_timer(idev);
3810
3811
3812
3813
3814 was_ready = idev->if_flags & IF_READY;
3815 if (!unregister)
3816 idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD|IF_READY);
3817
3818
3819 while (!list_empty(&idev->tempaddr_list)) {
3820 ifa = list_first_entry(&idev->tempaddr_list,
3821 struct inet6_ifaddr, tmp_list);
3822 list_del(&ifa->tmp_list);
3823 write_unlock_bh(&idev->lock);
3824 spin_lock_bh(&ifa->lock);
3825
3826 if (ifa->ifpub) {
3827 in6_ifa_put(ifa->ifpub);
3828 ifa->ifpub = NULL;
3829 }
3830 spin_unlock_bh(&ifa->lock);
3831 in6_ifa_put(ifa);
3832 write_lock_bh(&idev->lock);
3833 }
3834
3835 list_for_each_entry(ifa, &idev->addr_list, if_list)
3836 list_add_tail(&ifa->if_list_aux, &tmp_addr_list);
3837 write_unlock_bh(&idev->lock);
3838
3839 while (!list_empty(&tmp_addr_list)) {
3840 struct fib6_info *rt = NULL;
3841 bool keep;
3842
3843 ifa = list_first_entry(&tmp_addr_list,
3844 struct inet6_ifaddr, if_list_aux);
3845 list_del(&ifa->if_list_aux);
3846
3847 addrconf_del_dad_work(ifa);
3848
3849 keep = keep_addr && (ifa->flags & IFA_F_PERMANENT) &&
3850 !addr_is_local(&ifa->addr);
3851
3852 spin_lock_bh(&ifa->lock);
3853
3854 if (keep) {
3855
3856 state = INET6_IFADDR_STATE_DEAD;
3857 ifa->state = INET6_IFADDR_STATE_PREDAD;
3858 if (!(ifa->flags & IFA_F_NODAD))
3859 ifa->flags |= IFA_F_TENTATIVE;
3860
3861 rt = ifa->rt;
3862 ifa->rt = NULL;
3863 } else {
3864 state = ifa->state;
3865 ifa->state = INET6_IFADDR_STATE_DEAD;
3866 }
3867
3868 spin_unlock_bh(&ifa->lock);
3869
3870 if (rt)
3871 ip6_del_rt(net, rt, false);
3872
3873 if (state != INET6_IFADDR_STATE_DEAD) {
3874 __ipv6_ifa_notify(RTM_DELADDR, ifa);
3875 inet6addr_notifier_call_chain(NETDEV_DOWN, ifa);
3876 } else {
3877 if (idev->cnf.forwarding)
3878 addrconf_leave_anycast(ifa);
3879 addrconf_leave_solict(ifa->idev, &ifa->addr);
3880 }
3881
3882 if (!keep) {
3883 write_lock_bh(&idev->lock);
3884 list_del_rcu(&ifa->if_list);
3885 write_unlock_bh(&idev->lock);
3886 in6_ifa_put(ifa);
3887 }
3888 }
3889
3890
3891 if (unregister) {
3892 ipv6_ac_destroy_dev(idev);
3893 ipv6_mc_destroy_dev(idev);
3894 } else if (was_ready) {
3895 ipv6_mc_down(idev);
3896 }
3897
3898 idev->tstamp = jiffies;
3899 idev->ra_mtu = 0;
3900
3901
3902 if (unregister) {
3903 addrconf_sysctl_unregister(idev);
3904 neigh_parms_release(&nd_tbl, idev->nd_parms);
3905 neigh_ifdown(&nd_tbl, dev);
3906 in6_dev_put(idev);
3907 }
3908 return 0;
3909 }
3910
3911 static void addrconf_rs_timer(struct timer_list *t)
3912 {
3913 struct inet6_dev *idev = from_timer(idev, t, rs_timer);
3914 struct net_device *dev = idev->dev;
3915 struct in6_addr lladdr;
3916
3917 write_lock(&idev->lock);
3918 if (idev->dead || !(idev->if_flags & IF_READY))
3919 goto out;
3920
3921 if (!ipv6_accept_ra(idev))
3922 goto out;
3923
3924
3925 if (idev->if_flags & IF_RA_RCVD)
3926 goto out;
3927
3928 if (idev->rs_probes++ < idev->cnf.rtr_solicits || idev->cnf.rtr_solicits < 0) {
3929 write_unlock(&idev->lock);
3930 if (!ipv6_get_lladdr(dev, &lladdr, IFA_F_TENTATIVE))
3931 ndisc_send_rs(dev, &lladdr,
3932 &in6addr_linklocal_allrouters);
3933 else
3934 goto put;
3935
3936 write_lock(&idev->lock);
3937 idev->rs_interval = rfc3315_s14_backoff_update(
3938 idev->rs_interval, idev->cnf.rtr_solicit_max_interval);
3939
3940 addrconf_mod_rs_timer(idev, (idev->rs_probes ==
3941 idev->cnf.rtr_solicits) ?
3942 idev->cnf.rtr_solicit_delay :
3943 idev->rs_interval);
3944 } else {
3945
3946
3947
3948
3949 pr_debug("%s: no IPv6 routers present\n", idev->dev->name);
3950 }
3951
3952 out:
3953 write_unlock(&idev->lock);
3954 put:
3955 in6_dev_put(idev);
3956 }
3957
3958
3959
3960
3961 static void addrconf_dad_kick(struct inet6_ifaddr *ifp)
3962 {
3963 unsigned long rand_num;
3964 struct inet6_dev *idev = ifp->idev;
3965 u64 nonce;
3966
3967 if (ifp->flags & IFA_F_OPTIMISTIC)
3968 rand_num = 0;
3969 else
3970 rand_num = prandom_u32() % (idev->cnf.rtr_solicit_delay ? : 1);
3971
3972 nonce = 0;
3973 if (idev->cnf.enhanced_dad ||
3974 dev_net(idev->dev)->ipv6.devconf_all->enhanced_dad) {
3975 do
3976 get_random_bytes(&nonce, 6);
3977 while (nonce == 0);
3978 }
3979 ifp->dad_nonce = nonce;
3980 ifp->dad_probes = idev->cnf.dad_transmits;
3981 addrconf_mod_dad_work(ifp, rand_num);
3982 }
3983
3984 static void addrconf_dad_begin(struct inet6_ifaddr *ifp)
3985 {
3986 struct inet6_dev *idev = ifp->idev;
3987 struct net_device *dev = idev->dev;
3988 bool bump_id, notify = false;
3989 struct net *net;
3990
3991 addrconf_join_solict(dev, &ifp->addr);
3992
3993 read_lock_bh(&idev->lock);
3994 spin_lock(&ifp->lock);
3995 if (ifp->state == INET6_IFADDR_STATE_DEAD)
3996 goto out;
3997
3998 net = dev_net(dev);
3999 if (dev->flags&(IFF_NOARP|IFF_LOOPBACK) ||
4000 (net->ipv6.devconf_all->accept_dad < 1 &&
4001 idev->cnf.accept_dad < 1) ||
4002 !(ifp->flags&IFA_F_TENTATIVE) ||
4003 ifp->flags & IFA_F_NODAD) {
4004 bool send_na = false;
4005
4006 if (ifp->flags & IFA_F_TENTATIVE &&
4007 !(ifp->flags & IFA_F_OPTIMISTIC))
4008 send_na = true;
4009 bump_id = ifp->flags & IFA_F_TENTATIVE;
4010 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED);
4011 spin_unlock(&ifp->lock);
4012 read_unlock_bh(&idev->lock);
4013
4014 addrconf_dad_completed(ifp, bump_id, send_na);
4015 return;
4016 }
4017
4018 if (!(idev->if_flags & IF_READY)) {
4019 spin_unlock(&ifp->lock);
4020 read_unlock_bh(&idev->lock);
4021
4022
4023
4024
4025
4026 in6_ifa_hold(ifp);
4027 addrconf_dad_stop(ifp, 0);
4028 return;
4029 }
4030
4031
4032
4033
4034
4035 if (ifp->flags & IFA_F_OPTIMISTIC) {
4036 ip6_ins_rt(net, ifp->rt);
4037 if (ipv6_use_optimistic_addr(net, idev)) {
4038
4039
4040
4041 notify = true;
4042 }
4043 }
4044
4045 addrconf_dad_kick(ifp);
4046 out:
4047 spin_unlock(&ifp->lock);
4048 read_unlock_bh(&idev->lock);
4049 if (notify)
4050 ipv6_ifa_notify(RTM_NEWADDR, ifp);
4051 }
4052
4053 static void addrconf_dad_start(struct inet6_ifaddr *ifp)
4054 {
4055 bool begin_dad = false;
4056
4057 spin_lock_bh(&ifp->lock);
4058 if (ifp->state != INET6_IFADDR_STATE_DEAD) {
4059 ifp->state = INET6_IFADDR_STATE_PREDAD;
4060 begin_dad = true;
4061 }
4062 spin_unlock_bh(&ifp->lock);
4063
4064 if (begin_dad)
4065 addrconf_mod_dad_work(ifp, 0);
4066 }
4067
4068 static void addrconf_dad_work(struct work_struct *w)
4069 {
4070 struct inet6_ifaddr *ifp = container_of(to_delayed_work(w),
4071 struct inet6_ifaddr,
4072 dad_work);
4073 struct inet6_dev *idev = ifp->idev;
4074 bool bump_id, disable_ipv6 = false;
4075 struct in6_addr mcaddr;
4076
4077 enum {
4078 DAD_PROCESS,
4079 DAD_BEGIN,
4080 DAD_ABORT,
4081 } action = DAD_PROCESS;
4082
4083 rtnl_lock();
4084
4085 spin_lock_bh(&ifp->lock);
4086 if (ifp->state == INET6_IFADDR_STATE_PREDAD) {
4087 action = DAD_BEGIN;
4088 ifp->state = INET6_IFADDR_STATE_DAD;
4089 } else if (ifp->state == INET6_IFADDR_STATE_ERRDAD) {
4090 action = DAD_ABORT;
4091 ifp->state = INET6_IFADDR_STATE_POSTDAD;
4092
4093 if ((dev_net(idev->dev)->ipv6.devconf_all->accept_dad > 1 ||
4094 idev->cnf.accept_dad > 1) &&
4095 !idev->cnf.disable_ipv6 &&
4096 !(ifp->flags & IFA_F_STABLE_PRIVACY)) {
4097 struct in6_addr addr;
4098
4099 addr.s6_addr32[0] = htonl(0xfe800000);
4100 addr.s6_addr32[1] = 0;
4101
4102 if (!ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) &&
4103 ipv6_addr_equal(&ifp->addr, &addr)) {
4104
4105 idev->cnf.disable_ipv6 = 1;
4106
4107 pr_info("%s: IPv6 being disabled!\n",
4108 ifp->idev->dev->name);
4109 disable_ipv6 = true;
4110 }
4111 }
4112 }
4113 spin_unlock_bh(&ifp->lock);
4114
4115 if (action == DAD_BEGIN) {
4116 addrconf_dad_begin(ifp);
4117 goto out;
4118 } else if (action == DAD_ABORT) {
4119 in6_ifa_hold(ifp);
4120 addrconf_dad_stop(ifp, 1);
4121 if (disable_ipv6)
4122 addrconf_ifdown(idev->dev, false);
4123 goto out;
4124 }
4125
4126 if (!ifp->dad_probes && addrconf_dad_end(ifp))
4127 goto out;
4128
4129 write_lock_bh(&idev->lock);
4130 if (idev->dead || !(idev->if_flags & IF_READY)) {
4131 write_unlock_bh(&idev->lock);
4132 goto out;
4133 }
4134
4135 spin_lock(&ifp->lock);
4136 if (ifp->state == INET6_IFADDR_STATE_DEAD) {
4137 spin_unlock(&ifp->lock);
4138 write_unlock_bh(&idev->lock);
4139 goto out;
4140 }
4141
4142 if (ifp->dad_probes == 0) {
4143 bool send_na = false;
4144
4145
4146
4147
4148
4149 if (ifp->flags & IFA_F_TENTATIVE &&
4150 !(ifp->flags & IFA_F_OPTIMISTIC))
4151 send_na = true;
4152 bump_id = ifp->flags & IFA_F_TENTATIVE;
4153 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED);
4154 spin_unlock(&ifp->lock);
4155 write_unlock_bh(&idev->lock);
4156
4157 addrconf_dad_completed(ifp, bump_id, send_na);
4158
4159 goto out;
4160 }
4161
4162 ifp->dad_probes--;
4163 addrconf_mod_dad_work(ifp,
4164 max(NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME),
4165 HZ/100));
4166 spin_unlock(&ifp->lock);
4167 write_unlock_bh(&idev->lock);
4168
4169
4170 addrconf_addr_solict_mult(&ifp->addr, &mcaddr);
4171 ndisc_send_ns(ifp->idev->dev, &ifp->addr, &mcaddr, &in6addr_any,
4172 ifp->dad_nonce);
4173 out:
4174 in6_ifa_put(ifp);
4175 rtnl_unlock();
4176 }
4177
4178
4179 static bool ipv6_lonely_lladdr(struct inet6_ifaddr *ifp)
4180 {
4181 struct inet6_ifaddr *ifpiter;
4182 struct inet6_dev *idev = ifp->idev;
4183
4184 list_for_each_entry_reverse(ifpiter, &idev->addr_list, if_list) {
4185 if (ifpiter->scope > IFA_LINK)
4186 break;
4187 if (ifp != ifpiter && ifpiter->scope == IFA_LINK &&
4188 (ifpiter->flags & (IFA_F_PERMANENT|IFA_F_TENTATIVE|
4189 IFA_F_OPTIMISTIC|IFA_F_DADFAILED)) ==
4190 IFA_F_PERMANENT)
4191 return false;
4192 }
4193 return true;
4194 }
4195
4196 static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id,
4197 bool send_na)
4198 {
4199 struct net_device *dev = ifp->idev->dev;
4200 struct in6_addr lladdr;
4201 bool send_rs, send_mld;
4202
4203 addrconf_del_dad_work(ifp);
4204
4205
4206
4207
4208
4209 ipv6_ifa_notify(RTM_NEWADDR, ifp);
4210
4211
4212
4213
4214
4215 read_lock_bh(&ifp->idev->lock);
4216 send_mld = ifp->scope == IFA_LINK && ipv6_lonely_lladdr(ifp);
4217 send_rs = send_mld &&
4218 ipv6_accept_ra(ifp->idev) &&
4219 ifp->idev->cnf.rtr_solicits != 0 &&
4220 (dev->flags & IFF_LOOPBACK) == 0 &&
4221 (dev->type != ARPHRD_TUNNEL);
4222 read_unlock_bh(&ifp->idev->lock);
4223
4224
4225
4226
4227 if (send_mld)
4228 ipv6_mc_dad_complete(ifp->idev);
4229
4230
4231 if (send_na &&
4232 (ifp->idev->cnf.ndisc_notify ||
4233 dev_net(dev)->ipv6.devconf_all->ndisc_notify)) {
4234 ndisc_send_na(dev, &in6addr_linklocal_allnodes, &ifp->addr,
4235 !!ifp->idev->cnf.forwarding,
4236 false, true,
4237 true);
4238 }
4239
4240 if (send_rs) {
4241
4242
4243
4244
4245
4246 if (ipv6_get_lladdr(dev, &lladdr, IFA_F_TENTATIVE))
4247 return;
4248 ndisc_send_rs(dev, &lladdr, &in6addr_linklocal_allrouters);
4249
4250 write_lock_bh(&ifp->idev->lock);
4251 spin_lock(&ifp->lock);
4252 ifp->idev->rs_interval = rfc3315_s14_backoff_init(
4253 ifp->idev->cnf.rtr_solicit_interval);
4254 ifp->idev->rs_probes = 1;
4255 ifp->idev->if_flags |= IF_RS_SENT;
4256 addrconf_mod_rs_timer(ifp->idev, ifp->idev->rs_interval);
4257 spin_unlock(&ifp->lock);
4258 write_unlock_bh(&ifp->idev->lock);
4259 }
4260
4261 if (bump_id)
4262 rt_genid_bump_ipv6(dev_net(dev));
4263
4264
4265
4266
4267 if (ifp->flags & IFA_F_TEMPORARY)
4268 addrconf_verify_rtnl(dev_net(dev));
4269 }
4270
4271 static void addrconf_dad_run(struct inet6_dev *idev, bool restart)
4272 {
4273 struct inet6_ifaddr *ifp;
4274
4275 read_lock_bh(&idev->lock);
4276 list_for_each_entry(ifp, &idev->addr_list, if_list) {
4277 spin_lock(&ifp->lock);
4278 if ((ifp->flags & IFA_F_TENTATIVE &&
4279 ifp->state == INET6_IFADDR_STATE_DAD) || restart) {
4280 if (restart)
4281 ifp->state = INET6_IFADDR_STATE_PREDAD;
4282 addrconf_dad_kick(ifp);
4283 }
4284 spin_unlock(&ifp->lock);
4285 }
4286 read_unlock_bh(&idev->lock);
4287 }
4288
4289 #ifdef CONFIG_PROC_FS
4290 struct if6_iter_state {
4291 struct seq_net_private p;
4292 int bucket;
4293 int offset;
4294 };
4295
4296 static struct inet6_ifaddr *if6_get_first(struct seq_file *seq, loff_t pos)
4297 {
4298 struct if6_iter_state *state = seq->private;
4299 struct net *net = seq_file_net(seq);
4300 struct inet6_ifaddr *ifa = NULL;
4301 int p = 0;
4302
4303
4304 if (pos == 0) {
4305 state->bucket = 0;
4306 state->offset = 0;
4307 }
4308
4309 for (; state->bucket < IN6_ADDR_HSIZE; ++state->bucket) {
4310 hlist_for_each_entry_rcu(ifa, &net->ipv6.inet6_addr_lst[state->bucket],
4311 addr_lst) {
4312
4313 if (p < state->offset) {
4314 p++;
4315 continue;
4316 }
4317 return ifa;
4318 }
4319
4320
4321 state->offset = 0;
4322 p = 0;
4323 }
4324 return NULL;
4325 }
4326
4327 static struct inet6_ifaddr *if6_get_next(struct seq_file *seq,
4328 struct inet6_ifaddr *ifa)
4329 {
4330 struct if6_iter_state *state = seq->private;
4331 struct net *net = seq_file_net(seq);
4332
4333 hlist_for_each_entry_continue_rcu(ifa, addr_lst) {
4334 state->offset++;
4335 return ifa;
4336 }
4337
4338 state->offset = 0;
4339 while (++state->bucket < IN6_ADDR_HSIZE) {
4340 hlist_for_each_entry_rcu(ifa,
4341 &net->ipv6.inet6_addr_lst[state->bucket], addr_lst) {
4342 return ifa;
4343 }
4344 }
4345
4346 return NULL;
4347 }
4348
4349 static void *if6_seq_start(struct seq_file *seq, loff_t *pos)
4350 __acquires(rcu)
4351 {
4352 rcu_read_lock();
4353 return if6_get_first(seq, *pos);
4354 }
4355
4356 static void *if6_seq_next(struct seq_file *seq, void *v, loff_t *pos)
4357 {
4358 struct inet6_ifaddr *ifa;
4359
4360 ifa = if6_get_next(seq, v);
4361 ++*pos;
4362 return ifa;
4363 }
4364
4365 static void if6_seq_stop(struct seq_file *seq, void *v)
4366 __releases(rcu)
4367 {
4368 rcu_read_unlock();
4369 }
4370
4371 static int if6_seq_show(struct seq_file *seq, void *v)
4372 {
4373 struct inet6_ifaddr *ifp = (struct inet6_ifaddr *)v;
4374 seq_printf(seq, "%pi6 %02x %02x %02x %02x %8s\n",
4375 &ifp->addr,
4376 ifp->idev->dev->ifindex,
4377 ifp->prefix_len,
4378 ifp->scope,
4379 (u8) ifp->flags,
4380 ifp->idev->dev->name);
4381 return 0;
4382 }
4383
4384 static const struct seq_operations if6_seq_ops = {
4385 .start = if6_seq_start,
4386 .next = if6_seq_next,
4387 .show = if6_seq_show,
4388 .stop = if6_seq_stop,
4389 };
4390
4391 static int __net_init if6_proc_net_init(struct net *net)
4392 {
4393 if (!proc_create_net("if_inet6", 0444, net->proc_net, &if6_seq_ops,
4394 sizeof(struct if6_iter_state)))
4395 return -ENOMEM;
4396 return 0;
4397 }
4398
4399 static void __net_exit if6_proc_net_exit(struct net *net)
4400 {
4401 remove_proc_entry("if_inet6", net->proc_net);
4402 }
4403
4404 static struct pernet_operations if6_proc_net_ops = {
4405 .init = if6_proc_net_init,
4406 .exit = if6_proc_net_exit,
4407 };
4408
4409 int __init if6_proc_init(void)
4410 {
4411 return register_pernet_subsys(&if6_proc_net_ops);
4412 }
4413
4414 void if6_proc_exit(void)
4415 {
4416 unregister_pernet_subsys(&if6_proc_net_ops);
4417 }
4418 #endif
4419
4420 #if IS_ENABLED(CONFIG_IPV6_MIP6)
4421
4422 int ipv6_chk_home_addr(struct net *net, const struct in6_addr *addr)
4423 {
4424 unsigned int hash = inet6_addr_hash(net, addr);
4425 struct inet6_ifaddr *ifp = NULL;
4426 int ret = 0;
4427
4428 rcu_read_lock();
4429 hlist_for_each_entry_rcu(ifp, &net->ipv6.inet6_addr_lst[hash], addr_lst) {
4430 if (ipv6_addr_equal(&ifp->addr, addr) &&
4431 (ifp->flags & IFA_F_HOMEADDRESS)) {
4432 ret = 1;
4433 break;
4434 }
4435 }
4436 rcu_read_unlock();
4437 return ret;
4438 }
4439 #endif
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451 int ipv6_chk_rpl_srh_loop(struct net *net, const struct in6_addr *segs,
4452 unsigned char nsegs)
4453 {
4454 const struct in6_addr *addr;
4455 int i, ret = 0, found = 0;
4456 struct inet6_ifaddr *ifp;
4457 bool separated = false;
4458 unsigned int hash;
4459 bool hash_found;
4460
4461 rcu_read_lock();
4462 for (i = 0; i < nsegs; i++) {
4463 addr = &segs[i];
4464 hash = inet6_addr_hash(net, addr);
4465
4466 hash_found = false;
4467 hlist_for_each_entry_rcu(ifp, &net->ipv6.inet6_addr_lst[hash], addr_lst) {
4468
4469 if (ipv6_addr_equal(&ifp->addr, addr)) {
4470 hash_found = true;
4471 break;
4472 }
4473 }
4474
4475 if (hash_found) {
4476 if (found > 1 && separated) {
4477 ret = 1;
4478 break;
4479 }
4480
4481 separated = false;
4482 found++;
4483 } else {
4484 separated = true;
4485 }
4486 }
4487 rcu_read_unlock();
4488
4489 return ret;
4490 }
4491
4492
4493
4494
4495
4496 static void addrconf_verify_rtnl(struct net *net)
4497 {
4498 unsigned long now, next, next_sec, next_sched;
4499 struct inet6_ifaddr *ifp;
4500 int i;
4501
4502 ASSERT_RTNL();
4503
4504 rcu_read_lock_bh();
4505 now = jiffies;
4506 next = round_jiffies_up(now + ADDR_CHECK_FREQUENCY);
4507
4508 cancel_delayed_work(&net->ipv6.addr_chk_work);
4509
4510 for (i = 0; i < IN6_ADDR_HSIZE; i++) {
4511 restart:
4512 hlist_for_each_entry_rcu_bh(ifp, &net->ipv6.inet6_addr_lst[i], addr_lst) {
4513 unsigned long age;
4514
4515
4516
4517
4518
4519 if ((ifp->flags & IFA_F_PERMANENT) &&
4520 (ifp->prefered_lft == INFINITY_LIFE_TIME))
4521 continue;
4522
4523 spin_lock(&ifp->lock);
4524
4525 age = (now - ifp->tstamp + ADDRCONF_TIMER_FUZZ_MINUS) / HZ;
4526
4527 if ((ifp->flags&IFA_F_TEMPORARY) &&
4528 !(ifp->flags&IFA_F_TENTATIVE) &&
4529 ifp->prefered_lft != INFINITY_LIFE_TIME &&
4530 !ifp->regen_count && ifp->ifpub) {
4531
4532
4533 unsigned long regen_advance = ifp->idev->cnf.regen_max_retry *
4534 ifp->idev->cnf.dad_transmits *
4535 max(NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME), HZ/100) / HZ;
4536
4537 if (age + regen_advance >= ifp->prefered_lft) {
4538 struct inet6_ifaddr *ifpub = ifp->ifpub;
4539 if (time_before(ifp->tstamp + ifp->prefered_lft * HZ, next))
4540 next = ifp->tstamp + ifp->prefered_lft * HZ;
4541
4542 ifp->regen_count++;
4543 in6_ifa_hold(ifp);
4544 in6_ifa_hold(ifpub);
4545 spin_unlock(&ifp->lock);
4546
4547 spin_lock(&ifpub->lock);
4548 ifpub->regen_count = 0;
4549 spin_unlock(&ifpub->lock);
4550 rcu_read_unlock_bh();
4551 ipv6_create_tempaddr(ifpub, true);
4552 in6_ifa_put(ifpub);
4553 in6_ifa_put(ifp);
4554 rcu_read_lock_bh();
4555 goto restart;
4556 } else if (time_before(ifp->tstamp + ifp->prefered_lft * HZ - regen_advance * HZ, next))
4557 next = ifp->tstamp + ifp->prefered_lft * HZ - regen_advance * HZ;
4558 }
4559
4560 if (ifp->valid_lft != INFINITY_LIFE_TIME &&
4561 age >= ifp->valid_lft) {
4562 spin_unlock(&ifp->lock);
4563 in6_ifa_hold(ifp);
4564 rcu_read_unlock_bh();
4565 ipv6_del_addr(ifp);
4566 rcu_read_lock_bh();
4567 goto restart;
4568 } else if (ifp->prefered_lft == INFINITY_LIFE_TIME) {
4569 spin_unlock(&ifp->lock);
4570 continue;
4571 } else if (age >= ifp->prefered_lft) {
4572
4573 int deprecate = 0;
4574
4575 if (!(ifp->flags&IFA_F_DEPRECATED)) {
4576 deprecate = 1;
4577 ifp->flags |= IFA_F_DEPRECATED;
4578 }
4579
4580 if ((ifp->valid_lft != INFINITY_LIFE_TIME) &&
4581 (time_before(ifp->tstamp + ifp->valid_lft * HZ, next)))
4582 next = ifp->tstamp + ifp->valid_lft * HZ;
4583
4584 spin_unlock(&ifp->lock);
4585
4586 if (deprecate) {
4587 in6_ifa_hold(ifp);
4588
4589 ipv6_ifa_notify(0, ifp);
4590 in6_ifa_put(ifp);
4591 goto restart;
4592 }
4593 } else {
4594
4595 if (time_before(ifp->tstamp + ifp->prefered_lft * HZ, next))
4596 next = ifp->tstamp + ifp->prefered_lft * HZ;
4597 spin_unlock(&ifp->lock);
4598 }
4599 }
4600 }
4601
4602 next_sec = round_jiffies_up(next);
4603 next_sched = next;
4604
4605
4606 if (time_before(next_sec, next + ADDRCONF_TIMER_FUZZ))
4607 next_sched = next_sec;
4608
4609
4610 if (time_before(next_sched, jiffies + ADDRCONF_TIMER_FUZZ_MAX))
4611 next_sched = jiffies + ADDRCONF_TIMER_FUZZ_MAX;
4612
4613 pr_debug("now = %lu, schedule = %lu, rounded schedule = %lu => %lu\n",
4614 now, next, next_sec, next_sched);
4615 mod_delayed_work(addrconf_wq, &net->ipv6.addr_chk_work, next_sched - now);
4616 rcu_read_unlock_bh();
4617 }
4618
4619 static void addrconf_verify_work(struct work_struct *w)
4620 {
4621 struct net *net = container_of(to_delayed_work(w), struct net,
4622 ipv6.addr_chk_work);
4623
4624 rtnl_lock();
4625 addrconf_verify_rtnl(net);
4626 rtnl_unlock();
4627 }
4628
4629 static void addrconf_verify(struct net *net)
4630 {
4631 mod_delayed_work(addrconf_wq, &net->ipv6.addr_chk_work, 0);
4632 }
4633
4634 static struct in6_addr *extract_addr(struct nlattr *addr, struct nlattr *local,
4635 struct in6_addr **peer_pfx)
4636 {
4637 struct in6_addr *pfx = NULL;
4638
4639 *peer_pfx = NULL;
4640
4641 if (addr)
4642 pfx = nla_data(addr);
4643
4644 if (local) {
4645 if (pfx && nla_memcmp(local, pfx, sizeof(*pfx)))
4646 *peer_pfx = pfx;
4647 pfx = nla_data(local);
4648 }
4649
4650 return pfx;
4651 }
4652
4653 static const struct nla_policy ifa_ipv6_policy[IFA_MAX+1] = {
4654 [IFA_ADDRESS] = { .len = sizeof(struct in6_addr) },
4655 [IFA_LOCAL] = { .len = sizeof(struct in6_addr) },
4656 [IFA_CACHEINFO] = { .len = sizeof(struct ifa_cacheinfo) },
4657 [IFA_FLAGS] = { .len = sizeof(u32) },
4658 [IFA_RT_PRIORITY] = { .len = sizeof(u32) },
4659 [IFA_TARGET_NETNSID] = { .type = NLA_S32 },
4660 [IFA_PROTO] = { .type = NLA_U8 },
4661 };
4662
4663 static int
4664 inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh,
4665 struct netlink_ext_ack *extack)
4666 {
4667 struct net *net = sock_net(skb->sk);
4668 struct ifaddrmsg *ifm;
4669 struct nlattr *tb[IFA_MAX+1];
4670 struct in6_addr *pfx, *peer_pfx;
4671 u32 ifa_flags;
4672 int err;
4673
4674 err = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFA_MAX,
4675 ifa_ipv6_policy, extack);
4676 if (err < 0)
4677 return err;
4678
4679 ifm = nlmsg_data(nlh);
4680 pfx = extract_addr(tb[IFA_ADDRESS], tb[IFA_LOCAL], &peer_pfx);
4681 if (!pfx)
4682 return -EINVAL;
4683
4684 ifa_flags = tb[IFA_FLAGS] ? nla_get_u32(tb[IFA_FLAGS]) : ifm->ifa_flags;
4685
4686
4687 ifa_flags &= IFA_F_MANAGETEMPADDR;
4688
4689 return inet6_addr_del(net, ifm->ifa_index, ifa_flags, pfx,
4690 ifm->ifa_prefixlen);
4691 }
4692
4693 static int modify_prefix_route(struct inet6_ifaddr *ifp,
4694 unsigned long expires, u32 flags,
4695 bool modify_peer)
4696 {
4697 struct fib6_info *f6i;
4698 u32 prio;
4699
4700 f6i = addrconf_get_prefix_route(modify_peer ? &ifp->peer_addr : &ifp->addr,
4701 ifp->prefix_len,
4702 ifp->idev->dev, 0, RTF_DEFAULT, true);
4703 if (!f6i)
4704 return -ENOENT;
4705
4706 prio = ifp->rt_priority ? : IP6_RT_PRIO_ADDRCONF;
4707 if (f6i->fib6_metric != prio) {
4708
4709 ip6_del_rt(dev_net(ifp->idev->dev), f6i, false);
4710
4711
4712 addrconf_prefix_route(modify_peer ? &ifp->peer_addr : &ifp->addr,
4713 ifp->prefix_len,
4714 ifp->rt_priority, ifp->idev->dev,
4715 expires, flags, GFP_KERNEL);
4716 } else {
4717 if (!expires)
4718 fib6_clean_expires(f6i);
4719 else
4720 fib6_set_expires(f6i, expires);
4721
4722 fib6_info_release(f6i);
4723 }
4724
4725 return 0;
4726 }
4727
4728 static int inet6_addr_modify(struct net *net, struct inet6_ifaddr *ifp,
4729 struct ifa6_config *cfg)
4730 {
4731 u32 flags;
4732 clock_t expires;
4733 unsigned long timeout;
4734 bool was_managetempaddr;
4735 bool had_prefixroute;
4736 bool new_peer = false;
4737
4738 ASSERT_RTNL();
4739
4740 if (!cfg->valid_lft || cfg->preferred_lft > cfg->valid_lft)
4741 return -EINVAL;
4742
4743 if (cfg->ifa_flags & IFA_F_MANAGETEMPADDR &&
4744 (ifp->flags & IFA_F_TEMPORARY || ifp->prefix_len != 64))
4745 return -EINVAL;
4746
4747 if (!(ifp->flags & IFA_F_TENTATIVE) || ifp->flags & IFA_F_DADFAILED)
4748 cfg->ifa_flags &= ~IFA_F_OPTIMISTIC;
4749
4750 timeout = addrconf_timeout_fixup(cfg->valid_lft, HZ);
4751 if (addrconf_finite_timeout(timeout)) {
4752 expires = jiffies_to_clock_t(timeout * HZ);
4753 cfg->valid_lft = timeout;
4754 flags = RTF_EXPIRES;
4755 } else {
4756 expires = 0;
4757 flags = 0;
4758 cfg->ifa_flags |= IFA_F_PERMANENT;
4759 }
4760
4761 timeout = addrconf_timeout_fixup(cfg->preferred_lft, HZ);
4762 if (addrconf_finite_timeout(timeout)) {
4763 if (timeout == 0)
4764 cfg->ifa_flags |= IFA_F_DEPRECATED;
4765 cfg->preferred_lft = timeout;
4766 }
4767
4768 if (cfg->peer_pfx &&
4769 memcmp(&ifp->peer_addr, cfg->peer_pfx, sizeof(struct in6_addr))) {
4770 if (!ipv6_addr_any(&ifp->peer_addr))
4771 cleanup_prefix_route(ifp, expires, true, true);
4772 new_peer = true;
4773 }
4774
4775 spin_lock_bh(&ifp->lock);
4776 was_managetempaddr = ifp->flags & IFA_F_MANAGETEMPADDR;
4777 had_prefixroute = ifp->flags & IFA_F_PERMANENT &&
4778 !(ifp->flags & IFA_F_NOPREFIXROUTE);
4779 ifp->flags &= ~(IFA_F_DEPRECATED | IFA_F_PERMANENT | IFA_F_NODAD |
4780 IFA_F_HOMEADDRESS | IFA_F_MANAGETEMPADDR |
4781 IFA_F_NOPREFIXROUTE);
4782 ifp->flags |= cfg->ifa_flags;
4783 ifp->tstamp = jiffies;
4784 ifp->valid_lft = cfg->valid_lft;
4785 ifp->prefered_lft = cfg->preferred_lft;
4786 ifp->ifa_proto = cfg->ifa_proto;
4787
4788 if (cfg->rt_priority && cfg->rt_priority != ifp->rt_priority)
4789 ifp->rt_priority = cfg->rt_priority;
4790
4791 if (new_peer)
4792 ifp->peer_addr = *cfg->peer_pfx;
4793
4794 spin_unlock_bh(&ifp->lock);
4795 if (!(ifp->flags&IFA_F_TENTATIVE))
4796 ipv6_ifa_notify(0, ifp);
4797
4798 if (!(cfg->ifa_flags & IFA_F_NOPREFIXROUTE)) {
4799 int rc = -ENOENT;
4800
4801 if (had_prefixroute)
4802 rc = modify_prefix_route(ifp, expires, flags, false);
4803
4804
4805 if (rc == -ENOENT) {
4806 addrconf_prefix_route(&ifp->addr, ifp->prefix_len,
4807 ifp->rt_priority, ifp->idev->dev,
4808 expires, flags, GFP_KERNEL);
4809 }
4810
4811 if (had_prefixroute && !ipv6_addr_any(&ifp->peer_addr))
4812 rc = modify_prefix_route(ifp, expires, flags, true);
4813
4814 if (rc == -ENOENT && !ipv6_addr_any(&ifp->peer_addr)) {
4815 addrconf_prefix_route(&ifp->peer_addr, ifp->prefix_len,
4816 ifp->rt_priority, ifp->idev->dev,
4817 expires, flags, GFP_KERNEL);
4818 }
4819 } else if (had_prefixroute) {
4820 enum cleanup_prefix_rt_t action;
4821 unsigned long rt_expires;
4822
4823 write_lock_bh(&ifp->idev->lock);
4824 action = check_cleanup_prefix_route(ifp, &rt_expires);
4825 write_unlock_bh(&ifp->idev->lock);
4826
4827 if (action != CLEANUP_PREFIX_RT_NOP) {
4828 cleanup_prefix_route(ifp, rt_expires,
4829 action == CLEANUP_PREFIX_RT_DEL, false);
4830 }
4831 }
4832
4833 if (was_managetempaddr || ifp->flags & IFA_F_MANAGETEMPADDR) {
4834 if (was_managetempaddr &&
4835 !(ifp->flags & IFA_F_MANAGETEMPADDR)) {
4836 cfg->valid_lft = 0;
4837 cfg->preferred_lft = 0;
4838 }
4839 manage_tempaddrs(ifp->idev, ifp, cfg->valid_lft,
4840 cfg->preferred_lft, !was_managetempaddr,
4841 jiffies);
4842 }
4843
4844 addrconf_verify_rtnl(net);
4845
4846 return 0;
4847 }
4848
4849 static int
4850 inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh,
4851 struct netlink_ext_ack *extack)
4852 {
4853 struct net *net = sock_net(skb->sk);
4854 struct ifaddrmsg *ifm;
4855 struct nlattr *tb[IFA_MAX+1];
4856 struct in6_addr *peer_pfx;
4857 struct inet6_ifaddr *ifa;
4858 struct net_device *dev;
4859 struct inet6_dev *idev;
4860 struct ifa6_config cfg;
4861 int err;
4862
4863 err = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFA_MAX,
4864 ifa_ipv6_policy, extack);
4865 if (err < 0)
4866 return err;
4867
4868 memset(&cfg, 0, sizeof(cfg));
4869
4870 ifm = nlmsg_data(nlh);
4871 cfg.pfx = extract_addr(tb[IFA_ADDRESS], tb[IFA_LOCAL], &peer_pfx);
4872 if (!cfg.pfx)
4873 return -EINVAL;
4874
4875 cfg.peer_pfx = peer_pfx;
4876 cfg.plen = ifm->ifa_prefixlen;
4877 if (tb[IFA_RT_PRIORITY])
4878 cfg.rt_priority = nla_get_u32(tb[IFA_RT_PRIORITY]);
4879
4880 if (tb[IFA_PROTO])
4881 cfg.ifa_proto = nla_get_u8(tb[IFA_PROTO]);
4882
4883 cfg.valid_lft = INFINITY_LIFE_TIME;
4884 cfg.preferred_lft = INFINITY_LIFE_TIME;
4885
4886 if (tb[IFA_CACHEINFO]) {
4887 struct ifa_cacheinfo *ci;
4888
4889 ci = nla_data(tb[IFA_CACHEINFO]);
4890 cfg.valid_lft = ci->ifa_valid;
4891 cfg.preferred_lft = ci->ifa_prefered;
4892 }
4893
4894 dev = __dev_get_by_index(net, ifm->ifa_index);
4895 if (!dev)
4896 return -ENODEV;
4897
4898 if (tb[IFA_FLAGS])
4899 cfg.ifa_flags = nla_get_u32(tb[IFA_FLAGS]);
4900 else
4901 cfg.ifa_flags = ifm->ifa_flags;
4902
4903
4904 cfg.ifa_flags &= IFA_F_NODAD | IFA_F_HOMEADDRESS |
4905 IFA_F_MANAGETEMPADDR | IFA_F_NOPREFIXROUTE |
4906 IFA_F_MCAUTOJOIN | IFA_F_OPTIMISTIC;
4907
4908 idev = ipv6_find_idev(dev);
4909 if (IS_ERR(idev))
4910 return PTR_ERR(idev);
4911
4912 if (!ipv6_allow_optimistic_dad(net, idev))
4913 cfg.ifa_flags &= ~IFA_F_OPTIMISTIC;
4914
4915 if (cfg.ifa_flags & IFA_F_NODAD &&
4916 cfg.ifa_flags & IFA_F_OPTIMISTIC) {
4917 NL_SET_ERR_MSG(extack, "IFA_F_NODAD and IFA_F_OPTIMISTIC are mutually exclusive");
4918 return -EINVAL;
4919 }
4920
4921 ifa = ipv6_get_ifaddr(net, cfg.pfx, dev, 1);
4922 if (!ifa) {
4923
4924
4925
4926
4927 return inet6_addr_add(net, ifm->ifa_index, &cfg, extack);
4928 }
4929
4930 if (nlh->nlmsg_flags & NLM_F_EXCL ||
4931 !(nlh->nlmsg_flags & NLM_F_REPLACE))
4932 err = -EEXIST;
4933 else
4934 err = inet6_addr_modify(net, ifa, &cfg);
4935
4936 in6_ifa_put(ifa);
4937
4938 return err;
4939 }
4940
4941 static void put_ifaddrmsg(struct nlmsghdr *nlh, u8 prefixlen, u32 flags,
4942 u8 scope, int ifindex)
4943 {
4944 struct ifaddrmsg *ifm;
4945
4946 ifm = nlmsg_data(nlh);
4947 ifm->ifa_family = AF_INET6;
4948 ifm->ifa_prefixlen = prefixlen;
4949 ifm->ifa_flags = flags;
4950 ifm->ifa_scope = scope;
4951 ifm->ifa_index = ifindex;
4952 }
4953
4954 static int put_cacheinfo(struct sk_buff *skb, unsigned long cstamp,
4955 unsigned long tstamp, u32 preferred, u32 valid)
4956 {
4957 struct ifa_cacheinfo ci;
4958
4959 ci.cstamp = cstamp_delta(cstamp);
4960 ci.tstamp = cstamp_delta(tstamp);
4961 ci.ifa_prefered = preferred;
4962 ci.ifa_valid = valid;
4963
4964 return nla_put(skb, IFA_CACHEINFO, sizeof(ci), &ci);
4965 }
4966
4967 static inline int rt_scope(int ifa_scope)
4968 {
4969 if (ifa_scope & IFA_HOST)
4970 return RT_SCOPE_HOST;
4971 else if (ifa_scope & IFA_LINK)
4972 return RT_SCOPE_LINK;
4973 else if (ifa_scope & IFA_SITE)
4974 return RT_SCOPE_SITE;
4975 else
4976 return RT_SCOPE_UNIVERSE;
4977 }
4978
4979 static inline int inet6_ifaddr_msgsize(void)
4980 {
4981 return NLMSG_ALIGN(sizeof(struct ifaddrmsg))
4982 + nla_total_size(16)
4983 + nla_total_size(16)
4984 + nla_total_size(sizeof(struct ifa_cacheinfo))
4985 + nla_total_size(4)
4986 + nla_total_size(1)
4987 + nla_total_size(4) ;
4988 }
4989
4990 enum addr_type_t {
4991 UNICAST_ADDR,
4992 MULTICAST_ADDR,
4993 ANYCAST_ADDR,
4994 };
4995
4996 struct inet6_fill_args {
4997 u32 portid;
4998 u32 seq;
4999 int event;
5000 unsigned int flags;
5001 int netnsid;
5002 int ifindex;
5003 enum addr_type_t type;
5004 };
5005
5006 static int inet6_fill_ifaddr(struct sk_buff *skb, struct inet6_ifaddr *ifa,
5007 struct inet6_fill_args *args)
5008 {
5009 struct nlmsghdr *nlh;
5010 u32 preferred, valid;
5011
5012 nlh = nlmsg_put(skb, args->portid, args->seq, args->event,
5013 sizeof(struct ifaddrmsg), args->flags);
5014 if (!nlh)
5015 return -EMSGSIZE;
5016
5017 put_ifaddrmsg(nlh, ifa->prefix_len, ifa->flags, rt_scope(ifa->scope),
5018 ifa->idev->dev->ifindex);
5019
5020 if (args->netnsid >= 0 &&
5021 nla_put_s32(skb, IFA_TARGET_NETNSID, args->netnsid))
5022 goto error;
5023
5024 spin_lock_bh(&ifa->lock);
5025 if (!((ifa->flags&IFA_F_PERMANENT) &&
5026 (ifa->prefered_lft == INFINITY_LIFE_TIME))) {
5027 preferred = ifa->prefered_lft;
5028 valid = ifa->valid_lft;
5029 if (preferred != INFINITY_LIFE_TIME) {
5030 long tval = (jiffies - ifa->tstamp)/HZ;
5031 if (preferred > tval)
5032 preferred -= tval;
5033 else
5034 preferred = 0;
5035 if (valid != INFINITY_LIFE_TIME) {
5036 if (valid > tval)
5037 valid -= tval;
5038 else
5039 valid = 0;
5040 }
5041 }
5042 } else {
5043 preferred = INFINITY_LIFE_TIME;
5044 valid = INFINITY_LIFE_TIME;
5045 }
5046 spin_unlock_bh(&ifa->lock);
5047
5048 if (!ipv6_addr_any(&ifa->peer_addr)) {
5049 if (nla_put_in6_addr(skb, IFA_LOCAL, &ifa->addr) < 0 ||
5050 nla_put_in6_addr(skb, IFA_ADDRESS, &ifa->peer_addr) < 0)
5051 goto error;
5052 } else
5053 if (nla_put_in6_addr(skb, IFA_ADDRESS, &ifa->addr) < 0)
5054 goto error;
5055
5056 if (ifa->rt_priority &&
5057 nla_put_u32(skb, IFA_RT_PRIORITY, ifa->rt_priority))
5058 goto error;
5059
5060 if (put_cacheinfo(skb, ifa->cstamp, ifa->tstamp, preferred, valid) < 0)
5061 goto error;
5062
5063 if (nla_put_u32(skb, IFA_FLAGS, ifa->flags) < 0)
5064 goto error;
5065
5066 if (ifa->ifa_proto &&
5067 nla_put_u8(skb, IFA_PROTO, ifa->ifa_proto))
5068 goto error;
5069
5070 nlmsg_end(skb, nlh);
5071 return 0;
5072
5073 error:
5074 nlmsg_cancel(skb, nlh);
5075 return -EMSGSIZE;
5076 }
5077
5078 static int inet6_fill_ifmcaddr(struct sk_buff *skb, struct ifmcaddr6 *ifmca,
5079 struct inet6_fill_args *args)
5080 {
5081 struct nlmsghdr *nlh;
5082 u8 scope = RT_SCOPE_UNIVERSE;
5083 int ifindex = ifmca->idev->dev->ifindex;
5084
5085 if (ipv6_addr_scope(&ifmca->mca_addr) & IFA_SITE)
5086 scope = RT_SCOPE_SITE;
5087
5088 nlh = nlmsg_put(skb, args->portid, args->seq, args->event,
5089 sizeof(struct ifaddrmsg), args->flags);
5090 if (!nlh)
5091 return -EMSGSIZE;
5092
5093 if (args->netnsid >= 0 &&
5094 nla_put_s32(skb, IFA_TARGET_NETNSID, args->netnsid)) {
5095 nlmsg_cancel(skb, nlh);
5096 return -EMSGSIZE;
5097 }
5098
5099 put_ifaddrmsg(nlh, 128, IFA_F_PERMANENT, scope, ifindex);
5100 if (nla_put_in6_addr(skb, IFA_MULTICAST, &ifmca->mca_addr) < 0 ||
5101 put_cacheinfo(skb, ifmca->mca_cstamp, ifmca->mca_tstamp,
5102 INFINITY_LIFE_TIME, INFINITY_LIFE_TIME) < 0) {
5103 nlmsg_cancel(skb, nlh);
5104 return -EMSGSIZE;
5105 }
5106
5107 nlmsg_end(skb, nlh);
5108 return 0;
5109 }
5110
5111 static int inet6_fill_ifacaddr(struct sk_buff *skb, struct ifacaddr6 *ifaca,
5112 struct inet6_fill_args *args)
5113 {
5114 struct net_device *dev = fib6_info_nh_dev(ifaca->aca_rt);
5115 int ifindex = dev ? dev->ifindex : 1;
5116 struct nlmsghdr *nlh;
5117 u8 scope = RT_SCOPE_UNIVERSE;
5118
5119 if (ipv6_addr_scope(&ifaca->aca_addr) & IFA_SITE)
5120 scope = RT_SCOPE_SITE;
5121
5122 nlh = nlmsg_put(skb, args->portid, args->seq, args->event,
5123 sizeof(struct ifaddrmsg), args->flags);
5124 if (!nlh)
5125 return -EMSGSIZE;
5126
5127 if (args->netnsid >= 0 &&
5128 nla_put_s32(skb, IFA_TARGET_NETNSID, args->netnsid)) {
5129 nlmsg_cancel(skb, nlh);
5130 return -EMSGSIZE;
5131 }
5132
5133 put_ifaddrmsg(nlh, 128, IFA_F_PERMANENT, scope, ifindex);
5134 if (nla_put_in6_addr(skb, IFA_ANYCAST, &ifaca->aca_addr) < 0 ||
5135 put_cacheinfo(skb, ifaca->aca_cstamp, ifaca->aca_tstamp,
5136 INFINITY_LIFE_TIME, INFINITY_LIFE_TIME) < 0) {
5137 nlmsg_cancel(skb, nlh);
5138 return -EMSGSIZE;
5139 }
5140
5141 nlmsg_end(skb, nlh);
5142 return 0;
5143 }
5144
5145
5146 static int in6_dump_addrs(struct inet6_dev *idev, struct sk_buff *skb,
5147 struct netlink_callback *cb, int s_ip_idx,
5148 struct inet6_fill_args *fillargs)
5149 {
5150 struct ifmcaddr6 *ifmca;
5151 struct ifacaddr6 *ifaca;
5152 int ip_idx = 0;
5153 int err = 1;
5154
5155 read_lock_bh(&idev->lock);
5156 switch (fillargs->type) {
5157 case UNICAST_ADDR: {
5158 struct inet6_ifaddr *ifa;
5159 fillargs->event = RTM_NEWADDR;
5160
5161
5162 list_for_each_entry(ifa, &idev->addr_list, if_list) {
5163 if (ip_idx < s_ip_idx)
5164 goto next;
5165 err = inet6_fill_ifaddr(skb, ifa, fillargs);
5166 if (err < 0)
5167 break;
5168 nl_dump_check_consistent(cb, nlmsg_hdr(skb));
5169 next:
5170 ip_idx++;
5171 }
5172 break;
5173 }
5174 case MULTICAST_ADDR:
5175 read_unlock_bh(&idev->lock);
5176 fillargs->event = RTM_GETMULTICAST;
5177
5178
5179 for (ifmca = rtnl_dereference(idev->mc_list);
5180 ifmca;
5181 ifmca = rtnl_dereference(ifmca->next), ip_idx++) {
5182 if (ip_idx < s_ip_idx)
5183 continue;
5184 err = inet6_fill_ifmcaddr(skb, ifmca, fillargs);
5185 if (err < 0)
5186 break;
5187 }
5188 read_lock_bh(&idev->lock);
5189 break;
5190 case ANYCAST_ADDR:
5191 fillargs->event = RTM_GETANYCAST;
5192
5193 for (ifaca = idev->ac_list; ifaca;
5194 ifaca = ifaca->aca_next, ip_idx++) {
5195 if (ip_idx < s_ip_idx)
5196 continue;
5197 err = inet6_fill_ifacaddr(skb, ifaca, fillargs);
5198 if (err < 0)
5199 break;
5200 }
5201 break;
5202 default:
5203 break;
5204 }
5205 read_unlock_bh(&idev->lock);
5206 cb->args[2] = ip_idx;
5207 return err;
5208 }
5209
5210 static int inet6_valid_dump_ifaddr_req(const struct nlmsghdr *nlh,
5211 struct inet6_fill_args *fillargs,
5212 struct net **tgt_net, struct sock *sk,
5213 struct netlink_callback *cb)
5214 {
5215 struct netlink_ext_ack *extack = cb->extack;
5216 struct nlattr *tb[IFA_MAX+1];
5217 struct ifaddrmsg *ifm;
5218 int err, i;
5219
5220 if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*ifm))) {
5221 NL_SET_ERR_MSG_MOD(extack, "Invalid header for address dump request");
5222 return -EINVAL;
5223 }
5224
5225 ifm = nlmsg_data(nlh);
5226 if (ifm->ifa_prefixlen || ifm->ifa_flags || ifm->ifa_scope) {
5227 NL_SET_ERR_MSG_MOD(extack, "Invalid values in header for address dump request");
5228 return -EINVAL;
5229 }
5230
5231 fillargs->ifindex = ifm->ifa_index;
5232 if (fillargs->ifindex) {
5233 cb->answer_flags |= NLM_F_DUMP_FILTERED;
5234 fillargs->flags |= NLM_F_DUMP_FILTERED;
5235 }
5236
5237 err = nlmsg_parse_deprecated_strict(nlh, sizeof(*ifm), tb, IFA_MAX,
5238 ifa_ipv6_policy, extack);
5239 if (err < 0)
5240 return err;
5241
5242 for (i = 0; i <= IFA_MAX; ++i) {
5243 if (!tb[i])
5244 continue;
5245
5246 if (i == IFA_TARGET_NETNSID) {
5247 struct net *net;
5248
5249 fillargs->netnsid = nla_get_s32(tb[i]);
5250 net = rtnl_get_net_ns_capable(sk, fillargs->netnsid);
5251 if (IS_ERR(net)) {
5252 fillargs->netnsid = -1;
5253 NL_SET_ERR_MSG_MOD(extack, "Invalid target network namespace id");
5254 return PTR_ERR(net);
5255 }
5256 *tgt_net = net;
5257 } else {
5258 NL_SET_ERR_MSG_MOD(extack, "Unsupported attribute in dump request");
5259 return -EINVAL;
5260 }
5261 }
5262
5263 return 0;
5264 }
5265
5266 static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
5267 enum addr_type_t type)
5268 {
5269 const struct nlmsghdr *nlh = cb->nlh;
5270 struct inet6_fill_args fillargs = {
5271 .portid = NETLINK_CB(cb->skb).portid,
5272 .seq = cb->nlh->nlmsg_seq,
5273 .flags = NLM_F_MULTI,
5274 .netnsid = -1,
5275 .type = type,
5276 };
5277 struct net *tgt_net = sock_net(skb->sk);
5278 int idx, s_idx, s_ip_idx;
5279 int h, s_h;
5280 struct net_device *dev;
5281 struct inet6_dev *idev;
5282 struct hlist_head *head;
5283 int err = 0;
5284
5285 s_h = cb->args[0];
5286 s_idx = idx = cb->args[1];
5287 s_ip_idx = cb->args[2];
5288
5289 if (cb->strict_check) {
5290 err = inet6_valid_dump_ifaddr_req(nlh, &fillargs, &tgt_net,
5291 skb->sk, cb);
5292 if (err < 0)
5293 goto put_tgt_net;
5294
5295 err = 0;
5296 if (fillargs.ifindex) {
5297 dev = __dev_get_by_index(tgt_net, fillargs.ifindex);
5298 if (!dev) {
5299 err = -ENODEV;
5300 goto put_tgt_net;
5301 }
5302 idev = __in6_dev_get(dev);
5303 if (idev) {
5304 err = in6_dump_addrs(idev, skb, cb, s_ip_idx,
5305 &fillargs);
5306 if (err > 0)
5307 err = 0;
5308 }
5309 goto put_tgt_net;
5310 }
5311 }
5312
5313 rcu_read_lock();
5314 cb->seq = atomic_read(&tgt_net->ipv6.dev_addr_genid) ^ tgt_net->dev_base_seq;
5315 for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) {
5316 idx = 0;
5317 head = &tgt_net->dev_index_head[h];
5318 hlist_for_each_entry_rcu(dev, head, index_hlist) {
5319 if (idx < s_idx)
5320 goto cont;
5321 if (h > s_h || idx > s_idx)
5322 s_ip_idx = 0;
5323 idev = __in6_dev_get(dev);
5324 if (!idev)
5325 goto cont;
5326
5327 if (in6_dump_addrs(idev, skb, cb, s_ip_idx,
5328 &fillargs) < 0)
5329 goto done;
5330 cont:
5331 idx++;
5332 }
5333 }
5334 done:
5335 rcu_read_unlock();
5336 cb->args[0] = h;
5337 cb->args[1] = idx;
5338 put_tgt_net:
5339 if (fillargs.netnsid >= 0)
5340 put_net(tgt_net);
5341
5342 return skb->len ? : err;
5343 }
5344
5345 static int inet6_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
5346 {
5347 enum addr_type_t type = UNICAST_ADDR;
5348
5349 return inet6_dump_addr(skb, cb, type);
5350 }
5351
5352 static int inet6_dump_ifmcaddr(struct sk_buff *skb, struct netlink_callback *cb)
5353 {
5354 enum addr_type_t type = MULTICAST_ADDR;
5355
5356 return inet6_dump_addr(skb, cb, type);
5357 }
5358
5359
5360 static int inet6_dump_ifacaddr(struct sk_buff *skb, struct netlink_callback *cb)
5361 {
5362 enum addr_type_t type = ANYCAST_ADDR;
5363
5364 return inet6_dump_addr(skb, cb, type);
5365 }
5366
5367 static int inet6_rtm_valid_getaddr_req(struct sk_buff *skb,
5368 const struct nlmsghdr *nlh,
5369 struct nlattr **tb,
5370 struct netlink_ext_ack *extack)
5371 {
5372 struct ifaddrmsg *ifm;
5373 int i, err;
5374
5375 if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*ifm))) {
5376 NL_SET_ERR_MSG_MOD(extack, "Invalid header for get address request");
5377 return -EINVAL;
5378 }
5379
5380 if (!netlink_strict_get_check(skb))
5381 return nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFA_MAX,
5382 ifa_ipv6_policy, extack);
5383
5384 ifm = nlmsg_data(nlh);
5385 if (ifm->ifa_prefixlen || ifm->ifa_flags || ifm->ifa_scope) {
5386 NL_SET_ERR_MSG_MOD(extack, "Invalid values in header for get address request");
5387 return -EINVAL;
5388 }
5389
5390 err = nlmsg_parse_deprecated_strict(nlh, sizeof(*ifm), tb, IFA_MAX,
5391 ifa_ipv6_policy, extack);
5392 if (err)
5393 return err;
5394
5395 for (i = 0; i <= IFA_MAX; i++) {
5396 if (!tb[i])
5397 continue;
5398
5399 switch (i) {
5400 case IFA_TARGET_NETNSID:
5401 case IFA_ADDRESS:
5402 case IFA_LOCAL:
5403 break;
5404 default:
5405 NL_SET_ERR_MSG_MOD(extack, "Unsupported attribute in get address request");
5406 return -EINVAL;
5407 }
5408 }
5409
5410 return 0;
5411 }
5412
5413 static int inet6_rtm_getaddr(struct sk_buff *in_skb, struct nlmsghdr *nlh,
5414 struct netlink_ext_ack *extack)
5415 {
5416 struct net *tgt_net = sock_net(in_skb->sk);
5417 struct inet6_fill_args fillargs = {
5418 .portid = NETLINK_CB(in_skb).portid,
5419 .seq = nlh->nlmsg_seq,
5420 .event = RTM_NEWADDR,
5421 .flags = 0,
5422 .netnsid = -1,
5423 };
5424 struct ifaddrmsg *ifm;
5425 struct nlattr *tb[IFA_MAX+1];
5426 struct in6_addr *addr = NULL, *peer;
5427 struct net_device *dev = NULL;
5428 struct inet6_ifaddr *ifa;
5429 struct sk_buff *skb;
5430 int err;
5431
5432 err = inet6_rtm_valid_getaddr_req(in_skb, nlh, tb, extack);
5433 if (err < 0)
5434 return err;
5435
5436 if (tb[IFA_TARGET_NETNSID]) {
5437 fillargs.netnsid = nla_get_s32(tb[IFA_TARGET_NETNSID]);
5438
5439 tgt_net = rtnl_get_net_ns_capable(NETLINK_CB(in_skb).sk,
5440 fillargs.netnsid);
5441 if (IS_ERR(tgt_net))
5442 return PTR_ERR(tgt_net);
5443 }
5444
5445 addr = extract_addr(tb[IFA_ADDRESS], tb[IFA_LOCAL], &peer);
5446 if (!addr)
5447 return -EINVAL;
5448
5449 ifm = nlmsg_data(nlh);
5450 if (ifm->ifa_index)
5451 dev = dev_get_by_index(tgt_net, ifm->ifa_index);
5452
5453 ifa = ipv6_get_ifaddr(tgt_net, addr, dev, 1);
5454 if (!ifa) {
5455 err = -EADDRNOTAVAIL;
5456 goto errout;
5457 }
5458
5459 skb = nlmsg_new(inet6_ifaddr_msgsize(), GFP_KERNEL);
5460 if (!skb) {
5461 err = -ENOBUFS;
5462 goto errout_ifa;
5463 }
5464
5465 err = inet6_fill_ifaddr(skb, ifa, &fillargs);
5466 if (err < 0) {
5467
5468 WARN_ON(err == -EMSGSIZE);
5469 kfree_skb(skb);
5470 goto errout_ifa;
5471 }
5472 err = rtnl_unicast(skb, tgt_net, NETLINK_CB(in_skb).portid);
5473 errout_ifa:
5474 in6_ifa_put(ifa);
5475 errout:
5476 dev_put(dev);
5477 if (fillargs.netnsid >= 0)
5478 put_net(tgt_net);
5479
5480 return err;
5481 }
5482
5483 static void inet6_ifa_notify(int event, struct inet6_ifaddr *ifa)
5484 {
5485 struct sk_buff *skb;
5486 struct net *net = dev_net(ifa->idev->dev);
5487 struct inet6_fill_args fillargs = {
5488 .portid = 0,
5489 .seq = 0,
5490 .event = event,
5491 .flags = 0,
5492 .netnsid = -1,
5493 };
5494 int err = -ENOBUFS;
5495
5496 skb = nlmsg_new(inet6_ifaddr_msgsize(), GFP_ATOMIC);
5497 if (!skb)
5498 goto errout;
5499
5500 err = inet6_fill_ifaddr(skb, ifa, &fillargs);
5501 if (err < 0) {
5502
5503 WARN_ON(err == -EMSGSIZE);
5504 kfree_skb(skb);
5505 goto errout;
5506 }
5507 rtnl_notify(skb, net, 0, RTNLGRP_IPV6_IFADDR, NULL, GFP_ATOMIC);
5508 return;
5509 errout:
5510 if (err < 0)
5511 rtnl_set_sk_err(net, RTNLGRP_IPV6_IFADDR, err);
5512 }
5513
5514 static inline void ipv6_store_devconf(struct ipv6_devconf *cnf,
5515 __s32 *array, int bytes)
5516 {
5517 BUG_ON(bytes < (DEVCONF_MAX * 4));
5518
5519 memset(array, 0, bytes);
5520 array[DEVCONF_FORWARDING] = cnf->forwarding;
5521 array[DEVCONF_HOPLIMIT] = cnf->hop_limit;
5522 array[DEVCONF_MTU6] = cnf->mtu6;
5523 array[DEVCONF_ACCEPT_RA] = cnf->accept_ra;
5524 array[DEVCONF_ACCEPT_REDIRECTS] = cnf->accept_redirects;
5525 array[DEVCONF_AUTOCONF] = cnf->autoconf;
5526 array[DEVCONF_DAD_TRANSMITS] = cnf->dad_transmits;
5527 array[DEVCONF_RTR_SOLICITS] = cnf->rtr_solicits;
5528 array[DEVCONF_RTR_SOLICIT_INTERVAL] =
5529 jiffies_to_msecs(cnf->rtr_solicit_interval);
5530 array[DEVCONF_RTR_SOLICIT_MAX_INTERVAL] =
5531 jiffies_to_msecs(cnf->rtr_solicit_max_interval);
5532 array[DEVCONF_RTR_SOLICIT_DELAY] =
5533 jiffies_to_msecs(cnf->rtr_solicit_delay);
5534 array[DEVCONF_FORCE_MLD_VERSION] = cnf->force_mld_version;
5535 array[DEVCONF_MLDV1_UNSOLICITED_REPORT_INTERVAL] =
5536 jiffies_to_msecs(cnf->mldv1_unsolicited_report_interval);
5537 array[DEVCONF_MLDV2_UNSOLICITED_REPORT_INTERVAL] =
5538 jiffies_to_msecs(cnf->mldv2_unsolicited_report_interval);
5539 array[DEVCONF_USE_TEMPADDR] = cnf->use_tempaddr;
5540 array[DEVCONF_TEMP_VALID_LFT] = cnf->temp_valid_lft;
5541 array[DEVCONF_TEMP_PREFERED_LFT] = cnf->temp_prefered_lft;
5542 array[DEVCONF_REGEN_MAX_RETRY] = cnf->regen_max_retry;
5543 array[DEVCONF_MAX_DESYNC_FACTOR] = cnf->max_desync_factor;
5544 array[DEVCONF_MAX_ADDRESSES] = cnf->max_addresses;
5545 array[DEVCONF_ACCEPT_RA_DEFRTR] = cnf->accept_ra_defrtr;
5546 array[DEVCONF_RA_DEFRTR_METRIC] = cnf->ra_defrtr_metric;
5547 array[DEVCONF_ACCEPT_RA_MIN_HOP_LIMIT] = cnf->accept_ra_min_hop_limit;
5548 array[DEVCONF_ACCEPT_RA_PINFO] = cnf->accept_ra_pinfo;
5549 #ifdef CONFIG_IPV6_ROUTER_PREF
5550 array[DEVCONF_ACCEPT_RA_RTR_PREF] = cnf->accept_ra_rtr_pref;
5551 array[DEVCONF_RTR_PROBE_INTERVAL] =
5552 jiffies_to_msecs(cnf->rtr_probe_interval);
5553 #ifdef CONFIG_IPV6_ROUTE_INFO
5554 array[DEVCONF_ACCEPT_RA_RT_INFO_MIN_PLEN] = cnf->accept_ra_rt_info_min_plen;
5555 array[DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN] = cnf->accept_ra_rt_info_max_plen;
5556 #endif
5557 #endif
5558 array[DEVCONF_PROXY_NDP] = cnf->proxy_ndp;
5559 array[DEVCONF_ACCEPT_SOURCE_ROUTE] = cnf->accept_source_route;
5560 #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
5561 array[DEVCONF_OPTIMISTIC_DAD] = cnf->optimistic_dad;
5562 array[DEVCONF_USE_OPTIMISTIC] = cnf->use_optimistic;
5563 #endif
5564 #ifdef CONFIG_IPV6_MROUTE
5565 array[DEVCONF_MC_FORWARDING] = atomic_read(&cnf->mc_forwarding);
5566 #endif
5567 array[DEVCONF_DISABLE_IPV6] = cnf->disable_ipv6;
5568 array[DEVCONF_ACCEPT_DAD] = cnf->accept_dad;
5569 array[DEVCONF_FORCE_TLLAO] = cnf->force_tllao;
5570 array[DEVCONF_NDISC_NOTIFY] = cnf->ndisc_notify;
5571 array[DEVCONF_SUPPRESS_FRAG_NDISC] = cnf->suppress_frag_ndisc;
5572 array[DEVCONF_ACCEPT_RA_FROM_LOCAL] = cnf->accept_ra_from_local;
5573 array[DEVCONF_ACCEPT_RA_MTU] = cnf->accept_ra_mtu;
5574 array[DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN] = cnf->ignore_routes_with_linkdown;
5575
5576 array[DEVCONF_USE_OIF_ADDRS_ONLY] = cnf->use_oif_addrs_only;
5577 array[DEVCONF_DROP_UNICAST_IN_L2_MULTICAST] = cnf->drop_unicast_in_l2_multicast;
5578 array[DEVCONF_DROP_UNSOLICITED_NA] = cnf->drop_unsolicited_na;
5579 array[DEVCONF_KEEP_ADDR_ON_DOWN] = cnf->keep_addr_on_down;
5580 array[DEVCONF_SEG6_ENABLED] = cnf->seg6_enabled;
5581 #ifdef CONFIG_IPV6_SEG6_HMAC
5582 array[DEVCONF_SEG6_REQUIRE_HMAC] = cnf->seg6_require_hmac;
5583 #endif
5584 array[DEVCONF_ENHANCED_DAD] = cnf->enhanced_dad;
5585 array[DEVCONF_ADDR_GEN_MODE] = cnf->addr_gen_mode;
5586 array[DEVCONF_DISABLE_POLICY] = cnf->disable_policy;
5587 array[DEVCONF_NDISC_TCLASS] = cnf->ndisc_tclass;
5588 array[DEVCONF_RPL_SEG_ENABLED] = cnf->rpl_seg_enabled;
5589 array[DEVCONF_IOAM6_ENABLED] = cnf->ioam6_enabled;
5590 array[DEVCONF_IOAM6_ID] = cnf->ioam6_id;
5591 array[DEVCONF_IOAM6_ID_WIDE] = cnf->ioam6_id_wide;
5592 array[DEVCONF_NDISC_EVICT_NOCARRIER] = cnf->ndisc_evict_nocarrier;
5593 array[DEVCONF_ACCEPT_UNTRACKED_NA] = cnf->accept_untracked_na;
5594 }
5595
5596 static inline size_t inet6_ifla6_size(void)
5597 {
5598 return nla_total_size(4)
5599 + nla_total_size(sizeof(struct ifla_cacheinfo))
5600 + nla_total_size(DEVCONF_MAX * 4)
5601 + nla_total_size(IPSTATS_MIB_MAX * 8)
5602 + nla_total_size(ICMP6_MIB_MAX * 8)
5603 + nla_total_size(sizeof(struct in6_addr))
5604 + nla_total_size(1)
5605 + nla_total_size(4)
5606 + 0;
5607 }
5608
5609 static inline size_t inet6_if_nlmsg_size(void)
5610 {
5611 return NLMSG_ALIGN(sizeof(struct ifinfomsg))
5612 + nla_total_size(IFNAMSIZ)
5613 + nla_total_size(MAX_ADDR_LEN)
5614 + nla_total_size(4)
5615 + nla_total_size(4)
5616 + nla_total_size(1)
5617 + nla_total_size(inet6_ifla6_size());
5618 }
5619
5620 static inline void __snmp6_fill_statsdev(u64 *stats, atomic_long_t *mib,
5621 int bytes)
5622 {
5623 int i;
5624 int pad = bytes - sizeof(u64) * ICMP6_MIB_MAX;
5625 BUG_ON(pad < 0);
5626
5627
5628 put_unaligned(ICMP6_MIB_MAX, &stats[0]);
5629 for (i = 1; i < ICMP6_MIB_MAX; i++)
5630 put_unaligned(atomic_long_read(&mib[i]), &stats[i]);
5631
5632 memset(&stats[ICMP6_MIB_MAX], 0, pad);
5633 }
5634
5635 static inline void __snmp6_fill_stats64(u64 *stats, void __percpu *mib,
5636 int bytes, size_t syncpoff)
5637 {
5638 int i, c;
5639 u64 buff[IPSTATS_MIB_MAX];
5640 int pad = bytes - sizeof(u64) * IPSTATS_MIB_MAX;
5641
5642 BUG_ON(pad < 0);
5643
5644 memset(buff, 0, sizeof(buff));
5645 buff[0] = IPSTATS_MIB_MAX;
5646
5647 for_each_possible_cpu(c) {
5648 for (i = 1; i < IPSTATS_MIB_MAX; i++)
5649 buff[i] += snmp_get_cpu_field64(mib, c, i, syncpoff);
5650 }
5651
5652 memcpy(stats, buff, IPSTATS_MIB_MAX * sizeof(u64));
5653 memset(&stats[IPSTATS_MIB_MAX], 0, pad);
5654 }
5655
5656 static void snmp6_fill_stats(u64 *stats, struct inet6_dev *idev, int attrtype,
5657 int bytes)
5658 {
5659 switch (attrtype) {
5660 case IFLA_INET6_STATS:
5661 __snmp6_fill_stats64(stats, idev->stats.ipv6, bytes,
5662 offsetof(struct ipstats_mib, syncp));
5663 break;
5664 case IFLA_INET6_ICMP6STATS:
5665 __snmp6_fill_statsdev(stats, idev->stats.icmpv6dev->mibs, bytes);
5666 break;
5667 }
5668 }
5669
5670 static int inet6_fill_ifla6_attrs(struct sk_buff *skb, struct inet6_dev *idev,
5671 u32 ext_filter_mask)
5672 {
5673 struct nlattr *nla;
5674 struct ifla_cacheinfo ci;
5675
5676 if (nla_put_u32(skb, IFLA_INET6_FLAGS, idev->if_flags))
5677 goto nla_put_failure;
5678 ci.max_reasm_len = IPV6_MAXPLEN;
5679 ci.tstamp = cstamp_delta(idev->tstamp);
5680 ci.reachable_time = jiffies_to_msecs(idev->nd_parms->reachable_time);
5681 ci.retrans_time = jiffies_to_msecs(NEIGH_VAR(idev->nd_parms, RETRANS_TIME));
5682 if (nla_put(skb, IFLA_INET6_CACHEINFO, sizeof(ci), &ci))
5683 goto nla_put_failure;
5684 nla = nla_reserve(skb, IFLA_INET6_CONF, DEVCONF_MAX * sizeof(s32));
5685 if (!nla)
5686 goto nla_put_failure;
5687 ipv6_store_devconf(&idev->cnf, nla_data(nla), nla_len(nla));
5688
5689
5690
5691 if (ext_filter_mask & RTEXT_FILTER_SKIP_STATS)
5692 return 0;
5693
5694 nla = nla_reserve(skb, IFLA_INET6_STATS, IPSTATS_MIB_MAX * sizeof(u64));
5695 if (!nla)
5696 goto nla_put_failure;
5697 snmp6_fill_stats(nla_data(nla), idev, IFLA_INET6_STATS, nla_len(nla));
5698
5699 nla = nla_reserve(skb, IFLA_INET6_ICMP6STATS, ICMP6_MIB_MAX * sizeof(u64));
5700 if (!nla)
5701 goto nla_put_failure;
5702 snmp6_fill_stats(nla_data(nla), idev, IFLA_INET6_ICMP6STATS, nla_len(nla));
5703
5704 nla = nla_reserve(skb, IFLA_INET6_TOKEN, sizeof(struct in6_addr));
5705 if (!nla)
5706 goto nla_put_failure;
5707 read_lock_bh(&idev->lock);
5708 memcpy(nla_data(nla), idev->token.s6_addr, nla_len(nla));
5709 read_unlock_bh(&idev->lock);
5710
5711 if (nla_put_u8(skb, IFLA_INET6_ADDR_GEN_MODE, idev->cnf.addr_gen_mode))
5712 goto nla_put_failure;
5713
5714 if (idev->ra_mtu &&
5715 nla_put_u32(skb, IFLA_INET6_RA_MTU, idev->ra_mtu))
5716 goto nla_put_failure;
5717
5718 return 0;
5719
5720 nla_put_failure:
5721 return -EMSGSIZE;
5722 }
5723
5724 static size_t inet6_get_link_af_size(const struct net_device *dev,
5725 u32 ext_filter_mask)
5726 {
5727 if (!__in6_dev_get(dev))
5728 return 0;
5729
5730 return inet6_ifla6_size();
5731 }
5732
5733 static int inet6_fill_link_af(struct sk_buff *skb, const struct net_device *dev,
5734 u32 ext_filter_mask)
5735 {
5736 struct inet6_dev *idev = __in6_dev_get(dev);
5737
5738 if (!idev)
5739 return -ENODATA;
5740
5741 if (inet6_fill_ifla6_attrs(skb, idev, ext_filter_mask) < 0)
5742 return -EMSGSIZE;
5743
5744 return 0;
5745 }
5746
5747 static int inet6_set_iftoken(struct inet6_dev *idev, struct in6_addr *token,
5748 struct netlink_ext_ack *extack)
5749 {
5750 struct inet6_ifaddr *ifp;
5751 struct net_device *dev = idev->dev;
5752 bool clear_token, update_rs = false;
5753 struct in6_addr ll_addr;
5754
5755 ASSERT_RTNL();
5756
5757 if (!token)
5758 return -EINVAL;
5759
5760 if (dev->flags & IFF_LOOPBACK) {
5761 NL_SET_ERR_MSG_MOD(extack, "Device is loopback");
5762 return -EINVAL;
5763 }
5764
5765 if (dev->flags & IFF_NOARP) {
5766 NL_SET_ERR_MSG_MOD(extack,
5767 "Device does not do neighbour discovery");
5768 return -EINVAL;
5769 }
5770
5771 if (!ipv6_accept_ra(idev)) {
5772 NL_SET_ERR_MSG_MOD(extack,
5773 "Router advertisement is disabled on device");
5774 return -EINVAL;
5775 }
5776
5777 if (idev->cnf.rtr_solicits == 0) {
5778 NL_SET_ERR_MSG(extack,
5779 "Router solicitation is disabled on device");
5780 return -EINVAL;
5781 }
5782
5783 write_lock_bh(&idev->lock);
5784
5785 BUILD_BUG_ON(sizeof(token->s6_addr) != 16);
5786 memcpy(idev->token.s6_addr + 8, token->s6_addr + 8, 8);
5787
5788 write_unlock_bh(&idev->lock);
5789
5790 clear_token = ipv6_addr_any(token);
5791 if (clear_token)
5792 goto update_lft;
5793
5794 if (!idev->dead && (idev->if_flags & IF_READY) &&
5795 !ipv6_get_lladdr(dev, &ll_addr, IFA_F_TENTATIVE |
5796 IFA_F_OPTIMISTIC)) {
5797
5798
5799
5800 ndisc_send_rs(dev, &ll_addr, &in6addr_linklocal_allrouters);
5801 update_rs = true;
5802 }
5803
5804 update_lft:
5805 write_lock_bh(&idev->lock);
5806
5807 if (update_rs) {
5808 idev->if_flags |= IF_RS_SENT;
5809 idev->rs_interval = rfc3315_s14_backoff_init(
5810 idev->cnf.rtr_solicit_interval);
5811 idev->rs_probes = 1;
5812 addrconf_mod_rs_timer(idev, idev->rs_interval);
5813 }
5814
5815
5816 list_for_each_entry(ifp, &idev->addr_list, if_list) {
5817 spin_lock(&ifp->lock);
5818 if (ifp->tokenized) {
5819 ifp->valid_lft = 0;
5820 ifp->prefered_lft = 0;
5821 }
5822 spin_unlock(&ifp->lock);
5823 }
5824
5825 write_unlock_bh(&idev->lock);
5826 inet6_ifinfo_notify(RTM_NEWLINK, idev);
5827 addrconf_verify_rtnl(dev_net(dev));
5828 return 0;
5829 }
5830
5831 static const struct nla_policy inet6_af_policy[IFLA_INET6_MAX + 1] = {
5832 [IFLA_INET6_ADDR_GEN_MODE] = { .type = NLA_U8 },
5833 [IFLA_INET6_TOKEN] = { .len = sizeof(struct in6_addr) },
5834 [IFLA_INET6_RA_MTU] = { .type = NLA_REJECT,
5835 .reject_message =
5836 "IFLA_INET6_RA_MTU can not be set" },
5837 };
5838
5839 static int check_addr_gen_mode(int mode)
5840 {
5841 if (mode != IN6_ADDR_GEN_MODE_EUI64 &&
5842 mode != IN6_ADDR_GEN_MODE_NONE &&
5843 mode != IN6_ADDR_GEN_MODE_STABLE_PRIVACY &&
5844 mode != IN6_ADDR_GEN_MODE_RANDOM)
5845 return -EINVAL;
5846 return 1;
5847 }
5848
5849 static int check_stable_privacy(struct inet6_dev *idev, struct net *net,
5850 int mode)
5851 {
5852 if (mode == IN6_ADDR_GEN_MODE_STABLE_PRIVACY &&
5853 !idev->cnf.stable_secret.initialized &&
5854 !net->ipv6.devconf_dflt->stable_secret.initialized)
5855 return -EINVAL;
5856 return 1;
5857 }
5858
5859 static int inet6_validate_link_af(const struct net_device *dev,
5860 const struct nlattr *nla,
5861 struct netlink_ext_ack *extack)
5862 {
5863 struct nlattr *tb[IFLA_INET6_MAX + 1];
5864 struct inet6_dev *idev = NULL;
5865 int err;
5866
5867 if (dev) {
5868 idev = __in6_dev_get(dev);
5869 if (!idev)
5870 return -EAFNOSUPPORT;
5871 }
5872
5873 err = nla_parse_nested_deprecated(tb, IFLA_INET6_MAX, nla,
5874 inet6_af_policy, extack);
5875 if (err)
5876 return err;
5877
5878 if (!tb[IFLA_INET6_TOKEN] && !tb[IFLA_INET6_ADDR_GEN_MODE])
5879 return -EINVAL;
5880
5881 if (tb[IFLA_INET6_ADDR_GEN_MODE]) {
5882 u8 mode = nla_get_u8(tb[IFLA_INET6_ADDR_GEN_MODE]);
5883
5884 if (check_addr_gen_mode(mode) < 0)
5885 return -EINVAL;
5886 if (dev && check_stable_privacy(idev, dev_net(dev), mode) < 0)
5887 return -EINVAL;
5888 }
5889
5890 return 0;
5891 }
5892
5893 static int inet6_set_link_af(struct net_device *dev, const struct nlattr *nla,
5894 struct netlink_ext_ack *extack)
5895 {
5896 struct inet6_dev *idev = __in6_dev_get(dev);
5897 struct nlattr *tb[IFLA_INET6_MAX + 1];
5898 int err;
5899
5900 if (!idev)
5901 return -EAFNOSUPPORT;
5902
5903 if (nla_parse_nested_deprecated(tb, IFLA_INET6_MAX, nla, NULL, NULL) < 0)
5904 return -EINVAL;
5905
5906 if (tb[IFLA_INET6_TOKEN]) {
5907 err = inet6_set_iftoken(idev, nla_data(tb[IFLA_INET6_TOKEN]),
5908 extack);
5909 if (err)
5910 return err;
5911 }
5912
5913 if (tb[IFLA_INET6_ADDR_GEN_MODE]) {
5914 u8 mode = nla_get_u8(tb[IFLA_INET6_ADDR_GEN_MODE]);
5915
5916 idev->cnf.addr_gen_mode = mode;
5917 }
5918
5919 return 0;
5920 }
5921
5922 static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev,
5923 u32 portid, u32 seq, int event, unsigned int flags)
5924 {
5925 struct net_device *dev = idev->dev;
5926 struct ifinfomsg *hdr;
5927 struct nlmsghdr *nlh;
5928 void *protoinfo;
5929
5930 nlh = nlmsg_put(skb, portid, seq, event, sizeof(*hdr), flags);
5931 if (!nlh)
5932 return -EMSGSIZE;
5933
5934 hdr = nlmsg_data(nlh);
5935 hdr->ifi_family = AF_INET6;
5936 hdr->__ifi_pad = 0;
5937 hdr->ifi_type = dev->type;
5938 hdr->ifi_index = dev->ifindex;
5939 hdr->ifi_flags = dev_get_flags(dev);
5940 hdr->ifi_change = 0;
5941
5942 if (nla_put_string(skb, IFLA_IFNAME, dev->name) ||
5943 (dev->addr_len &&
5944 nla_put(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr)) ||
5945 nla_put_u32(skb, IFLA_MTU, dev->mtu) ||
5946 (dev->ifindex != dev_get_iflink(dev) &&
5947 nla_put_u32(skb, IFLA_LINK, dev_get_iflink(dev))) ||
5948 nla_put_u8(skb, IFLA_OPERSTATE,
5949 netif_running(dev) ? dev->operstate : IF_OPER_DOWN))
5950 goto nla_put_failure;
5951 protoinfo = nla_nest_start_noflag(skb, IFLA_PROTINFO);
5952 if (!protoinfo)
5953 goto nla_put_failure;
5954
5955 if (inet6_fill_ifla6_attrs(skb, idev, 0) < 0)
5956 goto nla_put_failure;
5957
5958 nla_nest_end(skb, protoinfo);
5959 nlmsg_end(skb, nlh);
5960 return 0;
5961
5962 nla_put_failure:
5963 nlmsg_cancel(skb, nlh);
5964 return -EMSGSIZE;
5965 }
5966
5967 static int inet6_valid_dump_ifinfo(const struct nlmsghdr *nlh,
5968 struct netlink_ext_ack *extack)
5969 {
5970 struct ifinfomsg *ifm;
5971
5972 if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*ifm))) {
5973 NL_SET_ERR_MSG_MOD(extack, "Invalid header for link dump request");
5974 return -EINVAL;
5975 }
5976
5977 if (nlmsg_attrlen(nlh, sizeof(*ifm))) {
5978 NL_SET_ERR_MSG_MOD(extack, "Invalid data after header");
5979 return -EINVAL;
5980 }
5981
5982 ifm = nlmsg_data(nlh);
5983 if (ifm->__ifi_pad || ifm->ifi_type || ifm->ifi_flags ||
5984 ifm->ifi_change || ifm->ifi_index) {
5985 NL_SET_ERR_MSG_MOD(extack, "Invalid values in header for dump request");
5986 return -EINVAL;
5987 }
5988
5989 return 0;
5990 }
5991
5992 static int inet6_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
5993 {
5994 struct net *net = sock_net(skb->sk);
5995 int h, s_h;
5996 int idx = 0, s_idx;
5997 struct net_device *dev;
5998 struct inet6_dev *idev;
5999 struct hlist_head *head;
6000
6001
6002
6003
6004 if (cb->strict_check) {
6005 int err = inet6_valid_dump_ifinfo(cb->nlh, cb->extack);
6006
6007 if (err < 0)
6008 return err;
6009 }
6010
6011 s_h = cb->args[0];
6012 s_idx = cb->args[1];
6013
6014 rcu_read_lock();
6015 for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) {
6016 idx = 0;
6017 head = &net->dev_index_head[h];
6018 hlist_for_each_entry_rcu(dev, head, index_hlist) {
6019 if (idx < s_idx)
6020 goto cont;
6021 idev = __in6_dev_get(dev);
6022 if (!idev)
6023 goto cont;
6024 if (inet6_fill_ifinfo(skb, idev,
6025 NETLINK_CB(cb->skb).portid,
6026 cb->nlh->nlmsg_seq,
6027 RTM_NEWLINK, NLM_F_MULTI) < 0)
6028 goto out;
6029 cont:
6030 idx++;
6031 }
6032 }
6033 out:
6034 rcu_read_unlock();
6035 cb->args[1] = idx;
6036 cb->args[0] = h;
6037
6038 return skb->len;
6039 }
6040
6041 void inet6_ifinfo_notify(int event, struct inet6_dev *idev)
6042 {
6043 struct sk_buff *skb;
6044 struct net *net = dev_net(idev->dev);
6045 int err = -ENOBUFS;
6046
6047 skb = nlmsg_new(inet6_if_nlmsg_size(), GFP_ATOMIC);
6048 if (!skb)
6049 goto errout;
6050
6051 err = inet6_fill_ifinfo(skb, idev, 0, 0, event, 0);
6052 if (err < 0) {
6053
6054 WARN_ON(err == -EMSGSIZE);
6055 kfree_skb(skb);
6056 goto errout;
6057 }
6058 rtnl_notify(skb, net, 0, RTNLGRP_IPV6_IFINFO, NULL, GFP_ATOMIC);
6059 return;
6060 errout:
6061 if (err < 0)
6062 rtnl_set_sk_err(net, RTNLGRP_IPV6_IFINFO, err);
6063 }
6064
6065 static inline size_t inet6_prefix_nlmsg_size(void)
6066 {
6067 return NLMSG_ALIGN(sizeof(struct prefixmsg))
6068 + nla_total_size(sizeof(struct in6_addr))
6069 + nla_total_size(sizeof(struct prefix_cacheinfo));
6070 }
6071
6072 static int inet6_fill_prefix(struct sk_buff *skb, struct inet6_dev *idev,
6073 struct prefix_info *pinfo, u32 portid, u32 seq,
6074 int event, unsigned int flags)
6075 {
6076 struct prefixmsg *pmsg;
6077 struct nlmsghdr *nlh;
6078 struct prefix_cacheinfo ci;
6079
6080 nlh = nlmsg_put(skb, portid, seq, event, sizeof(*pmsg), flags);
6081 if (!nlh)
6082 return -EMSGSIZE;
6083
6084 pmsg = nlmsg_data(nlh);
6085 pmsg->prefix_family = AF_INET6;
6086 pmsg->prefix_pad1 = 0;
6087 pmsg->prefix_pad2 = 0;
6088 pmsg->prefix_ifindex = idev->dev->ifindex;
6089 pmsg->prefix_len = pinfo->prefix_len;
6090 pmsg->prefix_type = pinfo->type;
6091 pmsg->prefix_pad3 = 0;
6092 pmsg->prefix_flags = 0;
6093 if (pinfo->onlink)
6094 pmsg->prefix_flags |= IF_PREFIX_ONLINK;
6095 if (pinfo->autoconf)
6096 pmsg->prefix_flags |= IF_PREFIX_AUTOCONF;
6097
6098 if (nla_put(skb, PREFIX_ADDRESS, sizeof(pinfo->prefix), &pinfo->prefix))
6099 goto nla_put_failure;
6100 ci.preferred_time = ntohl(pinfo->prefered);
6101 ci.valid_time = ntohl(pinfo->valid);
6102 if (nla_put(skb, PREFIX_CACHEINFO, sizeof(ci), &ci))
6103 goto nla_put_failure;
6104 nlmsg_end(skb, nlh);
6105 return 0;
6106
6107 nla_put_failure:
6108 nlmsg_cancel(skb, nlh);
6109 return -EMSGSIZE;
6110 }
6111
6112 static void inet6_prefix_notify(int event, struct inet6_dev *idev,
6113 struct prefix_info *pinfo)
6114 {
6115 struct sk_buff *skb;
6116 struct net *net = dev_net(idev->dev);
6117 int err = -ENOBUFS;
6118
6119 skb = nlmsg_new(inet6_prefix_nlmsg_size(), GFP_ATOMIC);
6120 if (!skb)
6121 goto errout;
6122
6123 err = inet6_fill_prefix(skb, idev, pinfo, 0, 0, event, 0);
6124 if (err < 0) {
6125
6126 WARN_ON(err == -EMSGSIZE);
6127 kfree_skb(skb);
6128 goto errout;
6129 }
6130 rtnl_notify(skb, net, 0, RTNLGRP_IPV6_PREFIX, NULL, GFP_ATOMIC);
6131 return;
6132 errout:
6133 if (err < 0)
6134 rtnl_set_sk_err(net, RTNLGRP_IPV6_PREFIX, err);
6135 }
6136
6137 static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
6138 {
6139 struct net *net = dev_net(ifp->idev->dev);
6140
6141 if (event)
6142 ASSERT_RTNL();
6143
6144 inet6_ifa_notify(event ? : RTM_NEWADDR, ifp);
6145
6146 switch (event) {
6147 case RTM_NEWADDR:
6148
6149
6150
6151
6152
6153
6154
6155
6156 if (ifp->rt && !rcu_access_pointer(ifp->rt->fib6_node)) {
6157 ip6_ins_rt(net, ifp->rt);
6158 } else if (!ifp->rt && (ifp->idev->dev->flags & IFF_UP)) {
6159 pr_warn("BUG: Address %pI6c on device %s is missing its host route.\n",
6160 &ifp->addr, ifp->idev->dev->name);
6161 }
6162
6163 if (ifp->idev->cnf.forwarding)
6164 addrconf_join_anycast(ifp);
6165 if (!ipv6_addr_any(&ifp->peer_addr))
6166 addrconf_prefix_route(&ifp->peer_addr, 128,
6167 ifp->rt_priority, ifp->idev->dev,
6168 0, 0, GFP_ATOMIC);
6169 break;
6170 case RTM_DELADDR:
6171 if (ifp->idev->cnf.forwarding)
6172 addrconf_leave_anycast(ifp);
6173 addrconf_leave_solict(ifp->idev, &ifp->addr);
6174 if (!ipv6_addr_any(&ifp->peer_addr)) {
6175 struct fib6_info *rt;
6176
6177 rt = addrconf_get_prefix_route(&ifp->peer_addr, 128,
6178 ifp->idev->dev, 0, 0,
6179 false);
6180 if (rt)
6181 ip6_del_rt(net, rt, false);
6182 }
6183 if (ifp->rt) {
6184 ip6_del_rt(net, ifp->rt, false);
6185 ifp->rt = NULL;
6186 }
6187 rt_genid_bump_ipv6(net);
6188 break;
6189 }
6190 atomic_inc(&net->ipv6.dev_addr_genid);
6191 }
6192
6193 static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
6194 {
6195 if (likely(ifp->idev->dead == 0))
6196 __ipv6_ifa_notify(event, ifp);
6197 }
6198
6199 #ifdef CONFIG_SYSCTL
6200
6201 static int addrconf_sysctl_forward(struct ctl_table *ctl, int write,
6202 void *buffer, size_t *lenp, loff_t *ppos)
6203 {
6204 int *valp = ctl->data;
6205 int val = *valp;
6206 loff_t pos = *ppos;
6207 struct ctl_table lctl;
6208 int ret;
6209
6210
6211
6212
6213
6214 lctl = *ctl;
6215 lctl.data = &val;
6216
6217 ret = proc_dointvec(&lctl, write, buffer, lenp, ppos);
6218
6219 if (write)
6220 ret = addrconf_fixup_forwarding(ctl, valp, val);
6221 if (ret)
6222 *ppos = pos;
6223 return ret;
6224 }
6225
6226 static int addrconf_sysctl_mtu(struct ctl_table *ctl, int write,
6227 void *buffer, size_t *lenp, loff_t *ppos)
6228 {
6229 struct inet6_dev *idev = ctl->extra1;
6230 int min_mtu = IPV6_MIN_MTU;
6231 struct ctl_table lctl;
6232
6233 lctl = *ctl;
6234 lctl.extra1 = &min_mtu;
6235 lctl.extra2 = idev ? &idev->dev->mtu : NULL;
6236
6237 return proc_dointvec_minmax(&lctl, write, buffer, lenp, ppos);
6238 }
6239
6240 static void dev_disable_change(struct inet6_dev *idev)
6241 {
6242 struct netdev_notifier_info info;
6243
6244 if (!idev || !idev->dev)
6245 return;
6246
6247 netdev_notifier_info_init(&info, idev->dev);
6248 if (idev->cnf.disable_ipv6)
6249 addrconf_notify(NULL, NETDEV_DOWN, &info);
6250 else
6251 addrconf_notify(NULL, NETDEV_UP, &info);
6252 }
6253
6254 static void addrconf_disable_change(struct net *net, __s32 newf)
6255 {
6256 struct net_device *dev;
6257 struct inet6_dev *idev;
6258
6259 for_each_netdev(net, dev) {
6260 idev = __in6_dev_get(dev);
6261 if (idev) {
6262 int changed = (!idev->cnf.disable_ipv6) ^ (!newf);
6263 idev->cnf.disable_ipv6 = newf;
6264 if (changed)
6265 dev_disable_change(idev);
6266 }
6267 }
6268 }
6269
6270 static int addrconf_disable_ipv6(struct ctl_table *table, int *p, int newf)
6271 {
6272 struct net *net;
6273 int old;
6274
6275 if (!rtnl_trylock())
6276 return restart_syscall();
6277
6278 net = (struct net *)table->extra2;
6279 old = *p;
6280 *p = newf;
6281
6282 if (p == &net->ipv6.devconf_dflt->disable_ipv6) {
6283 rtnl_unlock();
6284 return 0;
6285 }
6286
6287 if (p == &net->ipv6.devconf_all->disable_ipv6) {
6288 net->ipv6.devconf_dflt->disable_ipv6 = newf;
6289 addrconf_disable_change(net, newf);
6290 } else if ((!newf) ^ (!old))
6291 dev_disable_change((struct inet6_dev *)table->extra1);
6292
6293 rtnl_unlock();
6294 return 0;
6295 }
6296
6297 static int addrconf_sysctl_disable(struct ctl_table *ctl, int write,
6298 void *buffer, size_t *lenp, loff_t *ppos)
6299 {
6300 int *valp = ctl->data;
6301 int val = *valp;
6302 loff_t pos = *ppos;
6303 struct ctl_table lctl;
6304 int ret;
6305
6306
6307
6308
6309
6310 lctl = *ctl;
6311 lctl.data = &val;
6312
6313 ret = proc_dointvec(&lctl, write, buffer, lenp, ppos);
6314
6315 if (write)
6316 ret = addrconf_disable_ipv6(ctl, valp, val);
6317 if (ret)
6318 *ppos = pos;
6319 return ret;
6320 }
6321
6322 static int addrconf_sysctl_proxy_ndp(struct ctl_table *ctl, int write,
6323 void *buffer, size_t *lenp, loff_t *ppos)
6324 {
6325 int *valp = ctl->data;
6326 int ret;
6327 int old, new;
6328
6329 old = *valp;
6330 ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
6331 new = *valp;
6332
6333 if (write && old != new) {
6334 struct net *net = ctl->extra2;
6335
6336 if (!rtnl_trylock())
6337 return restart_syscall();
6338
6339 if (valp == &net->ipv6.devconf_dflt->proxy_ndp)
6340 inet6_netconf_notify_devconf(net, RTM_NEWNETCONF,
6341 NETCONFA_PROXY_NEIGH,
6342 NETCONFA_IFINDEX_DEFAULT,
6343 net->ipv6.devconf_dflt);
6344 else if (valp == &net->ipv6.devconf_all->proxy_ndp)
6345 inet6_netconf_notify_devconf(net, RTM_NEWNETCONF,
6346 NETCONFA_PROXY_NEIGH,
6347 NETCONFA_IFINDEX_ALL,
6348 net->ipv6.devconf_all);
6349 else {
6350 struct inet6_dev *idev = ctl->extra1;
6351
6352 inet6_netconf_notify_devconf(net, RTM_NEWNETCONF,
6353 NETCONFA_PROXY_NEIGH,
6354 idev->dev->ifindex,
6355 &idev->cnf);
6356 }
6357 rtnl_unlock();
6358 }
6359
6360 return ret;
6361 }
6362
6363 static int addrconf_sysctl_addr_gen_mode(struct ctl_table *ctl, int write,
6364 void *buffer, size_t *lenp,
6365 loff_t *ppos)
6366 {
6367 int ret = 0;
6368 u32 new_val;
6369 struct inet6_dev *idev = (struct inet6_dev *)ctl->extra1;
6370 struct net *net = (struct net *)ctl->extra2;
6371 struct ctl_table tmp = {
6372 .data = &new_val,
6373 .maxlen = sizeof(new_val),
6374 .mode = ctl->mode,
6375 };
6376
6377 if (!rtnl_trylock())
6378 return restart_syscall();
6379
6380 new_val = *((u32 *)ctl->data);
6381
6382 ret = proc_douintvec(&tmp, write, buffer, lenp, ppos);
6383 if (ret != 0)
6384 goto out;
6385
6386 if (write) {
6387 if (check_addr_gen_mode(new_val) < 0) {
6388 ret = -EINVAL;
6389 goto out;
6390 }
6391
6392 if (idev) {
6393 if (check_stable_privacy(idev, net, new_val) < 0) {
6394 ret = -EINVAL;
6395 goto out;
6396 }
6397
6398 if (idev->cnf.addr_gen_mode != new_val) {
6399 idev->cnf.addr_gen_mode = new_val;
6400 addrconf_dev_config(idev->dev);
6401 }
6402 } else if (&net->ipv6.devconf_all->addr_gen_mode == ctl->data) {
6403 struct net_device *dev;
6404
6405 net->ipv6.devconf_dflt->addr_gen_mode = new_val;
6406 for_each_netdev(net, dev) {
6407 idev = __in6_dev_get(dev);
6408 if (idev &&
6409 idev->cnf.addr_gen_mode != new_val) {
6410 idev->cnf.addr_gen_mode = new_val;
6411 addrconf_dev_config(idev->dev);
6412 }
6413 }
6414 }
6415
6416 *((u32 *)ctl->data) = new_val;
6417 }
6418
6419 out:
6420 rtnl_unlock();
6421
6422 return ret;
6423 }
6424
6425 static int addrconf_sysctl_stable_secret(struct ctl_table *ctl, int write,
6426 void *buffer, size_t *lenp,
6427 loff_t *ppos)
6428 {
6429 int err;
6430 struct in6_addr addr;
6431 char str[IPV6_MAX_STRLEN];
6432 struct ctl_table lctl = *ctl;
6433 struct net *net = ctl->extra2;
6434 struct ipv6_stable_secret *secret = ctl->data;
6435
6436 if (&net->ipv6.devconf_all->stable_secret == ctl->data)
6437 return -EIO;
6438
6439 lctl.maxlen = IPV6_MAX_STRLEN;
6440 lctl.data = str;
6441
6442 if (!rtnl_trylock())
6443 return restart_syscall();
6444
6445 if (!write && !secret->initialized) {
6446 err = -EIO;
6447 goto out;
6448 }
6449
6450 err = snprintf(str, sizeof(str), "%pI6", &secret->secret);
6451 if (err >= sizeof(str)) {
6452 err = -EIO;
6453 goto out;
6454 }
6455
6456 err = proc_dostring(&lctl, write, buffer, lenp, ppos);
6457 if (err || !write)
6458 goto out;
6459
6460 if (in6_pton(str, -1, addr.in6_u.u6_addr8, -1, NULL) != 1) {
6461 err = -EIO;
6462 goto out;
6463 }
6464
6465 secret->initialized = true;
6466 secret->secret = addr;
6467
6468 if (&net->ipv6.devconf_dflt->stable_secret == ctl->data) {
6469 struct net_device *dev;
6470
6471 for_each_netdev(net, dev) {
6472 struct inet6_dev *idev = __in6_dev_get(dev);
6473
6474 if (idev) {
6475 idev->cnf.addr_gen_mode =
6476 IN6_ADDR_GEN_MODE_STABLE_PRIVACY;
6477 }
6478 }
6479 } else {
6480 struct inet6_dev *idev = ctl->extra1;
6481
6482 idev->cnf.addr_gen_mode = IN6_ADDR_GEN_MODE_STABLE_PRIVACY;
6483 }
6484
6485 out:
6486 rtnl_unlock();
6487
6488 return err;
6489 }
6490
6491 static
6492 int addrconf_sysctl_ignore_routes_with_linkdown(struct ctl_table *ctl,
6493 int write, void *buffer,
6494 size_t *lenp,
6495 loff_t *ppos)
6496 {
6497 int *valp = ctl->data;
6498 int val = *valp;
6499 loff_t pos = *ppos;
6500 struct ctl_table lctl;
6501 int ret;
6502
6503
6504
6505
6506 lctl = *ctl;
6507 lctl.data = &val;
6508
6509 ret = proc_dointvec(&lctl, write, buffer, lenp, ppos);
6510
6511 if (write)
6512 ret = addrconf_fixup_linkdown(ctl, valp, val);
6513 if (ret)
6514 *ppos = pos;
6515 return ret;
6516 }
6517
6518 static
6519 void addrconf_set_nopolicy(struct rt6_info *rt, int action)
6520 {
6521 if (rt) {
6522 if (action)
6523 rt->dst.flags |= DST_NOPOLICY;
6524 else
6525 rt->dst.flags &= ~DST_NOPOLICY;
6526 }
6527 }
6528
6529 static
6530 void addrconf_disable_policy_idev(struct inet6_dev *idev, int val)
6531 {
6532 struct inet6_ifaddr *ifa;
6533
6534 read_lock_bh(&idev->lock);
6535 list_for_each_entry(ifa, &idev->addr_list, if_list) {
6536 spin_lock(&ifa->lock);
6537 if (ifa->rt) {
6538
6539 struct fib6_nh *nh = ifa->rt->fib6_nh;
6540 int cpu;
6541
6542 rcu_read_lock();
6543 ifa->rt->dst_nopolicy = val ? true : false;
6544 if (nh->rt6i_pcpu) {
6545 for_each_possible_cpu(cpu) {
6546 struct rt6_info **rtp;
6547
6548 rtp = per_cpu_ptr(nh->rt6i_pcpu, cpu);
6549 addrconf_set_nopolicy(*rtp, val);
6550 }
6551 }
6552 rcu_read_unlock();
6553 }
6554 spin_unlock(&ifa->lock);
6555 }
6556 read_unlock_bh(&idev->lock);
6557 }
6558
6559 static
6560 int addrconf_disable_policy(struct ctl_table *ctl, int *valp, int val)
6561 {
6562 struct inet6_dev *idev;
6563 struct net *net;
6564
6565 if (!rtnl_trylock())
6566 return restart_syscall();
6567
6568 *valp = val;
6569
6570 net = (struct net *)ctl->extra2;
6571 if (valp == &net->ipv6.devconf_dflt->disable_policy) {
6572 rtnl_unlock();
6573 return 0;
6574 }
6575
6576 if (valp == &net->ipv6.devconf_all->disable_policy) {
6577 struct net_device *dev;
6578
6579 for_each_netdev(net, dev) {
6580 idev = __in6_dev_get(dev);
6581 if (idev)
6582 addrconf_disable_policy_idev(idev, val);
6583 }
6584 } else {
6585 idev = (struct inet6_dev *)ctl->extra1;
6586 addrconf_disable_policy_idev(idev, val);
6587 }
6588
6589 rtnl_unlock();
6590 return 0;
6591 }
6592
6593 static int addrconf_sysctl_disable_policy(struct ctl_table *ctl, int write,
6594 void *buffer, size_t *lenp, loff_t *ppos)
6595 {
6596 int *valp = ctl->data;
6597 int val = *valp;
6598 loff_t pos = *ppos;
6599 struct ctl_table lctl;
6600 int ret;
6601
6602 lctl = *ctl;
6603 lctl.data = &val;
6604 ret = proc_dointvec(&lctl, write, buffer, lenp, ppos);
6605
6606 if (write && (*valp != val))
6607 ret = addrconf_disable_policy(ctl, valp, val);
6608
6609 if (ret)
6610 *ppos = pos;
6611
6612 return ret;
6613 }
6614
6615 static int minus_one = -1;
6616 static const int two_five_five = 255;
6617 static u32 ioam6_if_id_max = U16_MAX;
6618
6619 static const struct ctl_table addrconf_sysctl[] = {
6620 {
6621 .procname = "forwarding",
6622 .data = &ipv6_devconf.forwarding,
6623 .maxlen = sizeof(int),
6624 .mode = 0644,
6625 .proc_handler = addrconf_sysctl_forward,
6626 },
6627 {
6628 .procname = "hop_limit",
6629 .data = &ipv6_devconf.hop_limit,
6630 .maxlen = sizeof(int),
6631 .mode = 0644,
6632 .proc_handler = proc_dointvec_minmax,
6633 .extra1 = (void *)SYSCTL_ONE,
6634 .extra2 = (void *)&two_five_five,
6635 },
6636 {
6637 .procname = "mtu",
6638 .data = &ipv6_devconf.mtu6,
6639 .maxlen = sizeof(int),
6640 .mode = 0644,
6641 .proc_handler = addrconf_sysctl_mtu,
6642 },
6643 {
6644 .procname = "accept_ra",
6645 .data = &ipv6_devconf.accept_ra,
6646 .maxlen = sizeof(int),
6647 .mode = 0644,
6648 .proc_handler = proc_dointvec,
6649 },
6650 {
6651 .procname = "accept_redirects",
6652 .data = &ipv6_devconf.accept_redirects,
6653 .maxlen = sizeof(int),
6654 .mode = 0644,
6655 .proc_handler = proc_dointvec,
6656 },
6657 {
6658 .procname = "autoconf",
6659 .data = &ipv6_devconf.autoconf,
6660 .maxlen = sizeof(int),
6661 .mode = 0644,
6662 .proc_handler = proc_dointvec,
6663 },
6664 {
6665 .procname = "dad_transmits",
6666 .data = &ipv6_devconf.dad_transmits,
6667 .maxlen = sizeof(int),
6668 .mode = 0644,
6669 .proc_handler = proc_dointvec,
6670 },
6671 {
6672 .procname = "router_solicitations",
6673 .data = &ipv6_devconf.rtr_solicits,
6674 .maxlen = sizeof(int),
6675 .mode = 0644,
6676 .proc_handler = proc_dointvec_minmax,
6677 .extra1 = &minus_one,
6678 },
6679 {
6680 .procname = "router_solicitation_interval",
6681 .data = &ipv6_devconf.rtr_solicit_interval,
6682 .maxlen = sizeof(int),
6683 .mode = 0644,
6684 .proc_handler = proc_dointvec_jiffies,
6685 },
6686 {
6687 .procname = "router_solicitation_max_interval",
6688 .data = &ipv6_devconf.rtr_solicit_max_interval,
6689 .maxlen = sizeof(int),
6690 .mode = 0644,
6691 .proc_handler = proc_dointvec_jiffies,
6692 },
6693 {
6694 .procname = "router_solicitation_delay",
6695 .data = &ipv6_devconf.rtr_solicit_delay,
6696 .maxlen = sizeof(int),
6697 .mode = 0644,
6698 .proc_handler = proc_dointvec_jiffies,
6699 },
6700 {
6701 .procname = "force_mld_version",
6702 .data = &ipv6_devconf.force_mld_version,
6703 .maxlen = sizeof(int),
6704 .mode = 0644,
6705 .proc_handler = proc_dointvec,
6706 },
6707 {
6708 .procname = "mldv1_unsolicited_report_interval",
6709 .data =
6710 &ipv6_devconf.mldv1_unsolicited_report_interval,
6711 .maxlen = sizeof(int),
6712 .mode = 0644,
6713 .proc_handler = proc_dointvec_ms_jiffies,
6714 },
6715 {
6716 .procname = "mldv2_unsolicited_report_interval",
6717 .data =
6718 &ipv6_devconf.mldv2_unsolicited_report_interval,
6719 .maxlen = sizeof(int),
6720 .mode = 0644,
6721 .proc_handler = proc_dointvec_ms_jiffies,
6722 },
6723 {
6724 .procname = "use_tempaddr",
6725 .data = &ipv6_devconf.use_tempaddr,
6726 .maxlen = sizeof(int),
6727 .mode = 0644,
6728 .proc_handler = proc_dointvec,
6729 },
6730 {
6731 .procname = "temp_valid_lft",
6732 .data = &ipv6_devconf.temp_valid_lft,
6733 .maxlen = sizeof(int),
6734 .mode = 0644,
6735 .proc_handler = proc_dointvec,
6736 },
6737 {
6738 .procname = "temp_prefered_lft",
6739 .data = &ipv6_devconf.temp_prefered_lft,
6740 .maxlen = sizeof(int),
6741 .mode = 0644,
6742 .proc_handler = proc_dointvec,
6743 },
6744 {
6745 .procname = "regen_max_retry",
6746 .data = &ipv6_devconf.regen_max_retry,
6747 .maxlen = sizeof(int),
6748 .mode = 0644,
6749 .proc_handler = proc_dointvec,
6750 },
6751 {
6752 .procname = "max_desync_factor",
6753 .data = &ipv6_devconf.max_desync_factor,
6754 .maxlen = sizeof(int),
6755 .mode = 0644,
6756 .proc_handler = proc_dointvec,
6757 },
6758 {
6759 .procname = "max_addresses",
6760 .data = &ipv6_devconf.max_addresses,
6761 .maxlen = sizeof(int),
6762 .mode = 0644,
6763 .proc_handler = proc_dointvec,
6764 },
6765 {
6766 .procname = "accept_ra_defrtr",
6767 .data = &ipv6_devconf.accept_ra_defrtr,
6768 .maxlen = sizeof(int),
6769 .mode = 0644,
6770 .proc_handler = proc_dointvec,
6771 },
6772 {
6773 .procname = "ra_defrtr_metric",
6774 .data = &ipv6_devconf.ra_defrtr_metric,
6775 .maxlen = sizeof(u32),
6776 .mode = 0644,
6777 .proc_handler = proc_douintvec_minmax,
6778 .extra1 = (void *)SYSCTL_ONE,
6779 },
6780 {
6781 .procname = "accept_ra_min_hop_limit",
6782 .data = &ipv6_devconf.accept_ra_min_hop_limit,
6783 .maxlen = sizeof(int),
6784 .mode = 0644,
6785 .proc_handler = proc_dointvec,
6786 },
6787 {
6788 .procname = "accept_ra_pinfo",
6789 .data = &ipv6_devconf.accept_ra_pinfo,
6790 .maxlen = sizeof(int),
6791 .mode = 0644,
6792 .proc_handler = proc_dointvec,
6793 },
6794 #ifdef CONFIG_IPV6_ROUTER_PREF
6795 {
6796 .procname = "accept_ra_rtr_pref",
6797 .data = &ipv6_devconf.accept_ra_rtr_pref,
6798 .maxlen = sizeof(int),
6799 .mode = 0644,
6800 .proc_handler = proc_dointvec,
6801 },
6802 {
6803 .procname = "router_probe_interval",
6804 .data = &ipv6_devconf.rtr_probe_interval,
6805 .maxlen = sizeof(int),
6806 .mode = 0644,
6807 .proc_handler = proc_dointvec_jiffies,
6808 },
6809 #ifdef CONFIG_IPV6_ROUTE_INFO
6810 {
6811 .procname = "accept_ra_rt_info_min_plen",
6812 .data = &ipv6_devconf.accept_ra_rt_info_min_plen,
6813 .maxlen = sizeof(int),
6814 .mode = 0644,
6815 .proc_handler = proc_dointvec,
6816 },
6817 {
6818 .procname = "accept_ra_rt_info_max_plen",
6819 .data = &ipv6_devconf.accept_ra_rt_info_max_plen,
6820 .maxlen = sizeof(int),
6821 .mode = 0644,
6822 .proc_handler = proc_dointvec,
6823 },
6824 #endif
6825 #endif
6826 {
6827 .procname = "proxy_ndp",
6828 .data = &ipv6_devconf.proxy_ndp,
6829 .maxlen = sizeof(int),
6830 .mode = 0644,
6831 .proc_handler = addrconf_sysctl_proxy_ndp,
6832 },
6833 {
6834 .procname = "accept_source_route",
6835 .data = &ipv6_devconf.accept_source_route,
6836 .maxlen = sizeof(int),
6837 .mode = 0644,
6838 .proc_handler = proc_dointvec,
6839 },
6840 #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
6841 {
6842 .procname = "optimistic_dad",
6843 .data = &ipv6_devconf.optimistic_dad,
6844 .maxlen = sizeof(int),
6845 .mode = 0644,
6846 .proc_handler = proc_dointvec,
6847 },
6848 {
6849 .procname = "use_optimistic",
6850 .data = &ipv6_devconf.use_optimistic,
6851 .maxlen = sizeof(int),
6852 .mode = 0644,
6853 .proc_handler = proc_dointvec,
6854 },
6855 #endif
6856 #ifdef CONFIG_IPV6_MROUTE
6857 {
6858 .procname = "mc_forwarding",
6859 .data = &ipv6_devconf.mc_forwarding,
6860 .maxlen = sizeof(int),
6861 .mode = 0444,
6862 .proc_handler = proc_dointvec,
6863 },
6864 #endif
6865 {
6866 .procname = "disable_ipv6",
6867 .data = &ipv6_devconf.disable_ipv6,
6868 .maxlen = sizeof(int),
6869 .mode = 0644,
6870 .proc_handler = addrconf_sysctl_disable,
6871 },
6872 {
6873 .procname = "accept_dad",
6874 .data = &ipv6_devconf.accept_dad,
6875 .maxlen = sizeof(int),
6876 .mode = 0644,
6877 .proc_handler = proc_dointvec,
6878 },
6879 {
6880 .procname = "force_tllao",
6881 .data = &ipv6_devconf.force_tllao,
6882 .maxlen = sizeof(int),
6883 .mode = 0644,
6884 .proc_handler = proc_dointvec
6885 },
6886 {
6887 .procname = "ndisc_notify",
6888 .data = &ipv6_devconf.ndisc_notify,
6889 .maxlen = sizeof(int),
6890 .mode = 0644,
6891 .proc_handler = proc_dointvec
6892 },
6893 {
6894 .procname = "suppress_frag_ndisc",
6895 .data = &ipv6_devconf.suppress_frag_ndisc,
6896 .maxlen = sizeof(int),
6897 .mode = 0644,
6898 .proc_handler = proc_dointvec
6899 },
6900 {
6901 .procname = "accept_ra_from_local",
6902 .data = &ipv6_devconf.accept_ra_from_local,
6903 .maxlen = sizeof(int),
6904 .mode = 0644,
6905 .proc_handler = proc_dointvec,
6906 },
6907 {
6908 .procname = "accept_ra_mtu",
6909 .data = &ipv6_devconf.accept_ra_mtu,
6910 .maxlen = sizeof(int),
6911 .mode = 0644,
6912 .proc_handler = proc_dointvec,
6913 },
6914 {
6915 .procname = "stable_secret",
6916 .data = &ipv6_devconf.stable_secret,
6917 .maxlen = IPV6_MAX_STRLEN,
6918 .mode = 0600,
6919 .proc_handler = addrconf_sysctl_stable_secret,
6920 },
6921 {
6922 .procname = "use_oif_addrs_only",
6923 .data = &ipv6_devconf.use_oif_addrs_only,
6924 .maxlen = sizeof(int),
6925 .mode = 0644,
6926 .proc_handler = proc_dointvec,
6927 },
6928 {
6929 .procname = "ignore_routes_with_linkdown",
6930 .data = &ipv6_devconf.ignore_routes_with_linkdown,
6931 .maxlen = sizeof(int),
6932 .mode = 0644,
6933 .proc_handler = addrconf_sysctl_ignore_routes_with_linkdown,
6934 },
6935 {
6936 .procname = "drop_unicast_in_l2_multicast",
6937 .data = &ipv6_devconf.drop_unicast_in_l2_multicast,
6938 .maxlen = sizeof(int),
6939 .mode = 0644,
6940 .proc_handler = proc_dointvec,
6941 },
6942 {
6943 .procname = "drop_unsolicited_na",
6944 .data = &ipv6_devconf.drop_unsolicited_na,
6945 .maxlen = sizeof(int),
6946 .mode = 0644,
6947 .proc_handler = proc_dointvec,
6948 },
6949 {
6950 .procname = "keep_addr_on_down",
6951 .data = &ipv6_devconf.keep_addr_on_down,
6952 .maxlen = sizeof(int),
6953 .mode = 0644,
6954 .proc_handler = proc_dointvec,
6955
6956 },
6957 {
6958 .procname = "seg6_enabled",
6959 .data = &ipv6_devconf.seg6_enabled,
6960 .maxlen = sizeof(int),
6961 .mode = 0644,
6962 .proc_handler = proc_dointvec,
6963 },
6964 #ifdef CONFIG_IPV6_SEG6_HMAC
6965 {
6966 .procname = "seg6_require_hmac",
6967 .data = &ipv6_devconf.seg6_require_hmac,
6968 .maxlen = sizeof(int),
6969 .mode = 0644,
6970 .proc_handler = proc_dointvec,
6971 },
6972 #endif
6973 {
6974 .procname = "enhanced_dad",
6975 .data = &ipv6_devconf.enhanced_dad,
6976 .maxlen = sizeof(int),
6977 .mode = 0644,
6978 .proc_handler = proc_dointvec,
6979 },
6980 {
6981 .procname = "addr_gen_mode",
6982 .data = &ipv6_devconf.addr_gen_mode,
6983 .maxlen = sizeof(int),
6984 .mode = 0644,
6985 .proc_handler = addrconf_sysctl_addr_gen_mode,
6986 },
6987 {
6988 .procname = "disable_policy",
6989 .data = &ipv6_devconf.disable_policy,
6990 .maxlen = sizeof(int),
6991 .mode = 0644,
6992 .proc_handler = addrconf_sysctl_disable_policy,
6993 },
6994 {
6995 .procname = "ndisc_tclass",
6996 .data = &ipv6_devconf.ndisc_tclass,
6997 .maxlen = sizeof(int),
6998 .mode = 0644,
6999 .proc_handler = proc_dointvec_minmax,
7000 .extra1 = (void *)SYSCTL_ZERO,
7001 .extra2 = (void *)&two_five_five,
7002 },
7003 {
7004 .procname = "rpl_seg_enabled",
7005 .data = &ipv6_devconf.rpl_seg_enabled,
7006 .maxlen = sizeof(int),
7007 .mode = 0644,
7008 .proc_handler = proc_dointvec,
7009 },
7010 {
7011 .procname = "ioam6_enabled",
7012 .data = &ipv6_devconf.ioam6_enabled,
7013 .maxlen = sizeof(u8),
7014 .mode = 0644,
7015 .proc_handler = proc_dou8vec_minmax,
7016 .extra1 = (void *)SYSCTL_ZERO,
7017 .extra2 = (void *)SYSCTL_ONE,
7018 },
7019 {
7020 .procname = "ioam6_id",
7021 .data = &ipv6_devconf.ioam6_id,
7022 .maxlen = sizeof(u32),
7023 .mode = 0644,
7024 .proc_handler = proc_douintvec_minmax,
7025 .extra1 = (void *)SYSCTL_ZERO,
7026 .extra2 = (void *)&ioam6_if_id_max,
7027 },
7028 {
7029 .procname = "ioam6_id_wide",
7030 .data = &ipv6_devconf.ioam6_id_wide,
7031 .maxlen = sizeof(u32),
7032 .mode = 0644,
7033 .proc_handler = proc_douintvec,
7034 },
7035 {
7036 .procname = "ndisc_evict_nocarrier",
7037 .data = &ipv6_devconf.ndisc_evict_nocarrier,
7038 .maxlen = sizeof(u8),
7039 .mode = 0644,
7040 .proc_handler = proc_dou8vec_minmax,
7041 .extra1 = (void *)SYSCTL_ZERO,
7042 .extra2 = (void *)SYSCTL_ONE,
7043 },
7044 {
7045 .procname = "accept_untracked_na",
7046 .data = &ipv6_devconf.accept_untracked_na,
7047 .maxlen = sizeof(int),
7048 .mode = 0644,
7049 .proc_handler = proc_dointvec_minmax,
7050 .extra1 = SYSCTL_ZERO,
7051 .extra2 = SYSCTL_TWO,
7052 },
7053 {
7054
7055 }
7056 };
7057
7058 static int __addrconf_sysctl_register(struct net *net, char *dev_name,
7059 struct inet6_dev *idev, struct ipv6_devconf *p)
7060 {
7061 int i, ifindex;
7062 struct ctl_table *table;
7063 char path[sizeof("net/ipv6/conf/") + IFNAMSIZ];
7064
7065 table = kmemdup(addrconf_sysctl, sizeof(addrconf_sysctl), GFP_KERNEL_ACCOUNT);
7066 if (!table)
7067 goto out;
7068
7069 for (i = 0; table[i].data; i++) {
7070 table[i].data += (char *)p - (char *)&ipv6_devconf;
7071
7072
7073
7074
7075 if (!table[i].extra1 && !table[i].extra2) {
7076 table[i].extra1 = idev;
7077 table[i].extra2 = net;
7078 }
7079 }
7080
7081 snprintf(path, sizeof(path), "net/ipv6/conf/%s", dev_name);
7082
7083 p->sysctl_header = register_net_sysctl(net, path, table);
7084 if (!p->sysctl_header)
7085 goto free;
7086
7087 if (!strcmp(dev_name, "all"))
7088 ifindex = NETCONFA_IFINDEX_ALL;
7089 else if (!strcmp(dev_name, "default"))
7090 ifindex = NETCONFA_IFINDEX_DEFAULT;
7091 else
7092 ifindex = idev->dev->ifindex;
7093 inet6_netconf_notify_devconf(net, RTM_NEWNETCONF, NETCONFA_ALL,
7094 ifindex, p);
7095 return 0;
7096
7097 free:
7098 kfree(table);
7099 out:
7100 return -ENOBUFS;
7101 }
7102
7103 static void __addrconf_sysctl_unregister(struct net *net,
7104 struct ipv6_devconf *p, int ifindex)
7105 {
7106 struct ctl_table *table;
7107
7108 if (!p->sysctl_header)
7109 return;
7110
7111 table = p->sysctl_header->ctl_table_arg;
7112 unregister_net_sysctl_table(p->sysctl_header);
7113 p->sysctl_header = NULL;
7114 kfree(table);
7115
7116 inet6_netconf_notify_devconf(net, RTM_DELNETCONF, 0, ifindex, NULL);
7117 }
7118
7119 static int addrconf_sysctl_register(struct inet6_dev *idev)
7120 {
7121 int err;
7122
7123 if (!sysctl_dev_name_is_allowed(idev->dev->name))
7124 return -EINVAL;
7125
7126 err = neigh_sysctl_register(idev->dev, idev->nd_parms,
7127 &ndisc_ifinfo_sysctl_change);
7128 if (err)
7129 return err;
7130 err = __addrconf_sysctl_register(dev_net(idev->dev), idev->dev->name,
7131 idev, &idev->cnf);
7132 if (err)
7133 neigh_sysctl_unregister(idev->nd_parms);
7134
7135 return err;
7136 }
7137
7138 static void addrconf_sysctl_unregister(struct inet6_dev *idev)
7139 {
7140 __addrconf_sysctl_unregister(dev_net(idev->dev), &idev->cnf,
7141 idev->dev->ifindex);
7142 neigh_sysctl_unregister(idev->nd_parms);
7143 }
7144
7145
7146 #endif
7147
7148 static int __net_init addrconf_init_net(struct net *net)
7149 {
7150 int err = -ENOMEM;
7151 struct ipv6_devconf *all, *dflt;
7152
7153 spin_lock_init(&net->ipv6.addrconf_hash_lock);
7154 INIT_DEFERRABLE_WORK(&net->ipv6.addr_chk_work, addrconf_verify_work);
7155 net->ipv6.inet6_addr_lst = kcalloc(IN6_ADDR_HSIZE,
7156 sizeof(struct hlist_head),
7157 GFP_KERNEL);
7158 if (!net->ipv6.inet6_addr_lst)
7159 goto err_alloc_addr;
7160
7161 all = kmemdup(&ipv6_devconf, sizeof(ipv6_devconf), GFP_KERNEL);
7162 if (!all)
7163 goto err_alloc_all;
7164
7165 dflt = kmemdup(&ipv6_devconf_dflt, sizeof(ipv6_devconf_dflt), GFP_KERNEL);
7166 if (!dflt)
7167 goto err_alloc_dflt;
7168
7169 if (!net_eq(net, &init_net)) {
7170 switch (net_inherit_devconf()) {
7171 case 1:
7172 memcpy(all, init_net.ipv6.devconf_all,
7173 sizeof(ipv6_devconf));
7174 memcpy(dflt, init_net.ipv6.devconf_dflt,
7175 sizeof(ipv6_devconf_dflt));
7176 break;
7177 case 3:
7178 memcpy(all, current->nsproxy->net_ns->ipv6.devconf_all,
7179 sizeof(ipv6_devconf));
7180 memcpy(dflt,
7181 current->nsproxy->net_ns->ipv6.devconf_dflt,
7182 sizeof(ipv6_devconf_dflt));
7183 break;
7184 case 0:
7185 case 2:
7186
7187 break;
7188 }
7189 }
7190
7191
7192 dflt->autoconf = ipv6_defaults.autoconf;
7193 dflt->disable_ipv6 = ipv6_defaults.disable_ipv6;
7194
7195 dflt->stable_secret.initialized = false;
7196 all->stable_secret.initialized = false;
7197
7198 net->ipv6.devconf_all = all;
7199 net->ipv6.devconf_dflt = dflt;
7200
7201 #ifdef CONFIG_SYSCTL
7202 err = __addrconf_sysctl_register(net, "all", NULL, all);
7203 if (err < 0)
7204 goto err_reg_all;
7205
7206 err = __addrconf_sysctl_register(net, "default", NULL, dflt);
7207 if (err < 0)
7208 goto err_reg_dflt;
7209 #endif
7210 return 0;
7211
7212 #ifdef CONFIG_SYSCTL
7213 err_reg_dflt:
7214 __addrconf_sysctl_unregister(net, all, NETCONFA_IFINDEX_ALL);
7215 err_reg_all:
7216 kfree(dflt);
7217 #endif
7218 err_alloc_dflt:
7219 kfree(all);
7220 err_alloc_all:
7221 kfree(net->ipv6.inet6_addr_lst);
7222 err_alloc_addr:
7223 return err;
7224 }
7225
7226 static void __net_exit addrconf_exit_net(struct net *net)
7227 {
7228 int i;
7229
7230 #ifdef CONFIG_SYSCTL
7231 __addrconf_sysctl_unregister(net, net->ipv6.devconf_dflt,
7232 NETCONFA_IFINDEX_DEFAULT);
7233 __addrconf_sysctl_unregister(net, net->ipv6.devconf_all,
7234 NETCONFA_IFINDEX_ALL);
7235 #endif
7236 kfree(net->ipv6.devconf_dflt);
7237 net->ipv6.devconf_dflt = NULL;
7238 kfree(net->ipv6.devconf_all);
7239 net->ipv6.devconf_all = NULL;
7240
7241 cancel_delayed_work_sync(&net->ipv6.addr_chk_work);
7242
7243
7244
7245 for (i = 0; i < IN6_ADDR_HSIZE; i++)
7246 WARN_ON_ONCE(!hlist_empty(&net->ipv6.inet6_addr_lst[i]));
7247
7248 kfree(net->ipv6.inet6_addr_lst);
7249 net->ipv6.inet6_addr_lst = NULL;
7250 }
7251
7252 static struct pernet_operations addrconf_ops = {
7253 .init = addrconf_init_net,
7254 .exit = addrconf_exit_net,
7255 };
7256
7257 static struct rtnl_af_ops inet6_ops __read_mostly = {
7258 .family = AF_INET6,
7259 .fill_link_af = inet6_fill_link_af,
7260 .get_link_af_size = inet6_get_link_af_size,
7261 .validate_link_af = inet6_validate_link_af,
7262 .set_link_af = inet6_set_link_af,
7263 };
7264
7265
7266
7267
7268
7269 int __init addrconf_init(void)
7270 {
7271 struct inet6_dev *idev;
7272 int err;
7273
7274 err = ipv6_addr_label_init();
7275 if (err < 0) {
7276 pr_crit("%s: cannot initialize default policy table: %d\n",
7277 __func__, err);
7278 goto out;
7279 }
7280
7281 err = register_pernet_subsys(&addrconf_ops);
7282 if (err < 0)
7283 goto out_addrlabel;
7284
7285 addrconf_wq = create_workqueue("ipv6_addrconf");
7286 if (!addrconf_wq) {
7287 err = -ENOMEM;
7288 goto out_nowq;
7289 }
7290
7291 rtnl_lock();
7292 idev = ipv6_add_dev(blackhole_netdev);
7293 rtnl_unlock();
7294 if (IS_ERR(idev)) {
7295 err = PTR_ERR(idev);
7296 goto errlo;
7297 }
7298
7299 ip6_route_init_special_entries();
7300
7301 register_netdevice_notifier(&ipv6_dev_notf);
7302
7303 addrconf_verify(&init_net);
7304
7305 rtnl_af_register(&inet6_ops);
7306
7307 err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETLINK,
7308 NULL, inet6_dump_ifinfo, 0);
7309 if (err < 0)
7310 goto errout;
7311
7312 err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_NEWADDR,
7313 inet6_rtm_newaddr, NULL, 0);
7314 if (err < 0)
7315 goto errout;
7316 err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_DELADDR,
7317 inet6_rtm_deladdr, NULL, 0);
7318 if (err < 0)
7319 goto errout;
7320 err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETADDR,
7321 inet6_rtm_getaddr, inet6_dump_ifaddr,
7322 RTNL_FLAG_DOIT_UNLOCKED);
7323 if (err < 0)
7324 goto errout;
7325 err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETMULTICAST,
7326 NULL, inet6_dump_ifmcaddr, 0);
7327 if (err < 0)
7328 goto errout;
7329 err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETANYCAST,
7330 NULL, inet6_dump_ifacaddr, 0);
7331 if (err < 0)
7332 goto errout;
7333 err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETNETCONF,
7334 inet6_netconf_get_devconf,
7335 inet6_netconf_dump_devconf,
7336 RTNL_FLAG_DOIT_UNLOCKED);
7337 if (err < 0)
7338 goto errout;
7339 err = ipv6_addr_label_rtnl_register();
7340 if (err < 0)
7341 goto errout;
7342
7343 return 0;
7344 errout:
7345 rtnl_unregister_all(PF_INET6);
7346 rtnl_af_unregister(&inet6_ops);
7347 unregister_netdevice_notifier(&ipv6_dev_notf);
7348 errlo:
7349 destroy_workqueue(addrconf_wq);
7350 out_nowq:
7351 unregister_pernet_subsys(&addrconf_ops);
7352 out_addrlabel:
7353 ipv6_addr_label_cleanup();
7354 out:
7355 return err;
7356 }
7357
7358 void addrconf_cleanup(void)
7359 {
7360 struct net_device *dev;
7361
7362 unregister_netdevice_notifier(&ipv6_dev_notf);
7363 unregister_pernet_subsys(&addrconf_ops);
7364 ipv6_addr_label_cleanup();
7365
7366 rtnl_af_unregister(&inet6_ops);
7367
7368 rtnl_lock();
7369
7370
7371 for_each_netdev(&init_net, dev) {
7372 if (__in6_dev_get(dev) == NULL)
7373 continue;
7374 addrconf_ifdown(dev, true);
7375 }
7376 addrconf_ifdown(init_net.loopback_dev, true);
7377
7378 rtnl_unlock();
7379
7380 destroy_workqueue(addrconf_wq);
7381 }