xref: /openbmc/linux/include/net/gtp.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
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 Drewek static 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