3 * Wireshark - Network traffic analyzer
4 * By Gerald Combs <gerald@wireshark.org>
5 * Copyright 1998 Gerald Combs
7 * SPDX-License-Identifier: GPL-2.0-or-later
10 #ifndef __PACKET_GTP_H
11 #define __PACKET_GTP_H
12 /*structure used to track responses to requests using sequence number*/
13 typedef struct gtp_msg_hash_entry
{
14 bool is_request
; /*true/false*/
15 uint32_t req_frame
; /*frame with request */
16 nstime_t req_time
; /*req time */
17 uint32_t rep_frame
; /*frame with reply */
18 int seq_nr
; /*sequence number*/
19 unsigned msgtype
; /*messagetype*/
23 typedef struct _gtp_hdr
{
24 uint8_t flags
; /* GTP header flags */
25 uint8_t message
; /* Message type */
26 uint32_t length
; /* Length of header */
27 int64_t teid
; /* Tunnel End-point ID */
30 /* definitions of GTP messages */
31 #define GTP_MSG_UNKNOWN 0x00
32 #define GTP_MSG_ECHO_REQ 0x01
33 #define GTP_MSG_ECHO_RESP 0x02
34 #define GTP_MSG_VER_NOT_SUPP 0x03
35 #define GTP_MSG_NODE_ALIVE_REQ 0x04
36 #define GTP_MSG_NODE_ALIVE_RESP 0x05
37 #define GTP_MSG_REDIR_REQ 0x06
38 #define GTP_MSG_REDIR_RESP 0x07
40 * 8-15 For future use. Shall not be sent. If received,
41 * shall be treated as an Unknown message.
43 #define GTP_MSG_CREATE_PDP_REQ 0x10
44 #define GTP_MSG_CREATE_PDP_RESP 0x11
45 #define GTP_MSG_UPDATE_PDP_REQ 0x12
46 #define GTP_MSG_UPDATE_PDP_RESP 0x13
47 #define GTP_MSG_DELETE_PDP_REQ 0x14
48 #define GTP_MSG_DELETE_PDP_RESP 0x15
49 #define GTP_MSG_INIT_PDP_CONTEXT_ACT_REQ 0x16 /* 2G */
50 #define GTP_MSG_INIT_PDP_CONTEXT_ACT_RESP 0x17 /* 2G */
52 * 24-25 For future use. Shall not be sent. If received,
53 * shall be treated as an Unknown message.
55 #define GTP_MSG_DELETE_AA_PDP_REQ 0x18 /* 2G */
56 #define GTP_MSG_DELETE_AA_PDP_RESP 0x19 /* 2G */
57 #define GTP_MSG_ERR_IND 0x1A
58 #define GTP_MSG_PDU_NOTIFY_REQ 0x1B
59 #define GTP_MSG_PDU_NOTIFY_RESP 0x1C
60 #define GTP_MSG_PDU_NOTIFY_REJ_REQ 0x1D
61 #define GTP_MSG_PDU_NOTIFY_REJ_RESP 0x1E
62 #define GTP_MSG_SUPP_EXT_HDR 0x1F
63 #define GTP_MSG_SEND_ROUT_INFO_REQ 0x20
64 #define GTP_MSG_SEND_ROUT_INFO_RESP 0x21
65 #define GTP_MSG_FAIL_REP_REQ 0x22
66 #define GTP_MSG_FAIL_REP_RESP 0x23
67 #define GTP_MSG_MS_PRESENT_REQ 0x24
68 #define GTP_MSG_MS_PRESENT_RESP 0x25
70 * 38-47 For future use. Shall not be sent. If received,
71 * shall be treated as an Unknown message.
73 #define GTP_MSG_IDENT_REQ 0x30
74 #define GTP_MSG_IDENT_RESP 0x31
75 #define GTP_MSG_SGSN_CNTXT_REQ 0x32
76 #define GTP_MSG_SGSN_CNTXT_RESP 0x33
77 #define GTP_MSG_SGSN_CNTXT_ACK 0x34
78 #define GTP_MSG_FORW_RELOC_REQ 0x35
79 #define GTP_MSG_FORW_RELOC_RESP 0x36
80 #define GTP_MSG_FORW_RELOC_COMP 0x37
81 #define GTP_MSG_RELOC_CANCEL_REQ 0x38
82 #define GTP_MSG_RELOC_CANCEL_RESP 0x39
83 #define GTP_MSG_FORW_SRNS_CNTXT 0x3A
84 #define GTP_MSG_FORW_RELOC_ACK 0x3B
85 #define GTP_MSG_FORW_SRNS_CNTXT_ACK 0x3C
86 #define GTP_MSG_UE_REG_QUERY_REQ 0x3D
87 #define GTP_MSG_UE_REG_QUERY_RESP 0x3E
89 * 63-69 For future use. Shall not be sent. If received,
90 * shall be treated as an Unknown message.
92 #define GTP_MSG_RAN_INFO_RELAY 70
94 * 71-95 For future use. Shall not be sent. If received,
95 * shall be treated as an Unknown message.
97 #define GTP_MBMS_NOTIFY_REQ 96
98 #define GTP_MBMS_NOTIFY_RES 97
99 #define GTP_MBMS_NOTIFY_REJ_REQ 98
100 #define GTP_MBMS_NOTIFY_REJ_RES 99
101 #define GTP_CREATE_MBMS_CNTXT_REQ 100
102 #define GTP_CREATE_MBMS_CNTXT_RES 101
103 #define GTP_UPD_MBMS_CNTXT_REQ 102
104 #define GTP_UPD_MBMS_CNTXT_RES 103
105 #define GTP_DEL_MBMS_CNTXT_REQ 104
106 #define GTP_DEL_MBMS_CNTXT_RES 105
108 * 106 - 111 For future use. Shall not be sent. If received,
109 * shall be treated as an Unknown message.
111 #define GTP_MBMS_REG_REQ 112
112 #define GTP_MBMS_REG_RES 113
113 #define GTP_MBMS_DE_REG_REQ 114
114 #define GTP_MBMS_DE_REG_RES 115
115 #define GTP_MBMS_SES_START_REQ 116
116 #define GTP_MBMS_SES_START_RES 117
117 #define GTP_MBMS_SES_STOP_REQ 118
118 #define GTP_MBMS_SES_STOP_RES 119
119 #define GTP_MBMS_SES_UPD_REQ 120
120 #define GTP_MBMS_SES_UPD_RES 121
121 /* 122-127 For future use. Shall not be sent.
122 * If received, shall be treated as an Unknown message.
124 #define GTP_MS_INFO_CNG_NOT_REQ 128
125 #define GTP_MS_INFO_CNG_NOT_RES 129
126 /* 130-239 For future use. Shall not be sent.
127 * If received, shall be treated as an Unknown message.
129 #define GTP_MSG_DATA_TRANSF_REQ 0xF0
130 #define GTP_MSG_DATA_TRANSF_RESP 0xF1
131 /* 242-253 For future use. Shall not be sent.
132 * If received, shall be treated as an Unknown message.
134 #define GTP_MSG_END_MARKER 0xFE /* 254 */
135 #define GTP_MSG_TPDU 0xFF
137 extern value_string_ext cause_type_ext
;
139 /** GTP header extension info
140 * This structure is used to transfer infotmation to users of the "gtp.hdr_ext" dissector table
143 typedef struct gtp_hdr_ext_info
{
144 proto_item
* hdr_ext_item
; /* The item created when adding the type of header to the tree,
145 * used to put the name in the tree
147 } gtp_hdr_ext_info_t
;
151 /* Data structures to keep track of sessions */
152 extern uint32_t gtp_session_count
;
153 extern bool g_gtp_session
;
155 typedef struct session_args
{
156 wmem_list_t
*teid_list
;
157 wmem_list_t
*ip_list
;
163 /* Relation between frame -> session */
164 extern wmem_map_t
* session_table
;
166 /* Relation between <teid,ip> -> frame */
167 extern wmem_map_t
* frame_map
;
169 uint32_t get_frame(address ip
, uint32_t teid
, uint32_t *frame
);
171 void remove_frame_info(uint32_t f
);
173 void add_gtp_session(uint32_t frame
, uint32_t session
);
175 bool teid_exists(uint32_t teid
, wmem_list_t
*teid_list
);
177 bool ip_exists(address ip
, wmem_list_t
*ip_list
);
179 void fill_map(wmem_list_t
*teid_list
, wmem_list_t
*ip_list
, uint32_t frame
);
181 bool is_cause_accepted(uint8_t cause
, uint32_t version
);
183 int decode_qos_umts(tvbuff_t
* tvb
, int offset
, packet_info
* pinfo
, proto_tree
* tree
, const char * qos_str
, uint8_t type
);
185 void dissect_gtp_uli(tvbuff_t
* tvb
, int offset
, packet_info
* pinfo
, proto_tree
* tree
, session_args_t
* args _U_
);
187 #endif /* __PACKET_GTP_H*/