|
@@ -616,6 +616,7 @@ static netdev_tx_t ip6gre_xmit2(struct sk_buff *skb,
|
|
|
int err = -1;
|
|
|
u8 proto;
|
|
|
struct sk_buff *new_skb;
|
|
|
+ __be16 protocol;
|
|
|
|
|
|
if (dev->type == ARPHRD_ETHER)
|
|
|
IPCB(skb)->flags = 0;
|
|
@@ -732,8 +733,9 @@ static netdev_tx_t ip6gre_xmit2(struct sk_buff *skb,
|
|
|
ipv6h->daddr = fl6->daddr;
|
|
|
|
|
|
((__be16 *)(ipv6h + 1))[0] = tunnel->parms.o_flags;
|
|
|
- ((__be16 *)(ipv6h + 1))[1] = (dev->type == ARPHRD_ETHER) ?
|
|
|
- htons(ETH_P_TEB) : skb->protocol;
|
|
|
+ protocol = (dev->type == ARPHRD_ETHER) ?
|
|
|
+ htons(ETH_P_TEB) : skb->protocol;
|
|
|
+ ((__be16 *)(ipv6h + 1))[1] = protocol;
|
|
|
|
|
|
if (tunnel->parms.o_flags&(GRE_KEY|GRE_CSUM|GRE_SEQ)) {
|
|
|
__be32 *ptr = (__be32 *)(((u8 *)ipv6h) + tunnel->hlen - 4);
|
|
@@ -754,6 +756,8 @@ static netdev_tx_t ip6gre_xmit2(struct sk_buff *skb,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ skb_set_inner_protocol(skb, protocol);
|
|
|
+
|
|
|
ip6tunnel_xmit(skb, dev);
|
|
|
if (ndst)
|
|
|
ip6_tnl_dst_store(tunnel, ndst);
|