diff options
| author | Patrick McHardy <kaber@trash.net> | 2010-05-10 18:39:28 +0200 | 
|---|---|---|
| committer | Patrick McHardy <kaber@trash.net> | 2010-05-10 18:39:28 +0200 | 
| commit | 1e4b1057121bc756b91758a434b504d2010f6088 (patch) | |
| tree | b016cf2c728289c7e36d9e4e488f30ab0bd0ae6e /net/ipv4/route.c | |
| parent | 3b254c54ec46eb022cb26ee6ab37fae23f5f7d6a (diff) | |
| parent | 3ee943728fff536edaf8f59faa58aaa1aa7366e3 (diff) | |
| download | olio-linux-3.10-1e4b1057121bc756b91758a434b504d2010f6088.tar.xz olio-linux-3.10-1e4b1057121bc756b91758a434b504d2010f6088.zip  | |
Merge branch 'master' of /repos/git/net-next-2.6
Conflicts:
	net/bridge/br_device.c
	net/bridge/br_forward.c
Signed-off-by: Patrick McHardy <kaber@trash.net>
Diffstat (limited to 'net/ipv4/route.c')
| -rw-r--r-- | net/ipv4/route.c | 137 | 
1 files changed, 22 insertions, 115 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index cb562fdd9b9..dea3f926425 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -129,7 +129,6 @@ static int ip_rt_gc_elasticity __read_mostly	= 8;  static int ip_rt_mtu_expires __read_mostly	= 10 * 60 * HZ;  static int ip_rt_min_pmtu __read_mostly		= 512 + 20 + 20;  static int ip_rt_min_advmss __read_mostly	= 256; -static int ip_rt_secret_interval __read_mostly	= 10 * 60 * HZ;  static int rt_chain_length_max __read_mostly	= 20;  static struct delayed_work expires_work; @@ -258,10 +257,9 @@ static DEFINE_PER_CPU(struct rt_cache_stat, rt_cache_stat);  	(__raw_get_cpu_var(rt_cache_stat).field++)  static inline unsigned int rt_hash(__be32 daddr, __be32 saddr, int idx, -		int genid) +				   int genid)  { -	return jhash_3words((__force u32)(__be32)(daddr), -			    (__force u32)(__be32)(saddr), +	return jhash_3words((__force u32)daddr, (__force u32)saddr,  			    idx, genid)  		& rt_hash_mask;  } @@ -378,12 +376,13 @@ static int rt_cache_seq_show(struct seq_file *seq, void *v)  		struct rtable *r = v;  		int len; -		seq_printf(seq, "%s\t%08lX\t%08lX\t%8X\t%d\t%u\t%d\t" -			      "%08lX\t%d\t%u\t%u\t%02X\t%d\t%1d\t%08X%n", +		seq_printf(seq, "%s\t%08X\t%08X\t%8X\t%d\t%u\t%d\t" +			      "%08X\t%d\t%u\t%u\t%02X\t%d\t%1d\t%08X%n",  			r->u.dst.dev ? r->u.dst.dev->name : "*", -			(unsigned long)r->rt_dst, (unsigned long)r->rt_gateway, +			(__force u32)r->rt_dst, +			(__force u32)r->rt_gateway,  			r->rt_flags, atomic_read(&r->u.dst.__refcnt), -			r->u.dst.__use, 0, (unsigned long)r->rt_src, +			r->u.dst.__use, 0, (__force u32)r->rt_src,  			(dst_metric(&r->u.dst, RTAX_ADVMSS) ?  			     (int)dst_metric(&r->u.dst, RTAX_ADVMSS) + 40 : 0),  			dst_metric(&r->u.dst, RTAX_WINDOW), @@ -685,18 +684,17 @@ static inline bool rt_caching(const struct net *net)  static inline bool compare_hash_inputs(const struct flowi *fl1,  					const struct flowi *fl2)  { -	return (__force u32)(((fl1->nl_u.ip4_u.daddr ^ fl2->nl_u.ip4_u.daddr) | -		(fl1->nl_u.ip4_u.saddr ^ fl2->nl_u.ip4_u.saddr) | +	return ((((__force u32)fl1->nl_u.ip4_u.daddr ^ (__force u32)fl2->nl_u.ip4_u.daddr) | +		((__force u32)fl1->nl_u.ip4_u.saddr ^ (__force u32)fl2->nl_u.ip4_u.saddr) |  		(fl1->iif ^ fl2->iif)) == 0);  }  static inline int compare_keys(struct flowi *fl1, struct flowi *fl2)  { -	return ((__force u32)((fl1->nl_u.ip4_u.daddr ^ fl2->nl_u.ip4_u.daddr) | -		(fl1->nl_u.ip4_u.saddr ^ fl2->nl_u.ip4_u.saddr)) | +	return (((__force u32)fl1->nl_u.ip4_u.daddr ^ (__force u32)fl2->nl_u.ip4_u.daddr) | +		((__force u32)fl1->nl_u.ip4_u.saddr ^ (__force u32)fl2->nl_u.ip4_u.saddr) |  		(fl1->mark ^ fl2->mark) | -		(*(u16 *)&fl1->nl_u.ip4_u.tos ^ -		 *(u16 *)&fl2->nl_u.ip4_u.tos) | +		(*(u16 *)&fl1->nl_u.ip4_u.tos ^ *(u16 *)&fl2->nl_u.ip4_u.tos) |  		(fl1->oif ^ fl2->oif) |  		(fl1->iif ^ fl2->iif)) == 0;  } @@ -919,32 +917,11 @@ void rt_cache_flush_batch(void)  	rt_do_flush(!in_softirq());  } -/* - * We change rt_genid and let gc do the cleanup - */ -static void rt_secret_rebuild(unsigned long __net) -{ -	struct net *net = (struct net *)__net; -	rt_cache_invalidate(net); -	mod_timer(&net->ipv4.rt_secret_timer, jiffies + ip_rt_secret_interval); -} - -static void rt_secret_rebuild_oneshot(struct net *net) -{ -	del_timer_sync(&net->ipv4.rt_secret_timer); -	rt_cache_invalidate(net); -	if (ip_rt_secret_interval) -		mod_timer(&net->ipv4.rt_secret_timer, jiffies + ip_rt_secret_interval); -} -  static void rt_emergency_hash_rebuild(struct net *net)  { -	if (net_ratelimit()) { +	if (net_ratelimit())  		printk(KERN_WARNING "Route hash chain too long!\n"); -		printk(KERN_WARNING "Adjust your secret_interval!\n"); -	} - -	rt_secret_rebuild_oneshot(net); +	rt_cache_invalidate(net);  }  /* @@ -2319,8 +2296,8 @@ int ip_route_input(struct sk_buff *skb, __be32 daddr, __be32 saddr,  	rcu_read_lock();  	for (rth = rcu_dereference(rt_hash_table[hash].chain); rth;  	     rth = rcu_dereference(rth->u.dst.rt_next)) { -		if (((rth->fl.fl4_dst ^ daddr) | -		     (rth->fl.fl4_src ^ saddr) | +		if ((((__force u32)rth->fl.fl4_dst ^ (__force u32)daddr) | +		     ((__force u32)rth->fl.fl4_src ^ (__force u32)saddr) |  		     (rth->fl.iif ^ iif) |  		     rth->fl.oif |  		     (rth->fl.fl4_tos ^ tos)) == 0 && @@ -3102,48 +3079,6 @@ static int ipv4_sysctl_rtcache_flush(ctl_table *__ctl, int write,  	return -EINVAL;  } -static void rt_secret_reschedule(int old) -{ -	struct net *net; -	int new = ip_rt_secret_interval; -	int diff = new - old; - -	if (!diff) -		return; - -	rtnl_lock(); -	for_each_net(net) { -		int deleted = del_timer_sync(&net->ipv4.rt_secret_timer); -		long time; - -		if (!new) -			continue; - -		if (deleted) { -			time = net->ipv4.rt_secret_timer.expires - jiffies; - -			if (time <= 0 || (time += diff) <= 0) -				time = 0; -		} else -			time = new; - -		mod_timer(&net->ipv4.rt_secret_timer, jiffies + time); -	} -	rtnl_unlock(); -} - -static int ipv4_sysctl_rt_secret_interval(ctl_table *ctl, int write, -					  void __user *buffer, size_t *lenp, -					  loff_t *ppos) -{ -	int old = ip_rt_secret_interval; -	int ret = proc_dointvec_jiffies(ctl, write, buffer, lenp, ppos); - -	rt_secret_reschedule(old); - -	return ret; -} -  static ctl_table ipv4_route_table[] = {  	{  		.procname	= "gc_thresh", @@ -3252,13 +3187,6 @@ static ctl_table ipv4_route_table[] = {  		.mode		= 0644,  		.proc_handler	= proc_dointvec,  	}, -	{ -		.procname	= "secret_interval", -		.data		= &ip_rt_secret_interval, -		.maxlen		= sizeof(int), -		.mode		= 0644, -		.proc_handler	= ipv4_sysctl_rt_secret_interval, -	},  	{ }  }; @@ -3337,34 +3265,15 @@ static __net_initdata struct pernet_operations sysctl_route_ops = {  };  #endif - -static __net_init int rt_secret_timer_init(struct net *net) +static __net_init int rt_genid_init(struct net *net)  { -	atomic_set(&net->ipv4.rt_genid, -			(int) ((num_physpages ^ (num_physpages>>8)) ^ -			(jiffies ^ (jiffies >> 7)))); - -	net->ipv4.rt_secret_timer.function = rt_secret_rebuild; -	net->ipv4.rt_secret_timer.data = (unsigned long)net; -	init_timer_deferrable(&net->ipv4.rt_secret_timer); - -	if (ip_rt_secret_interval) { -		net->ipv4.rt_secret_timer.expires = -			jiffies + net_random() % ip_rt_secret_interval + -			ip_rt_secret_interval; -		add_timer(&net->ipv4.rt_secret_timer); -	} +	get_random_bytes(&net->ipv4.rt_genid, +			 sizeof(net->ipv4.rt_genid));  	return 0;  } -static __net_exit void rt_secret_timer_exit(struct net *net) -{ -	del_timer_sync(&net->ipv4.rt_secret_timer); -} - -static __net_initdata struct pernet_operations rt_secret_timer_ops = { -	.init = rt_secret_timer_init, -	.exit = rt_secret_timer_exit, +static __net_initdata struct pernet_operations rt_genid_ops = { +	.init = rt_genid_init,  }; @@ -3425,9 +3334,6 @@ int __init ip_rt_init(void)  	schedule_delayed_work(&expires_work,  		net_random() % ip_rt_gc_interval + ip_rt_gc_interval); -	if (register_pernet_subsys(&rt_secret_timer_ops)) -		printk(KERN_ERR "Unable to setup rt_secret_timer\n"); -  	if (ip_rt_proc_init())  		printk(KERN_ERR "Unable to create route proc files\n");  #ifdef CONFIG_XFRM @@ -3439,6 +3345,7 @@ int __init ip_rt_init(void)  #ifdef CONFIG_SYSCTL  	register_pernet_subsys(&sysctl_route_ops);  #endif +	register_pernet_subsys(&rt_genid_ops);  	return rc;  }  |