Merge tag 'armsoc-dt64' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
[cascardo/linux.git] / net / mpls / mpls_iptunnel.c
index 644a8da..cf52cf3 100644 (file)
@@ -37,7 +37,7 @@ static unsigned int mpls_encap_size(struct mpls_iptunnel_encap *en)
        return en->labels * sizeof(struct mpls_shim_hdr);
 }
 
-static int mpls_output(struct net *net, struct sock *sk, struct sk_buff *skb)
+static int mpls_xmit(struct sk_buff *skb)
 {
        struct mpls_iptunnel_encap *tun_encap_info;
        struct mpls_shim_hdr *hdr;
@@ -90,7 +90,11 @@ static int mpls_output(struct net *net, struct sock *sk, struct sk_buff *skb)
        if (skb_cow(skb, hh_len + new_header_size))
                goto drop;
 
+       skb_set_inner_protocol(skb, skb->protocol);
+       skb_reset_inner_network_header(skb);
+
        skb_push(skb, new_header_size);
+
        skb_reset_network_header(skb);
 
        skb->dev = out_dev;
@@ -115,7 +119,7 @@ static int mpls_output(struct net *net, struct sock *sk, struct sk_buff *skb)
                net_dbg_ratelimited("%s: packet transmission failed: %d\n",
                                    __func__, err);
 
-       return 0;
+       return LWTUNNEL_XMIT_DONE;
 
 drop:
        kfree_skb(skb);
@@ -153,7 +157,8 @@ static int mpls_build_state(struct net_device *dev, struct nlattr *nla,
        if (ret)
                goto errout;
        newts->type = LWTUNNEL_ENCAP_MPLS;
-       newts->flags |= LWTUNNEL_STATE_OUTPUT_REDIRECT;
+       newts->flags |= LWTUNNEL_STATE_XMIT_REDIRECT;
+       newts->headroom = mpls_encap_size(tun_encap_info);
 
        *ts = newts;
 
@@ -209,7 +214,7 @@ static int mpls_encap_cmp(struct lwtunnel_state *a, struct lwtunnel_state *b)
 
 static const struct lwtunnel_encap_ops mpls_iptun_ops = {
        .build_state = mpls_build_state,
-       .output = mpls_output,
+       .xmit = mpls_xmit,
        .fill_encap = mpls_fill_encap_info,
        .get_encap_size = mpls_encap_nlsize,
        .cmp_encap = mpls_encap_cmp,