#ifndef _GTP_H_
#define _GTP_H_
#include <linux/netdevice.h>
#include <linux/types.h>
#include <net/rtnetlink.h>
#define GTP0_PORT 3386
#define GTP1U_PORT 2152
#define GTP_ECHO_REQ 1
#define GTP_ECHO_RSP 2
#define GTP_TPDU 255
#define GTPIE_RECOVERY 14
struct gtp0_header {
__u8 flags;
__u8 type;
__be16 length;
__be16 seq;
__be16 flow;
__u8 number;
__u8 spare[3];
__be64 tid;
} __attribute__ ((packed));
struct gtp1_header {
__u8 flags;
__u8 type;
__be16 length;
__be32 tid;
} __attribute__ ((packed));
struct gtp1_header_long {
__u8 flags;
__u8 type;
__be16 length;
__be32 tid;
__be16 seq;
__u8 npdu;
__u8 next;
} __packed;
struct gtp_ie {
__u8 tag;
__u8 val;
} __packed;
struct gtp0_packet {
struct gtp0_header gtp0_h;
struct gtp_ie ie;
} __packed;
struct gtp1u_packet {
struct gtp1_header_long gtp1u_h;
struct gtp_ie ie;
} __packed;
struct gtp_pdu_session_info {
u8 pdu_type;
u8 qfi;
};
static inline bool netif_is_gtp(const struct net_device *dev)
{
return dev->rtnl_link_ops &&
!strcmp(dev->rtnl_link_ops->kind, "gtp");
}
#define GTP1_F_NPDU 0x01
#define GTP1_F_SEQ 0x02
#define GTP1_F_EXTHDR 0x04
#define GTP1_F_MASK 0x07
struct gtp_ext_hdr {
__u8 len;
__u8 data[];
};
#endif