diff options
Diffstat (limited to 'include/net/route.h')
| -rw-r--r-- | include/net/route.h | 19 | 
1 files changed, 17 insertions, 2 deletions
diff --git a/include/net/route.h b/include/net/route.h index c29ef2733f2..8c52bc6f1c9 100644 --- a/include/net/route.h +++ b/include/net/route.h @@ -30,6 +30,7 @@  #include <net/inet_sock.h>  #include <linux/in_route.h>  #include <linux/rtnetlink.h> +#include <linux/rcupdate.h>  #include <linux/route.h>  #include <linux/ip.h>  #include <linux/cache.h> @@ -157,8 +158,22 @@ static inline struct rtable *ip_route_output_gre(struct net *net, struct flowi4  	return ip_route_output_key(net, fl4);  } -extern int ip_route_input(struct sk_buff *skb, __be32 dst, __be32 src, -			  u8 tos, struct net_device *devin); +extern int ip_route_input_noref(struct sk_buff *skb, __be32 dst, __be32 src, +				u8 tos, struct net_device *devin); + +static inline int ip_route_input(struct sk_buff *skb, __be32 dst, __be32 src, +				 u8 tos, struct net_device *devin) +{ +	int err; + +	rcu_read_lock(); +	err = ip_route_input_noref(skb, dst, src, tos, devin); +	if (!err) +		skb_dst_force(skb); +	rcu_read_unlock(); + +	return err; +}  extern void ipv4_update_pmtu(struct sk_buff *skb, struct net *net, u32 mtu,  			     int oif, u32 mark, u8 protocol, int flow_flags);  |