1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2459aa660SPablo Neira #ifndef _GTP_H_ 39b8ac4f9SColin Ian King #define _GTP_H_ 4459aa660SPablo Neira 5*949d6b40SJakub Kicinski #include <linux/netdevice.h> 6*949d6b40SJakub Kicinski #include <linux/types.h> 7*949d6b40SJakub Kicinski #include <net/rtnetlink.h> 8*949d6b40SJakub Kicinski 9459aa660SPablo Neira /* General GTP protocol related definitions. */ 10459aa660SPablo Neira 11459aa660SPablo Neira #define GTP0_PORT 3386 12459aa660SPablo Neira #define GTP1U_PORT 2152 13459aa660SPablo Neira 149af41cc3SWojciech Drewek /* GTP messages types */ 159af41cc3SWojciech Drewek #define GTP_ECHO_REQ 1 /* Echo Request */ 169af41cc3SWojciech Drewek #define GTP_ECHO_RSP 2 /* Echo Response */ 17459aa660SPablo Neira #define GTP_TPDU 255 18459aa660SPablo Neira 199af41cc3SWojciech Drewek #define GTPIE_RECOVERY 14 209af41cc3SWojciech Drewek 21459aa660SPablo Neira struct gtp0_header { /* According to GSM TS 09.60. */ 22459aa660SPablo Neira __u8 flags; 23459aa660SPablo Neira __u8 type; 24459aa660SPablo Neira __be16 length; 25459aa660SPablo Neira __be16 seq; 26459aa660SPablo Neira __be16 flow; 27459aa660SPablo Neira __u8 number; 28459aa660SPablo Neira __u8 spare[3]; 29459aa660SPablo Neira __be64 tid; 30459aa660SPablo Neira } __attribute__ ((packed)); 31459aa660SPablo Neira 32459aa660SPablo Neira struct gtp1_header { /* According to 3GPP TS 29.060. */ 33459aa660SPablo Neira __u8 flags; 34459aa660SPablo Neira __u8 type; 35459aa660SPablo Neira __be16 length; 36459aa660SPablo Neira __be32 tid; 37459aa660SPablo Neira } __attribute__ ((packed)); 38459aa660SPablo Neira 399af41cc3SWojciech Drewek struct gtp1_header_long { /* According to 3GPP TS 29.060. */ 409af41cc3SWojciech Drewek __u8 flags; 419af41cc3SWojciech Drewek __u8 type; 429af41cc3SWojciech Drewek __be16 length; 439af41cc3SWojciech Drewek __be32 tid; 449af41cc3SWojciech Drewek __be16 seq; 459af41cc3SWojciech Drewek __u8 npdu; 469af41cc3SWojciech Drewek __u8 next; 479af41cc3SWojciech Drewek } __packed; 489af41cc3SWojciech Drewek 499af41cc3SWojciech Drewek /* GTP Information Element */ 509af41cc3SWojciech Drewek struct gtp_ie { 519af41cc3SWojciech Drewek __u8 tag; 529af41cc3SWojciech Drewek __u8 val; 539af41cc3SWojciech Drewek } __packed; 549af41cc3SWojciech Drewek 559af41cc3SWojciech Drewek struct gtp0_packet { 569af41cc3SWojciech Drewek struct gtp0_header gtp0_h; 579af41cc3SWojciech Drewek struct gtp_ie ie; 589af41cc3SWojciech Drewek } __packed; 599af41cc3SWojciech Drewek 609af41cc3SWojciech Drewek struct gtp1u_packet { 619af41cc3SWojciech Drewek struct gtp1_header_long gtp1u_h; 629af41cc3SWojciech Drewek struct gtp_ie ie; 639af41cc3SWojciech Drewek } __packed; 649af41cc3SWojciech Drewek 65e3acda7aSWojciech Drewek struct gtp_pdu_session_info { /* According to 3GPP TS 38.415. */ 66e3acda7aSWojciech Drewek u8 pdu_type; 67e3acda7aSWojciech Drewek u8 qfi; 68e3acda7aSWojciech Drewek }; 69e3acda7aSWojciech Drewek netif_is_gtp(const struct net_device * dev)7081dd9849SWojciech Drewekstatic inline bool netif_is_gtp(const struct net_device *dev) 7181dd9849SWojciech Drewek { 7281dd9849SWojciech Drewek return dev->rtnl_link_ops && 7381dd9849SWojciech Drewek !strcmp(dev->rtnl_link_ops->kind, "gtp"); 7481dd9849SWojciech Drewek } 7581dd9849SWojciech Drewek 76459aa660SPablo Neira #define GTP1_F_NPDU 0x01 77459aa660SPablo Neira #define GTP1_F_SEQ 0x02 78459aa660SPablo Neira #define GTP1_F_EXTHDR 0x04 79459aa660SPablo Neira #define GTP1_F_MASK 0x07 80459aa660SPablo Neira 81459aa660SPablo Neira #endif 82