diff options
Diffstat (limited to 'net/ipv4/ipip.c')
| -rw-r--r-- | net/ipv4/ipip.c | 34 | 
1 files changed, 16 insertions, 18 deletions
diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c index bfc17c5914e..378b20b7ca6 100644 --- a/net/ipv4/ipip.c +++ b/net/ipv4/ipip.c @@ -276,11 +276,6 @@ static struct ip_tunnel * ipip_tunnel_locate(struct net *net,  	dev_net_set(dev, net); -	if (strchr(name, '%')) { -		if (dev_alloc_name(dev, name) < 0) -			goto failed_free; -	} -  	nt = netdev_priv(dev);  	nt->parms = *parms; @@ -319,7 +314,7 @@ static int ipip_err(struct sk_buff *skb, u32 info)     8 bytes of packet payload. It means, that precise relaying of     ICMP in the real Internet is absolutely infeasible.   */ -	struct iphdr *iph = (struct iphdr *)skb->data; +	const struct iphdr *iph = (const struct iphdr *)skb->data;  	const int type = icmp_hdr(skb)->type;  	const int code = icmp_hdr(skb)->code;  	struct ip_tunnel *t; @@ -433,15 +428,16 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)  {  	struct ip_tunnel *tunnel = netdev_priv(dev);  	struct pcpu_tstats *tstats; -	struct iphdr  *tiph = &tunnel->parms.iph; +	const struct iphdr  *tiph = &tunnel->parms.iph;  	u8     tos = tunnel->parms.iph.tos;  	__be16 df = tiph->frag_off;  	struct rtable *rt;     			/* Route to the other host */  	struct net_device *tdev;		/* Device to other host */ -	struct iphdr  *old_iph = ip_hdr(skb); +	const struct iphdr  *old_iph = ip_hdr(skb);  	struct iphdr  *iph;			/* Our new IP header */  	unsigned int max_headroom;		/* The extra header space needed */  	__be32 dst = tiph->daddr; +	struct flowi4 fl4;  	int    mtu;  	if (skb->protocol != htons(ETH_P_IP)) @@ -460,7 +456,7 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)  			goto tx_error_icmp;  	} -	rt = ip_route_output_ports(dev_net(dev), NULL, +	rt = ip_route_output_ports(dev_net(dev), &fl4, NULL,  				   dst, tiph->saddr,  				   0, 0,  				   IPPROTO_IPIP, RT_TOS(tos), @@ -549,8 +545,8 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)  	iph->frag_off		=	df;  	iph->protocol		=	IPPROTO_IPIP;  	iph->tos		=	INET_ECN_encapsulate(tos, old_iph->tos); -	iph->daddr		=	rt->rt_dst; -	iph->saddr		=	rt->rt_src; +	iph->daddr		=	fl4.daddr; +	iph->saddr		=	fl4.saddr;  	if ((iph->ttl = tiph->ttl) == 0)  		iph->ttl	=	old_iph->ttl; @@ -572,19 +568,21 @@ static void ipip_tunnel_bind_dev(struct net_device *dev)  {  	struct net_device *tdev = NULL;  	struct ip_tunnel *tunnel; -	struct iphdr *iph; +	const struct iphdr *iph;  	tunnel = netdev_priv(dev);  	iph = &tunnel->parms.iph;  	if (iph->daddr) { -		struct rtable *rt = ip_route_output_ports(dev_net(dev), NULL, -							  iph->daddr, iph->saddr, -							  0, 0, -							  IPPROTO_IPIP, -							  RT_TOS(iph->tos), -							  tunnel->parms.link); +		struct rtable *rt; +		struct flowi4 fl4; +		rt = ip_route_output_ports(dev_net(dev), &fl4, NULL, +					   iph->daddr, iph->saddr, +					   0, 0, +					   IPPROTO_IPIP, +					   RT_TOS(iph->tos), +					   tunnel->parms.link);  		if (!IS_ERR(rt)) {  			tdev = rt->dst.dev;  			ip_rt_put(rt);  |