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 --- |