addrconf.c (b9f12a5d97f652c77ef6803dccd0d40d1290f5be) addrconf.c (a317a2f19da7d0af1f068cf4d3ae80cdd73643b7)
1/*
2 * IPv6 Address [auto]configuration
3 * Linux INET6 implementation
4 *
5 * Authors:
6 * Pedro Roque <roque@di.fc.ul.pt>
7 * Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
8 *

--- 94 unchanged lines hidden (view full) ---

103#define INFINITY_LIFE_TIME 0xFFFFFFFF
104
105static inline u32 cstamp_delta(unsigned long cstamp)
106{
107 return (cstamp - INITIAL_JIFFIES) * 100UL / HZ;
108}
109
110#ifdef CONFIG_SYSCTL
1/*
2 * IPv6 Address [auto]configuration
3 * Linux INET6 implementation
4 *
5 * Authors:
6 * Pedro Roque <roque@di.fc.ul.pt>
7 * Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
8 *

--- 94 unchanged lines hidden (view full) ---

103#define INFINITY_LIFE_TIME 0xFFFFFFFF
104
105static inline u32 cstamp_delta(unsigned long cstamp)
106{
107 return (cstamp - INITIAL_JIFFIES) * 100UL / HZ;
108}
109
110#ifdef CONFIG_SYSCTL
111static void addrconf_sysctl_register(struct inet6_dev *idev);
111static int addrconf_sysctl_register(struct inet6_dev *idev);
112static void addrconf_sysctl_unregister(struct inet6_dev *idev);
113#else
112static void addrconf_sysctl_unregister(struct inet6_dev *idev);
113#else
114static inline void addrconf_sysctl_register(struct inet6_dev *idev)
114static inline int addrconf_sysctl_register(struct inet6_dev *idev)
115{
115{
116 return 0;
116}
117
118static inline void addrconf_sysctl_unregister(struct inet6_dev *idev)
119{
120}
121#endif
122
123static void __ipv6_regen_rndid(struct inet6_dev *idev);

--- 57 unchanged lines hidden (view full) ---

181 .rtr_solicit_delay = MAX_RTR_SOLICITATION_DELAY,
182 .use_tempaddr = 0,
183 .temp_valid_lft = TEMP_VALID_LIFETIME,
184 .temp_prefered_lft = TEMP_PREFERRED_LIFETIME,
185 .regen_max_retry = REGEN_MAX_RETRY,
186 .max_desync_factor = MAX_DESYNC_FACTOR,
187 .max_addresses = IPV6_MAX_ADDRESSES,
188 .accept_ra_defrtr = 1,
117}
118
119static inline void addrconf_sysctl_unregister(struct inet6_dev *idev)
120{
121}
122#endif
123
124static void __ipv6_regen_rndid(struct inet6_dev *idev);

--- 57 unchanged lines hidden (view full) ---

182 .rtr_solicit_delay = MAX_RTR_SOLICITATION_DELAY,
183 .use_tempaddr = 0,
184 .temp_valid_lft = TEMP_VALID_LIFETIME,
185 .temp_prefered_lft = TEMP_PREFERRED_LIFETIME,
186 .regen_max_retry = REGEN_MAX_RETRY,
187 .max_desync_factor = MAX_DESYNC_FACTOR,
188 .max_addresses = IPV6_MAX_ADDRESSES,
189 .accept_ra_defrtr = 1,
190 .accept_ra_from_local = 0,
189 .accept_ra_pinfo = 1,
190#ifdef CONFIG_IPV6_ROUTER_PREF
191 .accept_ra_rtr_pref = 1,
192 .rtr_probe_interval = 60 * HZ,
193#ifdef CONFIG_IPV6_ROUTE_INFO
194 .accept_ra_rt_info_max_plen = 0,
195#endif
196#endif

--- 20 unchanged lines hidden (view full) ---

217 .rtr_solicit_delay = MAX_RTR_SOLICITATION_DELAY,
218 .use_tempaddr = 0,
219 .temp_valid_lft = TEMP_VALID_LIFETIME,
220 .temp_prefered_lft = TEMP_PREFERRED_LIFETIME,
221 .regen_max_retry = REGEN_MAX_RETRY,
222 .max_desync_factor = MAX_DESYNC_FACTOR,
223 .max_addresses = IPV6_MAX_ADDRESSES,
224 .accept_ra_defrtr = 1,
191 .accept_ra_pinfo = 1,
192#ifdef CONFIG_IPV6_ROUTER_PREF
193 .accept_ra_rtr_pref = 1,
194 .rtr_probe_interval = 60 * HZ,
195#ifdef CONFIG_IPV6_ROUTE_INFO
196 .accept_ra_rt_info_max_plen = 0,
197#endif
198#endif

--- 20 unchanged lines hidden (view full) ---

219 .rtr_solicit_delay = MAX_RTR_SOLICITATION_DELAY,
220 .use_tempaddr = 0,
221 .temp_valid_lft = TEMP_VALID_LIFETIME,
222 .temp_prefered_lft = TEMP_PREFERRED_LIFETIME,
223 .regen_max_retry = REGEN_MAX_RETRY,
224 .max_desync_factor = MAX_DESYNC_FACTOR,
225 .max_addresses = IPV6_MAX_ADDRESSES,
226 .accept_ra_defrtr = 1,
227 .accept_ra_from_local = 0,
225 .accept_ra_pinfo = 1,
226#ifdef CONFIG_IPV6_ROUTER_PREF
227 .accept_ra_rtr_pref = 1,
228 .rtr_probe_interval = 60 * HZ,
229#ifdef CONFIG_IPV6_ROUTE_INFO
230 .accept_ra_rt_info_max_plen = 0,
231#endif
232#endif

--- 70 unchanged lines hidden (view full) ---

303 free_percpu(idev->stats.ipv6);
304err_ip:
305 return -ENOMEM;
306}
307
308static struct inet6_dev *ipv6_add_dev(struct net_device *dev)
309{
310 struct inet6_dev *ndev;
228 .accept_ra_pinfo = 1,
229#ifdef CONFIG_IPV6_ROUTER_PREF
230 .accept_ra_rtr_pref = 1,
231 .rtr_probe_interval = 60 * HZ,
232#ifdef CONFIG_IPV6_ROUTE_INFO
233 .accept_ra_rt_info_max_plen = 0,
234#endif
235#endif

--- 70 unchanged lines hidden (view full) ---

306 free_percpu(idev->stats.ipv6);
307err_ip:
308 return -ENOMEM;
309}
310
311static struct inet6_dev *ipv6_add_dev(struct net_device *dev)
312{
313 struct inet6_dev *ndev;
314 int err = -ENOMEM;
311
312 ASSERT_RTNL();
313
314 if (dev->mtu < IPV6_MIN_MTU)
315
316 ASSERT_RTNL();
317
318 if (dev->mtu < IPV6_MIN_MTU)
315 return NULL;
319 return ERR_PTR(-EINVAL);
316
317 ndev = kzalloc(sizeof(struct inet6_dev), GFP_KERNEL);
320
321 ndev = kzalloc(sizeof(struct inet6_dev), GFP_KERNEL);
318
319 if (ndev == NULL)
322 if (ndev == NULL)
320 return NULL;
323 return ERR_PTR(err);
321
322 rwlock_init(&ndev->lock);
323 ndev->dev = dev;
324 INIT_LIST_HEAD(&ndev->addr_list);
325 setup_timer(&ndev->rs_timer, addrconf_rs_timer,
326 (unsigned long)ndev);
327 memcpy(&ndev->cnf, dev_net(dev)->ipv6.devconf_dflt, sizeof(ndev->cnf));
328 ndev->cnf.mtu6 = dev->mtu;
329 ndev->cnf.sysctl = NULL;
330 ndev->nd_parms = neigh_parms_alloc(dev, &nd_tbl);
331 if (ndev->nd_parms == NULL) {
332 kfree(ndev);
324
325 rwlock_init(&ndev->lock);
326 ndev->dev = dev;
327 INIT_LIST_HEAD(&ndev->addr_list);
328 setup_timer(&ndev->rs_timer, addrconf_rs_timer,
329 (unsigned long)ndev);
330 memcpy(&ndev->cnf, dev_net(dev)->ipv6.devconf_dflt, sizeof(ndev->cnf));
331 ndev->cnf.mtu6 = dev->mtu;
332 ndev->cnf.sysctl = NULL;
333 ndev->nd_parms = neigh_parms_alloc(dev, &nd_tbl);
334 if (ndev->nd_parms == NULL) {
335 kfree(ndev);
333 return NULL;
336 return ERR_PTR(err);
334 }
335 if (ndev->cnf.forwarding)
336 dev_disable_lro(dev);
337 /* We refer to the device */
338 dev_hold(dev);
339
340 if (snmp6_alloc_dev(ndev) < 0) {
341 ADBG(KERN_WARNING
342 "%s: cannot allocate memory for statistics; dev=%s.\n",
343 __func__, dev->name);
344 neigh_parms_release(&nd_tbl, ndev->nd_parms);
345 dev_put(dev);
346 kfree(ndev);
337 }
338 if (ndev->cnf.forwarding)
339 dev_disable_lro(dev);
340 /* We refer to the device */
341 dev_hold(dev);
342
343 if (snmp6_alloc_dev(ndev) < 0) {
344 ADBG(KERN_WARNING
345 "%s: cannot allocate memory for statistics; dev=%s.\n",
346 __func__, dev->name);
347 neigh_parms_release(&nd_tbl, ndev->nd_parms);
348 dev_put(dev);
349 kfree(ndev);
347 return NULL;
350 return ERR_PTR(err);
348 }
349
350 if (snmp6_register_dev(ndev) < 0) {
351 ADBG(KERN_WARNING
352 "%s: cannot create /proc/net/dev_snmp6/%s\n",
353 __func__, dev->name);
351 }
352
353 if (snmp6_register_dev(ndev) < 0) {
354 ADBG(KERN_WARNING
355 "%s: cannot create /proc/net/dev_snmp6/%s\n",
356 __func__, dev->name);
354 neigh_parms_release(&nd_tbl, ndev->nd_parms);
355 ndev->dead = 1;
356 in6_dev_finish_destroy(ndev);
357 return NULL;
357 goto err_release;
358 }
359
360 /* One reference from device. We must do this before
361 * we invoke __ipv6_regen_rndid().
362 */
363 in6_dev_hold(ndev);
364
365 if (dev->flags & (IFF_NOARP | IFF_LOOPBACK))

--- 21 unchanged lines hidden (view full) ---

387
388 ndev->token = in6addr_any;
389
390 if (netif_running(dev) && addrconf_qdisc_ok(dev))
391 ndev->if_flags |= IF_READY;
392
393 ipv6_mc_init_dev(ndev);
394 ndev->tstamp = jiffies;
358 }
359
360 /* One reference from device. We must do this before
361 * we invoke __ipv6_regen_rndid().
362 */
363 in6_dev_hold(ndev);
364
365 if (dev->flags & (IFF_NOARP | IFF_LOOPBACK))

--- 21 unchanged lines hidden (view full) ---

387
388 ndev->token = in6addr_any;
389
390 if (netif_running(dev) && addrconf_qdisc_ok(dev))
391 ndev->if_flags |= IF_READY;
392
393 ipv6_mc_init_dev(ndev);
394 ndev->tstamp = jiffies;
395 addrconf_sysctl_register(ndev);
395 err = addrconf_sysctl_register(ndev);
396 if (err) {
397 ipv6_mc_destroy_dev(ndev);
398 del_timer(&ndev->regen_timer);
399 goto err_release;
400 }
396 /* protected by rtnl_lock */
397 rcu_assign_pointer(dev->ip6_ptr, ndev);
398
399 /* Join interface-local all-node multicast group */
400 ipv6_dev_mc_inc(dev, &in6addr_interfacelocal_allnodes);
401
402 /* Join all-node multicast group */
403 ipv6_dev_mc_inc(dev, &in6addr_linklocal_allnodes);
404
405 /* Join all-router multicast group if forwarding is set */
406 if (ndev->cnf.forwarding && (dev->flags & IFF_MULTICAST))
407 ipv6_dev_mc_inc(dev, &in6addr_linklocal_allrouters);
408
409 return ndev;
401 /* protected by rtnl_lock */
402 rcu_assign_pointer(dev->ip6_ptr, ndev);
403
404 /* Join interface-local all-node multicast group */
405 ipv6_dev_mc_inc(dev, &in6addr_interfacelocal_allnodes);
406
407 /* Join all-node multicast group */
408 ipv6_dev_mc_inc(dev, &in6addr_linklocal_allnodes);
409
410 /* Join all-router multicast group if forwarding is set */
411 if (ndev->cnf.forwarding && (dev->flags & IFF_MULTICAST))
412 ipv6_dev_mc_inc(dev, &in6addr_linklocal_allrouters);
413
414 return ndev;
415
416err_release:
417 neigh_parms_release(&nd_tbl, ndev->nd_parms);
418 ndev->dead = 1;
419 in6_dev_finish_destroy(ndev);
420 return ERR_PTR(err);
410}
411
412static struct inet6_dev *ipv6_find_idev(struct net_device *dev)
413{
414 struct inet6_dev *idev;
415
416 ASSERT_RTNL();
417
418 idev = __in6_dev_get(dev);
419 if (!idev) {
420 idev = ipv6_add_dev(dev);
421}
422
423static struct inet6_dev *ipv6_find_idev(struct net_device *dev)
424{
425 struct inet6_dev *idev;
426
427 ASSERT_RTNL();
428
429 idev = __in6_dev_get(dev);
430 if (!idev) {
431 idev = ipv6_add_dev(dev);
421 if (!idev)
432 if (IS_ERR(idev))
422 return NULL;
423 }
424
425 if (dev->flags&IFF_UP)
426 ipv6_mc_up(idev);
427 return idev;
428}
429

--- 2293 unchanged lines hidden (view full) ---

2723 INFINITY_LIFE_TIME, INFINITY_LIFE_TIME);
2724 if (!IS_ERR(ifp)) {
2725 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, idev->dev, 0, 0);
2726 addrconf_dad_start(ifp);
2727 in6_ifa_put(ifp);
2728 }
2729}
2730
433 return NULL;
434 }
435
436 if (dev->flags&IFF_UP)
437 ipv6_mc_up(idev);
438 return idev;
439}
440

--- 2293 unchanged lines hidden (view full) ---

2734 INFINITY_LIFE_TIME, INFINITY_LIFE_TIME);
2735 if (!IS_ERR(ifp)) {
2736 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, idev->dev, 0, 0);
2737 addrconf_dad_start(ifp);
2738 in6_ifa_put(ifp);
2739 }
2740}
2741
2742static void addrconf_addr_gen(struct inet6_dev *idev, bool prefix_route)
2743{
2744 if (idev->addr_gen_mode == IN6_ADDR_GEN_MODE_EUI64) {
2745 struct in6_addr addr;
2746
2747 ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0);
2748 /* addrconf_add_linklocal also adds a prefix_route and we
2749 * only need to care about prefix routes if ipv6_generate_eui64
2750 * couldn't generate one.
2751 */
2752 if (ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) == 0)
2753 addrconf_add_linklocal(idev, &addr);
2754 else if (prefix_route)
2755 addrconf_prefix_route(&addr, 64, idev->dev, 0, 0);
2756 }
2757}
2758
2731static void addrconf_dev_config(struct net_device *dev)
2732{
2759static void addrconf_dev_config(struct net_device *dev)
2760{
2733 struct in6_addr addr;
2734 struct inet6_dev *idev;
2735
2736 ASSERT_RTNL();
2737
2738 if ((dev->type != ARPHRD_ETHER) &&
2739 (dev->type != ARPHRD_FDDI) &&
2740 (dev->type != ARPHRD_ARCNET) &&
2741 (dev->type != ARPHRD_INFINIBAND) &&

--- 4 unchanged lines hidden (view full) ---

2746 /* Alas, we support only Ethernet autoconfiguration. */
2747 return;
2748 }
2749
2750 idev = addrconf_add_dev(dev);
2751 if (IS_ERR(idev))
2752 return;
2753
2761 struct inet6_dev *idev;
2762
2763 ASSERT_RTNL();
2764
2765 if ((dev->type != ARPHRD_ETHER) &&
2766 (dev->type != ARPHRD_FDDI) &&
2767 (dev->type != ARPHRD_ARCNET) &&
2768 (dev->type != ARPHRD_INFINIBAND) &&

--- 4 unchanged lines hidden (view full) ---

2773 /* Alas, we support only Ethernet autoconfiguration. */
2774 return;
2775 }
2776
2777 idev = addrconf_add_dev(dev);
2778 if (IS_ERR(idev))
2779 return;
2780
2754 memset(&addr, 0, sizeof(struct in6_addr));
2755 addr.s6_addr32[0] = htonl(0xFE800000);
2756
2757 if (ipv6_generate_eui64(addr.s6_addr + 8, dev) == 0)
2758 addrconf_add_linklocal(idev, &addr);
2781 addrconf_addr_gen(idev, false);
2759}
2760
2761#if IS_ENABLED(CONFIG_IPV6_SIT)
2762static void addrconf_sit_config(struct net_device *dev)
2763{
2764 struct inet6_dev *idev;
2765
2766 ASSERT_RTNL();

--- 5 unchanged lines hidden (view full) ---

2772 */
2773
2774 if ((idev = ipv6_find_idev(dev)) == NULL) {
2775 pr_debug("%s: add_dev failed\n", __func__);
2776 return;
2777 }
2778
2779 if (dev->priv_flags & IFF_ISATAP) {
2782}
2783
2784#if IS_ENABLED(CONFIG_IPV6_SIT)
2785static void addrconf_sit_config(struct net_device *dev)
2786{
2787 struct inet6_dev *idev;
2788
2789 ASSERT_RTNL();

--- 5 unchanged lines hidden (view full) ---

2795 */
2796
2797 if ((idev = ipv6_find_idev(dev)) == NULL) {
2798 pr_debug("%s: add_dev failed\n", __func__);
2799 return;
2800 }
2801
2802 if (dev->priv_flags & IFF_ISATAP) {
2780 struct in6_addr addr;
2781
2782 ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0);
2783 if (!ipv6_generate_eui64(addr.s6_addr + 8, dev))
2784 addrconf_add_linklocal(idev, &addr);
2803 addrconf_addr_gen(idev, false);
2785 return;
2786 }
2787
2788 sit_add_v4_addrs(idev);
2789
2790 if (dev->flags&IFF_POINTOPOINT)
2791 addrconf_add_mroute(dev);
2792}
2793#endif
2794
2795#if IS_ENABLED(CONFIG_NET_IPGRE)
2796static void addrconf_gre_config(struct net_device *dev)
2797{
2798 struct inet6_dev *idev;
2804 return;
2805 }
2806
2807 sit_add_v4_addrs(idev);
2808
2809 if (dev->flags&IFF_POINTOPOINT)
2810 addrconf_add_mroute(dev);
2811}
2812#endif
2813
2814#if IS_ENABLED(CONFIG_NET_IPGRE)
2815static void addrconf_gre_config(struct net_device *dev)
2816{
2817 struct inet6_dev *idev;
2799 struct in6_addr addr;
2800
2801 ASSERT_RTNL();
2802
2803 if ((idev = ipv6_find_idev(dev)) == NULL) {
2804 pr_debug("%s: add_dev failed\n", __func__);
2805 return;
2806 }
2807
2818
2819 ASSERT_RTNL();
2820
2821 if ((idev = ipv6_find_idev(dev)) == NULL) {
2822 pr_debug("%s: add_dev failed\n", __func__);
2823 return;
2824 }
2825
2808 ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0);
2809 if (!ipv6_generate_eui64(addr.s6_addr + 8, dev))
2810 addrconf_add_linklocal(idev, &addr);
2811 else
2812 addrconf_prefix_route(&addr, 64, dev, 0, 0);
2826 addrconf_addr_gen(idev, true);
2813}
2814#endif
2815
2816static int addrconf_notify(struct notifier_block *this, unsigned long event,
2817 void *ptr)
2818{
2819 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
2820 struct inet6_dev *idev = __in6_dev_get(dev);
2821 int run_pending = 0;
2822 int err;
2823
2824 switch (event) {
2825 case NETDEV_REGISTER:
2826 if (!idev && dev->mtu >= IPV6_MIN_MTU) {
2827 idev = ipv6_add_dev(dev);
2827}
2828#endif
2829
2830static int addrconf_notify(struct notifier_block *this, unsigned long event,
2831 void *ptr)
2832{
2833 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
2834 struct inet6_dev *idev = __in6_dev_get(dev);
2835 int run_pending = 0;
2836 int err;
2837
2838 switch (event) {
2839 case NETDEV_REGISTER:
2840 if (!idev && dev->mtu >= IPV6_MIN_MTU) {
2841 idev = ipv6_add_dev(dev);
2828 if (!idev)
2829 return notifier_from_errno(-ENOMEM);
2842 if (IS_ERR(idev))
2843 return notifier_from_errno(PTR_ERR(idev));
2830 }
2831 break;
2832
2833 case NETDEV_UP:
2834 case NETDEV_CHANGE:
2835 if (dev->flags & IFF_SLAVE)
2836 break;
2837
2838 if (event == NETDEV_UP) {
2839 if (!addrconf_qdisc_ok(dev)) {
2840 /* device is not ready yet. */
2841 pr_info("ADDRCONF(NETDEV_UP): %s: link is not ready\n",
2842 dev->name);
2843 break;
2844 }
2845
2846 if (!idev && dev->mtu >= IPV6_MIN_MTU)
2847 idev = ipv6_add_dev(dev);
2848
2844 }
2845 break;
2846
2847 case NETDEV_UP:
2848 case NETDEV_CHANGE:
2849 if (dev->flags & IFF_SLAVE)
2850 break;
2851
2852 if (event == NETDEV_UP) {
2853 if (!addrconf_qdisc_ok(dev)) {
2854 /* device is not ready yet. */
2855 pr_info("ADDRCONF(NETDEV_UP): %s: link is not ready\n",
2856 dev->name);
2857 break;
2858 }
2859
2860 if (!idev && dev->mtu >= IPV6_MIN_MTU)
2861 idev = ipv6_add_dev(dev);
2862
2849 if (idev) {
2863 if (!IS_ERR_OR_NULL(idev)) {
2850 idev->if_flags |= IF_READY;
2851 run_pending = 1;
2852 }
2853 } else {
2854 if (!addrconf_qdisc_ok(dev)) {
2855 /* device is still not ready. */
2856 break;
2857 }

--- 26 unchanged lines hidden (view full) ---

2884 init_loopback(dev);
2885 break;
2886
2887 default:
2888 addrconf_dev_config(dev);
2889 break;
2890 }
2891
2864 idev->if_flags |= IF_READY;
2865 run_pending = 1;
2866 }
2867 } else {
2868 if (!addrconf_qdisc_ok(dev)) {
2869 /* device is still not ready. */
2870 break;
2871 }

--- 26 unchanged lines hidden (view full) ---

2898 init_loopback(dev);
2899 break;
2900
2901 default:
2902 addrconf_dev_config(dev);
2903 break;
2904 }
2905
2892 if (idev) {
2906 if (!IS_ERR_OR_NULL(idev)) {
2893 if (run_pending)
2894 addrconf_dad_run(idev);
2895
2896 /*
2897 * If the MTU changed during the interface down,
2898 * when the interface up, the changed MTU must be
2899 * reflected in the idev as well as routers.
2900 */

--- 18 unchanged lines hidden (view full) ---

2919 if (idev && dev->mtu >= IPV6_MIN_MTU) {
2920 rt6_mtu_change(dev, dev->mtu);
2921 idev->cnf.mtu6 = dev->mtu;
2922 break;
2923 }
2924
2925 if (!idev && dev->mtu >= IPV6_MIN_MTU) {
2926 idev = ipv6_add_dev(dev);
2907 if (run_pending)
2908 addrconf_dad_run(idev);
2909
2910 /*
2911 * If the MTU changed during the interface down,
2912 * when the interface up, the changed MTU must be
2913 * reflected in the idev as well as routers.
2914 */

--- 18 unchanged lines hidden (view full) ---

2933 if (idev && dev->mtu >= IPV6_MIN_MTU) {
2934 rt6_mtu_change(dev, dev->mtu);
2935 idev->cnf.mtu6 = dev->mtu;
2936 break;
2937 }
2938
2939 if (!idev && dev->mtu >= IPV6_MIN_MTU) {
2940 idev = ipv6_add_dev(dev);
2927 if (idev)
2941 if (!IS_ERR(idev))
2928 break;
2929 }
2930
2931 /*
2932 * if MTU under IPV6_MIN_MTU.
2933 * Stop IPv6 on this interface.
2934 */
2935

--- 4 unchanged lines hidden (view full) ---

2940 */
2941 addrconf_ifdown(dev, event != NETDEV_DOWN);
2942 break;
2943
2944 case NETDEV_CHANGENAME:
2945 if (idev) {
2946 snmp6_unregister_dev(idev);
2947 addrconf_sysctl_unregister(idev);
2942 break;
2943 }
2944
2945 /*
2946 * if MTU under IPV6_MIN_MTU.
2947 * Stop IPv6 on this interface.
2948 */
2949

--- 4 unchanged lines hidden (view full) ---

2954 */
2955 addrconf_ifdown(dev, event != NETDEV_DOWN);
2956 break;
2957
2958 case NETDEV_CHANGENAME:
2959 if (idev) {
2960 snmp6_unregister_dev(idev);
2961 addrconf_sysctl_unregister(idev);
2948 addrconf_sysctl_register(idev);
2949 err = snmp6_register_dev(idev);
2962 err = addrconf_sysctl_register(idev);
2950 if (err)
2951 return notifier_from_errno(err);
2963 if (err)
2964 return notifier_from_errno(err);
2965 err = snmp6_register_dev(idev);
2966 if (err) {
2967 addrconf_sysctl_unregister(idev);
2968 return notifier_from_errno(err);
2969 }
2952 }
2953 break;
2954
2955 case NETDEV_PRE_TYPE_CHANGE:
2956 case NETDEV_POST_TYPE_CHANGE:
2957 addrconf_type_change(dev, event);
2958 break;
2959 }

--- 1356 unchanged lines hidden (view full) ---

4316#ifdef CONFIG_IPV6_MROUTE
4317 array[DEVCONF_MC_FORWARDING] = cnf->mc_forwarding;
4318#endif
4319 array[DEVCONF_DISABLE_IPV6] = cnf->disable_ipv6;
4320 array[DEVCONF_ACCEPT_DAD] = cnf->accept_dad;
4321 array[DEVCONF_FORCE_TLLAO] = cnf->force_tllao;
4322 array[DEVCONF_NDISC_NOTIFY] = cnf->ndisc_notify;
4323 array[DEVCONF_SUPPRESS_FRAG_NDISC] = cnf->suppress_frag_ndisc;
2970 }
2971 break;
2972
2973 case NETDEV_PRE_TYPE_CHANGE:
2974 case NETDEV_POST_TYPE_CHANGE:
2975 addrconf_type_change(dev, event);
2976 break;
2977 }

--- 1356 unchanged lines hidden (view full) ---

4334#ifdef CONFIG_IPV6_MROUTE
4335 array[DEVCONF_MC_FORWARDING] = cnf->mc_forwarding;
4336#endif
4337 array[DEVCONF_DISABLE_IPV6] = cnf->disable_ipv6;
4338 array[DEVCONF_ACCEPT_DAD] = cnf->accept_dad;
4339 array[DEVCONF_FORCE_TLLAO] = cnf->force_tllao;
4340 array[DEVCONF_NDISC_NOTIFY] = cnf->ndisc_notify;
4341 array[DEVCONF_SUPPRESS_FRAG_NDISC] = cnf->suppress_frag_ndisc;
4342 array[DEVCONF_ACCEPT_RA_FROM_LOCAL] = cnf->accept_ra_from_local;
4324}
4325
4326static inline size_t inet6_ifla6_size(void)
4327{
4328 return nla_total_size(4) /* IFLA_INET6_FLAGS */
4329 + nla_total_size(sizeof(struct ifla_cacheinfo))
4330 + nla_total_size(DEVCONF_MAX * 4) /* IFLA_INET6_CONF */
4331 + nla_total_size(IPSTATS_MIB_MAX * 8) /* IFLA_INET6_STATS */

--- 83 unchanged lines hidden (view full) ---

4415 nla = nla_reserve(skb, IFLA_INET6_ICMP6STATS, ICMP6_MIB_MAX * sizeof(u64));
4416 if (nla == NULL)
4417 goto nla_put_failure;
4418 snmp6_fill_stats(nla_data(nla), idev, IFLA_INET6_ICMP6STATS, nla_len(nla));
4419
4420 nla = nla_reserve(skb, IFLA_INET6_TOKEN, sizeof(struct in6_addr));
4421 if (nla == NULL)
4422 goto nla_put_failure;
4343}
4344
4345static inline size_t inet6_ifla6_size(void)
4346{
4347 return nla_total_size(4) /* IFLA_INET6_FLAGS */
4348 + nla_total_size(sizeof(struct ifla_cacheinfo))
4349 + nla_total_size(DEVCONF_MAX * 4) /* IFLA_INET6_CONF */
4350 + nla_total_size(IPSTATS_MIB_MAX * 8) /* IFLA_INET6_STATS */

--- 83 unchanged lines hidden (view full) ---

4434 nla = nla_reserve(skb, IFLA_INET6_ICMP6STATS, ICMP6_MIB_MAX * sizeof(u64));
4435 if (nla == NULL)
4436 goto nla_put_failure;
4437 snmp6_fill_stats(nla_data(nla), idev, IFLA_INET6_ICMP6STATS, nla_len(nla));
4438
4439 nla = nla_reserve(skb, IFLA_INET6_TOKEN, sizeof(struct in6_addr));
4440 if (nla == NULL)
4441 goto nla_put_failure;
4442
4443 if (nla_put_u8(skb, IFLA_INET6_ADDR_GEN_MODE, idev->addr_gen_mode))
4444 goto nla_put_failure;
4445
4423 read_lock_bh(&idev->lock);
4424 memcpy(nla_data(nla), idev->token.s6_addr, nla_len(nla));
4425 read_unlock_bh(&idev->lock);
4426
4427 return 0;
4428
4429nla_put_failure:
4430 return -EMSGSIZE;

--- 88 unchanged lines hidden (view full) ---

4519 struct nlattr *tb[IFLA_INET6_MAX + 1];
4520
4521 if (!idev)
4522 return -EAFNOSUPPORT;
4523
4524 if (nla_parse_nested(tb, IFLA_INET6_MAX, nla, NULL) < 0)
4525 BUG();
4526
4446 read_lock_bh(&idev->lock);
4447 memcpy(nla_data(nla), idev->token.s6_addr, nla_len(nla));
4448 read_unlock_bh(&idev->lock);
4449
4450 return 0;
4451
4452nla_put_failure:
4453 return -EMSGSIZE;

--- 88 unchanged lines hidden (view full) ---

4542 struct nlattr *tb[IFLA_INET6_MAX + 1];
4543
4544 if (!idev)
4545 return -EAFNOSUPPORT;
4546
4547 if (nla_parse_nested(tb, IFLA_INET6_MAX, nla, NULL) < 0)
4548 BUG();
4549
4527 if (tb[IFLA_INET6_TOKEN])
4550 if (tb[IFLA_INET6_TOKEN]) {
4528 err = inet6_set_iftoken(idev, nla_data(tb[IFLA_INET6_TOKEN]));
4551 err = inet6_set_iftoken(idev, nla_data(tb[IFLA_INET6_TOKEN]));
4552 if (err)
4553 return err;
4554 }
4529
4555
4556 if (tb[IFLA_INET6_ADDR_GEN_MODE]) {
4557 u8 mode = nla_get_u8(tb[IFLA_INET6_ADDR_GEN_MODE]);
4558
4559 if (mode != IN6_ADDR_GEN_MODE_EUI64 &&
4560 mode != IN6_ADDR_GEN_MODE_NONE)
4561 return -EINVAL;
4562 idev->addr_gen_mode = mode;
4563 err = 0;
4564 }
4565
4530 return err;
4531}
4532
4533static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev,
4534 u32 portid, u32 seq, int event, unsigned int flags)
4535{
4536 struct net_device *dev = idev->dev;
4537 struct ifinfomsg *hdr;

--- 625 unchanged lines hidden (view full) ---

5163 {
5164 .procname = "suppress_frag_ndisc",
5165 .data = &ipv6_devconf.suppress_frag_ndisc,
5166 .maxlen = sizeof(int),
5167 .mode = 0644,
5168 .proc_handler = proc_dointvec
5169 },
5170 {
4566 return err;
4567}
4568
4569static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev,
4570 u32 portid, u32 seq, int event, unsigned int flags)
4571{
4572 struct net_device *dev = idev->dev;
4573 struct ifinfomsg *hdr;

--- 625 unchanged lines hidden (view full) ---

5199 {
5200 .procname = "suppress_frag_ndisc",
5201 .data = &ipv6_devconf.suppress_frag_ndisc,
5202 .maxlen = sizeof(int),
5203 .mode = 0644,
5204 .proc_handler = proc_dointvec
5205 },
5206 {
5207 .procname = "accept_ra_from_local",
5208 .data = &ipv6_devconf.accept_ra_from_local,
5209 .maxlen = sizeof(int),
5210 .mode = 0644,
5211 .proc_handler = proc_dointvec,
5212 },
5213 {
5171 /* sentinel */
5172 }
5173 },
5174};
5175
5176static int __addrconf_sysctl_register(struct net *net, char *dev_name,
5177 struct inet6_dev *idev, struct ipv6_devconf *p)
5178{

--- 34 unchanged lines hidden (view full) ---

5213 return;
5214
5215 t = p->sysctl;
5216 p->sysctl = NULL;
5217 unregister_net_sysctl_table(t->sysctl_header);
5218 kfree(t);
5219}
5220
5214 /* sentinel */
5215 }
5216 },
5217};
5218
5219static int __addrconf_sysctl_register(struct net *net, char *dev_name,
5220 struct inet6_dev *idev, struct ipv6_devconf *p)
5221{

--- 34 unchanged lines hidden (view full) ---

5256 return;
5257
5258 t = p->sysctl;
5259 p->sysctl = NULL;
5260 unregister_net_sysctl_table(t->sysctl_header);
5261 kfree(t);
5262}
5263
5221static void addrconf_sysctl_register(struct inet6_dev *idev)
5264static int addrconf_sysctl_register(struct inet6_dev *idev)
5222{
5265{
5223 neigh_sysctl_register(idev->dev, idev->nd_parms,
5224 &ndisc_ifinfo_sysctl_change);
5225 __addrconf_sysctl_register(dev_net(idev->dev), idev->dev->name,
5226 idev, &idev->cnf);
5266 int err;
5267
5268 if (!sysctl_dev_name_is_allowed(idev->dev->name))
5269 return -EINVAL;
5270
5271 err = neigh_sysctl_register(idev->dev, idev->nd_parms,
5272 &ndisc_ifinfo_sysctl_change);
5273 if (err)
5274 return err;
5275 err = __addrconf_sysctl_register(dev_net(idev->dev), idev->dev->name,
5276 idev, &idev->cnf);
5277 if (err)
5278 neigh_sysctl_unregister(idev->nd_parms);
5279
5280 return err;
5227}
5228
5229static void addrconf_sysctl_unregister(struct inet6_dev *idev)
5230{
5231 __addrconf_sysctl_unregister(&idev->cnf);
5232 neigh_sysctl_unregister(idev->nd_parms);
5233}
5234

--- 68 unchanged lines hidden (view full) ---

5303};
5304
5305/*
5306 * Init / cleanup code
5307 */
5308
5309int __init addrconf_init(void)
5310{
5281}
5282
5283static void addrconf_sysctl_unregister(struct inet6_dev *idev)
5284{
5285 __addrconf_sysctl_unregister(&idev->cnf);
5286 neigh_sysctl_unregister(idev->nd_parms);
5287}
5288

--- 68 unchanged lines hidden (view full) ---

5357};
5358
5359/*
5360 * Init / cleanup code
5361 */
5362
5363int __init addrconf_init(void)
5364{
5365 struct inet6_dev *idev;
5311 int i, err;
5312
5313 err = ipv6_addr_label_init();
5314 if (err < 0) {
5315 pr_crit("%s: cannot initialize default policy table: %d\n",
5316 __func__, err);
5317 goto out;
5318 }

--- 22 unchanged lines hidden (view full) ---

5341 * devices to fail to get a link-local address.
5342 *
5343 * So, as a temporary fix, allocate the ipv6 structure for
5344 * loopback_dev first by hand.
5345 * Longer term, all of the dependencies ipv6 has upon the loopback
5346 * device and it being up should be removed.
5347 */
5348 rtnl_lock();
5366 int i, err;
5367
5368 err = ipv6_addr_label_init();
5369 if (err < 0) {
5370 pr_crit("%s: cannot initialize default policy table: %d\n",
5371 __func__, err);
5372 goto out;
5373 }

--- 22 unchanged lines hidden (view full) ---

5396 * devices to fail to get a link-local address.
5397 *
5398 * So, as a temporary fix, allocate the ipv6 structure for
5399 * loopback_dev first by hand.
5400 * Longer term, all of the dependencies ipv6 has upon the loopback
5401 * device and it being up should be removed.
5402 */
5403 rtnl_lock();
5349 if (!ipv6_add_dev(init_net.loopback_dev))
5350 err = -ENOMEM;
5404 idev = ipv6_add_dev(init_net.loopback_dev);
5351 rtnl_unlock();
5405 rtnl_unlock();
5352 if (err)
5406 if (IS_ERR(idev)) {
5407 err = PTR_ERR(idev);
5353 goto errlo;
5408 goto errlo;
5409 }
5354
5355 for (i = 0; i < IN6_ADDR_HSIZE; i++)
5356 INIT_HLIST_HEAD(&inet6_addr_lst[i]);
5357
5358 register_netdevice_notifier(&ipv6_dev_notf);
5359
5360 addrconf_verify();
5361

--- 68 unchanged lines hidden ---
5410
5411 for (i = 0; i < IN6_ADDR_HSIZE; i++)
5412 INIT_HLIST_HEAD(&inet6_addr_lst[i]);
5413
5414 register_netdevice_notifier(&ipv6_dev_notf);
5415
5416 addrconf_verify();
5417

--- 68 unchanged lines hidden ---