blob: 58a36e960c9c035d6a972548825c79a9dadb2dce [file] [log] [blame]
jjako52c24142002-12-16 13:33:51 +00001/*
2 * OpenGGSN - Gateway GPRS Support Node
3 * Copyright (C) 2002 Mondru AB.
4 *
5 * The contents of this file may be used under the terms of the GNU
6 * General Public License Version 2, provided that the above copyright
7 * notice and this permission notice is included in all copies or
8 * substantial portions of the software.
9 *
10 * The initial developer of the original code is
11 * Jens Jakobsen <jj@openggsn.org>
12 *
13 * Contributor(s):
14 *
15 */
16
17#ifndef _GTPIE_H
18#define _GTPIE_H
19
20/* Macroes for conversion between host and network byte order */
21#define hton8(x) (x)
22#define ntoh8(x) (x)
23#define hton16(x) htons(x)
24#define ntoh16(x) ntohs(x)
25#define hton32(x) htonl(x)
26#define ntoh32(x) ntohl(x)
27
28#define GTPIE_SIZE 256 /* Max number of information elements */
29#define GTPIE_MAX 0xffff /* Max length of information elements */
30#define GTPIE_MAX_TV 28 /* Max length of type value pair */
31#define GTPIE_MAX_TLV 0xffff-3 /* Max length of TLV (GTP length is 16 bit) */
32
33#define GTPIE_DEBUG 0 /* Print debug information */
34
35/* GTP Information elements from 29.060 v3.9.0 7.7 Information Elements */
36/* Also covers version 0. Note that version 0 6: QOS Profile was superceded *
37 * by 135: QOS Profile in version 1 */
38
39#define GTPIE_CAUSE 1 /* Cause 1 */
40#define GTPIE_IMSI 2 /* International Mobile Subscriber Identity 8 */
41#define GTPIE_RAI 3 /* Routing Area Identity (RAI) 8 */
42#define GTPIE_TLLI 4 /* Temporary Logical Link Identity (TLLI) 4 */
43#define GTPIE_P_TMSI 5 /* Packet TMSI (P-TMSI) 4 */
44#define GTPIE_QOS_PROFILE0 6 /* Quality of Service Profile GTP version 0 3*/
45 /* 6-7 SPARE */ /* 6 is QoS Profile vers 0 */
46#define GTPIE_REORDER 8 /* Reordering Required 1 */
47#define GTPIE_AUTH_TRIPLET 9 /* Authentication Triplet 28 */
48 /* 10 SPARE */
49#define GTPIE_MAP_CAUSE 11 /* MAP Cause 1 */
50#define GTPIE_P_TMSI_S 12 /* P-TMSI Signature 3 */
51#define GTPIE_MS_VALIDATED 13 /* MS Validated 1 */
52#define GTPIE_RECOVERY 14 /* Recovery 1 */
53#define GTPIE_SELECTION_MODE 15 /* Selection Mode 1 */
54#define GTPIE_FL_DI 16 /* Flow Label Data I 2 */
55#define GTPIE_TEI_DI 16 /* Tunnel Endpoint Identifier Data I 4 */
56#define GTPIE_TEI_C 17 /* Tunnel Endpoint Identifier Control Plane 4 */
57#define GTPIE_FL_C 17 /* Flow Label Signalling 2 */
58#define GTPIE_TEI_DII 18 /* Tunnel Endpoint Identifier Data II 5 */
59#define GTPIE_TEARDOWN 19 /* Teardown Ind 1 */
60#define GTPIE_NSAPI 20 /* NSAPI 1 */
61#define GTPIE_RANAP_CAUSE 21 /* RANAP Cause 1 */
62#define GTPIE_RAB_CONTEXT 22 /* RAB Context 7 */
63#define GTPIE_RP_SMS 23 /* Radio Priority SMS 1 */
64#define GTPIE_RP 24 /* Radio Priority 1 */
65#define GTPIE_PFI 25 /* Packet Flow Id 2 */
66#define GTPIE_CHARGING_C 26 /* Charging Characteristics 2 */
67#define GTPIE_TRACE_REF 27 /* Trace Reference 2 */
68#define GTPIE_TRACE_TYPE 28 /* Trace Type 2 */
69#define GTPIE_MS_NOT_REACH 29 /* MS Not Reachable Reason 1 */
70 /* 30-116 UNUSED */
71/* 117-126 Reserved for the GPRS charging protocol (see GTP' in GSM 12.15) */
72#define GTPIE_CHARGING_ID 127 /* Charging ID 4 */
73#define GTPIE_EUA 128 /* End User Address */
74#define GTPIE_MM_CONTEXT 129 /* MM Context */
75#define GTPIE_PDP_CONTEXT 130 /* PDP Context */
76#define GTPIE_APN 131 /* Access Point Name */
77#define GTPIE_PCO 132 /* Protocol Configuration Options */
78#define GTPIE_GSN_ADDR 133 /* GSN Address */
79#define GTPIE_MSISDN 134 /* MS International PSTN/ISDN Number */
80#define GTPIE_QOS_PROFILE 135 /* Quality of Service Profile */
81#define GTPIE_AUTH_QUINTUP 136 /* Authentication Quintuplet */
82#define GTPIE_TFT 137 /* Traffic Flow Template */
83#define GTPIE_TARGET_INF 138 /* Target Identification */
84#define GTPIE_UTRAN_TRANS 139 /* UTRAN Transparent Container */
85#define GTPIE_RAB_SETUP 140 /* RAB Setup Information */
86#define GTPIE_EXT_HEADER_T 141 /* Extension Header Type List */
87#define GTPIE_TRIGGER_ID 142 /* Trigger Id */
88#define GTPIE_OMC_ID 143 /* OMC Identity */
89/* 239-250 Reserved for the GPRS charging protocol (see GTP' in GSM 12.15) */
90#define GTPIE_CHARGING_ADDR 251 /* Charging Gateway Address */
91/* 252-254 Reserved for the GPRS charging protocol (see GTP' in GSM 12.15) */
92#define GTPIE_PRIVATE 255 /* Private Extension */
93
94/* GTP information element cause codes from 29.060 v3.9.0 7.7 */
95/* */
96#define GTPCAUSE_REQ_IMSI 0 /* Request IMSI */
97#define GTPCAUSE_REQ_IMEI 1 /* Request IMEI */
98#define GTPCAUSE_REQ_IMSI_IMEI 2 /* Request IMSI and IMEI */
99#define GTPCAUSE_NO_ID_NEEDED 3 /* No identity needed */
jjakob9015be2003-01-14 14:45:51 +0000100#define GTPCAUSE_MS_REFUSES_X 4 /* MS refuses */
101#define GTPCAUSE_MS_NOT_RESP_X 5 /* MS is not GPRS responding */
jjako52c24142002-12-16 13:33:51 +0000102#define GTPCAUSE_006 6 /* For future use 6-48 */
103#define GTPCAUSE_049 49 /* Cause values reserved for GPRS charging protocol use (See GTP' in GSM 12.15) 49-63 */
104#define GTPCAUSE_064 64 /* For future use 64-127 */
105#define GTPCAUSE_ACC_REQ 128 /* Request accepted */
106#define GTPCAUSE_129 129 /* For future use 129-176 */
107#define GTPCAUSE_177 177 /* Cause values reserved for GPRS charging protocol use (See GTP' In GSM 12.15) 177-191 */
108#define GTPCAUSE_NON_EXIST 192 /* Non-existent */
109#define GTPCAUSE_INVALID_MESSAGE 193 /* Invalid message format */
110#define GTPCAUSE_IMSI_NOT_KNOWN 194 /* IMSI not known */
111#define GTPCAUSE_MS_DETACHED 195 /* MS is GPRS detached */
112#define GTPCAUSE_MS_NOT_RESP 196 /* MS is not GPRS responding */
113#define GTPCAUSE_MS_REFUSES 197 /* MS refuses */
114#define GTPCAUSE_198 198 /* For future use */
115#define GTPCAUSE_NO_RESOURCES 199 /* No resources available */
116#define GTPCAUSE_NOT_SUPPORTED 200 /* Service not supported */
117#define GTPCAUSE_MAN_IE_INCORRECT 201 /* Mandatory IE incorrect */
118#define GTPCAUSE_MAN_IE_MISSING 202 /* Mandatory IE missing */
119#define GTPCAUSE_OPT_IE_INCORRECT 203 /* Optional IE incorrect */
120#define GTPCAUSE_SYS_FAIL 204 /* System failure */
121#define GTPCAUSE_ROAMING_REST 205 /* Roaming Restriction */
122#define GTPCAUSE_PTIMSI_MISMATCH 206 /* P-TMSI signature mismatch */
123#define GTPCAUSE_CONN_SUSP 207 /* GPRS connection suspended */
124#define GTPCAUSE_AUTH_FAIL 208 /* Authentication failure */
125#define GTPCAUSE_USER_AUTH_FAIL 209 /* User authentication failed */
126#define GTPCAUSE_CONTEXT_NOT_FOUND 210 /* Context not found */
127#define GTPCAUSE_ADDR_OCCUPIED 211 /* All dynamic PDP addresses are occupied */
128#define GTPCAUSE_NO_MEMORY 212 /* No memory is available */
129#define GTPCAUSE_RELOC_FAIL 213 /* Relocation failure */
130#define GTPCAUSE_UNKNOWN_MAN_EXTHEADER 214 /* Unknown mandatory extension header */
131#define GTPCAUSE_SEM_ERR_TFT 215 /* Semantic error in the TFT operation */
132#define GTPCAUSE_SYN_ERR_TFT 216 /* Syntactic error in the TFT operation */
133#define GTPCAUSE_SEM_ERR_FILTER 217 /* Semantic errors in packet filter(s) */
134#define GTPCAUSE_SYN_ERR_FILTER 218 /* Syntactic errors in packet filter(s) */
135#define GTPCAUSE_MISSING_APN 219 /* Missing or unknown APN*/
136#define GTPCAUSE_UNKNOWN_PDP 220 /* Unknown PDP address or PDP type */
137#define GTPCAUSE_221 221 /* For Future Use 221-240 */
138#define GTPCAUSE_241 241 /* Cause Values Reserved For Gprs Charging Protocol Use (See Gtp' In Gsm 12.15) 241-255 */
139
140
141/* GTP information element structs in network order */
142struct gtpie_ext { /* Extension header */
143 u_int8_t t; /* Type */
144 u_int8_t l; /* Length */
145 u_int8_t *p; /* Value */
146} __attribute__((packed));
147
148struct gtpie_tlv { /* Type length value pair */
149 u_int8_t t; /* Type */
150 u_int16_t l; /* Length */
151 u_int8_t v[GTPIE_MAX_TLV]; /* Value */
152} __attribute__((packed));
153
154struct gtpie_tv0 { /* 1 byte type value pair */
155 u_int8_t t; /* Type */
156 u_int8_t v[GTPIE_MAX_TV]; /* Pointer to value */
157}__attribute__((packed));
158
159struct gtpie_tv1 { /* 1 byte type value pair */
160 u_int8_t t; /* Type */
161 u_int8_t v; /* Value */
162}__attribute__((packed));
163
164struct gtpie_tv2 { /* 2 byte type value pair */
165 u_int8_t t; /* Type */
166 u_int16_t v; /* Value */
167}__attribute__((packed));
168
169struct gtpie_tv4 { /* 4 byte type value pair */
170 u_int8_t t; /* Type */
171 u_int32_t v; /* Value */
172}__attribute__((packed));
173
174struct gtpie_tv8 { /* 8 byte type value pair */
175 u_int8_t t; /* Type */
176 u_int64_t v; /* Value */
177}__attribute__((packed));
178
179
180union gtpie_member {
181 u_int8_t t;
182 struct gtpie_ext ext;
183 struct gtpie_tlv tlv;
184 struct gtpie_tv0 tv0;
185 struct gtpie_tv1 tv1;
186 struct gtpie_tv2 tv2;
187 struct gtpie_tv4 tv4;
188 struct gtpie_tv8 tv8;
189}__attribute__((packed));
190
191/*
192cause
193imsi
194rai
195tlli
196p_tmsi
197qos_profile0
198reorder
199auth
200map_cause
201p_tmsi_s
202ms_validated
203recovery
204selection_mode
205tei_di
206tei_c
207tei_dii
208teardown
209nsapi
210ranap_cause
211rab_context
212rp_sms
213rp
214pfi
215charging_c
216trace_ref
217trace_type
218ms_not_reach
219charging_id
220eua
221mm_context
222pdp_context
223apn
224pco
225gsn_addr
226msisdn
227qos_profile
228auth
229tft
230target_inf
231utran_trans
232rab_setup
233ext_header_t
234trigger_id
235omc_id
236charging_addr
237private
238*/
239
240struct tlv1 {
241 u_int8_t type;
242 u_int8_t length;
243}__attribute__((packed));
244
245struct tlv2 {
246 u_int8_t type;
247 u_int16_t length;
248}__attribute__((packed));
249
250extern int gtpie_tlv(void *p, int *length, int size,
251 u_int8_t t, int l, void *v);
252extern int gtpie_tv0(void *p, int *length, int size,
253 u_int8_t t, int l, u_int8_t *v);
254extern int gtpie_tv1(void *p, int *length, int size, u_int8_t t, u_int8_t v);
255extern int gtpie_tv2(void *p, int *length, int size, u_int8_t t, u_int16_t v);
256extern int gtpie_tv4(void *p, int *length, int size, u_int8_t t, u_int32_t v);
257extern int gtpie_tv8(void *p, int *length, int size, u_int8_t t, u_int64_t v);
258extern int gtpie_getie(union gtpie_member* ie[], int type, int instance);
259extern int gtpie_exist(union gtpie_member* ie[], int type, int instance);
260extern int gtpie_gettlv(union gtpie_member* ie[], int type, int instance,
261 int *length, void *dst, int size);
262extern int gtpie_gettv0(union gtpie_member* ie[], int type, int instance,
263 void *dst, int size);
264extern int gtpie_gettv1(union gtpie_member* ie[], int type, int instance,
265 uint8_t *dst);
266extern int gtpie_gettv2(union gtpie_member* ie[], int type, int instance,
267 uint16_t *dst);
268extern int gtpie_gettv4(union gtpie_member* ie[], int type, int instance,
269 uint32_t *dst);
270
271extern int gtpie_decaps(union gtpie_member* ie[], void *pack, unsigned len);
272extern int gtpie_encaps(union gtpie_member* ie[], void *pack, unsigned *len);
273extern int gtpie_encaps2(union gtpie_member ie[], int size,
274 void *pack, unsigned *len);
275
276
277#endif /* !_GTPIE_H */
278
279