forked from mirrors/linux
		
	net: ip: make ip_route_input_rcu() return drop reasons
In this commit, we make ip_route_input_rcu() return drop reasons, which come from ip_route_input_mc() and ip_route_input_slow(). The only caller of ip_route_input_rcu() is ip_route_input_noref(). We adjust it by making it return -EINVAL on error and ignore the reasons that ip_route_input_rcu() returns. In the following patch, we will make ip_route_input_noref() returns the drop reasons. Signed-off-by: Menglong Dong <dongml2@chinatelecom.cn> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
		
							parent
							
								
									5b92112acd
								
							
						
					
					
						commit
						61b95c70f3
					
				
					 1 changed files with 10 additions and 9 deletions
				
			
		|  | @ -2448,9 +2448,10 @@ ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr, | |||
| } | ||||
| 
 | ||||
| /* called with rcu_read_lock held */ | ||||
| static int ip_route_input_rcu(struct sk_buff *skb, __be32 daddr, __be32 saddr, | ||||
| 			      dscp_t dscp, struct net_device *dev, | ||||
| 			      struct fib_result *res) | ||||
| static enum skb_drop_reason | ||||
| ip_route_input_rcu(struct sk_buff *skb, __be32 daddr, __be32 saddr, | ||||
| 		   dscp_t dscp, struct net_device *dev, | ||||
| 		   struct fib_result *res) | ||||
| { | ||||
| 	/* Multicast recognition logic is moved from route cache to here.
 | ||||
| 	 * The problem was that too many Ethernet cards have broken/missing | ||||
|  | @ -2493,23 +2494,23 @@ static int ip_route_input_rcu(struct sk_buff *skb, __be32 daddr, __be32 saddr, | |||
| 			reason = ip_route_input_mc(skb, daddr, saddr, dscp, | ||||
| 						   dev, our); | ||||
| 		} | ||||
| 		return reason ? -EINVAL : 0; | ||||
| 		return reason; | ||||
| 	} | ||||
| 
 | ||||
| 	return ip_route_input_slow(skb, daddr, saddr, dscp, dev, res) ? -EINVAL : 0; | ||||
| 	return ip_route_input_slow(skb, daddr, saddr, dscp, dev, res); | ||||
| } | ||||
| 
 | ||||
| int ip_route_input_noref(struct sk_buff *skb, __be32 daddr, __be32 saddr, | ||||
| 			 dscp_t dscp, struct net_device *dev) | ||||
| { | ||||
| 	enum skb_drop_reason reason; | ||||
| 	struct fib_result res; | ||||
| 	int err; | ||||
| 
 | ||||
| 	rcu_read_lock(); | ||||
| 	err = ip_route_input_rcu(skb, daddr, saddr, dscp, dev, &res); | ||||
| 	reason = ip_route_input_rcu(skb, daddr, saddr, dscp, dev, &res); | ||||
| 	rcu_read_unlock(); | ||||
| 
 | ||||
| 	return err; | ||||
| 	return reason ? -EINVAL : 0; | ||||
| } | ||||
| EXPORT_SYMBOL(ip_route_input_noref); | ||||
| 
 | ||||
|  | @ -3321,7 +3322,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, | |||
| 		skb->mark	= mark; | ||||
| 		err = ip_route_input_rcu(skb, dst, src, | ||||
| 					 inet_dsfield_to_dscp(rtm->rtm_tos), | ||||
| 					 dev, &res); | ||||
| 					 dev, &res) ? -EINVAL : 0; | ||||
| 
 | ||||
| 		rt = skb_rtable(skb); | ||||
| 		if (err == 0 && rt->dst.error) | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Menglong Dong
						Menglong Dong