addrconf.c (3782746a08f6b0a8e385058b6748a5a0f166f3a7) | addrconf.c (adc176c5472214971d77c1a61c83db9b01e9cdc7) |
---|---|
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 * --- 224 unchanged lines hidden (view full) --- 233 .suppress_frag_ndisc = 1, 234 .accept_ra_mtu = 1, 235 .stable_secret = { 236 .initialized = false, 237 }, 238 .use_oif_addrs_only = 0, 239 .ignore_routes_with_linkdown = 0, 240 .keep_addr_on_down = 0, | 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 * --- 224 unchanged lines hidden (view full) --- 233 .suppress_frag_ndisc = 1, 234 .accept_ra_mtu = 1, 235 .stable_secret = { 236 .initialized = false, 237 }, 238 .use_oif_addrs_only = 0, 239 .ignore_routes_with_linkdown = 0, 240 .keep_addr_on_down = 0, |
241 .seg6_enabled = 0, 242#ifdef CONFIG_IPV6_SEG6_HMAC 243 .seg6_require_hmac = 0, 244#endif 245 .enhanced_dad = 1, |
|
241}; 242 243static struct ipv6_devconf ipv6_devconf_dflt __read_mostly = { 244 .forwarding = 0, 245 .hop_limit = IPV6_DEFAULT_HOPLIMIT, 246 .mtu6 = IPV6_MIN_MTU, 247 .accept_ra = 1, 248 .accept_redirects = 1, --- 30 unchanged lines hidden (view full) --- 279 .suppress_frag_ndisc = 1, 280 .accept_ra_mtu = 1, 281 .stable_secret = { 282 .initialized = false, 283 }, 284 .use_oif_addrs_only = 0, 285 .ignore_routes_with_linkdown = 0, 286 .keep_addr_on_down = 0, | 246}; 247 248static struct ipv6_devconf ipv6_devconf_dflt __read_mostly = { 249 .forwarding = 0, 250 .hop_limit = IPV6_DEFAULT_HOPLIMIT, 251 .mtu6 = IPV6_MIN_MTU, 252 .accept_ra = 1, 253 .accept_redirects = 1, --- 30 unchanged lines hidden (view full) --- 284 .suppress_frag_ndisc = 1, 285 .accept_ra_mtu = 1, 286 .stable_secret = { 287 .initialized = false, 288 }, 289 .use_oif_addrs_only = 0, 290 .ignore_routes_with_linkdown = 0, 291 .keep_addr_on_down = 0, |
292 .seg6_enabled = 0, 293#ifdef CONFIG_IPV6_SEG6_HMAC 294 .seg6_require_hmac = 0, 295#endif 296 .enhanced_dad = 1, |
|
287}; 288 289/* Check if a valid qdisc is available */ 290static inline bool addrconf_qdisc_ok(const struct net_device *dev) 291{ 292 return !qdisc_tx_is_noop(dev); 293} 294 --- 3427 unchanged lines hidden (view full) --- 3722 3723/* 3724 * Duplicate Address Detection 3725 */ 3726static void addrconf_dad_kick(struct inet6_ifaddr *ifp) 3727{ 3728 unsigned long rand_num; 3729 struct inet6_dev *idev = ifp->idev; | 297}; 298 299/* Check if a valid qdisc is available */ 300static inline bool addrconf_qdisc_ok(const struct net_device *dev) 301{ 302 return !qdisc_tx_is_noop(dev); 303} 304 --- 3427 unchanged lines hidden (view full) --- 3732 3733/* 3734 * Duplicate Address Detection 3735 */ 3736static void addrconf_dad_kick(struct inet6_ifaddr *ifp) 3737{ 3738 unsigned long rand_num; 3739 struct inet6_dev *idev = ifp->idev; |
3740 u64 nonce; |
|
3730 3731 if (ifp->flags & IFA_F_OPTIMISTIC) 3732 rand_num = 0; 3733 else 3734 rand_num = prandom_u32() % (idev->cnf.rtr_solicit_delay ? : 1); 3735 | 3741 3742 if (ifp->flags & IFA_F_OPTIMISTIC) 3743 rand_num = 0; 3744 else 3745 rand_num = prandom_u32() % (idev->cnf.rtr_solicit_delay ? : 1); 3746 |
3747 nonce = 0; 3748 if (idev->cnf.enhanced_dad || 3749 dev_net(idev->dev)->ipv6.devconf_all->enhanced_dad) { 3750 do 3751 get_random_bytes(&nonce, 6); 3752 while (nonce == 0); 3753 } 3754 ifp->dad_nonce = nonce; |
|
3736 ifp->dad_probes = idev->cnf.dad_transmits; 3737 addrconf_mod_dad_work(ifp, rand_num); 3738} 3739 3740static void addrconf_dad_begin(struct inet6_ifaddr *ifp) 3741{ 3742 struct inet6_dev *idev = ifp->idev; 3743 struct net_device *dev = idev->dev; --- 161 unchanged lines hidden (view full) --- 3905 ifp->dad_probes--; 3906 addrconf_mod_dad_work(ifp, 3907 NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME)); 3908 spin_unlock(&ifp->lock); 3909 write_unlock_bh(&idev->lock); 3910 3911 /* send a neighbour solicitation for our addr */ 3912 addrconf_addr_solict_mult(&ifp->addr, &mcaddr); | 3755 ifp->dad_probes = idev->cnf.dad_transmits; 3756 addrconf_mod_dad_work(ifp, rand_num); 3757} 3758 3759static void addrconf_dad_begin(struct inet6_ifaddr *ifp) 3760{ 3761 struct inet6_dev *idev = ifp->idev; 3762 struct net_device *dev = idev->dev; --- 161 unchanged lines hidden (view full) --- 3924 ifp->dad_probes--; 3925 addrconf_mod_dad_work(ifp, 3926 NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME)); 3927 spin_unlock(&ifp->lock); 3928 write_unlock_bh(&idev->lock); 3929 3930 /* send a neighbour solicitation for our addr */ 3931 addrconf_addr_solict_mult(&ifp->addr, &mcaddr); |
3913 ndisc_send_ns(ifp->idev->dev, &ifp->addr, &mcaddr, &in6addr_any); | 3932 ndisc_send_ns(ifp->idev->dev, &ifp->addr, &mcaddr, &in6addr_any, 3933 ifp->dad_nonce); |
3914out: 3915 in6_ifa_put(ifp); 3916 rtnl_unlock(); 3917} 3918 3919/* ifp->idev must be at least read locked */ 3920static bool ipv6_lonely_lladdr(struct inet6_ifaddr *ifp) 3921{ --- 1023 unchanged lines hidden (view full) --- 4945 array[DEVCONF_ACCEPT_RA_FROM_LOCAL] = cnf->accept_ra_from_local; 4946 array[DEVCONF_ACCEPT_RA_MTU] = cnf->accept_ra_mtu; 4947 array[DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN] = cnf->ignore_routes_with_linkdown; 4948 /* we omit DEVCONF_STABLE_SECRET for now */ 4949 array[DEVCONF_USE_OIF_ADDRS_ONLY] = cnf->use_oif_addrs_only; 4950 array[DEVCONF_DROP_UNICAST_IN_L2_MULTICAST] = cnf->drop_unicast_in_l2_multicast; 4951 array[DEVCONF_DROP_UNSOLICITED_NA] = cnf->drop_unsolicited_na; 4952 array[DEVCONF_KEEP_ADDR_ON_DOWN] = cnf->keep_addr_on_down; | 3934out: 3935 in6_ifa_put(ifp); 3936 rtnl_unlock(); 3937} 3938 3939/* ifp->idev must be at least read locked */ 3940static bool ipv6_lonely_lladdr(struct inet6_ifaddr *ifp) 3941{ --- 1023 unchanged lines hidden (view full) --- 4965 array[DEVCONF_ACCEPT_RA_FROM_LOCAL] = cnf->accept_ra_from_local; 4966 array[DEVCONF_ACCEPT_RA_MTU] = cnf->accept_ra_mtu; 4967 array[DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN] = cnf->ignore_routes_with_linkdown; 4968 /* we omit DEVCONF_STABLE_SECRET for now */ 4969 array[DEVCONF_USE_OIF_ADDRS_ONLY] = cnf->use_oif_addrs_only; 4970 array[DEVCONF_DROP_UNICAST_IN_L2_MULTICAST] = cnf->drop_unicast_in_l2_multicast; 4971 array[DEVCONF_DROP_UNSOLICITED_NA] = cnf->drop_unsolicited_na; 4972 array[DEVCONF_KEEP_ADDR_ON_DOWN] = cnf->keep_addr_on_down; |
4973 array[DEVCONF_SEG6_ENABLED] = cnf->seg6_enabled; 4974#ifdef CONFIG_IPV6_SEG6_HMAC 4975 array[DEVCONF_SEG6_REQUIRE_HMAC] = cnf->seg6_require_hmac; 4976#endif 4977 array[DEVCONF_ENHANCED_DAD] = cnf->enhanced_dad; |
|
4953} 4954 4955static inline size_t inet6_ifla6_size(void) 4956{ 4957 return nla_total_size(4) /* IFLA_INET6_FLAGS */ 4958 + nla_total_size(sizeof(struct ifla_cacheinfo)) 4959 + nla_total_size(DEVCONF_MAX * 4) /* IFLA_INET6_CONF */ 4960 + nla_total_size(IPSTATS_MIB_MAX * 8) /* IFLA_INET6_STATS */ --- 1076 unchanged lines hidden (view full) --- 6037 .procname = "keep_addr_on_down", 6038 .data = &ipv6_devconf.keep_addr_on_down, 6039 .maxlen = sizeof(int), 6040 .mode = 0644, 6041 .proc_handler = proc_dointvec, 6042 6043 }, 6044 { | 4978} 4979 4980static inline size_t inet6_ifla6_size(void) 4981{ 4982 return nla_total_size(4) /* IFLA_INET6_FLAGS */ 4983 + nla_total_size(sizeof(struct ifla_cacheinfo)) 4984 + nla_total_size(DEVCONF_MAX * 4) /* IFLA_INET6_CONF */ 4985 + nla_total_size(IPSTATS_MIB_MAX * 8) /* IFLA_INET6_STATS */ --- 1076 unchanged lines hidden (view full) --- 6062 .procname = "keep_addr_on_down", 6063 .data = &ipv6_devconf.keep_addr_on_down, 6064 .maxlen = sizeof(int), 6065 .mode = 0644, 6066 .proc_handler = proc_dointvec, 6067 6068 }, 6069 { |
6070 .procname = "seg6_enabled", 6071 .data = &ipv6_devconf.seg6_enabled, 6072 .maxlen = sizeof(int), 6073 .mode = 0644, 6074 .proc_handler = proc_dointvec, 6075 }, 6076#ifdef CONFIG_IPV6_SEG6_HMAC 6077 { 6078 .procname = "seg6_require_hmac", 6079 .data = &ipv6_devconf.seg6_require_hmac, 6080 .maxlen = sizeof(int), 6081 .mode = 0644, 6082 .proc_handler = proc_dointvec, 6083 }, 6084#endif 6085 { 6086 .procname = "enhanced_dad", 6087 .data = &ipv6_devconf.enhanced_dad, 6088 .maxlen = sizeof(int), 6089 .mode = 0644, 6090 .proc_handler = proc_dointvec, 6091 }, 6092 { |
|
6045 /* sentinel */ 6046 } 6047}; 6048 6049static int __addrconf_sysctl_register(struct net *net, char *dev_name, 6050 struct inet6_dev *idev, struct ipv6_devconf *p) 6051{ 6052 int i, ifindex; --- 277 unchanged lines hidden --- | 6093 /* sentinel */ 6094 } 6095}; 6096 6097static int __addrconf_sysctl_register(struct net *net, char *dev_name, 6098 struct inet6_dev *idev, struct ipv6_devconf *p) 6099{ 6100 int i, ifindex; --- 277 unchanged lines hidden --- |