aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/networking/ip-sysctl.txt6
-rw-r--r--include/linux/ipv6.h2
-rw-r--r--include/linux/sysctl.h1
-rw-r--r--net/ipv6/addrconf.c12
-rw-r--r--net/ipv6/route.c2
5 files changed, 22 insertions, 1 deletions
diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt
index 87bbd774c2b2..88efed0a533f 100644
--- a/Documentation/networking/ip-sysctl.txt
+++ b/Documentation/networking/ip-sysctl.txt
@@ -789,6 +789,12 @@ mtu - INTEGER
789 Default Maximum Transfer Unit 789 Default Maximum Transfer Unit
790 Default: 1280 (IPv6 required minimum) 790 Default: 1280 (IPv6 required minimum)
791 791
792router_probe_interval - INTEGER
793 Minimum interval (in seconds) between Router Probing described
794 in RFC4191.
795
796 Default: 60
797
792router_solicitation_delay - INTEGER 798router_solicitation_delay - INTEGER
793 Number of seconds to wait after interface is brought up 799 Number of seconds to wait after interface is brought up
794 before sending Router Solicitations. 800 before sending Router Solicitations.
diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h
index 108b75dccd9f..c609cc702375 100644
--- a/include/linux/ipv6.h
+++ b/include/linux/ipv6.h
@@ -149,6 +149,7 @@ struct ipv6_devconf {
149 __s32 accept_ra_pinfo; 149 __s32 accept_ra_pinfo;
150#ifdef CONFIG_IPV6_ROUTER_PREF 150#ifdef CONFIG_IPV6_ROUTER_PREF
151 __s32 accept_ra_rtr_pref; 151 __s32 accept_ra_rtr_pref;
152 __s32 rtr_probe_interval;
152#endif 153#endif
153 void *sysctl; 154 void *sysctl;
154}; 155};
@@ -175,6 +176,7 @@ enum {
175 DEVCONF_ACCEPT_RA_DEFRTR, 176 DEVCONF_ACCEPT_RA_DEFRTR,
176 DEVCONF_ACCEPT_RA_PINFO, 177 DEVCONF_ACCEPT_RA_PINFO,
177 DEVCONF_ACCEPT_RA_RTR_PREF, 178 DEVCONF_ACCEPT_RA_RTR_PREF,
179 DEVCONF_RTR_PROBE_INTERVAL,
178 DEVCONF_MAX 180 DEVCONF_MAX
179}; 181};
180 182
diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h
index 236f537b38d2..f49488ffefef 100644
--- a/include/linux/sysctl.h
+++ b/include/linux/sysctl.h
@@ -534,6 +534,7 @@ enum {
534 NET_IPV6_ACCEPT_RA_DEFRTR=18, 534 NET_IPV6_ACCEPT_RA_DEFRTR=18,
535 NET_IPV6_ACCEPT_RA_PINFO=19, 535 NET_IPV6_ACCEPT_RA_PINFO=19,
536 NET_IPV6_ACCEPT_RA_RTR_PREF=20, 536 NET_IPV6_ACCEPT_RA_RTR_PREF=20,
537 NET_IPV6_RTR_PROBE_INTERVAL=21,
537 __NET_IPV6_MAX 538 __NET_IPV6_MAX
538}; 539};
539 540
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 51edba5fea26..e7add61e6e39 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -169,6 +169,7 @@ struct ipv6_devconf ipv6_devconf = {
169 .accept_ra_pinfo = 1, 169 .accept_ra_pinfo = 1,
170#ifdef CONFIG_IPV6_ROUTER_PREF 170#ifdef CONFIG_IPV6_ROUTER_PREF
171 .accept_ra_rtr_pref = 1, 171 .accept_ra_rtr_pref = 1,
172 .rtr_probe_interval = 60 * HZ,
172#endif 173#endif
173}; 174};
174 175
@@ -195,6 +196,7 @@ static struct ipv6_devconf ipv6_devconf_dflt = {
195 .accept_ra_pinfo = 1, 196 .accept_ra_pinfo = 1,
196#ifdef CONFIG_IPV6_ROUTER_PREF 197#ifdef CONFIG_IPV6_ROUTER_PREF
197 .accept_ra_rtr_pref = 1, 198 .accept_ra_rtr_pref = 1,
199 .rtr_probe_interval = 60 * HZ,
198#endif 200#endif
199}; 201};
200 202
@@ -3130,6 +3132,7 @@ static void inline ipv6_store_devconf(struct ipv6_devconf *cnf,
3130 array[DEVCONF_ACCEPT_RA_PINFO] = cnf->accept_ra_pinfo; 3132 array[DEVCONF_ACCEPT_RA_PINFO] = cnf->accept_ra_pinfo;
3131#ifdef CONFIG_IPV6_ROUTER_PREF 3133#ifdef CONFIG_IPV6_ROUTER_PREF
3132 array[DEVCONF_ACCEPT_RA_RTR_PREF] = cnf->accept_ra_rtr_pref; 3134 array[DEVCONF_ACCEPT_RA_RTR_PREF] = cnf->accept_ra_rtr_pref;
3135 array[DEVCONF_RTR_PROBE_INTERVAL] = cnf->rtr_probe_interval;
3133#endif 3136#endif
3134} 3137}
3135 3138
@@ -3608,6 +3611,15 @@ static struct addrconf_sysctl_table
3608 .mode = 0644, 3611 .mode = 0644,
3609 .proc_handler = &proc_dointvec, 3612 .proc_handler = &proc_dointvec,
3610 }, 3613 },
3614 {
3615 .ctl_name = NET_IPV6_RTR_PROBE_INTERVAL,
3616 .procname = "router_probe_interval",
3617 .data = &ipv6_devconf.rtr_probe_interval,
3618 .maxlen = sizeof(int),
3619 .mode = 0644,
3620 .proc_handler = &proc_dointvec_jiffies,
3621 .strategy = &sysctl_jiffies,
3622 },
3611#endif 3623#endif
3612 { 3624 {
3613 .ctl_name = 0, /* sentinel */ 3625 .ctl_name = 0, /* sentinel */
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index 8ba8900c0a5f..c797b9bbb7d1 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -234,7 +234,7 @@ static void rt6_probe(struct rt6_info *rt)
234 return; 234 return;
235 read_lock_bh(&neigh->lock); 235 read_lock_bh(&neigh->lock);
236 if (!(neigh->nud_state & NUD_VALID) && 236 if (!(neigh->nud_state & NUD_VALID) &&
237 time_after(jiffies, neigh->updated + 60 * HZ)) { 237 time_after(jiffies, neigh->updated + rt->rt6i_idev->cnf.rtr_probe_interval)) {
238 struct in6_addr mcaddr; 238 struct in6_addr mcaddr;
239 struct in6_addr *target; 239 struct in6_addr *target;
240 240