|
@@ -248,40 +248,6 @@ error:
|
|
|
return ERR_PTR(err);
|
|
|
}
|
|
|
|
|
|
-static struct sk_buff *gre_build_header(struct sk_buff *skb,
|
|
|
- const struct tnl_ptk_info *tpi,
|
|
|
- int hdr_len)
|
|
|
-{
|
|
|
- struct gre_base_hdr *greh;
|
|
|
-
|
|
|
- skb_push(skb, hdr_len);
|
|
|
-
|
|
|
- greh = (struct gre_base_hdr *)skb->data;
|
|
|
- greh->flags = tnl_flags_to_gre_flags(tpi->flags);
|
|
|
- greh->protocol = tpi->proto;
|
|
|
-
|
|
|
- if (tpi->flags&(TUNNEL_KEY|TUNNEL_CSUM|TUNNEL_SEQ)) {
|
|
|
- __be32 *ptr = (__be32 *)(((u8 *)greh) + hdr_len - 4);
|
|
|
-
|
|
|
- if (tpi->flags&TUNNEL_SEQ) {
|
|
|
- *ptr = tpi->seq;
|
|
|
- ptr--;
|
|
|
- }
|
|
|
- if (tpi->flags&TUNNEL_KEY) {
|
|
|
- *ptr = tpi->key;
|
|
|
- ptr--;
|
|
|
- }
|
|
|
- if (tpi->flags&TUNNEL_CSUM &&
|
|
|
- !(skb_shinfo(skb)->gso_type & SKB_GSO_GRE)) {
|
|
|
- *(__sum16 *)ptr = 0;
|
|
|
- *(__sum16 *)ptr = csum_fold(skb_checksum(skb, 0,
|
|
|
- skb->len, 0));
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return skb;
|
|
|
-}
|
|
|
-
|
|
|
static void __gre_xmit(struct sk_buff *skb, struct net_device *dev,
|
|
|
const struct iphdr *tnl_params,
|
|
|
__be16 proto)
|
|
@@ -302,11 +268,7 @@ static void __gre_xmit(struct sk_buff *skb, struct net_device *dev,
|
|
|
tpi.seq = htonl(tunnel->o_seqno);
|
|
|
|
|
|
/* Push GRE header. */
|
|
|
- skb = gre_build_header(skb, &tpi, tunnel->hlen);
|
|
|
- if (unlikely(!skb)) {
|
|
|
- dev->stats.tx_dropped++;
|
|
|
- return;
|
|
|
- }
|
|
|
+ gre_build_header(skb, &tpi, tunnel->hlen);
|
|
|
|
|
|
ip_tunnel_xmit(skb, dev, tnl_params, tnl_params->protocol);
|
|
|
}
|