aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/gre.c
diff options
context:
space:
mode:
authorPravin B Shelar <pshelar@nicira.com>2013-06-17 17:49:45 -0700
committerDavid S. Miller <davem@davemloft.net>2013-06-19 18:07:40 -0700
commit752f36da68e9136df8918461d651723a43627e04 (patch)
tree4701b050f7b67559162f935d4fbb626597738ee1 /net/ipv4/gre.c
parentgre: Allow multiple protocol listener for gre protocol. (diff)
downloadlinux-dev-752f36da68e9136df8918461d651723a43627e04.tar.xz
linux-dev-752f36da68e9136df8918461d651723a43627e04.zip
gre: export gre_build_header() function.
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>
Diffstat (limited to 'net/ipv4/gre.c')
-rw-r--r--net/ipv4/gre.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/net/ipv4/gre.c b/net/ipv4/gre.c
index 8b9a373890ab..1cbc46536d1f 100644
--- a/net/ipv4/gre.c
+++ b/net/ipv4/gre.c
@@ -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;