diff options
-rw-r--r-- | include/net/netns/ipv4.h | 2 | ||||
-rw-r--r-- | net/ipv4/route.c | 40 |
2 files changed, 32 insertions, 10 deletions
diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h index a29adf1ba0ff..356617f81beb 100644 --- a/include/net/netns/ipv4.h +++ b/include/net/netns/ipv4.h | |||
@@ -46,5 +46,7 @@ struct netns_ipv4 { | |||
46 | int sysctl_icmp_ratelimit; | 46 | int sysctl_icmp_ratelimit; |
47 | int sysctl_icmp_ratemask; | 47 | int sysctl_icmp_ratemask; |
48 | int sysctl_icmp_errors_use_inbound_ifaddr; | 48 | int sysctl_icmp_errors_use_inbound_ifaddr; |
49 | |||
50 | struct timer_list rt_secret_timer; | ||
49 | }; | 51 | }; |
50 | #endif | 52 | #endif |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 6fe799de9b96..f99d9dbb7720 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -132,7 +132,6 @@ static int ip_rt_secret_interval __read_mostly = 10 * 60 * HZ; | |||
132 | 132 | ||
133 | static void rt_worker_func(struct work_struct *work); | 133 | static void rt_worker_func(struct work_struct *work); |
134 | static DECLARE_DELAYED_WORK(expires_work, rt_worker_func); | 134 | static DECLARE_DELAYED_WORK(expires_work, rt_worker_func); |
135 | static struct timer_list rt_secret_timer; | ||
136 | 135 | ||
137 | /* | 136 | /* |
138 | * Interface to generic destination cache. | 137 | * Interface to generic destination cache. |
@@ -801,10 +800,11 @@ void rt_cache_flush(struct net *net, int delay) | |||
801 | /* | 800 | /* |
802 | * We change rt_genid and let gc do the cleanup | 801 | * We change rt_genid and let gc do the cleanup |
803 | */ | 802 | */ |
804 | static void rt_secret_rebuild(unsigned long dummy) | 803 | static void rt_secret_rebuild(unsigned long __net) |
805 | { | 804 | { |
805 | struct net *net = (struct net *)__net; | ||
806 | rt_cache_invalidate(); | 806 | rt_cache_invalidate(); |
807 | mod_timer(&rt_secret_timer, jiffies + ip_rt_secret_interval); | 807 | mod_timer(&net->ipv4.rt_secret_timer, jiffies + ip_rt_secret_interval); |
808 | } | 808 | } |
809 | 809 | ||
810 | /* | 810 | /* |
@@ -3072,6 +3072,31 @@ static __net_initdata struct pernet_operations sysctl_route_ops = { | |||
3072 | }; | 3072 | }; |
3073 | #endif | 3073 | #endif |
3074 | 3074 | ||
3075 | |||
3076 | static __net_init int rt_secret_timer_init(struct net *net) | ||
3077 | { | ||
3078 | net->ipv4.rt_secret_timer.function = rt_secret_rebuild; | ||
3079 | net->ipv4.rt_secret_timer.data = (unsigned long)net; | ||
3080 | init_timer_deferrable(&net->ipv4.rt_secret_timer); | ||
3081 | |||
3082 | net->ipv4.rt_secret_timer.expires = | ||
3083 | jiffies + net_random() % ip_rt_secret_interval + | ||
3084 | ip_rt_secret_interval; | ||
3085 | add_timer(&net->ipv4.rt_secret_timer); | ||
3086 | return 0; | ||
3087 | } | ||
3088 | |||
3089 | static __net_exit void rt_secret_timer_exit(struct net *net) | ||
3090 | { | ||
3091 | del_timer_sync(&net->ipv4.rt_secret_timer); | ||
3092 | } | ||
3093 | |||
3094 | static __net_initdata struct pernet_operations rt_secret_timer_ops = { | ||
3095 | .init = rt_secret_timer_init, | ||
3096 | .exit = rt_secret_timer_exit, | ||
3097 | }; | ||
3098 | |||
3099 | |||
3075 | #ifdef CONFIG_NET_CLS_ROUTE | 3100 | #ifdef CONFIG_NET_CLS_ROUTE |
3076 | struct ip_rt_acct *ip_rt_acct __read_mostly; | 3101 | struct ip_rt_acct *ip_rt_acct __read_mostly; |
3077 | #endif /* CONFIG_NET_CLS_ROUTE */ | 3102 | #endif /* CONFIG_NET_CLS_ROUTE */ |
@@ -3124,19 +3149,14 @@ int __init ip_rt_init(void) | |||
3124 | devinet_init(); | 3149 | devinet_init(); |
3125 | ip_fib_init(); | 3150 | ip_fib_init(); |
3126 | 3151 | ||
3127 | rt_secret_timer.function = rt_secret_rebuild; | ||
3128 | rt_secret_timer.data = 0; | ||
3129 | init_timer_deferrable(&rt_secret_timer); | ||
3130 | |||
3131 | /* All the timers, started at system startup tend | 3152 | /* All the timers, started at system startup tend |
3132 | to synchronize. Perturb it a bit. | 3153 | to synchronize. Perturb it a bit. |
3133 | */ | 3154 | */ |
3134 | schedule_delayed_work(&expires_work, | 3155 | schedule_delayed_work(&expires_work, |
3135 | net_random() % ip_rt_gc_interval + ip_rt_gc_interval); | 3156 | net_random() % ip_rt_gc_interval + ip_rt_gc_interval); |
3136 | 3157 | ||
3137 | rt_secret_timer.expires = jiffies + net_random() % ip_rt_secret_interval + | 3158 | if (register_pernet_subsys(&rt_secret_timer_ops)) |
3138 | ip_rt_secret_interval; | 3159 | printk(KERN_ERR "Unable to setup rt_secret_timer\n"); |
3139 | add_timer(&rt_secret_timer); | ||
3140 | 3160 | ||
3141 | if (ip_rt_proc_init()) | 3161 | if (ip_rt_proc_init()) |
3142 | printk(KERN_ERR "Unable to create route proc files\n"); | 3162 | printk(KERN_ERR "Unable to create route proc files\n"); |