#include <linux/skbuff.h>
#include <net/ip_tunnels.h>
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,37)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37) || \
+ defined(HAVE_GRE_CISCO_REGISTER)
#include_next <net/gre.h>
-
-#else /* LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,37) */
-
-#define GREPROTO_CISCO 0
-#define GREPROTO_MAX 2
-
-struct gre_protocol {
- int (*handler)(struct sk_buff *skb);
-};
-
-int gre_add_protocol(const struct gre_protocol *proto, u8 version);
-int gre_del_protocol(const struct gre_protocol *proto, u8 version);
-
#endif
-struct gre_base_hdr {
- __be16 flags;
- __be16 protocol;
-};
-#define GRE_HEADER_SECTION 4
+#ifndef HAVE_GRE_CISCO_REGISTER
+/* GRE demux not available, implement our own demux. */
#define MAX_GRE_PROTO_PRIORITY 255
+
struct gre_cisco_protocol {
int (*handler)(struct sk_buff *skb, const struct tnl_ptk_info *tpi);
u8 priority;
};
-#define gre_build_header rpl_gre_build_header
-void gre_build_header(struct sk_buff *skb, const struct tnl_ptk_info *tpi,
- int hdr_len);
-
-#define gre_handle_offloads rpl_gre_handle_offloads
-struct sk_buff *gre_handle_offloads(struct sk_buff *skb, bool gre_csum);
-
+#define gre_cisco_register rpl_gre_cisco_register
int gre_cisco_register(struct gre_cisco_protocol *proto);
-int gre_cisco_unregister(struct gre_cisco_protocol *proto);
-static inline int ip_gre_calc_hlen(__be16 o_flags)
-{
- int addend = 4;
+#define gre_cisco_unregister rpl_gre_cisco_unregister
+int gre_cisco_unregister(struct gre_cisco_protocol *proto);
- if (o_flags & TUNNEL_CSUM)
- addend += 4;
- if (o_flags & TUNNEL_KEY)
- addend += 4;
- if (o_flags & TUNNEL_SEQ)
- addend += 4;
- return addend;
-}
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+struct gre_base_hdr {
+ __be16 flags;
+ __be16 protocol;
+};
+#define GRE_HEADER_SECTION 4
static inline __be16 gre_flags_to_tnl_flags(__be16 flags)
{
return flags;
}
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) */
+#endif /* HAVE_GRE_CISCO_REGISTER */
+
+#define gre_build_header rpl_gre_build_header
+void gre_build_header(struct sk_buff *skb, const struct tnl_ptk_info *tpi,
+ int hdr_len);
+
+#define gre_handle_offloads rpl_gre_handle_offloads
+struct sk_buff *gre_handle_offloads(struct sk_buff *skb, bool gre_csum);
+
+#define ip_gre_calc_hlen rpl_ip_gre_calc_hlen
+static inline int ip_gre_calc_hlen(__be16 o_flags)
+{
+ int addend = 4;
+
+ if (o_flags & TUNNEL_CSUM)
+ addend += 4;
+ if (o_flags & TUNNEL_KEY)
+ addend += 4;
+ if (o_flags & TUNNEL_SEQ)
+ addend += 4;
+ return addend;
+}
+
#endif