diff --git a/drivers/net/usb/cdc_mbim.c b/drivers/net/usb/cdc_mbim.c
index 5ee7a1d..deb21de 100644
--- a/drivers/net/usb/cdc_mbim.c
+++ b/drivers/net/usb/cdc_mbim.c
@@ -338,7 +338,7 @@ static void do_neigh_solicit(struct usbnet *dev, u8 *buf, u16 tci)
in6_dev = in6_dev_get(netdev);
if (!in6_dev)
goto out;
- is_router = !!in6_dev->cnf.forwarding;
+ is_router = !!IN6_DEV_FORWARD(in6_dev);
in6_dev_put(in6_dev);
/* ipv6_stub != NULL if in6_dev_get returned an inet6_dev */
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
index 4e2caaf..38d4029 100644
--- a/drivers/net/vxlan.c
+++ b/drivers/net/vxlan.c
@@ -2633,7 +2633,7 @@ static int vxlan_newlink(struct net *net, struct net_device *dev,
#if IS_ENABLED(CONFIG_IPV6)
if (use_ipv6) {
struct inet6_dev *idev = __in6_dev_get(lowerdev);
- if (idev && idev->cnf.disable_ipv6) {
+ if (idev && IN6_DEV_DISABLE_IPV6(idev)) {
pr_info("IPv6 is disabled via sysctl\n");
return -EPERM;
}diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h
index 2faef33..fe8d38d 100644
--- a/include/linux/ipv6.h
+++ b/include/linux/ipv6.h
@@ -9,48 +9,8 @@
* This structure contains configuration options per IPv6 link.
*/
struct ipv6_devconf {
- __s32 forwarding;
- __s32 hop_limit;
- __s32 mtu6;
- __s32 accept_ra;
- __s32 accept_redirects;
- __s32 autoconf;
- __s32 dad_transmits;
- __s32 rtr_solicits;
- __s32 rtr_solicit_interval;
- __s32 rtr_solicit_delay;
- __s32 force_mld_version;
- __s32 mldv1_unsolicited_report_interval;
- __s32 mldv2_unsolicited_report_interval;
- __s32 use_tempaddr;
- __s32 temp_valid_lft;
- __s32 temp_prefered_lft;
- __s32 regen_max_retry;
- __s32 max_desync_factor;
- __s32 max_addresses;
- __s32 accept_ra_defrtr;
- __s32 accept_ra_pinfo;
-#ifdef CONFIG_IPV6_ROUTER_PREF
- __s32 accept_ra_rtr_pref;
- __s32 rtr_probe_interval;
-#ifdef CONFIG_IPV6_ROUTE_INFO
- __s32 accept_ra_rt_info_max_plen;
-#endif
-#endif
- __s32 proxy_ndp;
- __s32 accept_source_route;
-#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
- __s32 optimistic_dad;
-#endif
-#ifdef CONFIG_IPV6_MROUTE
- __s32 mc_forwarding;
-#endif
- __s32 disable_ipv6;
- __s32 accept_dad;
- __s32 force_tllao;
- __s32 ndisc_notify;
- __s32 suppress_frag_ndisc;
- void *sysctl;
+ void *sysctl;
+ __s32 data[IPV6_DEVCONF_MAX];
};
struct ipv6_params {diff --git a/include/net/addrconf.h b/include/net/addrconf.h
index f679877..7eb463e 100644
--- a/include/net/addrconf.h
+++ b/include/net/addrconf.h
@@ -8,8 +8,8 @@
#define TEMP_VALID_LIFETIME (7*86400)
#define TEMP_PREFERRED_LIFETIME (86400)
-#define REGEN_MAX_RETRY (3)
-#define MAX_DESYNC_FACTOR (600)
+#define _REGEN_MAX_RETRY (3)
+#define _MAX_DESYNC_FACTOR (600)
#define ADDR_CHECK_FREQUENCY (120*HZ)
diff --git a/include/net/ipv6.h b/include/net/ipv6.h
index 574337f..1ee39a5 100644
--- a/include/net/ipv6.h
+++ b/include/net/ipv6.h
@@ -288,13 +288,107 @@ struct ipv6_txoptions *ipv6_fixup_options(struct ipv6_txoptions *opt_space,
bool ipv6_opt_accepted(const struct sock *sk, const struct sk_buff *skb);
+#define IPV6_DEVCONF(cnf, attr) ((cnf).data[IPV6_DEVCONF_ ## attr])
+#define IPV6_DEVCONF_ALL(net, attr) \
+ IPV6_DEVCONF((*(net)->ipv6.devconf_all), attr)
+#define IPV6_DEVCONF_DFLT(net, attr) \
+ IPV6_DEVCONF((*(net)->ipv6.devconf_dflt), attr)
+
+static inline int ipv6_devconf_get(struct inet6_dev *idev, int index)
+{
+ return idev->cnf.data[index];
+}
+
+static inline void ipv6_devconf_set(struct inet6_dev *idev, int index,
+ int val)
+{
+ idev->cnf.data[index] = val;
+}
+
+#define IN6_DEV_CONF_GET(idev, attr) \
+ ipv6_devconf_get((idev), IPV6_DEVCONF_ ## attr)
+#define IN6_DEV_CONF_SET(idev, attr, val) \
+ ipv6_devconf_set((idev), IPV6_DEVCONF_ ## attr, (val))
+
+#define IN6_DEV_ANDCONF(idev, attr) \
+ (IPV6_DEVCONF_ALL(dev_net(idev->dev), attr) && \
+ IN6_DEV_CONF_GET((idev), attr))
+#define IN6_DEV_ORCONF(idev, attr) \
+ (IPV6_DEVCONF_ALL(dev_net(idev->dev), attr) || \
+ IN6_DEV_CONF_GET((idev), attr))
+#define IN6_DEV_MAXCONF(idev, attr) \
+ (max(IPV6_DEVCONF_ALL(dev_net(idev->dev), attr), \
+ IN6_DEV_CONF_GET((idev), attr)))
+
+#define IN6_DEV_DISABLE_IPV6(idev)\
+ unlikely(IN6_DEV_ORCONF((idev), DISABLE_IPV6))
+#define IN6_DEV_AUTOCONF(idev) IN6_DEV_ANDCONF((idev), AUTOCONF)
+
+#define IN6_DEV_FORWARD(idev) IN6_DEV_CONF_GET((idev), FORWARDING)
+#define IN6_DEV_MFORWARD(idev) IN6_DEV_ANDCONF((idev), MC_FORWARDING)
+#define IN6_DEV_MFORWARD_INC(idev) \
+ IN6_DEV_CONF_SET((idev), MC_FORWARDING, \
+ IN6_DEV_CONF_GET((idev), MC_FORWARDING) + 1)
+#define IN6_DEV_MFORWARD_DEC(idev) \
+ IN6_DEV_CONF_SET((idev), MC_FORWARDING, \
+ IN6_DEV_CONF_GET((idev), MC_FORWARDING) - 1)
+
+#define IN6_DEV_HOPLIMIT(idev) IN6_DEV_MAXCONF((idev), HOPLIMIT)
+#define IN6_DEV_MTU(idev) IN6_DEV_MAXCONF((idev), MTU6)
+
+#define IN6_DEV_RTR_SOLICITS(idev) IN6_DEV_MAXCONF((idev), RTR_SOLICITS)
+#define IN6_DEV_RTR_SOLICIT_INTERVAL(idev) \
+ IN6_DEV_MAXCONF((idev), RTR_SOLICIT_INTERVAL)
+#define IN6_DEV_RTR_SOLICIT_DELAY(idev) \
+ IN6_DEV_MAXCONF((idev), RTR_SOLICIT_DELAY)
+#define IN6_DEV_USE_TEMPADDR(idev) IN6_DEV_MAXCONF((idev), USE_TEMPADDR)
+
+#define IN6_DEV_ACCEPT_RA(idev) IN6_DEV_MAXCONF((idev), ACCEPT_RA)
+#define IN6_DEV_ACCEPT_REDIRECTS(idev) \
+ IN6_DEV_ANDCONF((idev), ACCEPT_REDIRECTS)
+#define IN6_DEV_ACCEPT_RA_DEFRTR(idev) \
+ IN6_DEV_ANDCONF((idev), ACCEPT_RA_DEFRTR)
+#define IN6_DEV_ACCEPT_RA_PINFO(idev) \
+ IN6_DEV_ANDCONF((idev), ACCEPT_RA_PINFO)
+#define IN6_DEV_ACCEPT_RA_RTR_PREF(idev) \
+ IN6_DEV_ANDCONF((idev), ACCEPT_RA_RTR_PREF)
+#define IN6_DEV_ACCEPT_RA_RT_INFO_MAX_PLEN(idev) \
+ IN6_DEV_MAXCONF((idev), ACCEPT_RA_RT_INFO_MAX_PLEN)
+
+#define IN6_DEV_ACCEPT_SOURCE_ROUTE(idev) \
+ IN6_DEV_MAXCONF((idev), ACCEPT_SOURCE_ROUTE)
+#define IN6_DEV_PROXY_NDP(idev) IN6_DEV_ORCONF((idev), PROXY_NDP)
+#define IN6_DEV_FORCE_MLD_VERSION(idev) \
+ IN6_DEV_MAXCONF((idev), FORCE_MLD_VERSION)
+
+#define IN6_DEV_NDISC_NOTIFY(idev) IN6_DEV_ANDCONF((idev), NDISC_NOTIFY)
+#define IN6_DEV_SUPPRESS_FRAG_NDISC(idev) \
+ IN6_DEV_ANDCONF((idev), SUPPRESS_FRAG_NDISC)
+#define IN6_DEV_FORCE_TLLAO(idev) IN6_DEV_ANDCONF((idev), FORCE_TLLAO)
+#define IN6_DEV_RTR_PROBE_INTERVAL(idev) \
+ IN6_DEV_MAXCONF((idev), RTR_PROBE_INTERVAL)
+#define IN6_DEV_REGEN_MAX_RETRY(idev) \
+ IN6_DEV_MAXCONF((idev), REGEN_MAX_RETRY)
+#define IN6_DEV_TEMP_VALID_LFT(idev) \
+ IN6_DEV_MAXCONF((idev), TEMP_VALID_LFT)
+#define IN6_DEV_TEMP_PREFERED_LFT(idev) \
+ IN6_DEV_MAXCONF((idev), TEMP_PREFERED_LFT)
+#define IN6_DEV_MAX_DESYNC_FACTOR(idev) \
+ IN6_DEV_MAXCONF((idev), MAX_DESYNC_FACTOR)
+#define IN6_DEV_MAX_ADDRESSES(idev) IN6_DEV_MAXCONF((idev), MAX_ADDRESSES)
+
+#define IN6_DEV_ACCEPT_DAD(idev) IN6_DEV_MAXCONF((idev), ACCEPT_DAD)
+#define IN6_DEV_OPTIMISTIC_DAD(idev) IN6_DEV_ANDCONF((idev), OPTIMISTIC_DAD)
+#define IN6_DEV_DAD_TRANSMITS(idev) IN6_DEV_MAXCONF((idev), DAD_TRANSMITS)
+
static inline bool ipv6_accept_ra(struct inet6_dev *idev)
{
/* If forwarding is enabled, RA are not accepted unless the special
* hybrid mode (accept_ra=2) is enabled.
*/
- return idev->cnf.forwarding ? idev->cnf.accept_ra == 2 :
- idev->cnf.accept_ra;
+ return IN6_DEV_FORWARD(idev) ?
+ IN6_DEV_ACCEPT_RA(idev) == 2 :
+ IN6_DEV_ACCEPT_RA(idev);
}
#if IS_ENABLED(CONFIG_IPV6)diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 24fbb38..5b1b578 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -166,75 +166,81 @@ static bool ipv6_chk_same_addr(struct net *net, const struct in6_addr *addr,
struct net_device *dev);
static struct ipv6_devconf ipv6_devconf __read_mostly = {
- .forwarding = 0,
- .hop_limit = IPV6_DEFAULT_HOPLIMIT,
- .mtu6 = IPV6_MIN_MTU,
- .accept_ra = 1,
- .accept_redirects = 1,
- .autoconf = 1,
- .force_mld_version = 0,
- .mldv1_unsolicited_report_interval = 10 * HZ,
- .mldv2_unsolicited_report_interval = HZ,
- .dad_transmits = 1,
- .rtr_solicits = MAX_RTR_SOLICITATIONS,
- .rtr_solicit_interval = RTR_SOLICITATION_INTERVAL,
- .rtr_solicit_delay = MAX_RTR_SOLICITATION_DELAY,
- .use_tempaddr = 0,
- .temp_valid_lft = TEMP_VALID_LIFETIME,
- .temp_prefered_lft = TEMP_PREFERRED_LIFETIME,
- .regen_max_retry = REGEN_MAX_RETRY,
- .max_desync_factor = MAX_DESYNC_FACTOR,
- .max_addresses = IPV6_MAX_ADDRESSES,
- .accept_ra_defrtr = 1,
- .accept_ra_pinfo = 1,
+ .data = {
+ [IPV6_DEVCONF_FORWARDING] = 0,
+ [IPV6_DEVCONF_HOPLIMIT] = IPV6_DEFAULT_HOPLIMIT,
+ [IPV6_DEVCONF_MTU6] = IPV6_MIN_MTU,
+ [IPV6_DEVCONF_ACCEPT_RA] = 1,
+ [IPV6_DEVCONF_ACCEPT_REDIRECTS] = 1,
+ [IPV6_DEVCONF_AUTOCONF] = 1,
+ [IPV6_DEVCONF_FORCE_MLD_VERSION] = 0,
+ [IPV6_DEVCONF_MLDV1_UNSOLICITED_REPORT_INTERVAL] = 10 * HZ,
+ [IPV6_DEVCONF_MLDV2_UNSOLICITED_REPORT_INTERVAL] = HZ,
+ [IPV6_DEVCONF_DAD_TRANSMITS] = 1,
+ [IPV6_DEVCONF_RTR_SOLICITS] = MAX_RTR_SOLICITATIONS,
+ [IPV6_DEVCONF_RTR_SOLICIT_INTERVAL] = RTR_SOLICITATION_INTERVAL,
+ [IPV6_DEVCONF_RTR_SOLICIT_DELAY] = MAX_RTR_SOLICITATION_DELAY,
+ [IPV6_DEVCONF_USE_TEMPADDR] = 0,
+ [IPV6_DEVCONF_TEMP_VALID_LFT] = TEMP_VALID_LIFETIME,
+ [IPV6_DEVCONF_TEMP_PREFERED_LFT] = TEMP_PREFERRED_LIFETIME,
+ [IPV6_DEVCONF_REGEN_MAX_RETRY] = _REGEN_MAX_RETRY,
+ [IPV6_DEVCONF_MAX_DESYNC_FACTOR] = _MAX_DESYNC_FACTOR,
+ [IPV6_DEVCONF_MAX_ADDRESSES] = IPV6_MAX_ADDRESSES,
+ [IPV6_DEVCONF_ACCEPT_RA_DEFRTR] = 1,
+ [IPV6_DEVCONF_ACCEPT_RA_PINFO] = 1,
#ifdef CONFIG_IPV6_ROUTER_PREF
- .accept_ra_rtr_pref = 1,
- .rtr_probe_interval = 60 * HZ,
+ [IPV6_DEVCONF_ACCEPT_RA_RTR_PREF] = 1,
+ [IPV6_DEVCONF_RTR_PROBE_INTERVAL] = 60 * HZ,
#ifdef CONFIG_IPV6_ROUTE_INFO
- .accept_ra_rt_info_max_plen = 0,
+ [IPV6_DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN] = 0,
#endif
#endif
- .proxy_ndp = 0,
- .accept_source_route = 0, /* we do not accept RH0 by default. */
- .disable_ipv6 = 0,
- .accept_dad = 1,
- .suppress_frag_ndisc = 1,
+ [IPV6_DEVCONF_PROXY_NDP] = 0,
+ /* we do not accept RH0 by default. */
+ [IPV6_DEVCONF_ACCEPT_SOURCE_ROUTE] = 0,
+ [IPV6_DEVCONF_DISABLE_IPV6] = 0,
+ [IPV6_DEVCONF_ACCEPT_DAD] = 1,
+ [IPV6_DEVCONF_SUPPRESS_FRAG_NDISC] = 1,
+ },
};
static struct ipv6_devconf ipv6_devconf_dflt __read_mostly = {
- .forwarding = 0,
- .hop_limit = IPV6_DEFAULT_HOPLIMIT,
- .mtu6 = IPV6_MIN_MTU,
- .accept_ra = 1,
- .accept_redirects = 1,
- .autoconf = 1,
- .force_mld_version = 0,
- .mldv1_unsolicited_report_interval = 10 * HZ,
- .mldv2_unsolicited_report_interval = HZ,
- .dad_transmits = 1,
- .rtr_solicits = MAX_RTR_SOLICITATIONS,
- .rtr_solicit_interval = RTR_SOLICITATION_INTERVAL,
- .rtr_solicit_delay = MAX_RTR_SOLICITATION_DELAY,
- .use_tempaddr = 0,
- .temp_valid_lft = TEMP_VALID_LIFETIME,
- .temp_prefered_lft = TEMP_PREFERRED_LIFETIME,
- .regen_max_retry = REGEN_MAX_RETRY,
- .max_desync_factor = MAX_DESYNC_FACTOR,
- .max_addresses = IPV6_MAX_ADDRESSES,
- .accept_ra_defrtr = 1,
- .accept_ra_pinfo = 1,
+ .data = {
+ [IPV6_DEVCONF_FORWARDING] = 0,
+ [IPV6_DEVCONF_HOPLIMIT] = IPV6_DEFAULT_HOPLIMIT,
+ [IPV6_DEVCONF_MTU6] = IPV6_MIN_MTU,
+ [IPV6_DEVCONF_ACCEPT_RA] = 1,
+ [IPV6_DEVCONF_ACCEPT_REDIRECTS] = 1,
+ [IPV6_DEVCONF_AUTOCONF] = 1,
+ [IPV6_DEVCONF_FORCE_MLD_VERSION] = 0,
+ [IPV6_DEVCONF_MLDV1_UNSOLICITED_REPORT_INTERVAL] = 10 * HZ,
+ [IPV6_DEVCONF_MLDV2_UNSOLICITED_REPORT_INTERVAL] = HZ,
+ [IPV6_DEVCONF_DAD_TRANSMITS] = 1,
+ [IPV6_DEVCONF_RTR_SOLICITS] = MAX_RTR_SOLICITATIONS,
+ [IPV6_DEVCONF_RTR_SOLICIT_INTERVAL] = RTR_SOLICITATION_INTERVAL,
+ [IPV6_DEVCONF_RTR_SOLICIT_DELAY] = MAX_RTR_SOLICITATION_DELAY,
+ [IPV6_DEVCONF_USE_TEMPADDR] = 0,
+ [IPV6_DEVCONF_TEMP_VALID_LFT] = TEMP_VALID_LIFETIME,
+ [IPV6_DEVCONF_TEMP_PREFERED_LFT] = TEMP_PREFERRED_LIFETIME,
+ [IPV6_DEVCONF_REGEN_MAX_RETRY] = _REGEN_MAX_RETRY,
+ [IPV6_DEVCONF_MAX_DESYNC_FACTOR] = _MAX_DESYNC_FACTOR,
+ [IPV6_DEVCONF_MAX_ADDRESSES] = IPV6_MAX_ADDRESSES,
+ [IPV6_DEVCONF_ACCEPT_RA_DEFRTR] = 1,
+ [IPV6_DEVCONF_ACCEPT_RA_PINFO] = 1,
#ifdef CONFIG_IPV6_ROUTER_PREF
- .accept_ra_rtr_pref = 1,
- .rtr_probe_interval = 60 * HZ,
+ [IPV6_DEVCONF_ACCEPT_RA_RTR_PREF] = 1,
+ [IPV6_DEVCONF_RTR_PROBE_INTERVAL] = 60 * HZ,
#ifdef CONFIG_IPV6_ROUTE_INFO
- .accept_ra_rt_info_max_plen = 0,
+ [IPV6_DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN] = 0,
#endif
#endif
- .proxy_ndp = 0,
- .accept_source_route = 0, /* we do not accept RH0 by default. */
- .disable_ipv6 = 0,
- .accept_dad = 1,
- .suppress_frag_ndisc = 1,
+ [IPV6_DEVCONF_PROXY_NDP] = 0,
+ /* we do not accept RH0 by default. */
+ [IPV6_DEVCONF_ACCEPT_SOURCE_ROUTE] = 0,
+ [IPV6_DEVCONF_DISABLE_IPV6] = 0,
+ [IPV6_DEVCONF_ACCEPT_DAD] = 1,
+ [IPV6_DEVCONF_SUPPRESS_FRAG_NDISC] = 1,
+ },
};
/* Check if a valid qdisc is available */@@ -325,14 +331,14 @@ static struct inet6_dev *ipv6_add_dev(struct net_device *dev)
setup_timer(&ndev->rs_timer, addrconf_rs_timer,
(unsigned long)ndev);
memcpy(&ndev->cnf, dev_net(dev)->ipv6.devconf_dflt, sizeof(ndev->cnf));
- ndev->cnf.mtu6 = dev->mtu;
+ IN6_DEV_CONF_SET(ndev, MTU6, dev->mtu);
ndev->cnf.sysctl = NULL;
ndev->nd_parms = neigh_parms_alloc(dev, &nd_tbl);
if (ndev->nd_parms == NULL) {
kfree(ndev);
return NULL;
}
- if (ndev->cnf.forwarding)
+ if (IN6_DEV_FORWARD(ndev))
dev_disable_lro(dev);
/* We refer to the device */
dev_hold(dev);@@ -363,12 +369,12 @@ static struct inet6_dev *ipv6_add_dev(struct net_device *dev)
in6_dev_hold(ndev);
if (dev->flags & (IFF_NOARP | IFF_LOOPBACK))
- ndev->cnf.accept_dad = -1;
+ IN6_DEV_CONF_SET(ndev, ACCEPT_DAD, -1);
#if IS_ENABLED(CONFIG_IPV6_SIT)
if (dev->type == ARPHRD_SIT && (dev->priv_flags & IFF_ISATAP)) {
pr_info("%s: Disabled Multicast RS\n", dev->name);
- ndev->cnf.rtr_solicits = 0;
+ IN6_DEV_CONF_SET(ndev, RTR_SOLICITS, 0);
}
#endif
@@ -379,7 +385,7 @@ static struct inet6_dev *ipv6_add_dev(struct net_device *dev)
dev->type == ARPHRD_TUNNEL6 ||
dev->type == ARPHRD_SIT ||
dev->type == ARPHRD_NONE) {
- ndev->cnf.use_tempaddr = -1;
+ IN6_DEV_CONF_SET(ndev, USE_TEMPADDR, -1);
} else {
in6_dev_hold(ndev);
ipv6_regen_rndid((unsigned long) ndev);@@ -403,7 +409,7 @@ static struct inet6_dev *ipv6_add_dev(struct net_device *dev)
ipv6_dev_mc_inc(dev, &in6addr_linklocal_allnodes);
/* Join all-router multicast group if forwarding is set */
- if (ndev->cnf.forwarding && (dev->flags & IFF_MULTICAST))
+ if (IN6_DEV_FORWARD(ndev) && (dev->flags & IFF_MULTICAST))
ipv6_dev_mc_inc(dev, &in6addr_linklocal_allrouters);
return ndev;
@@ -466,16 +472,18 @@ static int inet6_netconf_fill_devconf(struct sk_buff *skb, int ifindex,
/* type -1 is used for ALL */
if ((type == -1 || type == NETCONFA_FORWARDING) &&
- nla_put_s32(skb, NETCONFA_FORWARDING, devconf->forwarding) < 0)
+ nla_put_s32(skb, NETCONFA_FORWARDING,
+ IPV6_DEVCONF(*devconf, FORWARDING)) < 0)
goto nla_put_failure;
#ifdef CONFIG_IPV6_MROUTE
if ((type == -1 || type == NETCONFA_MC_FORWARDING) &&
nla_put_s32(skb, NETCONFA_MC_FORWARDING,
- devconf->mc_forwarding) < 0)
+ IPV6_DEVCONF(*devconf, MC_FORWARDING)) < 0)
goto nla_put_failure;
#endif
if ((type == -1 || type == NETCONFA_PROXY_NEIGH) &&
- nla_put_s32(skb, NETCONFA_PROXY_NEIGH, devconf->proxy_ndp) < 0)
+ nla_put_s32(skb, NETCONFA_PROXY_NEIGH,
+ IPV6_DEVCONF(*devconf, PROXY_NDP)) < 0)
goto nla_put_failure;
return nlmsg_end(skb, nlh);
@@ -656,10 +664,10 @@ static void dev_forward_change(struct inet6_dev *idev)
if (!idev)
return;
dev = idev->dev;
- if (idev->cnf.forwarding)
+ if (IN6_DEV_FORWARD(idev))
dev_disable_lro(dev);
if (dev->flags & IFF_MULTICAST) {
- if (idev->cnf.forwarding) {
+ if (IN6_DEV_FORWARD(idev)) {
ipv6_dev_mc_inc(dev, &in6addr_linklocal_allrouters);
ipv6_dev_mc_inc(dev, &in6addr_interfacelocal_allrouters);
ipv6_dev_mc_inc(dev, &in6addr_sitelocal_allrouters);@@ -673,7 +681,7 @@ static void dev_forward_change(struct inet6_dev *idev)
list_for_each_entry(ifa, &idev->addr_list, if_list) {
if (ifa->flags&IFA_F_TENTATIVE)
continue;
- if (idev->cnf.forwarding)
+ if (IN6_DEV_FORWARD(idev))
addrconf_join_anycast(ifa);
else
addrconf_leave_anycast(ifa);@@ -691,8 +699,9 @@ static void addrconf_forward_change(struct net *net, __s32 newf)
for_each_netdev(net, dev) {
idev = __in6_dev_get(dev);
if (idev) {
- int changed = (!idev->cnf.forwarding) ^ (!newf);
- idev->cnf.forwarding = newf;
+ int changed = (!IN6_DEV_FORWARD(idev)) ^ (!newf);
+
+ IN6_DEV_CONF_SET(idev, FORWARDING, newf);
if (changed)
dev_forward_change(idev);
}@@ -711,7 +720,7 @@ static int addrconf_fixup_forwarding(struct ctl_table *table, int *p, int newf)
old = *p;
*p = newf;
- if (p == &net->ipv6.devconf_dflt->forwarding) {
+ if (p == &IPV6_DEVCONF_DFLT(net, FORWARDING)) {
if ((!newf) ^ (!old))
inet6_netconf_notify_devconf(net, NETCONFA_FORWARDING,
NETCONFA_IFINDEX_DEFAULT,@@ -720,15 +729,19 @@ static int addrconf_fixup_forwarding(struct ctl_table *table, int *p, int newf)
return 0;
}
- if (p == &net->ipv6.devconf_all->forwarding) {
- net->ipv6.devconf_dflt->forwarding = newf;
+ if (p == &IPV6_DEVCONF_ALL(net, FORWARDING)) {
+ IPV6_DEVCONF_DFLT(net, FORWARDING) = newf;
addrconf_forward_change(net, newf);
if ((!newf) ^ (!old))
inet6_netconf_notify_devconf(net, NETCONFA_FORWARDING,
NETCONFA_IFINDEX_ALL,
net->ipv6.devconf_all);
- } else if ((!newf) ^ (!old))
- dev_forward_change((struct inet6_dev *)table->extra1);
+ } else if ((!newf) ^ (!old)) {
+ struct ipv6_devconf *cnf = table->extra1;
+ struct inet6_dev *idev =
+ container_of(cnf, struct inet6_dev, cnf);
+ dev_forward_change(idev);
+ }
rtnl_unlock();
if (newf)@@ -811,7 +824,7 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr,
goto out2;
}
- if (idev->cnf.disable_ipv6) {
+ if (IN6_DEV_DISABLE_IPV6(idev)) {
err = -EACCES;
goto out2;
}@@ -1059,7 +1072,7 @@ static int ipv6_create_tempaddr(struct inet6_ifaddr *ifp, struct inet6_ifaddr *i
}
retry:
in6_dev_hold(idev);
- if (idev->cnf.use_tempaddr <= 0) {
+ if (IN6_DEV_USE_TEMPADDR(idev) <= 0) {
write_unlock_bh(&idev->lock);
pr_info("%s: use_tempaddr is disabled\n", __func__);
in6_dev_put(idev);@@ -1067,8 +1080,8 @@ retry:
goto out;
}
spin_lock_bh(&ifp->lock);
- if (ifp->regen_count++ >= idev->cnf.regen_max_retry) {
- idev->cnf.use_tempaddr = -1; /*XXX*/
+ if (ifp->regen_count++ >= IN6_DEV_REGEN_MAX_RETRY(idev)) {
+ IN6_DEV_CONF_SET(idev, USE_TEMPADDR, -1); /*XXX*/
spin_unlock_bh(&ifp->lock);
write_unlock_bh(&idev->lock);
pr_warn("%s: regeneration time exceeded - disabled temporary address support\n",@@ -1084,18 +1097,18 @@ retry:
age = (now - ifp->tstamp) / HZ;
tmp_valid_lft = min_t(__u32,
ifp->valid_lft,
- idev->cnf.temp_valid_lft + age);
+ IN6_DEV_TEMP_VALID_LFT(idev) + age);
tmp_prefered_lft = min_t(__u32,
ifp->prefered_lft,
- idev->cnf.temp_prefered_lft + age -
- idev->cnf.max_desync_factor);
+ IN6_DEV_TEMP_PREFERED_LFT(idev) + age -
+ IN6_DEV_MAX_DESYNC_FACTOR(idev));
tmp_plen = ifp->prefix_len;
tmp_tstamp = ifp->tstamp;
spin_unlock_bh(&ifp->lock);
- regen_advance = idev->cnf.regen_max_retry *
- idev->cnf.dad_transmits *
- NEIGH_VAR(idev->nd_parms, RETRANS_TIME) / HZ;
+ regen_advance = IN6_DEV_REGEN_MAX_RETRY(idev) *
+ IN6_DEV_DAD_TRANSMITS(idev) *
+ NEIGH_VAR(idev->nd_parms, RETRANS_TIME) / HZ;
write_unlock_bh(&idev->lock);
/* A temporary address is created only if this calculated Preferred
@@ -1277,7 +1290,7 @@ static int ipv6_get_saddr_eval(struct net *net,
*/
int preftmp = dst->prefs & (IPV6_PREFER_SRC_PUBLIC|IPV6_PREFER_SRC_TMP) ?
!!(dst->prefs & IPV6_PREFER_SRC_TMP) :
- score->ifa->idev->cnf.use_tempaddr >= 2;
+ IN6_DEV_USE_TEMPADDR(score->ifa->idev) >= 2;
ret = (!(score->ifa->flags & IFA_F_TEMPORARY)) ^ preftmp;
break;
}
@@ -1655,7 +1668,8 @@ void addrconf_dad_failure(struct inet6_ifaddr *ifp)
net_info_ratelimited("%s: IPv6 duplicate address %pI6c detected!\n",
ifp->idev->dev->name, &ifp->addr);
- if (idev->cnf.accept_dad > 1 && !idev->cnf.disable_ipv6) {
+ if (IN6_DEV_ACCEPT_DAD(idev) > 1 &&
+ !IN6_DEV_DISABLE_IPV6(idev)) {
struct in6_addr addr;
addr.s6_addr32[0] = htonl(0xfe800000);@@ -1664,7 +1678,7 @@ void addrconf_dad_failure(struct inet6_ifaddr *ifp)
if (!ipv6_generate_eui64(addr.s6_addr + 8, idev->dev) &&
ipv6_addr_equal(&ifp->addr, &addr)) {
/* DAD failed for link-local based on MAC address */
- idev->cnf.disable_ipv6 = 1;
+ IN6_DEV_CONF_SET(idev, DISABLE_IPV6, 1);
pr_info("%s: IPv6 being disabled!\n",
ifp->idev->dev->name);@@ -1935,10 +1949,11 @@ static void ipv6_regen_rndid(unsigned long data)
__ipv6_regen_rndid(idev);
expires = jiffies +
- idev->cnf.temp_prefered_lft * HZ -
- idev->cnf.regen_max_retry * idev->cnf.dad_transmits *
+ IN6_DEV_TEMP_PREFERED_LFT(idev) * HZ -
+ IN6_DEV_REGEN_MAX_RETRY(idev) *
+ IN6_DEV_DAD_TRANSMITS(idev) *
NEIGH_VAR(idev->nd_parms, RETRANS_TIME) -
- idev->cnf.max_desync_factor * HZ;
+ IN6_DEV_MAX_DESYNC_FACTOR(idev) * HZ;
if (time_before(expires, jiffies)) {
pr_warn("%s: too short regeneration interval; timer disabled for %s\n",
__func__, idev->dev->name);@@ -2055,7 +2070,7 @@ static struct inet6_dev *addrconf_add_dev(struct net_device *dev)
if (!idev)
return ERR_PTR(-ENOBUFS);
- if (idev->cnf.disable_ipv6)
+ if (IN6_DEV_DISABLE_IPV6(idev))
return ERR_PTR(-EACCES);
/* Add default multicast route */
@@ -2090,12 +2105,13 @@ static void manage_tempaddrs(struct inet6_dev *idev,
* (TEMP_PREFERRED_LIFETIME - DESYNC_FACTOR), respectively.
*/
age = (now - ift->cstamp) / HZ;
- max_valid = idev->cnf.temp_valid_lft - age;
+ max_valid = IN6_DEV_TEMP_VALID_LFT(idev) - age;
if (max_valid < 0)
max_valid = 0;
- max_prefered = idev->cnf.temp_prefered_lft -
- idev->cnf.max_desync_factor - age;
+ max_prefered = IN6_DEV_TEMP_PREFERED_LFT(idev) -
+ IN6_DEV_MAX_DESYNC_FACTOR(idev) -
+ age;
if (max_prefered < 0)
max_prefered = 0;
@@ -2119,7 +2135,7 @@ static void manage_tempaddrs(struct inet6_dev *idev,
}
if ((create || list_empty(&idev->tempaddr_list)) &&
- idev->cnf.use_tempaddr > 0) {
+ IN6_DEV_USE_TEMPADDR(idev) > 0) {
/* When a new public address is created as described
* in [ADDRCONF], also create a new temporary address.
* Also create a temporary address if it's enabled but@@ -2229,7 +2245,7 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len, bool sllao)
/* Try to figure out our local address for this prefix */
- if (pinfo->autoconf && in6_dev->cnf.autoconf) {
+ if (pinfo->autoconf && IN6_DEV_AUTOCONF(in6_dev)) {
struct inet6_ifaddr *ifp;
struct in6_addr addr;
int create = 0, update_lft = 0;@@ -2261,12 +2277,12 @@ ok:
ifp = ipv6_get_ifaddr(net, &addr, dev, 1);
if (ifp == NULL && valid_lft) {
- int max_addresses = in6_dev->cnf.max_addresses;
+ int max_addresses = IN6_DEV_MAX_ADDRESSES(in6_dev);
u32 addr_flags = 0;
#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
- if (in6_dev->cnf.optimistic_dad &&
- !net->ipv6.devconf_all->forwarding && sllao)
+ if (IN6_DEV_OPTIMISTIC_DAD(in6_dev) &&
+ !IPV6_DEVCONF_ALL(net, FORWARDING) && sllao)
addr_flags = IFA_F_OPTIMISTIC;
#endif
@@ -2713,8 +2729,8 @@ static void addrconf_add_linklocal(struct inet6_dev *idev, const struct in6_addr
u32 addr_flags = IFA_F_PERMANENT;
#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
- if (idev->cnf.optimistic_dad &&
- !dev_net(idev->dev)->ipv6.devconf_all->forwarding)
+ if (IN6_DEV_OPTIMISTIC_DAD(idev) &&
+ !IPV6_DEVCONF_ALL(dev_net(idev->dev), FORWARDING))
addr_flags |= IFA_F_OPTIMISTIC;
#endif
@@ -2898,10 +2914,10 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
* when the interface up, the changed MTU must be
* reflected in the idev as well as routers.
*/
- if (idev->cnf.mtu6 != dev->mtu &&
+ if (IN6_DEV_MTU(idev) != dev->mtu &&
dev->mtu >= IPV6_MIN_MTU) {
rt6_mtu_change(dev, dev->mtu);
- idev->cnf.mtu6 = dev->mtu;
+ IN6_DEV_CONF_SET(idev, MTU6, dev->mtu);
}
idev->tstamp = jiffies;
inet6_ifinfo_notify(RTM_NEWLINK, idev);@@ -2918,7 +2934,7 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
case NETDEV_CHANGEMTU:
if (idev && dev->mtu >= IPV6_MIN_MTU) {
rt6_mtu_change(dev, dev->mtu);
- idev->cnf.mtu6 = dev->mtu;
+ IN6_DEV_CONF_SET(idev, MTU6, dev->mtu);
break;
}
@@ -3116,7 +3132,7 @@ static void addrconf_rs_timer(unsigned long data)
if (idev->if_flags & IF_RA_RCVD)
goto out;
- if (idev->rs_probes++ < idev->cnf.rtr_solicits) {
+ if (idev->rs_probes++ < IN6_DEV_RTR_SOLICITS(idev)) {
write_unlock(&idev->lock);
if (!ipv6_get_lladdr(dev, &lladdr, IFA_F_TENTATIVE))
ndisc_send_rs(dev, &lladdr,@@ -3127,9 +3143,9 @@ static void addrconf_rs_timer(unsigned long data)
write_lock(&idev->lock);
/* The wait after the last probe can be shorter */
addrconf_mod_rs_timer(idev, (idev->rs_probes ==
- idev->cnf.rtr_solicits) ?
- idev->cnf.rtr_solicit_delay :
- idev->cnf.rtr_solicit_interval);
+ IN6_DEV_RTR_SOLICITS(idev)) ?
+ IN6_DEV_RTR_SOLICIT_DELAY(idev) :
+ IN6_DEV_RTR_SOLICIT_INTERVAL(idev));
} else {
/*
* Note: we do not support deprecated "all on-link"@@ -3155,9 +3171,10 @@ static void addrconf_dad_kick(struct inet6_ifaddr *ifp)
if (ifp->flags & IFA_F_OPTIMISTIC)
rand_num = 0;
else
- rand_num = prandom_u32() % (idev->cnf.rtr_solicit_delay ? : 1);
+ rand_num = prandom_u32() %
+ (IN6_DEV_RTR_SOLICIT_DELAY(idev) ? : 1);
- ifp->dad_probes = idev->cnf.dad_transmits;
+ ifp->dad_probes = IN6_DEV_DAD_TRANSMITS(idev);
addrconf_mod_dad_work(ifp, rand_num);
}
@@ -3176,7 +3193,7 @@ static void addrconf_dad_begin(struct inet6_ifaddr *ifp)
goto out;
if (dev->flags&(IFF_NOARP|IFF_LOOPBACK) ||
- idev->cnf.accept_dad < 1 ||
+ IN6_DEV_ACCEPT_DAD(idev) < 1 ||
!(ifp->flags&IFA_F_TENTATIVE) ||
ifp->flags & IFA_F_NODAD) {
ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED);@@ -3346,7 +3363,7 @@ static void addrconf_dad_completed(struct inet6_ifaddr *ifp)
send_mld = ifp->scope == IFA_LINK && ipv6_lonely_lladdr(ifp);
send_rs = send_mld &&
ipv6_accept_ra(ifp->idev) &&
- ifp->idev->cnf.rtr_solicits > 0 &&
+ IN6_DEV_RTR_SOLICITS(ifp->idev) > 0 &&
(dev->flags&IFF_LOOPBACK) == 0;
read_unlock_bh(&ifp->idev->lock);
@@ -3371,7 +3388,7 @@ static void addrconf_dad_completed(struct inet6_ifaddr *ifp)
ifp->idev->rs_probes = 1;
ifp->idev->if_flags |= IF_RS_SENT;
addrconf_mod_rs_timer(ifp->idev,
- ifp->idev->cnf.rtr_solicit_interval);
+ IN6_DEV_RTR_SOLICIT_INTERVAL(ifp->idev));
spin_unlock(&ifp->lock);
write_unlock_bh(&ifp->idev->lock);
}
@@ -3635,8 +3652,9 @@ restart:
}
} else if ((ifp->flags&IFA_F_TEMPORARY) &&
!(ifp->flags&IFA_F_TENTATIVE)) {
- unsigned long regen_advance = ifp->idev->cnf.regen_max_retry *
- ifp->idev->cnf.dad_transmits *
+ unsigned long regen_advance =
+ IN6_DEV_REGEN_MAX_RETRY(ifp->idev) *
+ IN6_DEV_DAD_TRANSMITS(ifp->idev) *
NEIGH_VAR(ifp->idev->nd_parms, RETRANS_TIME) / HZ;
if (age >= ifp->prefered_lft - regen_advance) {@@ -4275,52 +4293,7 @@ static inline void ipv6_store_devconf(struct ipv6_devconf *cnf,
BUG_ON(bytes < (IPV6_DEVCONF_MAX * 4));
memset(array, 0, bytes);
- array[IPV6_DEVCONF_FORWARDING] = cnf->forwarding;
- array[IPV6_DEVCONF_HOPLIMIT] = cnf->hop_limit;
- array[IPV6_DEVCONF_MTU6] = cnf->mtu6;
- array[IPV6_DEVCONF_ACCEPT_RA] = cnf->accept_ra;
- array[IPV6_DEVCONF_ACCEPT_REDIRECTS] = cnf->accept_redirects;
- array[IPV6_DEVCONF_AUTOCONF] = cnf->autoconf;
- array[IPV6_DEVCONF_DAD_TRANSMITS] = cnf->dad_transmits;
- array[IPV6_DEVCONF_RTR_SOLICITS] = cnf->rtr_solicits;
- array[IPV6_DEVCONF_RTR_SOLICIT_INTERVAL] =
- jiffies_to_msecs(cnf->rtr_solicit_interval);
- array[IPV6_DEVCONF_RTR_SOLICIT_DELAY] =
- jiffies_to_msecs(cnf->rtr_solicit_delay);
- array[IPV6_DEVCONF_FORCE_MLD_VERSION] = cnf->force_mld_version;
- array[IPV6_DEVCONF_MLDV1_UNSOLICITED_REPORT_INTERVAL] =
- jiffies_to_msecs(cnf->mldv1_unsolicited_report_interval);
- array[IPV6_DEVCONF_MLDV2_UNSOLICITED_REPORT_INTERVAL] =
- jiffies_to_msecs(cnf->mldv2_unsolicited_report_interval);
- array[IPV6_DEVCONF_USE_TEMPADDR] = cnf->use_tempaddr;
- array[IPV6_DEVCONF_TEMP_VALID_LFT] = cnf->temp_valid_lft;
- array[IPV6_DEVCONF_TEMP_PREFERED_LFT] = cnf->temp_prefered_lft;
- array[IPV6_DEVCONF_REGEN_MAX_RETRY] = cnf->regen_max_retry;
- array[IPV6_DEVCONF_MAX_DESYNC_FACTOR] = cnf->max_desync_factor;
- array[IPV6_DEVCONF_MAX_ADDRESSES] = cnf->max_addresses;
- array[IPV6_DEVCONF_ACCEPT_RA_DEFRTR] = cnf->accept_ra_defrtr;
- array[IPV6_DEVCONF_ACCEPT_RA_PINFO] = cnf->accept_ra_pinfo;
-#ifdef CONFIG_IPV6_ROUTER_PREF
- array[IPV6_DEVCONF_ACCEPT_RA_RTR_PREF] = cnf->accept_ra_rtr_pref;
- array[IPV6_DEVCONF_RTR_PROBE_INTERVAL] =
- jiffies_to_msecs(cnf->rtr_probe_interval);
-#ifdef CONFIG_IPV6_ROUTE_INFO
- array[IPV6_DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN] = cnf->accept_ra_rt_info_max_plen;
-#endif
-#endif
- array[IPV6_DEVCONF_PROXY_NDP] = cnf->proxy_ndp;
- array[IPV6_DEVCONF_ACCEPT_SOURCE_ROUTE] = cnf->accept_source_route;
-#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
- array[IPV6_DEVCONF_OPTIMISTIC_DAD] = cnf->optimistic_dad;
-#endif
-#ifdef CONFIG_IPV6_MROUTE
- array[IPV6_DEVCONF_MC_FORWARDING] = cnf->mc_forwarding;
-#endif
- array[IPV6_DEVCONF_DISABLE_IPV6] = cnf->disable_ipv6;
- array[IPV6_DEVCONF_ACCEPT_DAD] = cnf->accept_dad;
- array[IPV6_DEVCONF_FORCE_TLLAO] = cnf->force_tllao;
- array[IPV6_DEVCONF_NDISC_NOTIFY] = cnf->ndisc_notify;
- array[IPV6_DEVCONF_SUPPRESS_FRAG_NDISC] = cnf->suppress_frag_ndisc;
+ memcpy(array, cnf->data, bytes);
}
static inline size_t inet6_ifla6_size(void)
@@ -4468,7 +4441,7 @@ static int inet6_set_iftoken(struct inet6_dev *idev, struct in6_addr *token)
return -EINVAL;
if (!ipv6_accept_ra(idev))
return -EINVAL;
- if (idev->cnf.rtr_solicits <= 0)
+ if (IN6_DEV_RTR_SOLICITS(idev) <= 0)
return -EINVAL;
write_lock_bh(&idev->lock);
@@ -4494,7 +4467,7 @@ static int inet6_set_iftoken(struct inet6_dev *idev, struct in6_addr *token)
if (update_rs) {
idev->if_flags |= IF_RS_SENT;
idev->rs_probes = 1;
- addrconf_mod_rs_timer(idev, idev->cnf.rtr_solicit_interval);
+ addrconf_mod_rs_timer(idev, IN6_DEV_RTR_SOLICIT_INTERVAL(idev));
}
/* Well, that's kinda nasty ... */@@ -4725,14 +4698,14 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
*/
if (!(ifp->rt->rt6i_node))
ip6_ins_rt(ifp->rt);
- if (ifp->idev->cnf.forwarding)
+ if (IN6_DEV_FORWARD(ifp->idev))
addrconf_join_anycast(ifp);
if (!ipv6_addr_any(&ifp->peer_addr))
addrconf_prefix_route(&ifp->peer_addr, 128,
ifp->idev->dev, 0, 0);
break;
case RTM_DELADDR:
- if (ifp->idev->cnf.forwarding)
+ if (IN6_DEV_FORWARD(ifp->idev))
addrconf_leave_anycast(ifp);
addrconf_leave_solict(ifp->idev, &ifp->addr);
if (!ipv6_addr_any(&ifp->peer_addr)) {@@ -4778,8 +4751,8 @@ int addrconf_sysctl_forward(struct ctl_table *ctl, int write,
int ret;
/*
- * ctl->data points to idev->cnf.forwarding, we should
- * not modify it until we get the rtnl lock.
+ * ctl->data points to idev->cnf.data[IPV6_DEVCONF_FORWARDING],
+ * we should not modify it until we get the rtnl lock.
*/
lctl = *ctl;
lctl.data = &val;
@@ -4801,7 +4774,7 @@ static void dev_disable_change(struct inet6_dev *idev)
return;
netdev_notifier_info_init(&info, idev->dev);
- if (idev->cnf.disable_ipv6)
+ if (IN6_DEV_DISABLE_IPV6(idev))
addrconf_notify(NULL, NETDEV_DOWN, &info);
else
addrconf_notify(NULL, NETDEV_UP, &info);
@@ -4816,8 +4789,9 @@ static void addrconf_disable_change(struct net *net, __s32 newf)
for_each_netdev_rcu(net, dev) {
idev = __in6_dev_get(dev);
if (idev) {
- int changed = (!idev->cnf.disable_ipv6) ^ (!newf);
- idev->cnf.disable_ipv6 = newf;
+ int changed = (!IN6_DEV_DISABLE_IPV6(idev)) ^ (!newf);
+
+ IN6_DEV_CONF_SET(idev, DISABLE_IPV6, newf);
if (changed)
dev_disable_change(idev);
}@@ -4837,16 +4811,20 @@ static int addrconf_disable_ipv6(struct ctl_table *table, int *p, int newf)
old = *p;
*p = newf;
- if (p == &net->ipv6.devconf_dflt->disable_ipv6) {
+ if (p == &IPV6_DEVCONF_DFLT(net, DISABLE_IPV6)) {
rtnl_unlock();
return 0;
}
- if (p == &net->ipv6.devconf_all->disable_ipv6) {
- net->ipv6.devconf_dflt->disable_ipv6 = newf;
+ if (p == &IPV6_DEVCONF_ALL(net, DISABLE_IPV6)) {
+ IPV6_DEVCONF_DFLT(net, DISABLE_IPV6) = newf;
addrconf_disable_change(net, newf);
- } else if ((!newf) ^ (!old))
- dev_disable_change((struct inet6_dev *)table->extra1);
+ } else if ((!newf) ^ (!old)) {
+ struct ipv6_devconf *cnf = table->extra1;
+ struct inet6_dev *idev =
+ container_of(cnf, struct inet6_dev, cnf);
+ dev_disable_change(idev);
+ }
rtnl_unlock();
return 0;@@ -4863,8 +4841,8 @@ int addrconf_sysctl_disable(struct ctl_table *ctl, int write,
int ret;
/*
- * ctl->data points to idev->cnf.disable_ipv6, we should
- * not modify it until we get the rtnl lock.
+ * ctl->data points to idev->cnf.data[IPV6_DEVCONF_DISABLE_IPV6],
+ * we should not modify it until we get the rtnl lock.
*/
lctl = *ctl;
lctl.data = &val;
@@ -4896,16 +4874,18 @@ int addrconf_sysctl_proxy_ndp(struct ctl_table *ctl, int write,
if (!rtnl_trylock())
return restart_syscall();
- if (valp == &net->ipv6.devconf_dflt->proxy_ndp)
+ if (valp == &IPV6_DEVCONF_DFLT(net, PROXY_NDP))
inet6_netconf_notify_devconf(net, NETCONFA_PROXY_NEIGH,
NETCONFA_IFINDEX_DEFAULT,
net->ipv6.devconf_dflt);
- else if (valp == &net->ipv6.devconf_all->proxy_ndp)
+ else if (valp == &IPV6_DEVCONF_ALL(net, PROXY_NDP))
inet6_netconf_notify_devconf(net, NETCONFA_PROXY_NEIGH,
NETCONFA_IFINDEX_ALL,
net->ipv6.devconf_all);
else {
- struct inet6_dev *idev = ctl->extra1;
+ struct ipv6_devconf *cnf = ctl->extra1;
+ struct inet6_dev *idev =
+ container_of(cnf, struct inet6_dev, cnf);
inet6_netconf_notify_devconf(net, NETCONFA_PROXY_NEIGH,
idev->dev->ifindex,@@ -4917,27 +4897,25 @@ int addrconf_sysctl_proxy_ndp(struct ctl_table *ctl, int write,
return ret;
}
-#define ADDRCONF_SYSCTL_ENTRY(name, var, mval, proc) \
+#define ADDRCONF_SYSCTL_ENTRY(attr, name, mval, proc) \
{ \
.procname = #name, \
- .data = (void *)&ipv6_devconf + \
- offsetof(struct ipv6_devconf, var), \
+ .data = ipv6_devconf.data + \
+ IPV6_DEVCONF_ ## attr, \
.maxlen = sizeof(int), \
.mode = mval, \
.proc_handler = proc, \
+ .extra1 = &ipv6_devconf, \
}
-#define ADDRCONF_SYSCTL_RW_ENTRY(name) \
- ADDRCONF_SYSCTL_ENTRY(name, name, 0644, proc_dointvec)
+#define ADDRCONF_SYSCTL_RW_ENTRY(attr, name) \
+ ADDRCONF_SYSCTL_ENTRY(attr, name, 0644, proc_dointvec)
-#define ADDRCONF_SYSCTL_RO_ENTRY(name) \
- ADDRCONF_SYSCTL_ENTRY(name, name, 0444, proc_dointvec)
+#define ADDRCONF_SYSCTL_RO_ENTRY(attr, name) \
+ ADDRCONF_SYSCTL_ENTRY(attr, name, 0444, proc_dointvec)
-#define ADDRCONF_SYSCTL_COMPLEX_ENTRY(name, proc) \
- ADDRCONF_SYSCTL_ENTRY(name, name, 0644, proc)
-
-#define ADDRCONF_SYSCTL_CUSTOM_ENTRY(name, var, proc) \
- ADDRCONF_SYSCTL_ENTRY(name, var, 0644, proc)
+#define ADDRCONF_SYSCTL_COMPLEX_ENTRY(attr, name, proc) \
+ ADDRCONF_SYSCTL_ENTRY(attr, name, 0644, proc)
static struct addrconf_sysctl_table
{@@ -4946,62 +4924,64 @@ static struct addrconf_sysctl_table
} addrconf_sysctl __read_mostly = {
.sysctl_header = NULL,
.addrconf_vars = {
- ADDRCONF_SYSCTL_COMPLEX_ENTRY(forwarding,
+ ADDRCONF_SYSCTL_COMPLEX_ENTRY(FORWARDING, forwarding,
addrconf_sysctl_forward),
- ADDRCONF_SYSCTL_RW_ENTRY(hop_limit),
- ADDRCONF_SYSCTL_CUSTOM_ENTRY(mtu, mtu6, proc_dointvec),
- ADDRCONF_SYSCTL_RW_ENTRY(accept_ra),
- ADDRCONF_SYSCTL_RW_ENTRY(accept_redirects),
- ADDRCONF_SYSCTL_RW_ENTRY(autoconf),
- ADDRCONF_SYSCTL_RW_ENTRY(dad_transmits),
- ADDRCONF_SYSCTL_CUSTOM_ENTRY(router_solicitations, rtr_solicits,
- proc_dointvec),
- ADDRCONF_SYSCTL_CUSTOM_ENTRY(router_solicitation_interval,
- rtr_solicit_interval,
- proc_dointvec_jiffies),
- ADDRCONF_SYSCTL_CUSTOM_ENTRY(router_solicitation_delay,
- rtr_solicit_delay,
- proc_dointvec_jiffies),
- ADDRCONF_SYSCTL_RW_ENTRY(force_mld_version),
- ADDRCONF_SYSCTL_COMPLEX_ENTRY(mldv1_unsolicited_report_interval,
- proc_dointvec_ms_jiffies),
- ADDRCONF_SYSCTL_COMPLEX_ENTRY(mldv2_unsolicited_report_interval,
- proc_dointvec_ms_jiffies),
- ADDRCONF_SYSCTL_RW_ENTRY(use_tempaddr),
- ADDRCONF_SYSCTL_RW_ENTRY(temp_valid_lft),
- ADDRCONF_SYSCTL_RW_ENTRY(temp_prefered_lft),
- ADDRCONF_SYSCTL_RW_ENTRY(regen_max_retry),
- ADDRCONF_SYSCTL_RW_ENTRY(max_desync_factor),
- ADDRCONF_SYSCTL_RW_ENTRY(max_addresses),
- ADDRCONF_SYSCTL_RW_ENTRY(accept_ra_defrtr),
- ADDRCONF_SYSCTL_RW_ENTRY(accept_ra_pinfo),
+ ADDRCONF_SYSCTL_RW_ENTRY(HOPLIMIT, hop_limit),
+ ADDRCONF_SYSCTL_RW_ENTRY(MTU6, mtu),
+ ADDRCONF_SYSCTL_RW_ENTRY(ACCEPT_RA, accept_ra),
+ ADDRCONF_SYSCTL_RW_ENTRY(ACCEPT_REDIRECTS, accept_redirects),
+ ADDRCONF_SYSCTL_RW_ENTRY(AUTOCONF, autoconf),
+ ADDRCONF_SYSCTL_RW_ENTRY(DAD_TRANSMITS, dad_transmits),
+ ADDRCONF_SYSCTL_RW_ENTRY(RTR_SOLICITS, router_solicitations),
+ ADDRCONF_SYSCTL_RW_ENTRY(RTR_SOLICIT_INTERVAL,
+ router_solicitation_interval),
+ ADDRCONF_SYSCTL_RW_ENTRY(RTR_SOLICIT_DELAY,
+ router_solicitation_delay),
+ ADDRCONF_SYSCTL_RW_ENTRY(FORCE_MLD_VERSION, force_mld_version),
+ ADDRCONF_SYSCTL_COMPLEX_ENTRY(
+ MLDV1_UNSOLICITED_REPORT_INTERVAL,
+ mldv1_unsolicited_report_interval,
+ proc_dointvec_ms_jiffies),
+ ADDRCONF_SYSCTL_COMPLEX_ENTRY(
+ MLDV2_UNSOLICITED_REPORT_INTERVAL,
+ mldv2_unsolicited_report_interval,
+ proc_dointvec_ms_jiffies),
+ ADDRCONF_SYSCTL_RW_ENTRY(USE_TEMPADDR, use_tempaddr),
+ ADDRCONF_SYSCTL_RW_ENTRY(TEMP_VALID_LFT, temp_valid_lft),
+ ADDRCONF_SYSCTL_RW_ENTRY(TEMP_PREFERED_LFT, temp_prefered_lft),
+ ADDRCONF_SYSCTL_RW_ENTRY(REGEN_MAX_RETRY, regen_max_retry),
+ ADDRCONF_SYSCTL_RW_ENTRY(MAX_DESYNC_FACTOR, max_desync_factor),
+ ADDRCONF_SYSCTL_RW_ENTRY(MAX_ADDRESSES, max_addresses),
+ ADDRCONF_SYSCTL_RW_ENTRY(ACCEPT_RA_DEFRTR, accept_ra_defrtr),
+ ADDRCONF_SYSCTL_RW_ENTRY(ACCEPT_RA_PINFO, accept_ra_pinfo),
#ifdef CONFIG_IPV6_ROUTER_PREF
- ADDRCONF_SYSCTL_RW_ENTRY(accept_ra_rtr_pref),
- ADDRCONF_SYSCTL_CUSTOM_ENTRY(router_probe_interval,
- rtr_probe_interval,
- proc_dointvec_jiffies),
+ ADDRCONF_SYSCTL_RW_ENTRY(ACCEPT_RA_RTR_PREF,
+ accept_ra_rtr_pref),
+ ADDRCONF_SYSCTL_COMPLEX_ENTRY(RTR_PROBE_INTERVAL,
+ router_probe_interval,
+ proc_dointvec_jiffies),
#ifdef CONFIG_IPV6_ROUTE_INFO
- ADDRCONF_SYSCTL_RW_ENTRY(accept_ra_rt_info_max_plen),
+ ADDRCONF_SYSCTL_RW_ENTRY(ACCEPT_RA_RT_INFO_MAX_PLEN,
+ accept_ra_rt_info_max_plen),
#endif
#endif
- ADDRCONF_SYSCTL_COMPLEX_ENTRY(proxy_ndp,
+ ADDRCONF_SYSCTL_COMPLEX_ENTRY(PROXY_NDP, proxy_ndp,
addrconf_sysctl_proxy_ndp),
- ADDRCONF_SYSCTL_RW_ENTRY(accept_source_route),
+ ADDRCONF_SYSCTL_RW_ENTRY(ACCEPT_SOURCE_ROUTE,
+ accept_source_route),
#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
- ADDRCONF_SYSCTL_RW_ENTRY(optimistic_dad),
+ ADDRCONF_SYSCTL_RW_ENTRY(OPTIMISTIC_DAD, optimistic_dad),
#endif
#ifdef CONFIG_IPV6_MROUTE
- ADDRCONF_SYSCTL_RO_ENTRY(mc_forwarding),
+ ADDRCONF_SYSCTL_RO_ENTRY(MC_FORWARDING, mc_forwarding),
#endif
- ADDRCONF_SYSCTL_COMPLEX_ENTRY(disable_ipv6,
+ ADDRCONF_SYSCTL_COMPLEX_ENTRY(DISABLE_IPV6, disable_ipv6,
addrconf_sysctl_disable),
- ADDRCONF_SYSCTL_RW_ENTRY(accept_dad),
- ADDRCONF_SYSCTL_RW_ENTRY(force_tllao),
- ADDRCONF_SYSCTL_RW_ENTRY(ndisc_notify),
- ADDRCONF_SYSCTL_RW_ENTRY(suppress_frag_ndisc),
- {
- /* sentinel */
- }
+ ADDRCONF_SYSCTL_RW_ENTRY(ACCEPT_DAD, accept_dad),
+ ADDRCONF_SYSCTL_RW_ENTRY(FORCE_TLLAO, force_tllao),
+ ADDRCONF_SYSCTL_RW_ENTRY(NDISC_NOTIFY, ndisc_notify),
+ ADDRCONF_SYSCTL_RW_ENTRY(SUPPRESS_FRAG_NDISC,
+ suppress_frag_ndisc),
},
};
@@ -5018,7 +4998,7 @@ static int __addrconf_sysctl_register(struct net *net, char *dev_name,
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].extra1 = p;
t->addrconf_vars[i].extra2 = net;
}
@@ -5081,8 +5061,8 @@ static int __net_init addrconf_init_net(struct net *net)
goto err_alloc_dflt;
/* these will be inherited by all namespaces */
- dflt->autoconf = ipv6_defaults.autoconf;
- dflt->disable_ipv6 = ipv6_defaults.disable_ipv6;
+ IPV6_DEVCONF(*dflt, AUTOCONF) = ipv6_defaults.autoconf;
+ IPV6_DEVCONF(*dflt, DISABLE_IPV6) = ipv6_defaults.disable_ipv6;
net->ipv6.devconf_all = all;
net->ipv6.devconf_dflt = dflt;
diff --git a/net/ipv6/anycast.c b/net/ipv6/anycast.c
index 2101832..4a9beac 100644
--- a/net/ipv6/anycast.c
+++ b/net/ipv6/anycast.c
@@ -61,7 +61,7 @@ int ipv6_sock_ac_join(struct sock *sk, int ifindex, const struct in6_addr *addr)
struct inet6_dev *idev;
struct ipv6_ac_socklist *pac;
struct net *net = sock_net(sk);
- int ishost = !net->ipv6.devconf_all->forwarding;
+ int ishost = !IPV6_DEVCONF_ALL(net, FORWARDING);
int err = 0;
if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
@@ -110,7 +110,7 @@ int ipv6_sock_ac_join(struct sock *sk, int ifindex, const struct in6_addr *addr)
goto error;
}
/* reset ishost, now that we have a specific device */
- ishost = !idev->cnf.forwarding;
+ ishost = !IN6_DEV_FORWARD(idev);
pac->acl_ifindex = dev->ifindex;
diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c
index 8d67900..9fcf463 100644
--- a/net/ipv6/exthdrs.c
+++ b/net/ipv6/exthdrs.c
@@ -295,16 +295,12 @@ static int ipv6_rthdr_rcv(struct sk_buff *skb)
struct inet6_skb_parm *opt = IP6CB(skb);
struct in6_addr *addr = NULL;
struct in6_addr daddr;
- struct inet6_dev *idev;
int n, i;
struct ipv6_rt_hdr *hdr;
struct rt0_hdr *rthdr;
struct net *net = dev_net(skb->dev);
- int accept_source_route = net->ipv6.devconf_all->accept_source_route;
-
- idev = __in6_dev_get(skb->dev);
- if (idev && accept_source_route > idev->cnf.accept_source_route)
- accept_source_route = idev->cnf.accept_source_route;
+ int accept_source_route =
+ IN6_DEV_ACCEPT_SOURCE_ROUTE(__in6_dev_get(skb->dev));
if (!pskb_may_pull(skb, skb_transport_offset(skb) + 8) ||
!pskb_may_pull(skb, (skb_transport_offset(skb) +
diff --git a/net/ipv6/ip6_input.c b/net/ipv6/ip6_input.c
index 51d54dc..67345a4 100644
--- a/net/ipv6/ip6_input.c
+++ b/net/ipv6/ip6_input.c
@@ -81,7 +81,7 @@ int ipv6_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt
IP6_UPD_PO_STATS_BH(net, idev, IPSTATS_MIB_IN, skb->len);
if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL ||
- !idev || unlikely(idev->cnf.disable_ipv6)) {
+ !idev || IN6_DEV_DISABLE_IPV6(idev)) {
IP6_INC_STATS_BH(net, idev, IPSTATS_MIB_INDISCARDS);
goto drop;
}@@ -296,7 +296,7 @@ int ip6_mc_input(struct sk_buff *skb)
/*
* IPv6 multicast router mode is now supported ;)
*/
- if (dev_net(skb->dev)->ipv6.devconf_all->mc_forwarding &&
+ if (IN6_DEV_MFORWARD(__in6_dev_get(skb->dev)) &&
!(ipv6_addr_type(&hdr->daddr) &
(IPV6_ADDR_LOOPBACK|IPV6_ADDR_LINKLOCAL)) &&
likely(!(IP6CB(skb)->flags & IP6SKB_FORWARDED))) {diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index cb9df0e..db05c4c 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -136,7 +136,7 @@ int ip6_output(struct sock *sk, struct sk_buff *skb)
{
struct net_device *dev = skb_dst(skb)->dev;
struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb));
- if (unlikely(idev->cnf.disable_ipv6)) {
+ if (IN6_DEV_DISABLE_IPV6(idev)) {
IP6_INC_STATS(dev_net(dev), idev,
IPSTATS_MIB_OUTDISCARDS);
kfree_skb(skb);@@ -336,7 +336,7 @@ static unsigned int ip6_dst_mtu_forward(const struct dst_entry *dst)
rcu_read_lock();
idev = __in6_dev_get(dst->dev);
if (idev)
- mtu = idev->cnf.mtu6;
+ mtu = IN6_DEV_MTU(idev);
rcu_read_unlock();
return mtu;
@@ -368,7 +368,7 @@ int ip6_forward(struct sk_buff *skb)
struct net *net = dev_net(dst->dev);
u32 mtu;
- if (net->ipv6.devconf_all->forwarding == 0)
+ if (IPV6_DEVCONF_ALL(net, FORWARDING) == 0)
goto error;
if (skb->pkt_type != PACKET_HOST)
@@ -417,8 +417,7 @@ int ip6_forward(struct sk_buff *skb)
return -ETIMEDOUT;
}
- /* XXX: idev->cnf.proxy_ndp? */
- if (net->ipv6.devconf_all->proxy_ndp &&
+ if (IN6_DEV_PROXY_NDP(ip6_dst_idev(dst)) &&
pneigh_lookup(&nd_tbl, net, &hdr->daddr, skb->dev, 0)) {
int proxied = ip6_forward_proxy_check(skb);
if (proxied > 0)diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c
index 8250474..2722e24 100644
--- a/net/ipv6/ip6mr.c
+++ b/net/ipv6/ip6mr.c
@@ -816,7 +816,7 @@ static int mif6_delete(struct mr6_table *mrt, int vifi, struct list_head *head)
in6_dev = __in6_dev_get(dev);
if (in6_dev) {
- in6_dev->cnf.mc_forwarding--;
+ IN6_DEV_MFORWARD_DEC(in6_dev);
inet6_netconf_notify_devconf(dev_net(dev),
NETCONFA_MC_FORWARDING,
dev->ifindex, &in6_dev->cnf);@@ -974,7 +974,7 @@ static int mif6_add(struct net *net, struct mr6_table *mrt,
in6_dev = __in6_dev_get(dev);
if (in6_dev) {
- in6_dev->cnf.mc_forwarding++;
+ IN6_DEV_MFORWARD_INC(in6_dev);
inet6_netconf_notify_devconf(dev_net(dev),
NETCONFA_MC_FORWARDING,
dev->ifindex, &in6_dev->cnf);@@ -1587,7 +1587,7 @@ static int ip6mr_sk_init(struct mr6_table *mrt, struct sock *sk)
write_lock_bh(&mrt_lock);
if (likely(mrt->mroute6_sk == NULL)) {
mrt->mroute6_sk = sk;
- net->ipv6.devconf_all->mc_forwarding++;
+ IPV6_DEVCONF_ALL(net, MC_FORWARDING)++;
inet6_netconf_notify_devconf(net, NETCONFA_MC_FORWARDING,
NETCONFA_IFINDEX_ALL,
net->ipv6.devconf_all);@@ -1612,7 +1612,7 @@ int ip6mr_sk_done(struct sock *sk)
if (sk == mrt->mroute6_sk) {
write_lock_bh(&mrt_lock);
mrt->mroute6_sk = NULL;
- net->ipv6.devconf_all->mc_forwarding--;
+ IPV6_DEVCONF_ALL(net, MC_FORWARDING)--;
inet6_netconf_notify_devconf(net,
NETCONFA_MC_FORWARDING,
NETCONFA_IFINDEX_ALL,diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c
index edb58af..d91f501 100644
--- a/net/ipv6/ipv6_sockglue.c
+++ b/net/ipv6/ipv6_sockglue.c
@@ -1188,7 +1188,7 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname,
}
if (val < 0)
- val = sock_net(sk)->ipv6.devconf_all->hop_limit;
+ val = IPV6_DEVCONF_ALL(sock_net(sk), HOPLIMIT);
break;
}
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c
index 08b367c..cd49bb5 100644
--- a/net/ipv6/mcast.c
+++ b/net/ipv6/mcast.c
@@ -95,7 +95,7 @@ static void mld_ifc_event(struct inet6_dev *idev);
static void mld_add_delrec(struct inet6_dev *idev, struct ifmcaddr6 *pmc);
static void mld_del_delrec(struct inet6_dev *idev, const struct in6_addr *addr);
static void mld_clear_delrec(struct inet6_dev *idev);
-static bool mld_in_v1_mode(const struct inet6_dev *idev);
+static bool mld_in_v1_mode(struct inet6_dev *idev);
static int sf_setstate(struct ifmcaddr6 *pmc);
static void sf_markstate(struct ifmcaddr6 *pmc);
static void ip6_mc_clear_src(struct ifmcaddr6 *pmc);
@@ -136,9 +136,9 @@ static int unsolicited_report_interval(struct inet6_dev *idev)
int iv;
if (mld_in_v1_mode(idev))
- iv = idev->cnf.mldv1_unsolicited_report_interval;
+ iv = IN6_DEV_CONF_GET(idev, MLDV1_UNSOLICITED_REPORT_INTERVAL);
else
- iv = idev->cnf.mldv2_unsolicited_report_interval;
+ iv = IN6_DEV_CONF_GET(idev, MLDV2_UNSOLICITED_REPORT_INTERVAL);
return iv > 0 ? iv : 1;
}
@@ -1129,30 +1129,17 @@ static bool mld_marksources(struct ifmcaddr6 *pmc, int nsrcs,
return true;
}
-static int mld_force_mld_version(const struct inet6_dev *idev)
+static bool mld_in_v2_mode_only(struct inet6_dev *idev)
{
- /* Normally, both are 0 here. If enforcement to a particular is
- * being used, individual device enforcement will have a lower
- * precedence over 'all' device (.../conf/all/force_mld_version).
- */
-
- if (dev_net(idev->dev)->ipv6.devconf_all->force_mld_version != 0)
- return dev_net(idev->dev)->ipv6.devconf_all->force_mld_version;
- else
- return idev->cnf.force_mld_version;
-}
-
-static bool mld_in_v2_mode_only(const struct inet6_dev *idev)
-{
- return mld_force_mld_version(idev) == 2;
+ return IN6_DEV_FORCE_MLD_VERSION(idev) == 2;
}
-static bool mld_in_v1_mode_only(const struct inet6_dev *idev)
+static bool mld_in_v1_mode_only(struct inet6_dev *idev)
{
- return mld_force_mld_version(idev) == 1;
+ return IN6_DEV_FORCE_MLD_VERSION(idev) == 1;
}
-static bool mld_in_v1_mode(const struct inet6_dev *idev)
+static bool mld_in_v1_mode(struct inet6_dev *idev)
{
if (mld_in_v2_mode_only(idev))
return false;@@ -2527,7 +2514,7 @@ void ipv6_mc_destroy_dev(struct inet6_dev *idev)
*/
__ipv6_dev_mc_dec(idev, &in6addr_linklocal_allnodes);
- if (idev->cnf.forwarding)
+ if (IN6_DEV_FORWARD(idev))
__ipv6_dev_mc_dec(idev, &in6addr_linklocal_allrouters);
write_lock_bh(&idev->lock);
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
index ca8d4ea..6803f3f 100644
--- a/net/ipv6/ndisc.c
+++ b/net/ipv6/ndisc.c
@@ -483,7 +483,7 @@ void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
src_addr = solicited_addr;
if (ifp->flags & IFA_F_OPTIMISTIC)
override = false;
- inc_opt |= ifp->idev->cnf.force_tllao;
+ inc_opt |= IN6_DEV_FORCE_TLLAO(ifp->idev);
in6_ifa_put(ifp);
} else {
if (ipv6_dev_get_saddr(dev_net(dev), dev, daddr,@@ -533,7 +533,7 @@ static void ndisc_send_unsol_na(struct net_device *dev)
read_lock_bh(&idev->lock);
list_for_each_entry(ifa, &idev->addr_list, if_list) {
ndisc_send_na(dev, NULL, &in6addr_linklocal_allnodes, &ifa->addr,
- /*router=*/ !!idev->cnf.forwarding,
+ /*router=*/ !!IN6_DEV_FORWARD(idev),
/*solicited=*/ false, /*override=*/ true,
/*inc_opt=*/ true);
}@@ -786,8 +786,7 @@ static void ndisc_recv_ns(struct sk_buff *skb)
}
if (ipv6_chk_acast_addr(net, dev, &msg->target) ||
- (idev->cnf.forwarding &&
- (net->ipv6.devconf_all->proxy_ndp || idev->cnf.proxy_ndp) &&
+ (IN6_DEV_FORWARD(idev) && IN6_DEV_PROXY_NDP(idev) &&
(is_router = pndisc_is_router(&msg->target, dev)) >= 0)) {
if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) &&
skb->pkt_type != PACKET_HOST &&@@ -810,7 +809,7 @@ static void ndisc_recv_ns(struct sk_buff *skb)
}
if (is_router < 0)
- is_router = idev->cnf.forwarding;
+ is_router = IN6_DEV_FORWARD(idev);
if (dad) {
ndisc_send_na(dev, NULL, &in6addr_linklocal_allnodes, &msg->target,@@ -927,9 +926,9 @@ static void ndisc_recv_na(struct sk_buff *skb)
* has already sent a NA to us.
*/
if (lladdr && !memcmp(lladdr, dev->dev_addr, dev->addr_len) &&
- net->ipv6.devconf_all->forwarding && net->ipv6.devconf_all->proxy_ndp &&
+ IN6_DEV_FORWARD(__in6_dev_get(dev)) &&
+ IN6_DEV_PROXY_NDP(__in6_dev_get(dev)) &&
pneigh_lookup(&nd_tbl, net, &msg->target, dev, 0)) {
- /* XXX: idev->cnf.proxy_ndp */
goto out;
}
@@ -972,7 +971,7 @@ static void ndisc_recv_rs(struct sk_buff *skb)
}
/* Don't accept RS if we're not in router mode */
- if (!idev->cnf.forwarding)
+ if (!IN6_DEV_FORWARD(idev))
goto out;
/*
@@ -1130,7 +1129,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)
(ra_msg->icmph.icmp6_addrconf_other ?
IF_RA_OTHERCONF : 0);
- if (!in6_dev->cnf.accept_ra_defrtr)
+ if (!IN6_DEV_ACCEPT_RA_DEFRTR(in6_dev))
goto skip_defrtr;
if (ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr, NULL, 0))
@@ -1142,7 +1141,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)
pref = ra_msg->icmph.icmp6_router_pref;
/* 10b is handled as if it were 00b (medium) */
if (pref == ICMPV6_ROUTER_PREF_INVALID ||
- !in6_dev->cnf.accept_ra_rtr_pref)
+ !IN6_DEV_ACCEPT_RA_RTR_PREF(in6_dev))
pref = ICMPV6_ROUTER_PREF_MEDIUM;
#endif
@@ -1190,7 +1189,8 @@ static void ndisc_router_discovery(struct sk_buff *skb)
if (rt)
rt6_set_expires(rt, jiffies + (HZ * lifetime));
if (ra_msg->icmph.icmp6_hop_limit) {
- in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit;
+ IN6_DEV_CONF_SET(in6_dev, HOPLIMIT,
+ ra_msg->icmph.icmp6_hop_limit);
if (rt)
dst_metric_set(&rt->dst, RTAX_HOPLIMIT,
ra_msg->icmph.icmp6_hop_limit);@@ -1267,7 +1267,7 @@ skip_linkparms:
if (ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr, NULL, 0))
goto skip_routeinfo;
- if (in6_dev->cnf.accept_ra_rtr_pref && ndopts.nd_opts_ri) {
+ if (IN6_DEV_ACCEPT_RA_RTR_PREF(in6_dev) && ndopts.nd_opts_ri) {
struct nd_opt_hdr *p;
for (p = ndopts.nd_opts_ri;
p;@@ -1279,9 +1279,10 @@ skip_linkparms:
continue;
#endif
if (ri->prefix_len == 0 &&
- !in6_dev->cnf.accept_ra_defrtr)
+ !IN6_DEV_ACCEPT_RA_DEFRTR(in6_dev))
continue;
- if (ri->prefix_len > in6_dev->cnf.accept_ra_rt_info_max_plen)
+ if (ri->prefix_len >
+ IN6_DEV_ACCEPT_RA_RT_INFO_MAX_PLEN(in6_dev))
continue;
rt6_route_rcv(skb->dev, (u8*)p, (p->nd_opt_len) << 3,
&ipv6_hdr(skb)->saddr);
@@ -1297,7 +1298,7 @@ skip_routeinfo:
goto out;
#endif
- if (in6_dev->cnf.accept_ra_pinfo && ndopts.nd_opts_pi) {
+ if (IN6_DEV_ACCEPT_RA_PINFO(in6_dev) && ndopts.nd_opts_pi) {
struct nd_opt_hdr *p;
for (p = ndopts.nd_opts_pi;
p;@@ -1317,8 +1318,8 @@ skip_routeinfo:
if (mtu < IPV6_MIN_MTU || mtu > skb->dev->mtu) {
ND_PRINTK(2, warn, "RA: invalid mtu: %d\n", mtu);
- } else if (in6_dev->cnf.mtu6 != mtu) {
- in6_dev->cnf.mtu6 = mtu;
+ } else if (IN6_DEV_CONF_GET(in6_dev, MTU6) != mtu) {
+ IN6_DEV_CONF_SET(in6_dev, MTU6, mtu);
if (rt)
dst_metric_set(&rt->dst, RTAX_MTU, mtu);@@ -1530,8 +1531,8 @@ static bool ndisc_suppress_frag_ndisc(struct sk_buff *skb)
if (!idev)
return true;
if (IP6CB(skb)->flags & IP6SKB_FRAGMENTED &&
- idev->cnf.suppress_frag_ndisc) {
- net_warn_ratelimited("Received fragmented ndisc packet. Carefully consider disabling suppress_frag_ndisc.\n");
+ IN6_DEV_SUPPRESS_FRAG_NDISC(idev)) {
+ ND_PRINTK(1, warn, "Received fragmented ndisc packet. Carefully consider disabling suppress_frag_ndisc.\n");
return true;
}
return false;@@ -1603,7 +1604,7 @@ static int ndisc_netdev_event(struct notifier_block *this, unsigned long event,
idev = in6_dev_get(dev);
if (!idev)
break;
- if (idev->cnf.ndisc_notify)
+ if (IN6_DEV_NDISC_NOTIFY(idev))
ndisc_send_unsol_na(dev);
in6_dev_put(idev);
break;
diff --git a/net/ipv6/output_core.c b/net/ipv6/output_core.c
index ffa0293..f86ffd4 100644
--- a/net/ipv6/output_core.c
+++ b/net/ipv6/output_core.c
@@ -60,9 +60,9 @@ int ip6_dst_hoplimit(struct dst_entry *dst)
rcu_read_lock();
idev = __in6_dev_get(dev);
if (idev)
- hoplimit = idev->cnf.hop_limit;
+ hoplimit = IN6_DEV_HOPLIMIT(idev);
else
- hoplimit = dev_net(dev)->ipv6.devconf_all->hop_limit;
+ hoplimit = IPV6_DEVCONF_ALL(dev_net(dev), HOPLIMIT);
rcu_read_unlock();
}
return hoplimit;
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index f23fbd2..0459cf9 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -525,7 +525,8 @@ static void rt6_probe(struct rt6_info *rt)
}
if (!neigh ||
- time_after(jiffies, neigh->updated + rt->rt6i_idev->cnf.rtr_probe_interval)) {
+ time_after(jiffies, neigh->updated +
+ IN6_DEV_RTR_PROBE_INTERVAL(rt->rt6i_idev))) {
struct __rt6_probe_work *work;
work = kmalloc(sizeof(*work), GFP_ATOMIC);@@ -922,7 +923,7 @@ static struct rt6_info *ip6_pol_route(struct net *net, struct fib6_table *table,
int strict = 0;
int attempts = 3;
int err;
- int reachable = net->ipv6.devconf_all->forwarding ? 0 : RT6_LOOKUP_F_REACHABLE;
+ int reachable = IPV6_DEVCONF_ALL(net, FORWARDING) ? 0 : RT6_LOOKUP_F_REACHABLE;
strict |= flags & RT6_LOOKUP_F_IFACE;
@@ -1347,7 +1348,7 @@ static unsigned int ip6_mtu(const struct dst_entry *dst)
rcu_read_lock();
idev = __in6_dev_get(dst->dev);
if (idev)
- mtu = idev->cnf.mtu6;
+ mtu = IN6_DEV_MTU(idev);
rcu_read_unlock();
out:
@@ -1790,7 +1791,7 @@ static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_bu
in6_dev = __in6_dev_get(skb->dev);
if (!in6_dev)
return;
- if (in6_dev->cnf.forwarding || !in6_dev->cnf.accept_redirects)
+ if (IN6_DEV_FORWARD(in6_dev) || !IN6_DEV_ACCEPT_REDIRECTS(in6_dev))
return;
/* RFC2461 8.1:
@@ -2031,7 +2032,7 @@ restart:
read_lock_bh(&table->tb6_lock);
for (rt = table->tb6_root.leaf; rt; rt = rt->dst.rt6_next) {
if (rt->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF) &&
- (!rt->rt6i_idev || rt->rt6i_idev->cnf.accept_ra != 2)) {
+ (!rt->rt6i_idev || IN6_DEV_ACCEPT_RA(rt->rt6i_idev) != 2)) {
dst_hold(&rt->dst);
read_unlock_bh(&table->tb6_lock);
ip6_del_rt(rt);@@ -2321,7 +2322,7 @@ static int rt6_mtu_change_route(struct rt6_info *rt, void *p_arg)
!dst_metric_locked(&rt->dst, RTAX_MTU) &&
(dst_mtu(&rt->dst) >= arg->mtu ||
(dst_mtu(&rt->dst) < arg->mtu &&
- dst_mtu(&rt->dst) == idev->cnf.mtu6))) {
+ dst_mtu(&rt->dst) == IN6_DEV_MTU(idev)))) {
dst_metric_set(&rt->dst, RTAX_MTU, arg->mtu);
}
return 0;--
1.9.0