From bc4eca1540920b350c9722b6b63808c2b0233460 Mon Sep 17 00:00:00 2001 From: Tianyi Gou Date: Fri, 21 Dec 2012 12:38:38 -0800 Subject: [PATCH] net/ipv6/addrconf: IPv6 tethering enhancement Added new procfs flag to toggle the automatic addition of prefix routes on a per device basis. The new flag is accept_ra_prefix_route. Defaults to 1 as to not break existing behavior. Change-Id: If25493890c7531c27f5b2c4855afebbbbf5d072a CRs-Fixed: 435320 Acked-by: Harout S. Hedeshian Signed-off-by: Tianyi Gou --- Documentation/networking/ip-sysctl.txt | 5 +++++ include/linux/ipv6.h | 2 ++ kernel/sysctl_binary.c | 1 + net/ipv6/addrconf.c | 17 +++++++++++++++-- 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt index 5aecb488941..2d4a6db25f0 100644 --- a/Documentation/networking/ip-sysctl.txt +++ b/Documentation/networking/ip-sysctl.txt @@ -1098,6 +1098,11 @@ accept_ra_rtr_pref - BOOLEAN Functional default: enabled if accept_ra is enabled. disabled if accept_ra is disabled. +accept_ra_prefix_route - BOOLEAN + Set the prefix route for the autoconfigured interface address + + Functional default: enabled + accept_redirects - BOOLEAN Accept Redirects. diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index 8260ef77976..4effce6889d 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h @@ -172,6 +172,7 @@ struct ipv6_devconf { __s32 disable_ipv6; __s32 accept_dad; __s32 force_tllao; + __s32 accept_ra_prefix_route; void *sysctl; }; @@ -213,6 +214,7 @@ enum { DEVCONF_DISABLE_IPV6, DEVCONF_ACCEPT_DAD, DEVCONF_FORCE_TLLAO, + DEVCONF_ACCEPT_RA_PREFIX_ROUTE, DEVCONF_MAX }; diff --git a/kernel/sysctl_binary.c b/kernel/sysctl_binary.c index d42c279db29..acb60bef99f 100644 --- a/kernel/sysctl_binary.c +++ b/kernel/sysctl_binary.c @@ -524,6 +524,7 @@ static const struct bin_table bin_net_ipv6_conf_var_table[] = { { CTL_INT, NET_IPV6_ACCEPT_RA_RT_INFO_MAX_PLEN, "accept_ra_rt_info_max_plen" }, { CTL_INT, NET_IPV6_PROXY_NDP, "proxy_ndp" }, { CTL_INT, NET_IPV6_ACCEPT_SOURCE_ROUTE, "accept_source_route" }, + { CTL_INT, NET_IPV6_ACCEPT_RA_PREFIX_ROUTE, "accept_ra_prefix_route" }, {} }; diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index f8978419f2d..5bb2847707a 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -36,6 +36,8 @@ * YOSHIFUJI Hideaki @USAGI : improved source address * selection; consider scope, * status etc. + * Harout S. Hedeshian : procfs flag to toggle automatic + * addition of prefix route */ #include @@ -197,6 +199,7 @@ static struct ipv6_devconf ipv6_devconf __read_mostly = { .accept_source_route = 0, /* we do not accept RH0 by default. */ .disable_ipv6 = 0, .accept_dad = 1, + .accept_ra_prefix_route = 1, }; static struct ipv6_devconf ipv6_devconf_dflt __read_mostly = { @@ -231,6 +234,7 @@ static struct ipv6_devconf ipv6_devconf_dflt __read_mostly = { .accept_source_route = 0, /* we do not accept RH0 by default. */ .disable_ipv6 = 0, .accept_dad = 1, + .accept_ra_prefix_route = 1, }; /* IPv6 Wildcard Address and Loopback Address defined by RFC2553 */ @@ -1908,8 +1912,10 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len, bool sllao) flags |= RTF_EXPIRES; expires = jiffies_to_clock_t(rt_expires); } - addrconf_prefix_route(&pinfo->prefix, pinfo->prefix_len, - dev, expires, flags); + if (dev->ip6_ptr->cnf.accept_ra_prefix_route) { + addrconf_prefix_route(&pinfo->prefix, + pinfo->prefix_len, dev, expires, flags); + } } if (rt) dst_release(&rt->dst); @@ -4597,6 +4603,13 @@ static struct addrconf_sysctl_table .mode = 0644, .proc_handler = proc_dointvec }, + { + .procname = "accept_ra_prefix_route", + .data = &ipv6_devconf.accept_ra_prefix_route, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec, + }, { /* sentinel */ }