Browse Source

[IPV6]: ROUTE: Add router_probe_interval sysctl.

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
YOSHIFUJI Hideaki 19 năm trước cách đây
mục cha
commit
52e1635631

+ 6 - 0
Documentation/networking/ip-sysctl.txt

@@ -789,6 +789,12 @@ mtu - INTEGER
 	Default Maximum Transfer Unit
 	Default: 1280 (IPv6 required minimum)
 
+router_probe_interval - INTEGER
+	Minimum interval (in seconds) between Router Probing described
+	in RFC4191.
+
+	Default: 60
+
 router_solicitation_delay - INTEGER
 	Number of seconds to wait after interface is brought up
 	before sending Router Solicitations.

+ 2 - 0
include/linux/ipv6.h

@@ -149,6 +149,7 @@ struct ipv6_devconf {
 	__s32		accept_ra_pinfo;
 #ifdef CONFIG_IPV6_ROUTER_PREF
 	__s32		accept_ra_rtr_pref;
+	__s32		rtr_probe_interval;
 #endif
 	void		*sysctl;
 };
@@ -175,6 +176,7 @@ enum {
 	DEVCONF_ACCEPT_RA_DEFRTR,
 	DEVCONF_ACCEPT_RA_PINFO,
 	DEVCONF_ACCEPT_RA_RTR_PREF,
+	DEVCONF_RTR_PROBE_INTERVAL,
 	DEVCONF_MAX
 };
 

+ 1 - 0
include/linux/sysctl.h

@@ -534,6 +534,7 @@ enum {
 	NET_IPV6_ACCEPT_RA_DEFRTR=18,
 	NET_IPV6_ACCEPT_RA_PINFO=19,
 	NET_IPV6_ACCEPT_RA_RTR_PREF=20,
+	NET_IPV6_RTR_PROBE_INTERVAL=21,
 	__NET_IPV6_MAX
 };
 

+ 12 - 0
net/ipv6/addrconf.c

@@ -169,6 +169,7 @@ struct ipv6_devconf ipv6_devconf = {
 	.accept_ra_pinfo	= 1,
 #ifdef CONFIG_IPV6_ROUTER_PREF
 	.accept_ra_rtr_pref	= 1,
+	.rtr_probe_interval	= 60 * HZ,
 #endif
 };
 
@@ -195,6 +196,7 @@ static struct ipv6_devconf ipv6_devconf_dflt = {
 	.accept_ra_pinfo	= 1,
 #ifdef CONFIG_IPV6_ROUTER_PREF
 	.accept_ra_rtr_pref	= 1,
+	.rtr_probe_interval	= 60 * HZ,
 #endif
 };
 
@@ -3130,6 +3132,7 @@ static void inline ipv6_store_devconf(struct ipv6_devconf *cnf,
 	array[DEVCONF_ACCEPT_RA_PINFO] = cnf->accept_ra_pinfo;
 #ifdef CONFIG_IPV6_ROUTER_PREF
 	array[DEVCONF_ACCEPT_RA_RTR_PREF] = cnf->accept_ra_rtr_pref;
+	array[DEVCONF_RTR_PROBE_INTERVAL] = cnf->rtr_probe_interval;
 #endif
 }
 
@@ -3608,6 +3611,15 @@ static struct addrconf_sysctl_table
 			.mode		=	0644,
 			.proc_handler	=	&proc_dointvec,
 		},
+		{
+			.ctl_name	=	NET_IPV6_RTR_PROBE_INTERVAL,
+			.procname	=	"router_probe_interval",
+			.data		=	&ipv6_devconf.rtr_probe_interval,
+			.maxlen		=	sizeof(int),
+			.mode		=	0644,
+			.proc_handler	=	&proc_dointvec_jiffies,
+			.strategy	=	&sysctl_jiffies,
+		},
 #endif
 		{
 			.ctl_name	=	0,	/* sentinel */

+ 1 - 1
net/ipv6/route.c

@@ -234,7 +234,7 @@ static void rt6_probe(struct rt6_info *rt)
 		return;
 	read_lock_bh(&neigh->lock);
 	if (!(neigh->nud_state & NUD_VALID) &&
-	    time_after(jiffies, neigh->updated + 60 * HZ)) {
+	    time_after(jiffies, neigh->updated + rt->rt6i_idev->cnf.rtr_probe_interval)) {
 		struct in6_addr mcaddr;
 		struct in6_addr *target;