]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/ipv4/ip_gre.c
fib_trie: Fix RCU bug and merge similar bits of inflate/halve
[karo-tx-linux.git] / net / ipv4 / ip_gre.c
index ac8491245e5b2e99a50259bd7a6d95d92bcff4f4..6e7727f273939984e910256630336f7364addf9d 100644 (file)
@@ -252,10 +252,6 @@ static netdev_tx_t ipgre_xmit(struct sk_buff *skb,
        struct ip_tunnel *tunnel = netdev_priv(dev);
        const struct iphdr *tnl_params;
 
-       skb = gre_handle_offloads(skb, !!(tunnel->parms.o_flags&TUNNEL_CSUM));
-       if (IS_ERR(skb))
-               goto out;
-
        if (dev->header_ops) {
                /* Need space for new headers */
                if (skb_cow_head(skb, dev->needed_headroom -
@@ -268,6 +264,7 @@ static netdev_tx_t ipgre_xmit(struct sk_buff *skb,
                 * to gre header.
                 */
                skb_pull(skb, tunnel->hlen + sizeof(struct iphdr));
+               skb_reset_mac_header(skb);
        } else {
                if (skb_cow_head(skb, dev->needed_headroom))
                        goto free_skb;
@@ -275,6 +272,10 @@ static netdev_tx_t ipgre_xmit(struct sk_buff *skb,
                tnl_params = &tunnel->parms.iph;
        }
 
+       skb = gre_handle_offloads(skb, !!(tunnel->parms.o_flags&TUNNEL_CSUM));
+       if (IS_ERR(skb))
+               goto out;
+
        __gre_xmit(skb, dev, tnl_params, skb->protocol);
 
        return NETDEV_TX_OK;
@@ -672,6 +673,7 @@ static bool ipgre_netlink_encap_parms(struct nlattr *data[],
 static int gre_tap_init(struct net_device *dev)
 {
        __gre_tunnel_init(dev);
+       dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
 
        return ip_tunnel_init(dev);
 }
@@ -827,6 +829,7 @@ static struct rtnl_link_ops ipgre_link_ops __read_mostly = {
        .dellink        = ip_tunnel_dellink,
        .get_size       = ipgre_get_size,
        .fill_info      = ipgre_fill_info,
+       .get_link_net   = ip_tunnel_get_link_net,
 };
 
 static struct rtnl_link_ops ipgre_tap_ops __read_mostly = {
@@ -841,6 +844,7 @@ static struct rtnl_link_ops ipgre_tap_ops __read_mostly = {
        .dellink        = ip_tunnel_dellink,
        .get_size       = ipgre_get_size,
        .fill_info      = ipgre_fill_info,
+       .get_link_net   = ip_tunnel_get_link_net,
 };
 
 static int __net_init ipgre_tap_init_net(struct net *net)