2010-08-22 10:05:39 +04:00
# ifndef __LINUX_GRE_H
# define __LINUX_GRE_H
# include <linux/skbuff.h>
2013-03-25 18:49:35 +04:00
# include <net/ip_tunnels.h>
2010-08-22 10:05:39 +04:00
# define GREPROTO_CISCO 0
# define GREPROTO_PPTP 1
# define GREPROTO_MAX 2
2013-06-18 04:49:38 +04:00
# define GRE_IP_PROTO_MAX 2
2010-08-22 10:05:39 +04:00
struct gre_protocol {
int ( * handler ) ( struct sk_buff * skb ) ;
void ( * err_handler ) ( struct sk_buff * skb , u32 info ) ;
} ;
2013-03-25 18:49:35 +04:00
struct gre_base_hdr {
__be16 flags ;
__be16 protocol ;
} ;
# define GRE_HEADER_SECTION 4
2010-08-22 10:05:39 +04:00
int gre_add_protocol ( const struct gre_protocol * proto , u8 version ) ;
int gre_del_protocol ( const struct gre_protocol * proto , u8 version ) ;
2013-06-18 04:49:38 +04:00
struct gre_cisco_protocol {
int ( * handler ) ( struct sk_buff * skb , const struct tnl_ptk_info * tpi ) ;
int ( * err_handler ) ( struct sk_buff * skb , u32 info ,
const struct tnl_ptk_info * tpi ) ;
u8 priority ;
} ;
int gre_cisco_register ( struct gre_cisco_protocol * proto ) ;
int gre_cisco_unregister ( struct gre_cisco_protocol * proto ) ;
2013-07-01 21:24:00 +04:00
2013-06-18 04:49:45 +04:00
void gre_build_header ( struct sk_buff * skb , const struct tnl_ptk_info * tpi ,
int hdr_len ) ;
2013-10-19 22:42:55 +04:00
static inline struct sk_buff * gre_handle_offloads ( struct sk_buff * skb ,
2014-06-05 04:20:23 +04:00
bool csum )
2013-10-19 22:42:55 +04:00
{
2014-06-05 04:20:23 +04:00
return iptunnel_handle_offloads ( skb , csum ,
csum ? SKB_GSO_GRE_CSUM : SKB_GSO_GRE ) ;
2013-10-19 22:42:55 +04:00
}
2013-06-18 04:49:38 +04:00
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 ;
}
2013-03-25 18:49:35 +04:00
static inline __be16 gre_flags_to_tnl_flags ( __be16 flags )
{
__be16 tflags = 0 ;
if ( flags & GRE_CSUM )
tflags | = TUNNEL_CSUM ;
if ( flags & GRE_ROUTING )
tflags | = TUNNEL_ROUTING ;
if ( flags & GRE_KEY )
tflags | = TUNNEL_KEY ;
if ( flags & GRE_SEQ )
tflags | = TUNNEL_SEQ ;
if ( flags & GRE_STRICT )
tflags | = TUNNEL_STRICT ;
if ( flags & GRE_REC )
tflags | = TUNNEL_REC ;
if ( flags & GRE_VERSION )
tflags | = TUNNEL_VERSION ;
return tflags ;
}
static inline __be16 tnl_flags_to_gre_flags ( __be16 tflags )
{
__be16 flags = 0 ;
if ( tflags & TUNNEL_CSUM )
flags | = GRE_CSUM ;
if ( tflags & TUNNEL_ROUTING )
flags | = GRE_ROUTING ;
if ( tflags & TUNNEL_KEY )
flags | = GRE_KEY ;
if ( tflags & TUNNEL_SEQ )
flags | = GRE_SEQ ;
if ( tflags & TUNNEL_STRICT )
flags | = GRE_STRICT ;
if ( tflags & TUNNEL_REC )
flags | = GRE_REC ;
if ( tflags & TUNNEL_VERSION )
flags | = GRE_VERSION ;
return flags ;
}
2010-08-22 10:05:39 +04:00
# endif