diff options
Diffstat (limited to 'net/ipv4/ip_gre.c')
| -rw-r--r-- | net/ipv4/ip_gre.c | 16 | 
1 files changed, 9 insertions, 7 deletions
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index d7aea4c5b94..9b842544aea 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c @@ -178,7 +178,7 @@ static int ipgre_err(struct sk_buff *skb, u32 info,  	else  		itn = net_generic(net, ipgre_net_id); -	iph = (const struct iphdr *)skb->data; +	iph = (const struct iphdr *)(icmp_hdr(skb) + 1);  	t = ip_tunnel_lookup(itn, skb->dev->ifindex, tpi->flags,  			     iph->daddr, iph->saddr, tpi->key); @@ -217,6 +217,7 @@ static int ipgre_rcv(struct sk_buff *skb, const struct tnl_ptk_info *tpi)  				  iph->saddr, iph->daddr, tpi->key);  	if (tunnel) { +		skb_pop_mac_header(skb);  		ip_tunnel_rcv(tunnel, skb, tpi, log_ecn_error);  		return PACKET_RCVD;  	} @@ -277,7 +278,7 @@ static netdev_tx_t ipgre_xmit(struct sk_buff *skb,  	return NETDEV_TX_OK;  free_skb: -	dev_kfree_skb(skb); +	kfree_skb(skb);  out:  	dev->stats.tx_dropped++;  	return NETDEV_TX_OK; @@ -300,7 +301,7 @@ static netdev_tx_t gre_tap_xmit(struct sk_buff *skb,  	return NETDEV_TX_OK;  free_skb: -	dev_kfree_skb(skb); +	kfree_skb(skb);  out:  	dev->stats.tx_dropped++;  	return NETDEV_TX_OK; @@ -409,7 +410,7 @@ static int ipgre_open(struct net_device *dev)  		struct flowi4 fl4;  		struct rtable *rt; -		rt = ip_route_output_gre(dev_net(dev), &fl4, +		rt = ip_route_output_gre(t->net, &fl4,  					 t->parms.iph.daddr,  					 t->parms.iph.saddr,  					 t->parms.o_key, @@ -433,7 +434,7 @@ static int ipgre_close(struct net_device *dev)  	if (ipv4_is_multicast(t->parms.iph.daddr) && t->mlink) {  		struct in_device *in_dev; -		in_dev = inetdev_by_index(dev_net(dev), t->mlink); +		in_dev = inetdev_by_index(t->net, t->mlink);  		if (in_dev)  			ip_mc_dec_group(in_dev, t->parms.iph.daddr);  	} @@ -462,6 +463,7 @@ static const struct net_device_ops ipgre_netdev_ops = {  static void ipgre_tunnel_setup(struct net_device *dev)  {  	dev->netdev_ops		= &ipgre_netdev_ops; +	dev->type		= ARPHRD_IPGRE;  	ip_tunnel_setup(dev, ipgre_net_id);  } @@ -476,7 +478,7 @@ static void __gre_tunnel_init(struct net_device *dev)  	dev->needed_headroom	= LL_MAX_HEADER + sizeof(struct iphdr) + 4;  	dev->mtu		= ETH_DATA_LEN - sizeof(struct iphdr) - 4; -	dev->features		|= NETIF_F_NETNS_LOCAL | GRE_FEATURES; +	dev->features		|= GRE_FEATURES;  	dev->hw_features	|= GRE_FEATURES;  	if (!(tunnel->parms.o_flags & TUNNEL_SEQ)) { @@ -500,7 +502,6 @@ static int ipgre_tunnel_init(struct net_device *dev)  	memcpy(dev->dev_addr, &iph->saddr, 4);  	memcpy(dev->broadcast, &iph->daddr, 4); -	dev->type		= ARPHRD_IPGRE;  	dev->flags		= IFF_NOARP;  	dev->priv_flags		&= ~IFF_XMIT_DST_RELEASE;  	dev->addr_len		= 4; @@ -648,6 +649,7 @@ static void ipgre_tap_setup(struct net_device *dev)  {  	ether_setup(dev);  	dev->netdev_ops		= &gre_tap_netdev_ops; +	dev->priv_flags 	|= IFF_LIVE_ADDR_CHANGE;  	ip_tunnel_setup(dev, gre_tap_net_id);  }  | 
