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