blob: c376124742415e734140593ca3193f43d6c6d5a2 [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
jjako08d331d2003-10-13 20:33:30 +000028#if BYTE_ORDER == LITTLE_ENDIAN
jjakob7b93fc2004-01-09 11:56:48 +000029static __inline uint64_t
30hton64(uint64_t q)
jjako08d331d2003-10-13 20:33:30 +000031{
jjakob7b93fc2004-01-09 11:56:48 +000032 register uint32_t u, l;
jjako08d331d2003-10-13 20:33:30 +000033 u = q >> 32;
jjakob7b93fc2004-01-09 11:56:48 +000034 l = (uint32_t) q;
jjako08d331d2003-10-13 20:33:30 +000035
jjakob7b93fc2004-01-09 11:56:48 +000036 return htonl(u) | ((uint64_t)htonl(l) << 32);
jjako08d331d2003-10-13 20:33:30 +000037}
38
39#define ntoh64(_x) hton64(_x)
40
41#elif BYTE_ORDER == BIG_ENDIAN
42
43#define hton64(_x) (_x)
44#define ntoh64(_x) hton64(_x)
45
46#else
47#error "Please fix <machine/endian.h>"
48#endif
49
50
jjako52c24142002-12-16 13:33:51 +000051#define GTPIE_SIZE 256 /* Max number of information elements */
52#define GTPIE_MAX 0xffff /* Max length of information elements */
53#define GTPIE_MAX_TV 28 /* Max length of type value pair */
54#define GTPIE_MAX_TLV 0xffff-3 /* Max length of TLV (GTP length is 16 bit) */
55
56#define GTPIE_DEBUG 0 /* Print debug information */
57
58/* GTP Information elements from 29.060 v3.9.0 7.7 Information Elements */
59/* Also covers version 0. Note that version 0 6: QOS Profile was superceded *
60 * by 135: QOS Profile in version 1 */
61
62#define GTPIE_CAUSE 1 /* Cause 1 */
63#define GTPIE_IMSI 2 /* International Mobile Subscriber Identity 8 */
64#define GTPIE_RAI 3 /* Routing Area Identity (RAI) 8 */
65#define GTPIE_TLLI 4 /* Temporary Logical Link Identity (TLLI) 4 */
66#define GTPIE_P_TMSI 5 /* Packet TMSI (P-TMSI) 4 */
67#define GTPIE_QOS_PROFILE0 6 /* Quality of Service Profile GTP version 0 3*/
68 /* 6-7 SPARE */ /* 6 is QoS Profile vers 0 */
69#define GTPIE_REORDER 8 /* Reordering Required 1 */
70#define GTPIE_AUTH_TRIPLET 9 /* Authentication Triplet 28 */
71 /* 10 SPARE */
72#define GTPIE_MAP_CAUSE 11 /* MAP Cause 1 */
73#define GTPIE_P_TMSI_S 12 /* P-TMSI Signature 3 */
74#define GTPIE_MS_VALIDATED 13 /* MS Validated 1 */
75#define GTPIE_RECOVERY 14 /* Recovery 1 */
76#define GTPIE_SELECTION_MODE 15 /* Selection Mode 1 */
77#define GTPIE_FL_DI 16 /* Flow Label Data I 2 */
78#define GTPIE_TEI_DI 16 /* Tunnel Endpoint Identifier Data I 4 */
79#define GTPIE_TEI_C 17 /* Tunnel Endpoint Identifier Control Plane 4 */
80#define GTPIE_FL_C 17 /* Flow Label Signalling 2 */
81#define GTPIE_TEI_DII 18 /* Tunnel Endpoint Identifier Data II 5 */
82#define GTPIE_TEARDOWN 19 /* Teardown Ind 1 */
83#define GTPIE_NSAPI 20 /* NSAPI 1 */
84#define GTPIE_RANAP_CAUSE 21 /* RANAP Cause 1 */
85#define GTPIE_RAB_CONTEXT 22 /* RAB Context 7 */
86#define GTPIE_RP_SMS 23 /* Radio Priority SMS 1 */
87#define GTPIE_RP 24 /* Radio Priority 1 */
88#define GTPIE_PFI 25 /* Packet Flow Id 2 */
89#define GTPIE_CHARGING_C 26 /* Charging Characteristics 2 */
90#define GTPIE_TRACE_REF 27 /* Trace Reference 2 */
91#define GTPIE_TRACE_TYPE 28 /* Trace Type 2 */
92#define GTPIE_MS_NOT_REACH 29 /* MS Not Reachable Reason 1 */
93 /* 30-116 UNUSED */
94/* 117-126 Reserved for the GPRS charging protocol (see GTP' in GSM 12.15) */
95#define GTPIE_CHARGING_ID 127 /* Charging ID 4 */
96#define GTPIE_EUA 128 /* End User Address */
97#define GTPIE_MM_CONTEXT 129 /* MM Context */
98#define GTPIE_PDP_CONTEXT 130 /* PDP Context */
99#define GTPIE_APN 131 /* Access Point Name */
100#define GTPIE_PCO 132 /* Protocol Configuration Options */
101#define GTPIE_GSN_ADDR 133 /* GSN Address */
102#define GTPIE_MSISDN 134 /* MS International PSTN/ISDN Number */
103#define GTPIE_QOS_PROFILE 135 /* Quality of Service Profile */
104#define GTPIE_AUTH_QUINTUP 136 /* Authentication Quintuplet */
105#define GTPIE_TFT 137 /* Traffic Flow Template */
106#define GTPIE_TARGET_INF 138 /* Target Identification */
107#define GTPIE_UTRAN_TRANS 139 /* UTRAN Transparent Container */
108#define GTPIE_RAB_SETUP 140 /* RAB Setup Information */
109#define GTPIE_EXT_HEADER_T 141 /* Extension Header Type List */
110#define GTPIE_TRIGGER_ID 142 /* Trigger Id */
111#define GTPIE_OMC_ID 143 /* OMC Identity */
112/* 239-250 Reserved for the GPRS charging protocol (see GTP' in GSM 12.15) */
113#define GTPIE_CHARGING_ADDR 251 /* Charging Gateway Address */
114/* 252-254 Reserved for the GPRS charging protocol (see GTP' in GSM 12.15) */
115#define GTPIE_PRIVATE 255 /* Private Extension */
116
jjako52c24142002-12-16 13:33:51 +0000117
118/* GTP information element structs in network order */
119struct gtpie_ext { /* Extension header */
jjakob7b93fc2004-01-09 11:56:48 +0000120 uint8_t t; /* Type */
121 uint8_t l; /* Length */
122 uint8_t *p; /* Value */
jjako52c24142002-12-16 13:33:51 +0000123} __attribute__((packed));
124
125struct gtpie_tlv { /* Type length value pair */
jjakob7b93fc2004-01-09 11:56:48 +0000126 uint8_t t; /* Type */
127 uint16_t l; /* Length */
128 uint8_t v[GTPIE_MAX_TLV]; /* Value */
jjako52c24142002-12-16 13:33:51 +0000129} __attribute__((packed));
130
131struct gtpie_tv0 { /* 1 byte type value pair */
jjakob7b93fc2004-01-09 11:56:48 +0000132 uint8_t t; /* Type */
133 uint8_t v[GTPIE_MAX_TV]; /* Pointer to value */
jjako52c24142002-12-16 13:33:51 +0000134}__attribute__((packed));
135
136struct gtpie_tv1 { /* 1 byte type value pair */
jjakob7b93fc2004-01-09 11:56:48 +0000137 uint8_t t; /* Type */
138 uint8_t v; /* Value */
jjako52c24142002-12-16 13:33:51 +0000139}__attribute__((packed));
140
141struct gtpie_tv2 { /* 2 byte type value pair */
jjakob7b93fc2004-01-09 11:56:48 +0000142 uint8_t t; /* Type */
143 uint16_t v; /* Value */
jjako52c24142002-12-16 13:33:51 +0000144}__attribute__((packed));
145
146struct gtpie_tv4 { /* 4 byte type value pair */
jjakob7b93fc2004-01-09 11:56:48 +0000147 uint8_t t; /* Type */
148 uint32_t v; /* Value */
jjako52c24142002-12-16 13:33:51 +0000149}__attribute__((packed));
150
151struct gtpie_tv8 { /* 8 byte type value pair */
jjakob7b93fc2004-01-09 11:56:48 +0000152 uint8_t t; /* Type */
153 uint64_t v; /* Value */
jjako52c24142002-12-16 13:33:51 +0000154}__attribute__((packed));
155
156
157union gtpie_member {
jjakob7b93fc2004-01-09 11:56:48 +0000158 uint8_t t;
jjako52c24142002-12-16 13:33:51 +0000159 struct gtpie_ext ext;
160 struct gtpie_tlv tlv;
161 struct gtpie_tv0 tv0;
162 struct gtpie_tv1 tv1;
163 struct gtpie_tv2 tv2;
164 struct gtpie_tv4 tv4;
165 struct gtpie_tv8 tv8;
166}__attribute__((packed));
167
168/*
169cause
170imsi
171rai
172tlli
173p_tmsi
174qos_profile0
175reorder
176auth
177map_cause
178p_tmsi_s
179ms_validated
180recovery
181selection_mode
182tei_di
183tei_c
184tei_dii
185teardown
186nsapi
187ranap_cause
188rab_context
189rp_sms
190rp
191pfi
192charging_c
193trace_ref
194trace_type
195ms_not_reach
196charging_id
197eua
198mm_context
199pdp_context
200apn
201pco
202gsn_addr
203msisdn
204qos_profile
205auth
206tft
207target_inf
208utran_trans
209rab_setup
210ext_header_t
211trigger_id
212omc_id
213charging_addr
214private
215*/
216
217struct tlv1 {
jjakob7b93fc2004-01-09 11:56:48 +0000218 uint8_t type;
219 uint8_t length;
jjako52c24142002-12-16 13:33:51 +0000220}__attribute__((packed));
221
222struct tlv2 {
jjakob7b93fc2004-01-09 11:56:48 +0000223 uint8_t type;
224 uint16_t length;
jjako52c24142002-12-16 13:33:51 +0000225}__attribute__((packed));
226
227extern int gtpie_tlv(void *p, int *length, int size,
jjakob7b93fc2004-01-09 11:56:48 +0000228 uint8_t t, int l, void *v);
jjako52c24142002-12-16 13:33:51 +0000229extern int gtpie_tv0(void *p, int *length, int size,
jjakob7b93fc2004-01-09 11:56:48 +0000230 uint8_t t, int l, uint8_t *v);
231extern int gtpie_tv1(void *p, int *length, int size, uint8_t t, uint8_t v);
232extern int gtpie_tv2(void *p, int *length, int size, uint8_t t, uint16_t v);
233extern int gtpie_tv4(void *p, int *length, int size, uint8_t t, uint32_t v);
234extern int gtpie_tv8(void *p, int *length, int size, uint8_t t, uint64_t v);
jjako52c24142002-12-16 13:33:51 +0000235extern int gtpie_getie(union gtpie_member* ie[], int type, int instance);
236extern int gtpie_exist(union gtpie_member* ie[], int type, int instance);
237extern int gtpie_gettlv(union gtpie_member* ie[], int type, int instance,
238 int *length, void *dst, int size);
239extern int gtpie_gettv0(union gtpie_member* ie[], int type, int instance,
240 void *dst, int size);
241extern int gtpie_gettv1(union gtpie_member* ie[], int type, int instance,
242 uint8_t *dst);
243extern int gtpie_gettv2(union gtpie_member* ie[], int type, int instance,
244 uint16_t *dst);
245extern int gtpie_gettv4(union gtpie_member* ie[], int type, int instance,
246 uint32_t *dst);
jjako08d331d2003-10-13 20:33:30 +0000247extern int gtpie_gettv8(union gtpie_member* ie[], int type, int instance,
248 uint64_t *dst);
jjako52c24142002-12-16 13:33:51 +0000249
jjako08d331d2003-10-13 20:33:30 +0000250extern int gtpie_decaps(union gtpie_member* ie[], int version,
251 void *pack, unsigned len);
jjako52c24142002-12-16 13:33:51 +0000252extern int gtpie_encaps(union gtpie_member* ie[], void *pack, unsigned *len);
253extern int gtpie_encaps2(union gtpie_member ie[], int size,
254 void *pack, unsigned *len);
255
256
257#endif /* !_GTPIE_H */
258
259