]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - net/ipv6/addrconf.c
net/ipv6/addrconf: fix sysctl table indentation
[karo-tx-linux.git] / net / ipv6 / addrconf.c
index 27aed1afcf81c0a516bb6768e20b27a6794fb1cc..19258d97494c629de07b7b1eb9308ff923c9ce89 100644 (file)
@@ -359,7 +359,6 @@ static struct inet6_dev *ipv6_add_dev(struct net_device *dev)
                ndev->addr_gen_mode = IN6_ADDR_GEN_MODE_EUI64;
 
        ndev->cnf.mtu6 = dev->mtu;
-       ndev->cnf.sysctl = NULL;
        ndev->nd_parms = neigh_parms_alloc(dev, &nd_tbl);
        if (!ndev->nd_parms) {
                kfree(ndev);
@@ -4995,15 +4994,13 @@ static int inet6_set_iftoken(struct inet6_dev *idev, struct in6_addr *token)
 {
        struct inet6_ifaddr *ifp;
        struct net_device *dev = idev->dev;
-       bool update_rs = false;
+       bool clear_token, update_rs = false;
        struct in6_addr ll_addr;
 
        ASSERT_RTNL();
 
        if (!token)
                return -EINVAL;
-       if (ipv6_addr_any(token))
-               return -EINVAL;
        if (dev->flags & (IFF_LOOPBACK | IFF_NOARP))
                return -EINVAL;
        if (!ipv6_accept_ra(idev))
@@ -5018,10 +5015,13 @@ static int inet6_set_iftoken(struct inet6_dev *idev, struct in6_addr *token)
 
        write_unlock_bh(&idev->lock);
 
+       clear_token = ipv6_addr_any(token);
+       if (clear_token)
+               goto update_lft;
+
        if (!idev->dead && (idev->if_flags & IF_READY) &&
            !ipv6_get_lladdr(dev, &ll_addr, IFA_F_TENTATIVE |
                             IFA_F_OPTIMISTIC)) {
-
                /* If we're not ready, then normal ifup will take care
                 * of this. Otherwise, we need to request our rs here.
                 */
@@ -5029,6 +5029,7 @@ static int inet6_set_iftoken(struct inet6_dev *idev, struct in6_addr *token)
                update_rs = true;
        }
 
+update_lft:
        write_lock_bh(&idev->lock);
 
        if (update_rs) {
@@ -5618,376 +5619,366 @@ int addrconf_sysctl_ignore_routes_with_linkdown(struct ctl_table *ctl,
        return ret;
 }
 
-static struct addrconf_sysctl_table
-{
-       struct ctl_table_header *sysctl_header;
-       struct ctl_table addrconf_vars[DEVCONF_MAX+1];
-} addrconf_sysctl __read_mostly = {
-       .sysctl_header = NULL,
-       .addrconf_vars = {
-               {
-                       .procname       = "forwarding",
-                       .data           = &ipv6_devconf.forwarding,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = addrconf_sysctl_forward,
-               },
-               {
-                       .procname       = "hop_limit",
-                       .data           = &ipv6_devconf.hop_limit,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = addrconf_sysctl_hop_limit,
-               },
-               {
-                       .procname       = "mtu",
-                       .data           = &ipv6_devconf.mtu6,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = addrconf_sysctl_mtu,
-               },
-               {
-                       .procname       = "accept_ra",
-                       .data           = &ipv6_devconf.accept_ra,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-               },
-               {
-                       .procname       = "accept_redirects",
-                       .data           = &ipv6_devconf.accept_redirects,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-               },
-               {
-                       .procname       = "autoconf",
-                       .data           = &ipv6_devconf.autoconf,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-               },
-               {
-                       .procname       = "dad_transmits",
-                       .data           = &ipv6_devconf.dad_transmits,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-               },
-               {
-                       .procname       = "router_solicitations",
-                       .data           = &ipv6_devconf.rtr_solicits,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-               },
-               {
-                       .procname       = "router_solicitation_interval",
-                       .data           = &ipv6_devconf.rtr_solicit_interval,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec_jiffies,
-               },
-               {
-                       .procname       = "router_solicitation_delay",
-                       .data           = &ipv6_devconf.rtr_solicit_delay,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec_jiffies,
-               },
-               {
-                       .procname       = "force_mld_version",
-                       .data           = &ipv6_devconf.force_mld_version,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-               },
-               {
-                       .procname       = "mldv1_unsolicited_report_interval",
-                       .data           =
-                               &ipv6_devconf.mldv1_unsolicited_report_interval,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec_ms_jiffies,
-               },
-               {
-                       .procname       = "mldv2_unsolicited_report_interval",
-                       .data           =
-                               &ipv6_devconf.mldv2_unsolicited_report_interval,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec_ms_jiffies,
-               },
-               {
-                       .procname       = "use_tempaddr",
-                       .data           = &ipv6_devconf.use_tempaddr,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-               },
-               {
-                       .procname       = "temp_valid_lft",
-                       .data           = &ipv6_devconf.temp_valid_lft,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-               },
-               {
-                       .procname       = "temp_prefered_lft",
-                       .data           = &ipv6_devconf.temp_prefered_lft,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-               },
-               {
-                       .procname       = "regen_max_retry",
-                       .data           = &ipv6_devconf.regen_max_retry,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-               },
-               {
-                       .procname       = "max_desync_factor",
-                       .data           = &ipv6_devconf.max_desync_factor,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-               },
-               {
-                       .procname       = "max_addresses",
-                       .data           = &ipv6_devconf.max_addresses,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-               },
-               {
-                       .procname       = "accept_ra_defrtr",
-                       .data           = &ipv6_devconf.accept_ra_defrtr,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-               },
-               {
-                       .procname       = "accept_ra_min_hop_limit",
-                       .data           = &ipv6_devconf.accept_ra_min_hop_limit,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-               },
-               {
-                       .procname       = "accept_ra_pinfo",
-                       .data           = &ipv6_devconf.accept_ra_pinfo,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-               },
+static const struct ctl_table addrconf_sysctl[] = {
+       {
+               .procname       = "forwarding",
+               .data           = &ipv6_devconf.forwarding,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = addrconf_sysctl_forward,
+       },
+       {
+               .procname       = "hop_limit",
+               .data           = &ipv6_devconf.hop_limit,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = addrconf_sysctl_hop_limit,
+       },
+       {
+               .procname       = "mtu",
+               .data           = &ipv6_devconf.mtu6,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = addrconf_sysctl_mtu,
+       },
+       {
+               .procname       = "accept_ra",
+               .data           = &ipv6_devconf.accept_ra,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .procname       = "accept_redirects",
+               .data           = &ipv6_devconf.accept_redirects,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .procname       = "autoconf",
+               .data           = &ipv6_devconf.autoconf,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .procname       = "dad_transmits",
+               .data           = &ipv6_devconf.dad_transmits,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .procname       = "router_solicitations",
+               .data           = &ipv6_devconf.rtr_solicits,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .procname       = "router_solicitation_interval",
+               .data           = &ipv6_devconf.rtr_solicit_interval,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec_jiffies,
+       },
+       {
+               .procname       = "router_solicitation_delay",
+               .data           = &ipv6_devconf.rtr_solicit_delay,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec_jiffies,
+       },
+       {
+               .procname       = "force_mld_version",
+               .data           = &ipv6_devconf.force_mld_version,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .procname       = "mldv1_unsolicited_report_interval",
+               .data           =
+                       &ipv6_devconf.mldv1_unsolicited_report_interval,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec_ms_jiffies,
+       },
+       {
+               .procname       = "mldv2_unsolicited_report_interval",
+               .data           =
+                       &ipv6_devconf.mldv2_unsolicited_report_interval,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec_ms_jiffies,
+       },
+       {
+               .procname       = "use_tempaddr",
+               .data           = &ipv6_devconf.use_tempaddr,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .procname       = "temp_valid_lft",
+               .data           = &ipv6_devconf.temp_valid_lft,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .procname       = "temp_prefered_lft",
+               .data           = &ipv6_devconf.temp_prefered_lft,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .procname       = "regen_max_retry",
+               .data           = &ipv6_devconf.regen_max_retry,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .procname       = "max_desync_factor",
+               .data           = &ipv6_devconf.max_desync_factor,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .procname       = "max_addresses",
+               .data           = &ipv6_devconf.max_addresses,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .procname       = "accept_ra_defrtr",
+               .data           = &ipv6_devconf.accept_ra_defrtr,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .procname       = "accept_ra_min_hop_limit",
+               .data           = &ipv6_devconf.accept_ra_min_hop_limit,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .procname       = "accept_ra_pinfo",
+               .data           = &ipv6_devconf.accept_ra_pinfo,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
 #ifdef CONFIG_IPV6_ROUTER_PREF
-               {
-                       .procname       = "accept_ra_rtr_pref",
-                       .data           = &ipv6_devconf.accept_ra_rtr_pref,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-               },
-               {
-                       .procname       = "router_probe_interval",
-                       .data           = &ipv6_devconf.rtr_probe_interval,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec_jiffies,
-               },
+       {
+               .procname       = "accept_ra_rtr_pref",
+               .data           = &ipv6_devconf.accept_ra_rtr_pref,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .procname       = "router_probe_interval",
+               .data           = &ipv6_devconf.rtr_probe_interval,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec_jiffies,
+       },
 #ifdef CONFIG_IPV6_ROUTE_INFO
-               {
-                       .procname       = "accept_ra_rt_info_max_plen",
-                       .data           = &ipv6_devconf.accept_ra_rt_info_max_plen,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-               },
+       {
+               .procname       = "accept_ra_rt_info_max_plen",
+               .data           = &ipv6_devconf.accept_ra_rt_info_max_plen,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
 #endif
 #endif
-               {
-                       .procname       = "proxy_ndp",
-                       .data           = &ipv6_devconf.proxy_ndp,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = addrconf_sysctl_proxy_ndp,
-               },
-               {
-                       .procname       = "accept_source_route",
-                       .data           = &ipv6_devconf.accept_source_route,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-               },
+       {
+               .procname       = "proxy_ndp",
+               .data           = &ipv6_devconf.proxy_ndp,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = addrconf_sysctl_proxy_ndp,
+       },
+       {
+               .procname       = "accept_source_route",
+               .data           = &ipv6_devconf.accept_source_route,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
 #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
-               {
-                       .procname       = "optimistic_dad",
-                       .data           = &ipv6_devconf.optimistic_dad,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-
-               },
-               {
-                       .procname       = "use_optimistic",
-                       .data           = &ipv6_devconf.use_optimistic,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-
-               },
+       {
+               .procname       = "optimistic_dad",
+               .data           = &ipv6_devconf.optimistic_dad,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .procname       = "use_optimistic",
+               .data           = &ipv6_devconf.use_optimistic,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
 #endif
 #ifdef CONFIG_IPV6_MROUTE
-               {
-                       .procname       = "mc_forwarding",
-                       .data           = &ipv6_devconf.mc_forwarding,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0444,
-                       .proc_handler   = proc_dointvec,
-               },
+       {
+               .procname       = "mc_forwarding",
+               .data           = &ipv6_devconf.mc_forwarding,
+               .maxlen         = sizeof(int),
+               .mode           = 0444,
+               .proc_handler   = proc_dointvec,
+       },
 #endif
-               {
-                       .procname       = "disable_ipv6",
-                       .data           = &ipv6_devconf.disable_ipv6,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = addrconf_sysctl_disable,
-               },
-               {
-                       .procname       = "accept_dad",
-                       .data           = &ipv6_devconf.accept_dad,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-               },
-               {
-                       .procname       = "force_tllao",
-                       .data           = &ipv6_devconf.force_tllao,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec
-               },
-               {
-                       .procname       = "ndisc_notify",
-                       .data           = &ipv6_devconf.ndisc_notify,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec
-               },
-               {
-                       .procname       = "suppress_frag_ndisc",
-                       .data           = &ipv6_devconf.suppress_frag_ndisc,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec
-               },
-               {
-                       .procname       = "accept_ra_from_local",
-                       .data           = &ipv6_devconf.accept_ra_from_local,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-               },
-               {
-                       .procname       = "accept_ra_mtu",
-                       .data           = &ipv6_devconf.accept_ra_mtu,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-               },
-               {
-                       .procname       = "stable_secret",
-                       .data           = &ipv6_devconf.stable_secret,
-                       .maxlen         = IPV6_MAX_STRLEN,
-                       .mode           = 0600,
-                       .proc_handler   = addrconf_sysctl_stable_secret,
-               },
-               {
-                       .procname       = "use_oif_addrs_only",
-                       .data           = &ipv6_devconf.use_oif_addrs_only,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-               },
-               {
-                       .procname       = "ignore_routes_with_linkdown",
-                       .data           = &ipv6_devconf.ignore_routes_with_linkdown,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = addrconf_sysctl_ignore_routes_with_linkdown,
-               },
-               {
-                       .procname       = "drop_unicast_in_l2_multicast",
-                       .data           = &ipv6_devconf.drop_unicast_in_l2_multicast,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-               },
-               {
-                       .procname       = "drop_unsolicited_na",
-                       .data           = &ipv6_devconf.drop_unsolicited_na,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-               },
-               {
-                       .procname       = "keep_addr_on_down",
-                       .data           = &ipv6_devconf.keep_addr_on_down,
-                       .maxlen         = sizeof(int),
-                       .mode           = 0644,
-                       .proc_handler   = proc_dointvec,
-
-               },
-               {
-                       /* sentinel */
-               }
+       {
+               .procname       = "disable_ipv6",
+               .data           = &ipv6_devconf.disable_ipv6,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = addrconf_sysctl_disable,
+       },
+       {
+               .procname       = "accept_dad",
+               .data           = &ipv6_devconf.accept_dad,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .procname       = "force_tllao",
+               .data           = &ipv6_devconf.force_tllao,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec
+       },
+       {
+               .procname       = "ndisc_notify",
+               .data           = &ipv6_devconf.ndisc_notify,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec
        },
+       {
+               .procname       = "suppress_frag_ndisc",
+               .data           = &ipv6_devconf.suppress_frag_ndisc,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec
+       },
+       {
+               .procname       = "accept_ra_from_local",
+               .data           = &ipv6_devconf.accept_ra_from_local,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .procname       = "accept_ra_mtu",
+               .data           = &ipv6_devconf.accept_ra_mtu,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .procname       = "stable_secret",
+               .data           = &ipv6_devconf.stable_secret,
+               .maxlen         = IPV6_MAX_STRLEN,
+               .mode           = 0600,
+               .proc_handler   = addrconf_sysctl_stable_secret,
+       },
+       {
+               .procname       = "use_oif_addrs_only",
+               .data           = &ipv6_devconf.use_oif_addrs_only,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .procname       = "ignore_routes_with_linkdown",
+               .data           = &ipv6_devconf.ignore_routes_with_linkdown,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = addrconf_sysctl_ignore_routes_with_linkdown,
+       },
+       {
+               .procname       = "drop_unicast_in_l2_multicast",
+               .data           = &ipv6_devconf.drop_unicast_in_l2_multicast,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .procname       = "drop_unsolicited_na",
+               .data           = &ipv6_devconf.drop_unsolicited_na,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
+       {
+               .procname       = "keep_addr_on_down",
+               .data           = &ipv6_devconf.keep_addr_on_down,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+
+       },
+       {
+               /* sentinel */
+       }
 };
 
 static int __addrconf_sysctl_register(struct net *net, char *dev_name,
                struct inet6_dev *idev, struct ipv6_devconf *p)
 {
        int i;
-       struct addrconf_sysctl_table *t;
+       struct ctl_table *table;
        char path[sizeof("net/ipv6/conf/") + IFNAMSIZ];
 
-       t = kmemdup(&addrconf_sysctl, sizeof(*t), GFP_KERNEL);
-       if (!t)
+       table = kmemdup(addrconf_sysctl, sizeof(addrconf_sysctl), GFP_KERNEL);
+       if (!table)
                goto out;
 
-       for (i = 0; t->addrconf_vars[i].data; i++) {
-               t->addrconf_vars[i].data += (char *)p - (char *)&ipv6_devconf;
-               t->addrconf_vars[i].extra1 = idev; /* embedded; no ref */
-               t->addrconf_vars[i].extra2 = net;
+       for (i = 0; table[i].data; i++) {
+               table[i].data += (char *)p - (char *)&ipv6_devconf;
+               table[i].extra1 = idev; /* embedded; no ref */
+               table[i].extra2 = net;
        }
 
        snprintf(path, sizeof(path), "net/ipv6/conf/%s", dev_name);
 
-       t->sysctl_header = register_net_sysctl(net, path, t->addrconf_vars);
-       if (!t->sysctl_header)
+       p->sysctl_header = register_net_sysctl(net, path, table);
+       if (!p->sysctl_header)
                goto free;
 
-       p->sysctl = t;
        return 0;
 
 free:
-       kfree(t);
+       kfree(table);
 out:
        return -ENOBUFS;
 }
 
 static void __addrconf_sysctl_unregister(struct ipv6_devconf *p)
 {
-       struct addrconf_sysctl_table *t;
+       struct ctl_table *table;
 
-       if (!p->sysctl)
+       if (!p->sysctl_header)
                return;
 
-       t = p->sysctl;
-       p->sysctl = NULL;
-       unregister_net_sysctl_table(t->sysctl_header);
-       kfree(t);
+       table = p->sysctl_header->ctl_table_arg;
+       unregister_net_sysctl_table(p->sysctl_header);
+       p->sysctl_header = NULL;
+       kfree(table);
 }
 
 static int addrconf_sysctl_register(struct inet6_dev *idev)