gre: export gre_build_header() function.
authorPravin B Shelar <pshelar@nicira.com>
Tue, 18 Jun 2013 00:49:45 +0000 (17:49 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 20 Jun 2013 01:07:40 +0000 (18:07 -0700)
This is required for ovs gre module.

Signed-off-by: Pravin B Shelar <pshelar@nicira.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/gre.h
net/ipv4/gre.c
net/ipv4/ip_gre.c

index c6ea0c72c605aa63bbe7ba12a7c69333f1edb251..cbb9d51d82c151147d0e9004741bdcaf2d2fe2ef 100644 (file)
@@ -32,6 +32,8 @@ struct gre_cisco_protocol {
 
 int gre_cisco_register(struct gre_cisco_protocol *proto);
 int gre_cisco_unregister(struct gre_cisco_protocol *proto);
+void gre_build_header(struct sk_buff *skb, const struct tnl_ptk_info *tpi,
+                     int hdr_len);
 
 static inline int ip_gre_calc_hlen(__be16 o_flags)
 {
index 8b9a373890ab2eee38be5c4fd8b1c03c2de51dad..1cbc46536d1fda02bf8bf3737faa0c4534875345 100644 (file)
@@ -61,6 +61,38 @@ int gre_del_protocol(const struct gre_protocol *proto, u8 version)
 }
 EXPORT_SYMBOL_GPL(gre_del_protocol);
 
+void 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)) {
+                       *ptr = 0;
+                       *(__sum16 *)ptr = csum_fold(skb_checksum(skb, 0,
+                                                                skb->len, 0));
+               }
+       }
+}
+EXPORT_SYMBOL_GPL(gre_build_header);
+
 static __sum16 check_checksum(struct sk_buff *skb)
 {
        __sum16 csum = 0;
index 19863a81cea118c5542a4f6dbce7eb7161439b62..362c7c4c13ca05a3db123a8b1a732dcb455c0dd5 100644 (file)
@@ -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);
 }