Coverage Report

Created: 2026-07-14 06:05

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/open5gs/lib/nas/eps/decoder.c
Line
Count
Source
1
/*
2
 * The MIT License
3
 *
4
 * Copyright (C) 2019-2026 by Sukchan Lee <acetcom@gmail.com>
5
 *
6
 * This file is part of Open5GS.
7
 *
8
 * Permission is hereby granted, free of charge, to any person obtaining
9
 * a copy of this software and associated documentation files (the
10
 * "Software"), to deal in the Software without restriction, including
11
 * without limitation the rights to use, copy, modify, merge, publish,
12
 * distribute, sublicense, and/or sell copies of the Software, and to
13
 * permit persons to whom the Software is furnished to do so, subject to
14
 * the following conditions:
15
 *
16
 * The above copyright notice and this permission notice shall be
17
 * included in all copies or substantial portions of the Software.
18
 *
19
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
23
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
24
 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
25
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26
 */
27
28
/*******************************************************************************
29
 * This file had been created by nas-message.py script v0.1.0
30
 * Please do not modify this file but regenerate it via script.
31
 * Created on: 2026-06-27 11:33:07.993784 by acetcom
32
 * from r19.6.0/24301-j60-ch8-ch9.docx
33
 ******************************************************************************/
34
35
#include "ogs-nas-eps.h"
36
37
int ogs_nas_eps_decode_attach_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
38
int ogs_nas_eps_decode_attach_accept(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
39
int ogs_nas_eps_decode_attach_complete(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
40
int ogs_nas_eps_decode_attach_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
41
int ogs_nas_eps_decode_detach_request_from_ue(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
42
int ogs_nas_eps_decode_detach_request_to_ue(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
43
int ogs_nas_eps_decode_tracking_area_update_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
44
int ogs_nas_eps_decode_tracking_area_update_accept(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
45
int ogs_nas_eps_decode_tracking_area_update_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
46
int ogs_nas_eps_decode_extended_service_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
47
int ogs_nas_eps_decode_service_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
48
int ogs_nas_eps_decode_service_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
49
int ogs_nas_eps_decode_guti_reallocation_command(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
50
int ogs_nas_eps_decode_authentication_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
51
int ogs_nas_eps_decode_authentication_response(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
52
int ogs_nas_eps_decode_identity_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
53
int ogs_nas_eps_decode_identity_response(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
54
int ogs_nas_eps_decode_authentication_failure(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
55
int ogs_nas_eps_decode_security_mode_command(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
56
int ogs_nas_eps_decode_security_mode_complete(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
57
int ogs_nas_eps_decode_security_mode_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
58
int ogs_nas_eps_decode_emm_status(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
59
int ogs_nas_eps_decode_emm_information(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
60
int ogs_nas_eps_decode_downlink_nas_transport(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
61
int ogs_nas_eps_decode_uplink_nas_transport(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
62
int ogs_nas_eps_decode_cs_service_notification(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
63
int ogs_nas_eps_decode_uplink_generic_nas_transport(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
64
int ogs_nas_eps_decode_downlink_generic_nas_transport(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
65
int ogs_nas_eps_decode_activate_default_eps_bearer_context_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
66
int ogs_nas_eps_decode_activate_default_eps_bearer_context_accept(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
67
int ogs_nas_eps_decode_activate_default_eps_bearer_context_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
68
int ogs_nas_eps_decode_activate_dedicated_eps_bearer_context_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
69
int ogs_nas_eps_decode_activate_dedicated_eps_bearer_context_accept(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
70
int ogs_nas_eps_decode_activate_dedicated_eps_bearer_context_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
71
int ogs_nas_eps_decode_modify_eps_bearer_context_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
72
int ogs_nas_eps_decode_modify_eps_bearer_context_accept(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
73
int ogs_nas_eps_decode_modify_eps_bearer_context_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
74
int ogs_nas_eps_decode_deactivate_eps_bearer_context_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
75
int ogs_nas_eps_decode_deactivate_eps_bearer_context_accept(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
76
int ogs_nas_eps_decode_pdn_connectivity_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
77
int ogs_nas_eps_decode_pdn_connectivity_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
78
int ogs_nas_eps_decode_pdn_disconnect_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
79
int ogs_nas_eps_decode_pdn_disconnect_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
80
int ogs_nas_eps_decode_bearer_resource_allocation_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
81
int ogs_nas_eps_decode_bearer_resource_allocation_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
82
int ogs_nas_eps_decode_bearer_resource_modification_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
83
int ogs_nas_eps_decode_bearer_resource_modification_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
84
int ogs_nas_eps_decode_esm_information_response(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
85
int ogs_nas_eps_decode_esm_status(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf);
86
int ogs_nas_eps_decode_attach_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
87
0
{
88
0
    ogs_nas_eps_attach_request_t *attach_request = &message->emm.attach_request;
89
0
    int decoded = 0;
90
0
    int size = 0;
91
92
0
    ogs_trace("[NAS] Decode ATTACH_REQUEST\n");
93
94
0
    size = ogs_nas_eps_decode_eps_attach_type(&attach_request->eps_attach_type, pkbuf);
95
0
    if (size < 0) {
96
0
        ogs_error("ogs_nas_eps_decode_eps_attach_type() failed");
97
0
        return size;
98
0
    }
99
100
0
    decoded += size;
101
102
0
    size = ogs_nas_eps_decode_eps_mobile_identity(&attach_request->eps_mobile_identity, pkbuf);
103
0
    if (size < 0) {
104
0
        ogs_error("ogs_nas_eps_decode_eps_mobile_identity() failed");
105
0
        return size;
106
0
    }
107
108
0
    decoded += size;
109
110
0
    size = ogs_nas_eps_decode_ue_network_capability(&attach_request->ue_network_capability, pkbuf);
111
0
    if (size < 0) {
112
0
        ogs_error("ogs_nas_eps_decode_ue_network_capability() failed");
113
0
        return size;
114
0
    }
115
116
0
    decoded += size;
117
118
0
    size = ogs_nas_eps_decode_esm_message_container(&attach_request->esm_message_container, pkbuf);
119
0
    if (size < 0) {
120
0
        ogs_error("ogs_nas_eps_decode_esm_message_container() failed");
121
0
        return size;
122
0
    }
123
124
0
    decoded += size;
125
126
0
    while (pkbuf->len > 0) {
127
0
        uint8_t *buffer = pkbuf->data;
128
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
129
130
0
        size = sizeof(uint8_t);
131
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
132
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
133
0
           return OGS_ERROR;
134
0
        }
135
0
        decoded += size;
136
137
0
        switch (type) {
138
0
        case OGS_NAS_EPS_ATTACH_REQUEST_OLD_P_TMSI_SIGNATURE_TYPE:
139
0
            size = ogs_nas_eps_decode_p_tmsi_signature(&attach_request->old_p_tmsi_signature, pkbuf);
140
0
            if (size < 0) {
141
0
               ogs_error("ogs_nas_eps_decode_p_tmsi_signature() failed");
142
0
               return size;
143
0
            }
144
145
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_OLD_P_TMSI_SIGNATURE_PRESENT;
146
0
            decoded += size;
147
0
            break;
148
0
        case OGS_NAS_EPS_ATTACH_REQUEST_ADDITIONAL_GUTI_TYPE:
149
0
            size = ogs_nas_eps_decode_eps_mobile_identity(&attach_request->additional_guti, pkbuf);
150
0
            if (size < 0) {
151
0
               ogs_error("ogs_nas_eps_decode_eps_mobile_identity() failed");
152
0
               return size;
153
0
            }
154
155
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_ADDITIONAL_GUTI_PRESENT;
156
0
            decoded += size;
157
0
            break;
158
0
        case OGS_NAS_EPS_ATTACH_REQUEST_LAST_VISITED_REGISTERED_TAI_TYPE:
159
0
            size = ogs_nas_eps_decode_tracking_area_identity(&attach_request->last_visited_registered_tai, pkbuf);
160
0
            if (size < 0) {
161
0
               ogs_error("ogs_nas_eps_decode_tracking_area_identity() failed");
162
0
               return size;
163
0
            }
164
165
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_LAST_VISITED_REGISTERED_TAI_PRESENT;
166
0
            decoded += size;
167
0
            break;
168
0
        case OGS_NAS_EPS_ATTACH_REQUEST_DRX_PARAMETER_TYPE:
169
0
            size = ogs_nas_eps_decode_drx_parameter(&attach_request->drx_parameter, pkbuf);
170
0
            if (size < 0) {
171
0
               ogs_error("ogs_nas_eps_decode_drx_parameter() failed");
172
0
               return size;
173
0
            }
174
175
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_DRX_PARAMETER_PRESENT;
176
0
            decoded += size;
177
0
            break;
178
0
        case OGS_NAS_EPS_ATTACH_REQUEST_MS_NETWORK_CAPABILITY_TYPE:
179
0
            size = ogs_nas_eps_decode_ms_network_capability(&attach_request->ms_network_capability, pkbuf);
180
0
            if (size < 0) {
181
0
               ogs_error("ogs_nas_eps_decode_ms_network_capability() failed");
182
0
               return size;
183
0
            }
184
185
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_MS_NETWORK_CAPABILITY_PRESENT;
186
0
            decoded += size;
187
0
            break;
188
0
        case OGS_NAS_EPS_ATTACH_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_TYPE:
189
0
            size = ogs_nas_eps_decode_location_area_identification(&attach_request->old_location_area_identification, pkbuf);
190
0
            if (size < 0) {
191
0
               ogs_error("ogs_nas_eps_decode_location_area_identification() failed");
192
0
               return size;
193
0
            }
194
195
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_PRESENT;
196
0
            decoded += size;
197
0
            break;
198
0
        case OGS_NAS_EPS_ATTACH_REQUEST_TMSI_STATUS_TYPE:
199
0
            decoded--;
200
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
201
0
            size = ogs_nas_eps_decode_tmsi_status(&attach_request->tmsi_status, pkbuf);
202
0
            if (size < 0) {
203
0
               ogs_error("ogs_nas_eps_decode_tmsi_status() failed");
204
0
               return size;
205
0
            }
206
207
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_TMSI_STATUS_PRESENT;
208
0
            decoded += size;
209
0
            break;
210
0
        case OGS_NAS_EPS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_2_TYPE:
211
0
            size = ogs_nas_eps_decode_mobile_station_classmark_2(&attach_request->mobile_station_classmark_2, pkbuf);
212
0
            if (size < 0) {
213
0
               ogs_error("ogs_nas_eps_decode_mobile_station_classmark_2() failed");
214
0
               return size;
215
0
            }
216
217
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_2_PRESENT;
218
0
            decoded += size;
219
0
            break;
220
0
        case OGS_NAS_EPS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_3_TYPE:
221
0
            size = ogs_nas_eps_decode_mobile_station_classmark_3(&attach_request->mobile_station_classmark_3, pkbuf);
222
0
            if (size < 0) {
223
0
               ogs_error("ogs_nas_eps_decode_mobile_station_classmark_3() failed");
224
0
               return size;
225
0
            }
226
227
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_3_PRESENT;
228
0
            decoded += size;
229
0
            break;
230
0
        case OGS_NAS_EPS_ATTACH_REQUEST_SUPPORTED_CODECS_TYPE:
231
0
            size = ogs_nas_eps_decode_supported_codec_list(&attach_request->supported_codecs, pkbuf);
232
0
            if (size < 0) {
233
0
               ogs_error("ogs_nas_eps_decode_supported_codec_list() failed");
234
0
               return size;
235
0
            }
236
237
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_SUPPORTED_CODECS_PRESENT;
238
0
            decoded += size;
239
0
            break;
240
0
        case OGS_NAS_EPS_ATTACH_REQUEST_ADDITIONAL_UPDATE_TYPE_TYPE:
241
0
            decoded--;
242
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
243
0
            size = ogs_nas_eps_decode_additional_update_type(&attach_request->additional_update_type, pkbuf);
244
0
            if (size < 0) {
245
0
               ogs_error("ogs_nas_eps_decode_additional_update_type() failed");
246
0
               return size;
247
0
            }
248
249
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_ADDITIONAL_UPDATE_TYPE_PRESENT;
250
0
            decoded += size;
251
0
            break;
252
0
        case OGS_NAS_EPS_ATTACH_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_TYPE:
253
0
            size = ogs_nas_eps_decode_voice_domain_preference_and_ue_usage_setting(&attach_request->voice_domain_preference_and_ue_usage_setting, pkbuf);
254
0
            if (size < 0) {
255
0
               ogs_error("ogs_nas_eps_decode_voice_domain_preference_and_ue_usage_setting() failed");
256
0
               return size;
257
0
            }
258
259
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_PRESENT;
260
0
            decoded += size;
261
0
            break;
262
0
        case OGS_NAS_EPS_ATTACH_REQUEST_DEVICE_PROPERTIES_TYPE:
263
0
            decoded--;
264
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
265
0
            size = ogs_nas_eps_decode_device_properties(&attach_request->device_properties, pkbuf);
266
0
            if (size < 0) {
267
0
               ogs_error("ogs_nas_eps_decode_device_properties() failed");
268
0
               return size;
269
0
            }
270
271
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_DEVICE_PROPERTIES_PRESENT;
272
0
            decoded += size;
273
0
            break;
274
0
        case OGS_NAS_EPS_ATTACH_REQUEST_OLD_GUTI_TYPE_TYPE:
275
0
            decoded--;
276
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
277
0
            size = ogs_nas_eps_decode_guti_type(&attach_request->old_guti_type, pkbuf);
278
0
            if (size < 0) {
279
0
               ogs_error("ogs_nas_eps_decode_guti_type() failed");
280
0
               return size;
281
0
            }
282
283
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_OLD_GUTI_TYPE_PRESENT;
284
0
            decoded += size;
285
0
            break;
286
0
        case OGS_NAS_EPS_ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_TYPE:
287
0
            decoded--;
288
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
289
0
            size = ogs_nas_eps_decode_ms_network_feature_support(&attach_request->ms_network_feature_support, pkbuf);
290
0
            if (size < 0) {
291
0
               ogs_error("ogs_nas_eps_decode_ms_network_feature_support() failed");
292
0
               return size;
293
0
            }
294
295
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_PRESENT;
296
0
            decoded += size;
297
0
            break;
298
0
        case OGS_NAS_EPS_ATTACH_REQUEST_TMSI_BASED_NRI_CONTAINER_TYPE:
299
0
            size = ogs_nas_eps_decode_network_resource_identifier_container(&attach_request->tmsi_based_nri_container, pkbuf);
300
0
            if (size < 0) {
301
0
               ogs_error("ogs_nas_eps_decode_network_resource_identifier_container() failed");
302
0
               return size;
303
0
            }
304
305
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_TMSI_BASED_NRI_CONTAINER_PRESENT;
306
0
            decoded += size;
307
0
            break;
308
0
        case OGS_NAS_EPS_ATTACH_REQUEST_T3324_VALUE_TYPE:
309
0
            size = ogs_nas_eps_decode_gprs_timer_2(&attach_request->t3324_value, pkbuf);
310
0
            if (size < 0) {
311
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_2() failed");
312
0
               return size;
313
0
            }
314
315
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_T3324_VALUE_PRESENT;
316
0
            decoded += size;
317
0
            break;
318
0
        case OGS_NAS_EPS_ATTACH_REQUEST_T3412_EXTENDED_VALUE_TYPE:
319
0
            size = ogs_nas_eps_decode_gprs_timer_3(&attach_request->t3412_extended_value, pkbuf);
320
0
            if (size < 0) {
321
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_3() failed");
322
0
               return size;
323
0
            }
324
325
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_T3412_EXTENDED_VALUE_PRESENT;
326
0
            decoded += size;
327
0
            break;
328
0
        case OGS_NAS_EPS_ATTACH_REQUEST_EXTENDED_DRX_PARAMETERS_TYPE:
329
0
            size = ogs_nas_eps_decode_extended_drx_parameters(&attach_request->extended_drx_parameters, pkbuf);
330
0
            if (size < 0) {
331
0
               ogs_error("ogs_nas_eps_decode_extended_drx_parameters() failed");
332
0
               return size;
333
0
            }
334
335
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_EXTENDED_DRX_PARAMETERS_PRESENT;
336
0
            decoded += size;
337
0
            break;
338
0
        case OGS_NAS_EPS_ATTACH_REQUEST_UE_ADDITIONAL_SECURITY_CAPABILITY_TYPE:
339
0
            size = ogs_nas_eps_decode_ue_additional_security_capability(&attach_request->ue_additional_security_capability, pkbuf);
340
0
            if (size < 0) {
341
0
               ogs_error("ogs_nas_eps_decode_ue_additional_security_capability() failed");
342
0
               return size;
343
0
            }
344
345
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_UE_ADDITIONAL_SECURITY_CAPABILITY_PRESENT;
346
0
            decoded += size;
347
0
            break;
348
0
        case OGS_NAS_EPS_ATTACH_REQUEST_UE_STATUS_TYPE:
349
0
            size = ogs_nas_eps_decode_ue_status(&attach_request->ue_status, pkbuf);
350
0
            if (size < 0) {
351
0
               ogs_error("ogs_nas_eps_decode_ue_status() failed");
352
0
               return size;
353
0
            }
354
355
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_UE_STATUS_PRESENT;
356
0
            decoded += size;
357
0
            break;
358
0
        case OGS_NAS_EPS_ATTACH_REQUEST_ADDITIONAL_INFORMATION_REQUESTED_TYPE:
359
0
            size = ogs_nas_eps_decode_additional_information_requested(&attach_request->additional_information_requested, pkbuf);
360
0
            if (size < 0) {
361
0
               ogs_error("ogs_nas_eps_decode_additional_information_requested() failed");
362
0
               return size;
363
0
            }
364
365
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_ADDITIONAL_INFORMATION_REQUESTED_PRESENT;
366
0
            decoded += size;
367
0
            break;
368
0
        case OGS_NAS_EPS_ATTACH_REQUEST_N1_UE_NETWORK_CAPABILITY_TYPE:
369
0
            size = ogs_nas_eps_decode_n1_ue_network_capability(&attach_request->n1_ue_network_capability, pkbuf);
370
0
            if (size < 0) {
371
0
               ogs_error("ogs_nas_eps_decode_n1_ue_network_capability() failed");
372
0
               return size;
373
0
            }
374
375
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_N1_UE_NETWORK_CAPABILITY_PRESENT;
376
0
            decoded += size;
377
0
            break;
378
0
        case OGS_NAS_EPS_ATTACH_REQUEST_UE_RADIO_CAPABILITY_ID_AVAILABILITY_TYPE:
379
0
            size = ogs_nas_eps_decode_ue_radio_capability_id_availability(&attach_request->ue_radio_capability_id_availability, pkbuf);
380
0
            if (size < 0) {
381
0
               ogs_error("ogs_nas_eps_decode_ue_radio_capability_id_availability() failed");
382
0
               return size;
383
0
            }
384
385
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_UE_RADIO_CAPABILITY_ID_AVAILABILITY_PRESENT;
386
0
            decoded += size;
387
0
            break;
388
0
        case OGS_NAS_EPS_ATTACH_REQUEST_REQUESTED_WUS_ASSISTANCE_INFORMATION_TYPE:
389
0
            size = ogs_nas_eps_decode_wus_assistance_information(&attach_request->requested_wus_assistance_information, pkbuf);
390
0
            if (size < 0) {
391
0
               ogs_error("ogs_nas_eps_decode_wus_assistance_information() failed");
392
0
               return size;
393
0
            }
394
395
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_REQUESTED_WUS_ASSISTANCE_INFORMATION_PRESENT;
396
0
            decoded += size;
397
0
            break;
398
0
        case OGS_NAS_EPS_ATTACH_REQUEST_DRX_PARAMETER_IN_NB_S1_MODE_TYPE:
399
0
            size = ogs_nas_eps_decode_nb_s1_drx_parameter(&attach_request->drx_parameter_in_nb_s1_mode, pkbuf);
400
0
            if (size < 0) {
401
0
               ogs_error("ogs_nas_eps_decode_nb_s1_drx_parameter() failed");
402
0
               return size;
403
0
            }
404
405
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_DRX_PARAMETER_IN_NB_S1_MODE_PRESENT;
406
0
            decoded += size;
407
0
            break;
408
0
        case OGS_NAS_EPS_ATTACH_REQUEST_REQUESTED_IMSI_OFFSET_TYPE:
409
0
            size = ogs_nas_eps_decode_imsi_offset(&attach_request->requested_imsi_offset, pkbuf);
410
0
            if (size < 0) {
411
0
               ogs_error("ogs_nas_eps_decode_imsi_offset() failed");
412
0
               return size;
413
0
            }
414
415
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_REQUESTED_IMSI_OFFSET_PRESENT;
416
0
            decoded += size;
417
0
            break;
418
0
        case OGS_NAS_EPS_ATTACH_REQUEST_UE_DETERMINED_PLMN_WITH_DISASTER_CONDITION_TYPE:
419
0
            size = ogs_nas_eps_decode_plmn_identity(&attach_request->ue_determined_plmn_with_disaster_condition, pkbuf);
420
0
            if (size < 0) {
421
0
               ogs_error("ogs_nas_eps_decode_plmn_identity() failed");
422
0
               return size;
423
0
            }
424
425
0
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_UE_DETERMINED_PLMN_WITH_DISASTER_CONDITION_PRESENT;
426
0
            decoded += size;
427
0
            break;
428
0
        default:
429
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
430
0
            break;
431
0
        }
432
0
    }
433
434
0
    return decoded;
435
0
}
436
437
int ogs_nas_eps_decode_attach_accept(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
438
0
{
439
0
    ogs_nas_eps_attach_accept_t *attach_accept = &message->emm.attach_accept;
440
0
    int decoded = 0;
441
0
    int size = 0;
442
443
0
    ogs_trace("[NAS] Decode ATTACH_ACCEPT\n");
444
445
0
    size = ogs_nas_eps_decode_eps_attach_result(&attach_accept->eps_attach_result, pkbuf);
446
0
    if (size < 0) {
447
0
        ogs_error("ogs_nas_eps_decode_eps_attach_result() failed");
448
0
        return size;
449
0
    }
450
451
0
    decoded += size;
452
453
0
    size = ogs_nas_eps_decode_gprs_timer(&attach_accept->t3412_value, pkbuf);
454
0
    if (size < 0) {
455
0
        ogs_error("ogs_nas_eps_decode_gprs_timer() failed");
456
0
        return size;
457
0
    }
458
459
0
    decoded += size;
460
461
0
    size = ogs_nas_eps_decode_tracking_area_identity_list(&attach_accept->tai_list, pkbuf);
462
0
    if (size < 0) {
463
0
        ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
464
0
        return size;
465
0
    }
466
467
0
    decoded += size;
468
469
0
    size = ogs_nas_eps_decode_esm_message_container(&attach_accept->esm_message_container, pkbuf);
470
0
    if (size < 0) {
471
0
        ogs_error("ogs_nas_eps_decode_esm_message_container() failed");
472
0
        return size;
473
0
    }
474
475
0
    decoded += size;
476
477
0
    while (pkbuf->len > 0) {
478
0
        uint8_t *buffer = pkbuf->data;
479
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
480
481
0
        size = sizeof(uint8_t);
482
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
483
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
484
0
           return OGS_ERROR;
485
0
        }
486
0
        decoded += size;
487
488
0
        switch (type) {
489
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_GUTI_TYPE:
490
0
            size = ogs_nas_eps_decode_eps_mobile_identity(&attach_accept->guti, pkbuf);
491
0
            if (size < 0) {
492
0
               ogs_error("ogs_nas_eps_decode_eps_mobile_identity() failed");
493
0
               return size;
494
0
            }
495
496
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_GUTI_PRESENT;
497
0
            decoded += size;
498
0
            break;
499
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_LOCATION_AREA_IDENTIFICATION_TYPE:
500
0
            size = ogs_nas_eps_decode_location_area_identification(&attach_accept->location_area_identification, pkbuf);
501
0
            if (size < 0) {
502
0
               ogs_error("ogs_nas_eps_decode_location_area_identification() failed");
503
0
               return size;
504
0
            }
505
506
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_LOCATION_AREA_IDENTIFICATION_PRESENT;
507
0
            decoded += size;
508
0
            break;
509
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_MS_IDENTITY_TYPE:
510
0
            size = ogs_nas_eps_decode_mobile_identity(&attach_accept->ms_identity, pkbuf);
511
0
            if (size < 0) {
512
0
               ogs_error("ogs_nas_eps_decode_mobile_identity() failed");
513
0
               return size;
514
0
            }
515
516
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_MS_IDENTITY_PRESENT;
517
0
            decoded += size;
518
0
            break;
519
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_EMM_CAUSE_TYPE:
520
0
            size = ogs_nas_eps_decode_emm_cause(&attach_accept->emm_cause, pkbuf);
521
0
            if (size < 0) {
522
0
               ogs_error("ogs_nas_eps_decode_emm_cause() failed");
523
0
               return size;
524
0
            }
525
526
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_EMM_CAUSE_PRESENT;
527
0
            decoded += size;
528
0
            break;
529
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_T3402_VALUE_TYPE:
530
0
            size = ogs_nas_eps_decode_gprs_timer(&attach_accept->t3402_value, pkbuf);
531
0
            if (size < 0) {
532
0
               ogs_error("ogs_nas_eps_decode_gprs_timer() failed");
533
0
               return size;
534
0
            }
535
536
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_T3402_VALUE_PRESENT;
537
0
            decoded += size;
538
0
            break;
539
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_T3423_VALUE_TYPE:
540
0
            size = ogs_nas_eps_decode_gprs_timer(&attach_accept->t3423_value, pkbuf);
541
0
            if (size < 0) {
542
0
               ogs_error("ogs_nas_eps_decode_gprs_timer() failed");
543
0
               return size;
544
0
            }
545
546
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_T3423_VALUE_PRESENT;
547
0
            decoded += size;
548
0
            break;
549
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_EQUIVALENT_PLMNS_TYPE:
550
0
            size = ogs_nas_eps_decode_plmn_list(&attach_accept->equivalent_plmns, pkbuf);
551
0
            if (size < 0) {
552
0
               ogs_error("ogs_nas_eps_decode_plmn_list() failed");
553
0
               return size;
554
0
            }
555
556
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_EQUIVALENT_PLMNS_PRESENT;
557
0
            decoded += size;
558
0
            break;
559
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_EMERGENCY_NUMBER_LIST_TYPE:
560
0
            size = ogs_nas_eps_decode_emergency_number_list(&attach_accept->emergency_number_list, pkbuf);
561
0
            if (size < 0) {
562
0
               ogs_error("ogs_nas_eps_decode_emergency_number_list() failed");
563
0
               return size;
564
0
            }
565
566
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_EMERGENCY_NUMBER_LIST_PRESENT;
567
0
            decoded += size;
568
0
            break;
569
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_EPS_NETWORK_FEATURE_SUPPORT_TYPE:
570
0
            size = ogs_nas_eps_decode_eps_network_feature_support(&attach_accept->eps_network_feature_support, pkbuf);
571
0
            if (size < 0) {
572
0
               ogs_error("ogs_nas_eps_decode_eps_network_feature_support() failed");
573
0
               return size;
574
0
            }
575
576
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_EPS_NETWORK_FEATURE_SUPPORT_PRESENT;
577
0
            decoded += size;
578
0
            break;
579
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_ADDITIONAL_UPDATE_RESULT_TYPE:
580
0
            decoded--;
581
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
582
0
            size = ogs_nas_eps_decode_additional_update_result(&attach_accept->additional_update_result, pkbuf);
583
0
            if (size < 0) {
584
0
               ogs_error("ogs_nas_eps_decode_additional_update_result() failed");
585
0
               return size;
586
0
            }
587
588
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_ADDITIONAL_UPDATE_RESULT_PRESENT;
589
0
            decoded += size;
590
0
            break;
591
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_T3412_EXTENDED_VALUE_TYPE:
592
0
            size = ogs_nas_eps_decode_gprs_timer_3(&attach_accept->t3412_extended_value, pkbuf);
593
0
            if (size < 0) {
594
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_3() failed");
595
0
               return size;
596
0
            }
597
598
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_T3412_EXTENDED_VALUE_PRESENT;
599
0
            decoded += size;
600
0
            break;
601
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_T3324_VALUE_TYPE:
602
0
            size = ogs_nas_eps_decode_gprs_timer_2(&attach_accept->t3324_value, pkbuf);
603
0
            if (size < 0) {
604
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_2() failed");
605
0
               return size;
606
0
            }
607
608
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_T3324_VALUE_PRESENT;
609
0
            decoded += size;
610
0
            break;
611
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_EXTENDED_DRX_PARAMETERS_TYPE:
612
0
            size = ogs_nas_eps_decode_extended_drx_parameters(&attach_accept->extended_drx_parameters, pkbuf);
613
0
            if (size < 0) {
614
0
               ogs_error("ogs_nas_eps_decode_extended_drx_parameters() failed");
615
0
               return size;
616
0
            }
617
618
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_EXTENDED_DRX_PARAMETERS_PRESENT;
619
0
            decoded += size;
620
0
            break;
621
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_DCN_ID_TYPE:
622
0
            size = ogs_nas_eps_decode_dcn_id(&attach_accept->dcn_id, pkbuf);
623
0
            if (size < 0) {
624
0
               ogs_error("ogs_nas_eps_decode_dcn_id() failed");
625
0
               return size;
626
0
            }
627
628
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_DCN_ID_PRESENT;
629
0
            decoded += size;
630
0
            break;
631
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_SMS_SERVICES_STATUS_TYPE:
632
0
            decoded--;
633
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
634
0
            size = ogs_nas_eps_decode_sms_services_status(&attach_accept->sms_services_status, pkbuf);
635
0
            if (size < 0) {
636
0
               ogs_error("ogs_nas_eps_decode_sms_services_status() failed");
637
0
               return size;
638
0
            }
639
640
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_SMS_SERVICES_STATUS_PRESENT;
641
0
            decoded += size;
642
0
            break;
643
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_NON__NW_PROVIDED_POLICIES_TYPE:
644
0
            decoded--;
645
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
646
0
            size = ogs_nas_eps_decode_non_nw_provided_policies(&attach_accept->non_nw_provided_policies, pkbuf);
647
0
            if (size < 0) {
648
0
               ogs_error("ogs_nas_eps_decode_non_nw_provided_policies() failed");
649
0
               return size;
650
0
            }
651
652
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_NON__NW_PROVIDED_POLICIES_PRESENT;
653
0
            decoded += size;
654
0
            break;
655
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_T3448_VALUE_TYPE:
656
0
            size = ogs_nas_eps_decode_gprs_timer_2(&attach_accept->t3448_value, pkbuf);
657
0
            if (size < 0) {
658
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_2() failed");
659
0
               return size;
660
0
            }
661
662
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_T3448_VALUE_PRESENT;
663
0
            decoded += size;
664
0
            break;
665
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_NETWORK_POLICY_TYPE:
666
0
            decoded--;
667
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
668
0
            size = ogs_nas_eps_decode_network_policy(&attach_accept->network_policy, pkbuf);
669
0
            if (size < 0) {
670
0
               ogs_error("ogs_nas_eps_decode_network_policy() failed");
671
0
               return size;
672
0
            }
673
674
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_NETWORK_POLICY_PRESENT;
675
0
            decoded += size;
676
0
            break;
677
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_T3447_VALUE_TYPE:
678
0
            size = ogs_nas_eps_decode_gprs_timer_3(&attach_accept->t3447_value, pkbuf);
679
0
            if (size < 0) {
680
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_3() failed");
681
0
               return size;
682
0
            }
683
684
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_T3447_VALUE_PRESENT;
685
0
            decoded += size;
686
0
            break;
687
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_EXTENDED_EMERGENCY_NUMBER_LIST_TYPE:
688
0
            size = ogs_nas_eps_decode_extended_emergency_number_list(&attach_accept->extended_emergency_number_list, pkbuf);
689
0
            if (size < 0) {
690
0
               ogs_error("ogs_nas_eps_decode_extended_emergency_number_list() failed");
691
0
               return size;
692
0
            }
693
694
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_EXTENDED_EMERGENCY_NUMBER_LIST_PRESENT;
695
0
            decoded += size;
696
0
            break;
697
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_CIPHERING_KEY_DATA_TYPE:
698
0
            size = ogs_nas_eps_decode_ciphering_key_data(&attach_accept->ciphering_key_data, pkbuf);
699
0
            if (size < 0) {
700
0
               ogs_error("ogs_nas_eps_decode_ciphering_key_data() failed");
701
0
               return size;
702
0
            }
703
704
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_CIPHERING_KEY_DATA_PRESENT;
705
0
            decoded += size;
706
0
            break;
707
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_UE_RADIO_CAPABILITY_ID_TYPE:
708
0
            size = ogs_nas_eps_decode_ue_radio_capability_id(&attach_accept->ue_radio_capability_id, pkbuf);
709
0
            if (size < 0) {
710
0
               ogs_error("ogs_nas_eps_decode_ue_radio_capability_id() failed");
711
0
               return size;
712
0
            }
713
714
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_UE_RADIO_CAPABILITY_ID_PRESENT;
715
0
            decoded += size;
716
0
            break;
717
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_TYPE:
718
0
            decoded--;
719
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
720
0
            size = ogs_nas_eps_decode_ue_radio_capability_id_deletion_indication(&attach_accept->ue_radio_capability_id_deletion_indication, pkbuf);
721
0
            if (size < 0) {
722
0
               ogs_error("ogs_nas_eps_decode_ue_radio_capability_id_deletion_indication() failed");
723
0
               return size;
724
0
            }
725
726
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_PRESENT;
727
0
            decoded += size;
728
0
            break;
729
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_NEGOTIATED_WUS_ASSISTANCE_INFORMATION_TYPE:
730
0
            size = ogs_nas_eps_decode_wus_assistance_information(&attach_accept->negotiated_wus_assistance_information, pkbuf);
731
0
            if (size < 0) {
732
0
               ogs_error("ogs_nas_eps_decode_wus_assistance_information() failed");
733
0
               return size;
734
0
            }
735
736
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_NEGOTIATED_WUS_ASSISTANCE_INFORMATION_PRESENT;
737
0
            decoded += size;
738
0
            break;
739
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_NEGOTIATED_DRX_PARAMETER_IN_NB_S1_MODE_TYPE:
740
0
            size = ogs_nas_eps_decode_nb_s1_drx_parameter(&attach_accept->negotiated_drx_parameter_in_nb_s1_mode, pkbuf);
741
0
            if (size < 0) {
742
0
               ogs_error("ogs_nas_eps_decode_nb_s1_drx_parameter() failed");
743
0
               return size;
744
0
            }
745
746
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_NEGOTIATED_DRX_PARAMETER_IN_NB_S1_MODE_PRESENT;
747
0
            decoded += size;
748
0
            break;
749
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_NEGOTIATED_IMSI_OFFSET_TYPE:
750
0
            size = ogs_nas_eps_decode_imsi_offset(&attach_accept->negotiated_imsi_offset, pkbuf);
751
0
            if (size < 0) {
752
0
               ogs_error("ogs_nas_eps_decode_imsi_offset() failed");
753
0
               return size;
754
0
            }
755
756
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_NEGOTIATED_IMSI_OFFSET_PRESENT;
757
0
            decoded += size;
758
0
            break;
759
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_TYPE:
760
0
            size = ogs_nas_eps_decode_tracking_area_identity_list(&attach_accept->forbidden_tai_for_the_list_of_forbidden_tracking_areas_for_roaming, pkbuf);
761
0
            if (size < 0) {
762
0
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
763
0
               return size;
764
0
            }
765
766
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_PRESENT;
767
0
            decoded += size;
768
0
            break;
769
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_TYPE:
770
0
            size = ogs_nas_eps_decode_tracking_area_identity_list(&attach_accept->forbidden_tai_for_the_list_of_forbidden_tracking_areas_forregional_provision_of_service, pkbuf);
771
0
            if (size < 0) {
772
0
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
773
0
               return size;
774
0
            }
775
776
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_PRESENT;
777
0
            decoded += size;
778
0
            break;
779
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_UNAVAILABILITY_CONFIGURATION_TYPE:
780
0
            size = ogs_nas_eps_decode_unavailability_configuration(&attach_accept->unavailability_configuration, pkbuf);
781
0
            if (size < 0) {
782
0
               ogs_error("ogs_nas_eps_decode_unavailability_configuration() failed");
783
0
               return size;
784
0
            }
785
786
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_UNAVAILABILITY_CONFIGURATION_PRESENT;
787
0
            decoded += size;
788
0
            break;
789
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_ACCESS_TECHNOLOGY_UTILIZATION_CONTROL_TYPE:
790
0
            size = ogs_nas_eps_decode_access_technology_utilization_control(&attach_accept->access_technology_utilization_control, pkbuf);
791
0
            if (size < 0) {
792
0
               ogs_error("ogs_nas_eps_decode_access_technology_utilization_control() failed");
793
0
               return size;
794
0
            }
795
796
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_ACCESS_TECHNOLOGY_UTILIZATION_CONTROL_PRESENT;
797
0
            decoded += size;
798
0
            break;
799
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_S_F_SATELLITE_OPERATION_PARAMETERS_TYPE:
800
0
            size = ogs_nas_eps_decode_s_f_satellite_operation_parameters(&attach_accept->s_f_satellite_operation_parameters, pkbuf);
801
0
            if (size < 0) {
802
0
               ogs_error("ogs_nas_eps_decode_s_f_satellite_operation_parameters() failed");
803
0
               return size;
804
0
            }
805
806
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_S_F_SATELLITE_OPERATION_PARAMETERS_PRESENT;
807
0
            decoded += size;
808
0
            break;
809
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_DISASTER_ROAMING_WAIT_RANGE_TYPE:
810
0
            size = ogs_nas_eps_decode_registration_wait_range(&attach_accept->disaster_roaming_wait_range, pkbuf);
811
0
            if (size < 0) {
812
0
               ogs_error("ogs_nas_eps_decode_registration_wait_range() failed");
813
0
               return size;
814
0
            }
815
816
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_DISASTER_ROAMING_WAIT_RANGE_PRESENT;
817
0
            decoded += size;
818
0
            break;
819
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_DISASTER_RETURN_WAIT_RANGE_TYPE:
820
0
            size = ogs_nas_eps_decode_registration_wait_range(&attach_accept->disaster_return_wait_range, pkbuf);
821
0
            if (size < 0) {
822
0
               ogs_error("ogs_nas_eps_decode_registration_wait_range() failed");
823
0
               return size;
824
0
            }
825
826
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_DISASTER_RETURN_WAIT_RANGE_PRESENT;
827
0
            decoded += size;
828
0
            break;
829
0
        case OGS_NAS_EPS_ATTACH_ACCEPT_LIST_OF_PLMNS_TO_BE_USED_IN_DISASTER_CONDITION_TYPE:
830
0
            size = ogs_nas_eps_decode_list_of_plmns_to_be_used_in_disaster_condition(&attach_accept->list_of_plmns_to_be_used_in_disaster_condition, pkbuf);
831
0
            if (size < 0) {
832
0
               ogs_error("ogs_nas_eps_decode_list_of_plmns_to_be_used_in_disaster_condition() failed");
833
0
               return size;
834
0
            }
835
836
0
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_LIST_OF_PLMNS_TO_BE_USED_IN_DISASTER_CONDITION_PRESENT;
837
0
            decoded += size;
838
0
            break;
839
0
        default:
840
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
841
0
            break;
842
0
        }
843
0
    }
844
845
0
    return decoded;
846
0
}
847
848
int ogs_nas_eps_decode_attach_complete(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
849
0
{
850
0
    ogs_nas_eps_attach_complete_t *attach_complete = &message->emm.attach_complete;
851
0
    int decoded = 0;
852
0
    int size = 0;
853
854
0
    ogs_trace("[NAS] Decode ATTACH_COMPLETE\n");
855
856
0
    size = ogs_nas_eps_decode_esm_message_container(&attach_complete->esm_message_container, pkbuf);
857
0
    if (size < 0) {
858
0
        ogs_error("ogs_nas_eps_decode_esm_message_container() failed");
859
0
        return size;
860
0
    }
861
862
0
    decoded += size;
863
864
0
    return decoded;
865
0
}
866
867
int ogs_nas_eps_decode_attach_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
868
0
{
869
0
    ogs_nas_eps_attach_reject_t *attach_reject = &message->emm.attach_reject;
870
0
    int decoded = 0;
871
0
    int size = 0;
872
873
0
    ogs_trace("[NAS] Decode ATTACH_REJECT\n");
874
875
0
    size = ogs_nas_eps_decode_emm_cause(&attach_reject->emm_cause, pkbuf);
876
0
    if (size < 0) {
877
0
        ogs_error("ogs_nas_eps_decode_emm_cause() failed");
878
0
        return size;
879
0
    }
880
881
0
    decoded += size;
882
883
0
    while (pkbuf->len > 0) {
884
0
        uint8_t *buffer = pkbuf->data;
885
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
886
887
0
        size = sizeof(uint8_t);
888
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
889
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
890
0
           return OGS_ERROR;
891
0
        }
892
0
        decoded += size;
893
894
0
        switch (type) {
895
0
        case OGS_NAS_EPS_ATTACH_REJECT_ESM_MESSAGE_CONTAINER_TYPE:
896
0
            size = ogs_nas_eps_decode_esm_message_container(&attach_reject->esm_message_container, pkbuf);
897
0
            if (size < 0) {
898
0
               ogs_error("ogs_nas_eps_decode_esm_message_container() failed");
899
0
               return size;
900
0
            }
901
902
0
            attach_reject->presencemask |= OGS_NAS_EPS_ATTACH_REJECT_ESM_MESSAGE_CONTAINER_PRESENT;
903
0
            decoded += size;
904
0
            break;
905
0
        case OGS_NAS_EPS_ATTACH_REJECT_T3346_VALUE_TYPE:
906
0
            size = ogs_nas_eps_decode_gprs_timer_2(&attach_reject->t3346_value, pkbuf);
907
0
            if (size < 0) {
908
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_2() failed");
909
0
               return size;
910
0
            }
911
912
0
            attach_reject->presencemask |= OGS_NAS_EPS_ATTACH_REJECT_T3346_VALUE_PRESENT;
913
0
            decoded += size;
914
0
            break;
915
0
        case OGS_NAS_EPS_ATTACH_REJECT_T3402_VALUE_TYPE:
916
0
            size = ogs_nas_eps_decode_gprs_timer_2(&attach_reject->t3402_value, pkbuf);
917
0
            if (size < 0) {
918
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_2() failed");
919
0
               return size;
920
0
            }
921
922
0
            attach_reject->presencemask |= OGS_NAS_EPS_ATTACH_REJECT_T3402_VALUE_PRESENT;
923
0
            decoded += size;
924
0
            break;
925
0
        case OGS_NAS_EPS_ATTACH_REJECT_EXTENDED_EMM_CAUSE_TYPE:
926
0
            decoded--;
927
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
928
0
            size = ogs_nas_eps_decode_extended_emm_cause(&attach_reject->extended_emm_cause, pkbuf);
929
0
            if (size < 0) {
930
0
               ogs_error("ogs_nas_eps_decode_extended_emm_cause() failed");
931
0
               return size;
932
0
            }
933
934
0
            attach_reject->presencemask |= OGS_NAS_EPS_ATTACH_REJECT_EXTENDED_EMM_CAUSE_PRESENT;
935
0
            decoded += size;
936
0
            break;
937
0
        case OGS_NAS_EPS_ATTACH_REJECT_LOWER_BOUND_TIMER_VALUE_TYPE:
938
0
            size = ogs_nas_eps_decode_gprs_timer_3(&attach_reject->lower_bound_timer_value, pkbuf);
939
0
            if (size < 0) {
940
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_3() failed");
941
0
               return size;
942
0
            }
943
944
0
            attach_reject->presencemask |= OGS_NAS_EPS_ATTACH_REJECT_LOWER_BOUND_TIMER_VALUE_PRESENT;
945
0
            decoded += size;
946
0
            break;
947
0
        case OGS_NAS_EPS_ATTACH_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_TYPE:
948
0
            size = ogs_nas_eps_decode_tracking_area_identity_list(&attach_reject->forbidden_tai_for_the_list_of_forbidden_tracking_areas_for_roaming, pkbuf);
949
0
            if (size < 0) {
950
0
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
951
0
               return size;
952
0
            }
953
954
0
            attach_reject->presencemask |= OGS_NAS_EPS_ATTACH_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_PRESENT;
955
0
            decoded += size;
956
0
            break;
957
0
        case OGS_NAS_EPS_ATTACH_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_TYPE:
958
0
            size = ogs_nas_eps_decode_tracking_area_identity_list(&attach_reject->forbidden_tai_for_the_list_of_forbidden_tracking_areas_forregional_provision_of_service, pkbuf);
959
0
            if (size < 0) {
960
0
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
961
0
               return size;
962
0
            }
963
964
0
            attach_reject->presencemask |= OGS_NAS_EPS_ATTACH_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_PRESENT;
965
0
            decoded += size;
966
0
            break;
967
0
        case OGS_NAS_EPS_ATTACH_REJECT_ACCESS_TECHNOLOGY_UTILIZATION_CONTROL_TYPE:
968
0
            size = ogs_nas_eps_decode_access_technology_utilization_control(&attach_reject->access_technology_utilization_control, pkbuf);
969
0
            if (size < 0) {
970
0
               ogs_error("ogs_nas_eps_decode_access_technology_utilization_control() failed");
971
0
               return size;
972
0
            }
973
974
0
            attach_reject->presencemask |= OGS_NAS_EPS_ATTACH_REJECT_ACCESS_TECHNOLOGY_UTILIZATION_CONTROL_PRESENT;
975
0
            decoded += size;
976
0
            break;
977
0
        case OGS_NAS_EPS_ATTACH_REJECT_S_F_SATELLITE_OPERATION_PARAMETERS_TYPE:
978
0
            size = ogs_nas_eps_decode_s_f_satellite_operation_parameters(&attach_reject->s_f_satellite_operation_parameters, pkbuf);
979
0
            if (size < 0) {
980
0
               ogs_error("ogs_nas_eps_decode_s_f_satellite_operation_parameters() failed");
981
0
               return size;
982
0
            }
983
984
0
            attach_reject->presencemask |= OGS_NAS_EPS_ATTACH_REJECT_S_F_SATELLITE_OPERATION_PARAMETERS_PRESENT;
985
0
            decoded += size;
986
0
            break;
987
0
        default:
988
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
989
0
            break;
990
0
        }
991
0
    }
992
993
0
    return decoded;
994
0
}
995
996
int ogs_nas_eps_decode_detach_request_from_ue(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
997
0
{
998
0
    ogs_nas_eps_detach_request_from_ue_t *detach_request_from_ue = &message->emm.detach_request_from_ue;
999
0
    int decoded = 0;
1000
0
    int size = 0;
1001
1002
0
    ogs_trace("[NAS] Decode DETACH_REQUEST\n");
1003
1004
0
    size = ogs_nas_eps_decode_detach_type(&detach_request_from_ue->detach_type, pkbuf);
1005
0
    if (size < 0) {
1006
0
        ogs_error("ogs_nas_eps_decode_detach_type() failed");
1007
0
        return size;
1008
0
    }
1009
1010
0
    decoded += size;
1011
1012
0
    size = ogs_nas_eps_decode_eps_mobile_identity(&detach_request_from_ue->eps_mobile_identity, pkbuf);
1013
0
    if (size < 0) {
1014
0
        ogs_error("ogs_nas_eps_decode_eps_mobile_identity() failed");
1015
0
        return size;
1016
0
    }
1017
1018
0
    decoded += size;
1019
1020
0
    return decoded;
1021
0
}
1022
1023
int ogs_nas_eps_decode_detach_request_to_ue(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
1024
0
{
1025
0
    ogs_nas_eps_detach_request_to_ue_t *detach_request_to_ue = &message->emm.detach_request_to_ue;
1026
0
    int decoded = 0;
1027
0
    int size = 0;
1028
1029
0
    ogs_trace("[NAS] Decode DETACH_REQUEST\n");
1030
1031
0
    size = ogs_nas_eps_decode_detach_type(&detach_request_to_ue->detach_type, pkbuf);
1032
0
    if (size < 0) {
1033
0
        ogs_error("ogs_nas_eps_decode_detach_type() failed");
1034
0
        return size;
1035
0
    }
1036
1037
0
    decoded += size;
1038
1039
0
    while (pkbuf->len > 0) {
1040
0
        uint8_t *buffer = pkbuf->data;
1041
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
1042
1043
0
        size = sizeof(uint8_t);
1044
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
1045
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
1046
0
           return OGS_ERROR;
1047
0
        }
1048
0
        decoded += size;
1049
1050
0
        switch (type) {
1051
0
        case OGS_NAS_EPS_DETACH_REQUEST_EMM_CAUSE_TYPE:
1052
0
            size = ogs_nas_eps_decode_emm_cause(&detach_request_to_ue->emm_cause, pkbuf);
1053
0
            if (size < 0) {
1054
0
               ogs_error("ogs_nas_eps_decode_emm_cause() failed");
1055
0
               return size;
1056
0
            }
1057
1058
0
            detach_request_to_ue->presencemask |= OGS_NAS_EPS_DETACH_REQUEST_EMM_CAUSE_PRESENT;
1059
0
            decoded += size;
1060
0
            break;
1061
0
        case OGS_NAS_EPS_DETACH_REQUEST_LOWER_BOUND_TIMER_VALUE_TYPE:
1062
0
            size = ogs_nas_eps_decode_gprs_timer_3(&detach_request_to_ue->lower_bound_timer_value, pkbuf);
1063
0
            if (size < 0) {
1064
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_3() failed");
1065
0
               return size;
1066
0
            }
1067
1068
0
            detach_request_to_ue->presencemask |= OGS_NAS_EPS_DETACH_REQUEST_LOWER_BOUND_TIMER_VALUE_PRESENT;
1069
0
            decoded += size;
1070
0
            break;
1071
0
        case OGS_NAS_EPS_DETACH_REQUEST_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_TYPE:
1072
0
            size = ogs_nas_eps_decode_tracking_area_identity_list(&detach_request_to_ue->forbidden_tai_for_the_list_of_forbidden_tracking_areas_for_roaming, pkbuf);
1073
0
            if (size < 0) {
1074
0
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
1075
0
               return size;
1076
0
            }
1077
1078
0
            detach_request_to_ue->presencemask |= OGS_NAS_EPS_DETACH_REQUEST_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_PRESENT;
1079
0
            decoded += size;
1080
0
            break;
1081
0
        case OGS_NAS_EPS_DETACH_REQUEST_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_TYPE:
1082
0
            size = ogs_nas_eps_decode_tracking_area_identity_list(&detach_request_to_ue->forbidden_tai_for_the_list_of_forbidden_tracking_areas_forregional_provision_of_service, pkbuf);
1083
0
            if (size < 0) {
1084
0
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
1085
0
               return size;
1086
0
            }
1087
1088
0
            detach_request_to_ue->presencemask |= OGS_NAS_EPS_DETACH_REQUEST_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_PRESENT;
1089
0
            decoded += size;
1090
0
            break;
1091
0
        case OGS_NAS_EPS_DETACH_REQUEST_ACCESS_TECHNOLOGY_UTILIZATION_CONTROL_TYPE:
1092
0
            size = ogs_nas_eps_decode_access_technology_utilization_control(&detach_request_to_ue->access_technology_utilization_control, pkbuf);
1093
0
            if (size < 0) {
1094
0
               ogs_error("ogs_nas_eps_decode_access_technology_utilization_control() failed");
1095
0
               return size;
1096
0
            }
1097
1098
0
            detach_request_to_ue->presencemask |= OGS_NAS_EPS_DETACH_REQUEST_ACCESS_TECHNOLOGY_UTILIZATION_CONTROL_PRESENT;
1099
0
            decoded += size;
1100
0
            break;
1101
0
        case OGS_NAS_EPS_DETACH_REQUEST_S_F_SATELLITE_OPERATION_PARAMETERS_TYPE:
1102
0
            size = ogs_nas_eps_decode_s_f_satellite_operation_parameters(&detach_request_to_ue->s_f_satellite_operation_parameters, pkbuf);
1103
0
            if (size < 0) {
1104
0
               ogs_error("ogs_nas_eps_decode_s_f_satellite_operation_parameters() failed");
1105
0
               return size;
1106
0
            }
1107
1108
0
            detach_request_to_ue->presencemask |= OGS_NAS_EPS_DETACH_REQUEST_S_F_SATELLITE_OPERATION_PARAMETERS_PRESENT;
1109
0
            decoded += size;
1110
0
            break;
1111
0
        case OGS_NAS_EPS_DETACH_REQUEST_DISASTER_RETURN_WAIT_RANGE_TYPE:
1112
0
            size = ogs_nas_eps_decode_registration_wait_range(&detach_request_to_ue->disaster_return_wait_range, pkbuf);
1113
0
            if (size < 0) {
1114
0
               ogs_error("ogs_nas_eps_decode_registration_wait_range() failed");
1115
0
               return size;
1116
0
            }
1117
1118
0
            detach_request_to_ue->presencemask |= OGS_NAS_EPS_DETACH_REQUEST_DISASTER_RETURN_WAIT_RANGE_PRESENT;
1119
0
            decoded += size;
1120
0
            break;
1121
0
        default:
1122
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
1123
0
            break;
1124
0
        }
1125
0
    }
1126
1127
0
    return decoded;
1128
0
}
1129
1130
int ogs_nas_eps_decode_tracking_area_update_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
1131
0
{
1132
0
    ogs_nas_eps_tracking_area_update_request_t *tracking_area_update_request = &message->emm.tracking_area_update_request;
1133
0
    int decoded = 0;
1134
0
    int size = 0;
1135
1136
0
    ogs_trace("[NAS] Decode TRACKING_AREA_UPDATE_REQUEST\n");
1137
1138
0
    size = ogs_nas_eps_decode_eps_update_type(&tracking_area_update_request->eps_update_type, pkbuf);
1139
0
    if (size < 0) {
1140
0
        ogs_error("ogs_nas_eps_decode_eps_update_type() failed");
1141
0
        return size;
1142
0
    }
1143
1144
0
    decoded += size;
1145
1146
0
    size = ogs_nas_eps_decode_eps_mobile_identity(&tracking_area_update_request->old_guti, pkbuf);
1147
0
    if (size < 0) {
1148
0
        ogs_error("ogs_nas_eps_decode_eps_mobile_identity() failed");
1149
0
        return size;
1150
0
    }
1151
1152
0
    decoded += size;
1153
1154
0
    while (pkbuf->len > 0) {
1155
0
        uint8_t *buffer = pkbuf->data;
1156
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
1157
1158
0
        size = sizeof(uint8_t);
1159
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
1160
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
1161
0
           return OGS_ERROR;
1162
0
        }
1163
0
        decoded += size;
1164
1165
0
        switch (type) {
1166
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_NON_CURRENT_NATIVE_NAS_KEY_SET_IDENTIFIER_TYPE:
1167
0
            decoded--;
1168
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1169
0
            size = ogs_nas_eps_decode_key_set_identifier(&tracking_area_update_request->non_current_native_nas_key_set_identifier, pkbuf);
1170
0
            if (size < 0) {
1171
0
               ogs_error("ogs_nas_eps_decode_key_set_identifier() failed");
1172
0
               return size;
1173
0
            }
1174
1175
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_NON_CURRENT_NATIVE_NAS_KEY_SET_IDENTIFIER_PRESENT;
1176
0
            decoded += size;
1177
0
            break;
1178
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_GPRS_CIPHERING_KEY_SEQUENCE_NUMBER_TYPE:
1179
0
            decoded--;
1180
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1181
0
            size = ogs_nas_eps_decode_ciphering_key_sequence_number(&tracking_area_update_request->gprs_ciphering_key_sequence_number, pkbuf);
1182
0
            if (size < 0) {
1183
0
               ogs_error("ogs_nas_eps_decode_ciphering_key_sequence_number() failed");
1184
0
               return size;
1185
0
            }
1186
1187
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_GPRS_CIPHERING_KEY_SEQUENCE_NUMBER_PRESENT;
1188
0
            decoded += size;
1189
0
            break;
1190
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_OLD_P_TMSI_SIGNATURE_TYPE:
1191
0
            size = ogs_nas_eps_decode_p_tmsi_signature(&tracking_area_update_request->old_p_tmsi_signature, pkbuf);
1192
0
            if (size < 0) {
1193
0
               ogs_error("ogs_nas_eps_decode_p_tmsi_signature() failed");
1194
0
               return size;
1195
0
            }
1196
1197
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_OLD_P_TMSI_SIGNATURE_PRESENT;
1198
0
            decoded += size;
1199
0
            break;
1200
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_GUTI_TYPE:
1201
0
            size = ogs_nas_eps_decode_eps_mobile_identity(&tracking_area_update_request->additional_guti, pkbuf);
1202
0
            if (size < 0) {
1203
0
               ogs_error("ogs_nas_eps_decode_eps_mobile_identity() failed");
1204
0
               return size;
1205
0
            }
1206
1207
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_GUTI_PRESENT;
1208
0
            decoded += size;
1209
0
            break;
1210
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_NONCEUE_TYPE:
1211
0
            size = ogs_nas_eps_decode_nonce(&tracking_area_update_request->nonceue, pkbuf);
1212
0
            if (size < 0) {
1213
0
               ogs_error("ogs_nas_eps_decode_nonce() failed");
1214
0
               return size;
1215
0
            }
1216
1217
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_NONCEUE_PRESENT;
1218
0
            decoded += size;
1219
0
            break;
1220
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_NETWORK_CAPABILITY_TYPE:
1221
0
            size = ogs_nas_eps_decode_ue_network_capability(&tracking_area_update_request->ue_network_capability, pkbuf);
1222
0
            if (size < 0) {
1223
0
               ogs_error("ogs_nas_eps_decode_ue_network_capability() failed");
1224
0
               return size;
1225
0
            }
1226
1227
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_NETWORK_CAPABILITY_PRESENT;
1228
0
            decoded += size;
1229
0
            break;
1230
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_LAST_VISITED_REGISTERED_TAI_TYPE:
1231
0
            size = ogs_nas_eps_decode_tracking_area_identity(&tracking_area_update_request->last_visited_registered_tai, pkbuf);
1232
0
            if (size < 0) {
1233
0
               ogs_error("ogs_nas_eps_decode_tracking_area_identity() failed");
1234
0
               return size;
1235
0
            }
1236
1237
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_LAST_VISITED_REGISTERED_TAI_PRESENT;
1238
0
            decoded += size;
1239
0
            break;
1240
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_DRX_PARAMETER_TYPE:
1241
0
            size = ogs_nas_eps_decode_drx_parameter(&tracking_area_update_request->drx_parameter, pkbuf);
1242
0
            if (size < 0) {
1243
0
               ogs_error("ogs_nas_eps_decode_drx_parameter() failed");
1244
0
               return size;
1245
0
            }
1246
1247
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_DRX_PARAMETER_PRESENT;
1248
0
            decoded += size;
1249
0
            break;
1250
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_RADIO_CAPABILITY_INFORMATION_UPDATE_NEEDED_TYPE:
1251
0
            decoded--;
1252
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1253
0
            size = ogs_nas_eps_decode_ue_radio_capability_information_update_needed(&tracking_area_update_request->ue_radio_capability_information_update_needed, pkbuf);
1254
0
            if (size < 0) {
1255
0
               ogs_error("ogs_nas_eps_decode_ue_radio_capability_information_update_needed() failed");
1256
0
               return size;
1257
0
            }
1258
1259
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_RADIO_CAPABILITY_INFORMATION_UPDATE_NEEDED_PRESENT;
1260
0
            decoded += size;
1261
0
            break;
1262
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_EPS_BEARER_CONTEXT_STATUS_TYPE:
1263
0
            size = ogs_nas_eps_decode_eps_bearer_context_status(&tracking_area_update_request->eps_bearer_context_status, pkbuf);
1264
0
            if (size < 0) {
1265
0
               ogs_error("ogs_nas_eps_decode_eps_bearer_context_status() failed");
1266
0
               return size;
1267
0
            }
1268
1269
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_EPS_BEARER_CONTEXT_STATUS_PRESENT;
1270
0
            decoded += size;
1271
0
            break;
1272
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_MS_NETWORK_CAPABILITY_TYPE:
1273
0
            size = ogs_nas_eps_decode_ms_network_capability(&tracking_area_update_request->ms_network_capability, pkbuf);
1274
0
            if (size < 0) {
1275
0
               ogs_error("ogs_nas_eps_decode_ms_network_capability() failed");
1276
0
               return size;
1277
0
            }
1278
1279
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_MS_NETWORK_CAPABILITY_PRESENT;
1280
0
            decoded += size;
1281
0
            break;
1282
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_TYPE:
1283
0
            size = ogs_nas_eps_decode_location_area_identification(&tracking_area_update_request->old_location_area_identification, pkbuf);
1284
0
            if (size < 0) {
1285
0
               ogs_error("ogs_nas_eps_decode_location_area_identification() failed");
1286
0
               return size;
1287
0
            }
1288
1289
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_PRESENT;
1290
0
            decoded += size;
1291
0
            break;
1292
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_TMSI_STATUS_TYPE:
1293
0
            decoded--;
1294
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1295
0
            size = ogs_nas_eps_decode_tmsi_status(&tracking_area_update_request->tmsi_status, pkbuf);
1296
0
            if (size < 0) {
1297
0
               ogs_error("ogs_nas_eps_decode_tmsi_status() failed");
1298
0
               return size;
1299
0
            }
1300
1301
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_TMSI_STATUS_PRESENT;
1302
0
            decoded += size;
1303
0
            break;
1304
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_MOBILE_STATION_CLASSMARK_2_TYPE:
1305
0
            size = ogs_nas_eps_decode_mobile_station_classmark_2(&tracking_area_update_request->mobile_station_classmark_2, pkbuf);
1306
0
            if (size < 0) {
1307
0
               ogs_error("ogs_nas_eps_decode_mobile_station_classmark_2() failed");
1308
0
               return size;
1309
0
            }
1310
1311
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_MOBILE_STATION_CLASSMARK_2_PRESENT;
1312
0
            decoded += size;
1313
0
            break;
1314
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_MOBILE_STATION_CLASSMARK_3_TYPE:
1315
0
            size = ogs_nas_eps_decode_mobile_station_classmark_3(&tracking_area_update_request->mobile_station_classmark_3, pkbuf);
1316
0
            if (size < 0) {
1317
0
               ogs_error("ogs_nas_eps_decode_mobile_station_classmark_3() failed");
1318
0
               return size;
1319
0
            }
1320
1321
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_MOBILE_STATION_CLASSMARK_3_PRESENT;
1322
0
            decoded += size;
1323
0
            break;
1324
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_SUPPORTED_CODECS_TYPE:
1325
0
            size = ogs_nas_eps_decode_supported_codec_list(&tracking_area_update_request->supported_codecs, pkbuf);
1326
0
            if (size < 0) {
1327
0
               ogs_error("ogs_nas_eps_decode_supported_codec_list() failed");
1328
0
               return size;
1329
0
            }
1330
1331
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_SUPPORTED_CODECS_PRESENT;
1332
0
            decoded += size;
1333
0
            break;
1334
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_UPDATE_TYPE_TYPE:
1335
0
            decoded--;
1336
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1337
0
            size = ogs_nas_eps_decode_additional_update_type(&tracking_area_update_request->additional_update_type, pkbuf);
1338
0
            if (size < 0) {
1339
0
               ogs_error("ogs_nas_eps_decode_additional_update_type() failed");
1340
0
               return size;
1341
0
            }
1342
1343
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_UPDATE_TYPE_PRESENT;
1344
0
            decoded += size;
1345
0
            break;
1346
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_TYPE:
1347
0
            size = ogs_nas_eps_decode_voice_domain_preference_and_ue_usage_setting(&tracking_area_update_request->voice_domain_preference_and_ue_usage_setting, pkbuf);
1348
0
            if (size < 0) {
1349
0
               ogs_error("ogs_nas_eps_decode_voice_domain_preference_and_ue_usage_setting() failed");
1350
0
               return size;
1351
0
            }
1352
1353
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_PRESENT;
1354
0
            decoded += size;
1355
0
            break;
1356
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_OLD_GUTI_TYPE_TYPE:
1357
0
            decoded--;
1358
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1359
0
            size = ogs_nas_eps_decode_guti_type(&tracking_area_update_request->old_guti_type, pkbuf);
1360
0
            if (size < 0) {
1361
0
               ogs_error("ogs_nas_eps_decode_guti_type() failed");
1362
0
               return size;
1363
0
            }
1364
1365
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_OLD_GUTI_TYPE_PRESENT;
1366
0
            decoded += size;
1367
0
            break;
1368
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_DEVICE_PROPERTIES_TYPE:
1369
0
            decoded--;
1370
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1371
0
            size = ogs_nas_eps_decode_device_properties(&tracking_area_update_request->device_properties, pkbuf);
1372
0
            if (size < 0) {
1373
0
               ogs_error("ogs_nas_eps_decode_device_properties() failed");
1374
0
               return size;
1375
0
            }
1376
1377
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_DEVICE_PROPERTIES_PRESENT;
1378
0
            decoded += size;
1379
0
            break;
1380
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_MS_NETWORK_FEATURE_SUPPORT_TYPE:
1381
0
            decoded--;
1382
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1383
0
            size = ogs_nas_eps_decode_ms_network_feature_support(&tracking_area_update_request->ms_network_feature_support, pkbuf);
1384
0
            if (size < 0) {
1385
0
               ogs_error("ogs_nas_eps_decode_ms_network_feature_support() failed");
1386
0
               return size;
1387
0
            }
1388
1389
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_MS_NETWORK_FEATURE_SUPPORT_PRESENT;
1390
0
            decoded += size;
1391
0
            break;
1392
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_TMSI_BASED_NRI_CONTAINER_TYPE:
1393
0
            size = ogs_nas_eps_decode_network_resource_identifier_container(&tracking_area_update_request->tmsi_based_nri_container, pkbuf);
1394
0
            if (size < 0) {
1395
0
               ogs_error("ogs_nas_eps_decode_network_resource_identifier_container() failed");
1396
0
               return size;
1397
0
            }
1398
1399
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_TMSI_BASED_NRI_CONTAINER_PRESENT;
1400
0
            decoded += size;
1401
0
            break;
1402
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_T3324_VALUE_TYPE:
1403
0
            size = ogs_nas_eps_decode_gprs_timer_2(&tracking_area_update_request->t3324_value, pkbuf);
1404
0
            if (size < 0) {
1405
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_2() failed");
1406
0
               return size;
1407
0
            }
1408
1409
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_T3324_VALUE_PRESENT;
1410
0
            decoded += size;
1411
0
            break;
1412
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_T3412_EXTENDED_VALUE_TYPE:
1413
0
            size = ogs_nas_eps_decode_gprs_timer_3(&tracking_area_update_request->t3412_extended_value, pkbuf);
1414
0
            if (size < 0) {
1415
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_3() failed");
1416
0
               return size;
1417
0
            }
1418
1419
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_T3412_EXTENDED_VALUE_PRESENT;
1420
0
            decoded += size;
1421
0
            break;
1422
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_EXTENDED_DRX_PARAMETERS_TYPE:
1423
0
            size = ogs_nas_eps_decode_extended_drx_parameters(&tracking_area_update_request->extended_drx_parameters, pkbuf);
1424
0
            if (size < 0) {
1425
0
               ogs_error("ogs_nas_eps_decode_extended_drx_parameters() failed");
1426
0
               return size;
1427
0
            }
1428
1429
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_EXTENDED_DRX_PARAMETERS_PRESENT;
1430
0
            decoded += size;
1431
0
            break;
1432
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_ADDITIONAL_SECURITY_CAPABILITY_TYPE:
1433
0
            size = ogs_nas_eps_decode_ue_additional_security_capability(&tracking_area_update_request->ue_additional_security_capability, pkbuf);
1434
0
            if (size < 0) {
1435
0
               ogs_error("ogs_nas_eps_decode_ue_additional_security_capability() failed");
1436
0
               return size;
1437
0
            }
1438
1439
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_ADDITIONAL_SECURITY_CAPABILITY_PRESENT;
1440
0
            decoded += size;
1441
0
            break;
1442
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_STATUS_TYPE:
1443
0
            size = ogs_nas_eps_decode_ue_status(&tracking_area_update_request->ue_status, pkbuf);
1444
0
            if (size < 0) {
1445
0
               ogs_error("ogs_nas_eps_decode_ue_status() failed");
1446
0
               return size;
1447
0
            }
1448
1449
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_STATUS_PRESENT;
1450
0
            decoded += size;
1451
0
            break;
1452
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_INFORMATION_REQUESTED_TYPE:
1453
0
            size = ogs_nas_eps_decode_additional_information_requested(&tracking_area_update_request->additional_information_requested, pkbuf);
1454
0
            if (size < 0) {
1455
0
               ogs_error("ogs_nas_eps_decode_additional_information_requested() failed");
1456
0
               return size;
1457
0
            }
1458
1459
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_INFORMATION_REQUESTED_PRESENT;
1460
0
            decoded += size;
1461
0
            break;
1462
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_N1_UE_NETWORK_CAPABILITY_TYPE:
1463
0
            size = ogs_nas_eps_decode_n1_ue_network_capability(&tracking_area_update_request->n1_ue_network_capability, pkbuf);
1464
0
            if (size < 0) {
1465
0
               ogs_error("ogs_nas_eps_decode_n1_ue_network_capability() failed");
1466
0
               return size;
1467
0
            }
1468
1469
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_N1_UE_NETWORK_CAPABILITY_PRESENT;
1470
0
            decoded += size;
1471
0
            break;
1472
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_RADIO_CAPABILITY_ID_AVAILABILITY_TYPE:
1473
0
            size = ogs_nas_eps_decode_ue_radio_capability_id_availability(&tracking_area_update_request->ue_radio_capability_id_availability, pkbuf);
1474
0
            if (size < 0) {
1475
0
               ogs_error("ogs_nas_eps_decode_ue_radio_capability_id_availability() failed");
1476
0
               return size;
1477
0
            }
1478
1479
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_RADIO_CAPABILITY_ID_AVAILABILITY_PRESENT;
1480
0
            decoded += size;
1481
0
            break;
1482
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_REQUESTED_WUS_ASSISTANCE_INFORMATION_TYPE:
1483
0
            size = ogs_nas_eps_decode_wus_assistance_information(&tracking_area_update_request->requested_wus_assistance_information, pkbuf);
1484
0
            if (size < 0) {
1485
0
               ogs_error("ogs_nas_eps_decode_wus_assistance_information() failed");
1486
0
               return size;
1487
0
            }
1488
1489
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_REQUESTED_WUS_ASSISTANCE_INFORMATION_PRESENT;
1490
0
            decoded += size;
1491
0
            break;
1492
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_DRX_PARAMETER_IN_NB_S1_MODE_TYPE:
1493
0
            size = ogs_nas_eps_decode_nb_s1_drx_parameter(&tracking_area_update_request->drx_parameter_in_nb_s1_mode, pkbuf);
1494
0
            if (size < 0) {
1495
0
               ogs_error("ogs_nas_eps_decode_nb_s1_drx_parameter() failed");
1496
0
               return size;
1497
0
            }
1498
1499
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_DRX_PARAMETER_IN_NB_S1_MODE_PRESENT;
1500
0
            decoded += size;
1501
0
            break;
1502
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_REQUESTED_IMSI_OFFSET_TYPE:
1503
0
            size = ogs_nas_eps_decode_imsi_offset(&tracking_area_update_request->requested_imsi_offset, pkbuf);
1504
0
            if (size < 0) {
1505
0
               ogs_error("ogs_nas_eps_decode_imsi_offset() failed");
1506
0
               return size;
1507
0
            }
1508
1509
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_REQUESTED_IMSI_OFFSET_PRESENT;
1510
0
            decoded += size;
1511
0
            break;
1512
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_REQUEST_TYPE_TYPE:
1513
0
            size = ogs_nas_eps_decode_ue_request_type(&tracking_area_update_request->ue_request_type, pkbuf);
1514
0
            if (size < 0) {
1515
0
               ogs_error("ogs_nas_eps_decode_ue_request_type() failed");
1516
0
               return size;
1517
0
            }
1518
1519
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_REQUEST_TYPE_PRESENT;
1520
0
            decoded += size;
1521
0
            break;
1522
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_PAGING_RESTRICTION_TYPE:
1523
0
            size = ogs_nas_eps_decode_paging_restriction(&tracking_area_update_request->paging_restriction, pkbuf);
1524
0
            if (size < 0) {
1525
0
               ogs_error("ogs_nas_eps_decode_paging_restriction() failed");
1526
0
               return size;
1527
0
            }
1528
1529
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_PAGING_RESTRICTION_PRESENT;
1530
0
            decoded += size;
1531
0
            break;
1532
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UNAVAILABILITY_INFORMATION_TYPE:
1533
0
            size = ogs_nas_eps_decode_unavailability_information(&tracking_area_update_request->unavailability_information, pkbuf);
1534
0
            if (size < 0) {
1535
0
               ogs_error("ogs_nas_eps_decode_unavailability_information() failed");
1536
0
               return size;
1537
0
            }
1538
1539
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UNAVAILABILITY_INFORMATION_PRESENT;
1540
0
            decoded += size;
1541
0
            break;
1542
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_DETERMINED_PLMN_WITH_DISASTER_CONDITION_TYPE:
1543
0
            size = ogs_nas_eps_decode_plmn_identity(&tracking_area_update_request->ue_determined_plmn_with_disaster_condition, pkbuf);
1544
0
            if (size < 0) {
1545
0
               ogs_error("ogs_nas_eps_decode_plmn_identity() failed");
1546
0
               return size;
1547
0
            }
1548
1549
0
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_DETERMINED_PLMN_WITH_DISASTER_CONDITION_PRESENT;
1550
0
            decoded += size;
1551
0
            break;
1552
0
        default:
1553
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
1554
0
            break;
1555
0
        }
1556
0
    }
1557
1558
0
    return decoded;
1559
0
}
1560
1561
int ogs_nas_eps_decode_tracking_area_update_accept(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
1562
0
{
1563
0
    ogs_nas_eps_tracking_area_update_accept_t *tracking_area_update_accept = &message->emm.tracking_area_update_accept;
1564
0
    int decoded = 0;
1565
0
    int size = 0;
1566
1567
0
    ogs_trace("[NAS] Decode TRACKING_AREA_UPDATE_ACCEPT\n");
1568
1569
0
    size = ogs_nas_eps_decode_eps_update_result(&tracking_area_update_accept->eps_update_result, pkbuf);
1570
0
    if (size < 0) {
1571
0
        ogs_error("ogs_nas_eps_decode_eps_update_result() failed");
1572
0
        return size;
1573
0
    }
1574
1575
0
    decoded += size;
1576
1577
0
    while (pkbuf->len > 0) {
1578
0
        uint8_t *buffer = pkbuf->data;
1579
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
1580
1581
0
        size = sizeof(uint8_t);
1582
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
1583
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
1584
0
           return OGS_ERROR;
1585
0
        }
1586
0
        decoded += size;
1587
1588
0
        switch (type) {
1589
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3412_VALUE_TYPE:
1590
0
            size = ogs_nas_eps_decode_gprs_timer(&tracking_area_update_accept->t3412_value, pkbuf);
1591
0
            if (size < 0) {
1592
0
               ogs_error("ogs_nas_eps_decode_gprs_timer() failed");
1593
0
               return size;
1594
0
            }
1595
1596
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3412_VALUE_PRESENT;
1597
0
            decoded += size;
1598
0
            break;
1599
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_GUTI_TYPE:
1600
0
            size = ogs_nas_eps_decode_eps_mobile_identity(&tracking_area_update_accept->guti, pkbuf);
1601
0
            if (size < 0) {
1602
0
               ogs_error("ogs_nas_eps_decode_eps_mobile_identity() failed");
1603
0
               return size;
1604
0
            }
1605
1606
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_GUTI_PRESENT;
1607
0
            decoded += size;
1608
0
            break;
1609
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_TAI_LIST_TYPE:
1610
0
            size = ogs_nas_eps_decode_tracking_area_identity_list(&tracking_area_update_accept->tai_list, pkbuf);
1611
0
            if (size < 0) {
1612
0
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
1613
0
               return size;
1614
0
            }
1615
1616
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_TAI_LIST_PRESENT;
1617
0
            decoded += size;
1618
0
            break;
1619
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EPS_BEARER_CONTEXT_STATUS_TYPE:
1620
0
            size = ogs_nas_eps_decode_eps_bearer_context_status(&tracking_area_update_accept->eps_bearer_context_status, pkbuf);
1621
0
            if (size < 0) {
1622
0
               ogs_error("ogs_nas_eps_decode_eps_bearer_context_status() failed");
1623
0
               return size;
1624
0
            }
1625
1626
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EPS_BEARER_CONTEXT_STATUS_PRESENT;
1627
0
            decoded += size;
1628
0
            break;
1629
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_LOCATION_AREA_IDENTIFICATION_TYPE:
1630
0
            size = ogs_nas_eps_decode_location_area_identification(&tracking_area_update_accept->location_area_identification, pkbuf);
1631
0
            if (size < 0) {
1632
0
               ogs_error("ogs_nas_eps_decode_location_area_identification() failed");
1633
0
               return size;
1634
0
            }
1635
1636
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_LOCATION_AREA_IDENTIFICATION_PRESENT;
1637
0
            decoded += size;
1638
0
            break;
1639
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_MS_IDENTITY_TYPE:
1640
0
            size = ogs_nas_eps_decode_mobile_identity(&tracking_area_update_accept->ms_identity, pkbuf);
1641
0
            if (size < 0) {
1642
0
               ogs_error("ogs_nas_eps_decode_mobile_identity() failed");
1643
0
               return size;
1644
0
            }
1645
1646
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_MS_IDENTITY_PRESENT;
1647
0
            decoded += size;
1648
0
            break;
1649
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EMM_CAUSE_TYPE:
1650
0
            size = ogs_nas_eps_decode_emm_cause(&tracking_area_update_accept->emm_cause, pkbuf);
1651
0
            if (size < 0) {
1652
0
               ogs_error("ogs_nas_eps_decode_emm_cause() failed");
1653
0
               return size;
1654
0
            }
1655
1656
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EMM_CAUSE_PRESENT;
1657
0
            decoded += size;
1658
0
            break;
1659
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3402_VALUE_TYPE:
1660
0
            size = ogs_nas_eps_decode_gprs_timer(&tracking_area_update_accept->t3402_value, pkbuf);
1661
0
            if (size < 0) {
1662
0
               ogs_error("ogs_nas_eps_decode_gprs_timer() failed");
1663
0
               return size;
1664
0
            }
1665
1666
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3402_VALUE_PRESENT;
1667
0
            decoded += size;
1668
0
            break;
1669
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3423_VALUE_TYPE:
1670
0
            size = ogs_nas_eps_decode_gprs_timer(&tracking_area_update_accept->t3423_value, pkbuf);
1671
0
            if (size < 0) {
1672
0
               ogs_error("ogs_nas_eps_decode_gprs_timer() failed");
1673
0
               return size;
1674
0
            }
1675
1676
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3423_VALUE_PRESENT;
1677
0
            decoded += size;
1678
0
            break;
1679
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EQUIVALENT_PLMNS_TYPE:
1680
0
            size = ogs_nas_eps_decode_plmn_list(&tracking_area_update_accept->equivalent_plmns, pkbuf);
1681
0
            if (size < 0) {
1682
0
               ogs_error("ogs_nas_eps_decode_plmn_list() failed");
1683
0
               return size;
1684
0
            }
1685
1686
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EQUIVALENT_PLMNS_PRESENT;
1687
0
            decoded += size;
1688
0
            break;
1689
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EMERGENCY_NUMBER_LIST_TYPE:
1690
0
            size = ogs_nas_eps_decode_emergency_number_list(&tracking_area_update_accept->emergency_number_list, pkbuf);
1691
0
            if (size < 0) {
1692
0
               ogs_error("ogs_nas_eps_decode_emergency_number_list() failed");
1693
0
               return size;
1694
0
            }
1695
1696
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EMERGENCY_NUMBER_LIST_PRESENT;
1697
0
            decoded += size;
1698
0
            break;
1699
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EPS_NETWORK_FEATURE_SUPPORT_TYPE:
1700
0
            size = ogs_nas_eps_decode_eps_network_feature_support(&tracking_area_update_accept->eps_network_feature_support, pkbuf);
1701
0
            if (size < 0) {
1702
0
               ogs_error("ogs_nas_eps_decode_eps_network_feature_support() failed");
1703
0
               return size;
1704
0
            }
1705
1706
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EPS_NETWORK_FEATURE_SUPPORT_PRESENT;
1707
0
            decoded += size;
1708
0
            break;
1709
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_ADDITIONAL_UPDATE_RESULT_TYPE:
1710
0
            decoded--;
1711
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1712
0
            size = ogs_nas_eps_decode_additional_update_result(&tracking_area_update_accept->additional_update_result, pkbuf);
1713
0
            if (size < 0) {
1714
0
               ogs_error("ogs_nas_eps_decode_additional_update_result() failed");
1715
0
               return size;
1716
0
            }
1717
1718
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_ADDITIONAL_UPDATE_RESULT_PRESENT;
1719
0
            decoded += size;
1720
0
            break;
1721
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3412_EXTENDED_VALUE_TYPE:
1722
0
            size = ogs_nas_eps_decode_gprs_timer_3(&tracking_area_update_accept->t3412_extended_value, pkbuf);
1723
0
            if (size < 0) {
1724
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_3() failed");
1725
0
               return size;
1726
0
            }
1727
1728
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3412_EXTENDED_VALUE_PRESENT;
1729
0
            decoded += size;
1730
0
            break;
1731
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3324_VALUE_TYPE:
1732
0
            size = ogs_nas_eps_decode_gprs_timer_2(&tracking_area_update_accept->t3324_value, pkbuf);
1733
0
            if (size < 0) {
1734
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_2() failed");
1735
0
               return size;
1736
0
            }
1737
1738
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3324_VALUE_PRESENT;
1739
0
            decoded += size;
1740
0
            break;
1741
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EXTENDED_DRX_PARAMETERS_TYPE:
1742
0
            size = ogs_nas_eps_decode_extended_drx_parameters(&tracking_area_update_accept->extended_drx_parameters, pkbuf);
1743
0
            if (size < 0) {
1744
0
               ogs_error("ogs_nas_eps_decode_extended_drx_parameters() failed");
1745
0
               return size;
1746
0
            }
1747
1748
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EXTENDED_DRX_PARAMETERS_PRESENT;
1749
0
            decoded += size;
1750
0
            break;
1751
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_HEADER_COMPRESSION_CONFIGURATION_STATUS_TYPE:
1752
0
            size = ogs_nas_eps_decode_header_compression_configuration_status(&tracking_area_update_accept->header_compression_configuration_status, pkbuf);
1753
0
            if (size < 0) {
1754
0
               ogs_error("ogs_nas_eps_decode_header_compression_configuration_status() failed");
1755
0
               return size;
1756
0
            }
1757
1758
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_HEADER_COMPRESSION_CONFIGURATION_STATUS_PRESENT;
1759
0
            decoded += size;
1760
0
            break;
1761
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_DCN_ID_TYPE:
1762
0
            size = ogs_nas_eps_decode_dcn_id(&tracking_area_update_accept->dcn_id, pkbuf);
1763
0
            if (size < 0) {
1764
0
               ogs_error("ogs_nas_eps_decode_dcn_id() failed");
1765
0
               return size;
1766
0
            }
1767
1768
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_DCN_ID_PRESENT;
1769
0
            decoded += size;
1770
0
            break;
1771
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_SMS_SERVICES_STATUS_TYPE:
1772
0
            decoded--;
1773
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1774
0
            size = ogs_nas_eps_decode_sms_services_status(&tracking_area_update_accept->sms_services_status, pkbuf);
1775
0
            if (size < 0) {
1776
0
               ogs_error("ogs_nas_eps_decode_sms_services_status() failed");
1777
0
               return size;
1778
0
            }
1779
1780
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_SMS_SERVICES_STATUS_PRESENT;
1781
0
            decoded += size;
1782
0
            break;
1783
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_NON__NW_POLICIES_TYPE:
1784
0
            decoded--;
1785
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1786
0
            size = ogs_nas_eps_decode_non_nw_provided_policies(&tracking_area_update_accept->non_nw_policies, pkbuf);
1787
0
            if (size < 0) {
1788
0
               ogs_error("ogs_nas_eps_decode_non_nw_provided_policies() failed");
1789
0
               return size;
1790
0
            }
1791
1792
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_NON__NW_POLICIES_PRESENT;
1793
0
            decoded += size;
1794
0
            break;
1795
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3448_VALUE_TYPE:
1796
0
            size = ogs_nas_eps_decode_gprs_timer_2(&tracking_area_update_accept->t3448_value, pkbuf);
1797
0
            if (size < 0) {
1798
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_2() failed");
1799
0
               return size;
1800
0
            }
1801
1802
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3448_VALUE_PRESENT;
1803
0
            decoded += size;
1804
0
            break;
1805
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_NETWORK_POLICY_TYPE:
1806
0
            decoded--;
1807
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1808
0
            size = ogs_nas_eps_decode_network_policy(&tracking_area_update_accept->network_policy, pkbuf);
1809
0
            if (size < 0) {
1810
0
               ogs_error("ogs_nas_eps_decode_network_policy() failed");
1811
0
               return size;
1812
0
            }
1813
1814
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_NETWORK_POLICY_PRESENT;
1815
0
            decoded += size;
1816
0
            break;
1817
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3447_VALUE_TYPE:
1818
0
            size = ogs_nas_eps_decode_gprs_timer_3(&tracking_area_update_accept->t3447_value, pkbuf);
1819
0
            if (size < 0) {
1820
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_3() failed");
1821
0
               return size;
1822
0
            }
1823
1824
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3447_VALUE_PRESENT;
1825
0
            decoded += size;
1826
0
            break;
1827
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EXTENDED_EMERGENCY_NUMBER_LIST_TYPE:
1828
0
            size = ogs_nas_eps_decode_extended_emergency_number_list(&tracking_area_update_accept->extended_emergency_number_list, pkbuf);
1829
0
            if (size < 0) {
1830
0
               ogs_error("ogs_nas_eps_decode_extended_emergency_number_list() failed");
1831
0
               return size;
1832
0
            }
1833
1834
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EXTENDED_EMERGENCY_NUMBER_LIST_PRESENT;
1835
0
            decoded += size;
1836
0
            break;
1837
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_CIPHERING_KEY_DATA_TYPE:
1838
0
            size = ogs_nas_eps_decode_ciphering_key_data(&tracking_area_update_accept->ciphering_key_data, pkbuf);
1839
0
            if (size < 0) {
1840
0
               ogs_error("ogs_nas_eps_decode_ciphering_key_data() failed");
1841
0
               return size;
1842
0
            }
1843
1844
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_CIPHERING_KEY_DATA_PRESENT;
1845
0
            decoded += size;
1846
0
            break;
1847
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_UE_RADIO_CAPABILITY_ID_TYPE:
1848
0
            size = ogs_nas_eps_decode_ue_radio_capability_id(&tracking_area_update_accept->ue_radio_capability_id, pkbuf);
1849
0
            if (size < 0) {
1850
0
               ogs_error("ogs_nas_eps_decode_ue_radio_capability_id() failed");
1851
0
               return size;
1852
0
            }
1853
1854
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_UE_RADIO_CAPABILITY_ID_PRESENT;
1855
0
            decoded += size;
1856
0
            break;
1857
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_TYPE:
1858
0
            decoded--;
1859
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1860
0
            size = ogs_nas_eps_decode_ue_radio_capability_id_deletion_indication(&tracking_area_update_accept->ue_radio_capability_id_deletion_indication, pkbuf);
1861
0
            if (size < 0) {
1862
0
               ogs_error("ogs_nas_eps_decode_ue_radio_capability_id_deletion_indication() failed");
1863
0
               return size;
1864
0
            }
1865
1866
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_PRESENT;
1867
0
            decoded += size;
1868
0
            break;
1869
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_NEGOTIATED_WUS_ASSISTANCE_INFORMATION_TYPE:
1870
0
            size = ogs_nas_eps_decode_wus_assistance_information(&tracking_area_update_accept->negotiated_wus_assistance_information, pkbuf);
1871
0
            if (size < 0) {
1872
0
               ogs_error("ogs_nas_eps_decode_wus_assistance_information() failed");
1873
0
               return size;
1874
0
            }
1875
1876
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_NEGOTIATED_WUS_ASSISTANCE_INFORMATION_PRESENT;
1877
0
            decoded += size;
1878
0
            break;
1879
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_NEGOTIATED_DRX_PARAMETER_IN_NB_S1_MODE_TYPE:
1880
0
            size = ogs_nas_eps_decode_nb_s1_drx_parameter(&tracking_area_update_accept->negotiated_drx_parameter_in_nb_s1_mode, pkbuf);
1881
0
            if (size < 0) {
1882
0
               ogs_error("ogs_nas_eps_decode_nb_s1_drx_parameter() failed");
1883
0
               return size;
1884
0
            }
1885
1886
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_NEGOTIATED_DRX_PARAMETER_IN_NB_S1_MODE_PRESENT;
1887
0
            decoded += size;
1888
0
            break;
1889
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_NEGOTIATED_IMSI_OFFSET_TYPE:
1890
0
            size = ogs_nas_eps_decode_imsi_offset(&tracking_area_update_accept->negotiated_imsi_offset, pkbuf);
1891
0
            if (size < 0) {
1892
0
               ogs_error("ogs_nas_eps_decode_imsi_offset() failed");
1893
0
               return size;
1894
0
            }
1895
1896
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_NEGOTIATED_IMSI_OFFSET_PRESENT;
1897
0
            decoded += size;
1898
0
            break;
1899
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EPS_ADDITIONAL_REQUEST_RESULT_TYPE:
1900
0
            size = ogs_nas_eps_decode_eps_additional_request_result(&tracking_area_update_accept->eps_additional_request_result, pkbuf);
1901
0
            if (size < 0) {
1902
0
               ogs_error("ogs_nas_eps_decode_eps_additional_request_result() failed");
1903
0
               return size;
1904
0
            }
1905
1906
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EPS_ADDITIONAL_REQUEST_RESULT_PRESENT;
1907
0
            decoded += size;
1908
0
            break;
1909
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_TYPE:
1910
0
            size = ogs_nas_eps_decode_tracking_area_identity_list(&tracking_area_update_accept->forbidden_tai_for_the_list_of_forbidden_tracking_areas_for_roaming, pkbuf);
1911
0
            if (size < 0) {
1912
0
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
1913
0
               return size;
1914
0
            }
1915
1916
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_PRESENT;
1917
0
            decoded += size;
1918
0
            break;
1919
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_TYPE:
1920
0
            size = ogs_nas_eps_decode_tracking_area_identity_list(&tracking_area_update_accept->forbidden_tai_for_the_list_of_forbidden_tracking_areas_forregional_provision_of_service, pkbuf);
1921
0
            if (size < 0) {
1922
0
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
1923
0
               return size;
1924
0
            }
1925
1926
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_PRESENT;
1927
0
            decoded += size;
1928
0
            break;
1929
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_MAXIMUM_TIME_OFFSET_TYPE:
1930
0
            size = ogs_nas_eps_decode_gprs_timer_3(&tracking_area_update_accept->maximum_time_offset, pkbuf);
1931
0
            if (size < 0) {
1932
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_3() failed");
1933
0
               return size;
1934
0
            }
1935
1936
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_MAXIMUM_TIME_OFFSET_PRESENT;
1937
0
            decoded += size;
1938
0
            break;
1939
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_UNAVAILABILITY_CONFIGURATION_TYPE:
1940
0
            size = ogs_nas_eps_decode_unavailability_configuration(&tracking_area_update_accept->unavailability_configuration, pkbuf);
1941
0
            if (size < 0) {
1942
0
               ogs_error("ogs_nas_eps_decode_unavailability_configuration() failed");
1943
0
               return size;
1944
0
            }
1945
1946
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_UNAVAILABILITY_CONFIGURATION_PRESENT;
1947
0
            decoded += size;
1948
0
            break;
1949
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_ACCESS_TECHNOLOGY_UTILIZATION_CONTROL_TYPE:
1950
0
            size = ogs_nas_eps_decode_access_technology_utilization_control(&tracking_area_update_accept->access_technology_utilization_control, pkbuf);
1951
0
            if (size < 0) {
1952
0
               ogs_error("ogs_nas_eps_decode_access_technology_utilization_control() failed");
1953
0
               return size;
1954
0
            }
1955
1956
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_ACCESS_TECHNOLOGY_UTILIZATION_CONTROL_PRESENT;
1957
0
            decoded += size;
1958
0
            break;
1959
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_S_F_SATELLITE_OPERATION_PARAMETERS_TYPE:
1960
0
            size = ogs_nas_eps_decode_s_f_satellite_operation_parameters(&tracking_area_update_accept->s_f_satellite_operation_parameters, pkbuf);
1961
0
            if (size < 0) {
1962
0
               ogs_error("ogs_nas_eps_decode_s_f_satellite_operation_parameters() failed");
1963
0
               return size;
1964
0
            }
1965
1966
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_S_F_SATELLITE_OPERATION_PARAMETERS_PRESENT;
1967
0
            decoded += size;
1968
0
            break;
1969
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_DISASTER_ROAMING_WAIT_RANGE_TYPE:
1970
0
            size = ogs_nas_eps_decode_registration_wait_range(&tracking_area_update_accept->disaster_roaming_wait_range, pkbuf);
1971
0
            if (size < 0) {
1972
0
               ogs_error("ogs_nas_eps_decode_registration_wait_range() failed");
1973
0
               return size;
1974
0
            }
1975
1976
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_DISASTER_ROAMING_WAIT_RANGE_PRESENT;
1977
0
            decoded += size;
1978
0
            break;
1979
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_DISASTER_RETURN_WAIT_RANGE_TYPE:
1980
0
            size = ogs_nas_eps_decode_registration_wait_range(&tracking_area_update_accept->disaster_return_wait_range, pkbuf);
1981
0
            if (size < 0) {
1982
0
               ogs_error("ogs_nas_eps_decode_registration_wait_range() failed");
1983
0
               return size;
1984
0
            }
1985
1986
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_DISASTER_RETURN_WAIT_RANGE_PRESENT;
1987
0
            decoded += size;
1988
0
            break;
1989
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_LIST_OF_PLMNS_TO_BE_USED_IN_DISASTER_CONDITION_TYPE:
1990
0
            size = ogs_nas_eps_decode_list_of_plmns_to_be_used_in_disaster_condition(&tracking_area_update_accept->list_of_plmns_to_be_used_in_disaster_condition, pkbuf);
1991
0
            if (size < 0) {
1992
0
               ogs_error("ogs_nas_eps_decode_list_of_plmns_to_be_used_in_disaster_condition() failed");
1993
0
               return size;
1994
0
            }
1995
1996
0
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_LIST_OF_PLMNS_TO_BE_USED_IN_DISASTER_CONDITION_PRESENT;
1997
0
            decoded += size;
1998
0
            break;
1999
0
        default:
2000
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2001
0
            break;
2002
0
        }
2003
0
    }
2004
2005
0
    return decoded;
2006
0
}
2007
2008
int ogs_nas_eps_decode_tracking_area_update_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2009
0
{
2010
0
    ogs_nas_eps_tracking_area_update_reject_t *tracking_area_update_reject = &message->emm.tracking_area_update_reject;
2011
0
    int decoded = 0;
2012
0
    int size = 0;
2013
2014
0
    ogs_trace("[NAS] Decode TRACKING_AREA_UPDATE_REJECT\n");
2015
2016
0
    size = ogs_nas_eps_decode_emm_cause(&tracking_area_update_reject->emm_cause, pkbuf);
2017
0
    if (size < 0) {
2018
0
        ogs_error("ogs_nas_eps_decode_emm_cause() failed");
2019
0
        return size;
2020
0
    }
2021
2022
0
    decoded += size;
2023
2024
0
    while (pkbuf->len > 0) {
2025
0
        uint8_t *buffer = pkbuf->data;
2026
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2027
2028
0
        size = sizeof(uint8_t);
2029
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
2030
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
2031
0
           return OGS_ERROR;
2032
0
        }
2033
0
        decoded += size;
2034
2035
0
        switch (type) {
2036
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT_T3346_VALUE_TYPE:
2037
0
            size = ogs_nas_eps_decode_gprs_timer_2(&tracking_area_update_reject->t3346_value, pkbuf);
2038
0
            if (size < 0) {
2039
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_2() failed");
2040
0
               return size;
2041
0
            }
2042
2043
0
            tracking_area_update_reject->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT_T3346_VALUE_PRESENT;
2044
0
            decoded += size;
2045
0
            break;
2046
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT_EXTENDED_EMM_CAUSE_TYPE:
2047
0
            decoded--;
2048
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
2049
0
            size = ogs_nas_eps_decode_extended_emm_cause(&tracking_area_update_reject->extended_emm_cause, pkbuf);
2050
0
            if (size < 0) {
2051
0
               ogs_error("ogs_nas_eps_decode_extended_emm_cause() failed");
2052
0
               return size;
2053
0
            }
2054
2055
0
            tracking_area_update_reject->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT_EXTENDED_EMM_CAUSE_PRESENT;
2056
0
            decoded += size;
2057
0
            break;
2058
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT_LOWER_BOUND_TIMER_VALUE_TYPE:
2059
0
            size = ogs_nas_eps_decode_gprs_timer_3(&tracking_area_update_reject->lower_bound_timer_value, pkbuf);
2060
0
            if (size < 0) {
2061
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_3() failed");
2062
0
               return size;
2063
0
            }
2064
2065
0
            tracking_area_update_reject->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT_LOWER_BOUND_TIMER_VALUE_PRESENT;
2066
0
            decoded += size;
2067
0
            break;
2068
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_TYPE:
2069
0
            size = ogs_nas_eps_decode_tracking_area_identity_list(&tracking_area_update_reject->forbidden_tai_for_the_list_of_forbidden_tracking_areas_for_roaming, pkbuf);
2070
0
            if (size < 0) {
2071
0
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
2072
0
               return size;
2073
0
            }
2074
2075
0
            tracking_area_update_reject->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_PRESENT;
2076
0
            decoded += size;
2077
0
            break;
2078
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_TYPE:
2079
0
            size = ogs_nas_eps_decode_tracking_area_identity_list(&tracking_area_update_reject->forbidden_tai_for_the_list_of_forbidden_tracking_areas_forregional_provision_of_service, pkbuf);
2080
0
            if (size < 0) {
2081
0
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
2082
0
               return size;
2083
0
            }
2084
2085
0
            tracking_area_update_reject->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_PRESENT;
2086
0
            decoded += size;
2087
0
            break;
2088
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT_ACCESS_TECHNOLOGY_UTILIZATION_CONTROL_TYPE:
2089
0
            size = ogs_nas_eps_decode_access_technology_utilization_control(&tracking_area_update_reject->access_technology_utilization_control, pkbuf);
2090
0
            if (size < 0) {
2091
0
               ogs_error("ogs_nas_eps_decode_access_technology_utilization_control() failed");
2092
0
               return size;
2093
0
            }
2094
2095
0
            tracking_area_update_reject->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT_ACCESS_TECHNOLOGY_UTILIZATION_CONTROL_PRESENT;
2096
0
            decoded += size;
2097
0
            break;
2098
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT_S_F_SATELLITE_OPERATION_PARAMETERS_TYPE:
2099
0
            size = ogs_nas_eps_decode_s_f_satellite_operation_parameters(&tracking_area_update_reject->s_f_satellite_operation_parameters, pkbuf);
2100
0
            if (size < 0) {
2101
0
               ogs_error("ogs_nas_eps_decode_s_f_satellite_operation_parameters() failed");
2102
0
               return size;
2103
0
            }
2104
2105
0
            tracking_area_update_reject->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT_S_F_SATELLITE_OPERATION_PARAMETERS_PRESENT;
2106
0
            decoded += size;
2107
0
            break;
2108
0
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT_DISASTER_RETURN_WAIT_RANGE_TYPE:
2109
0
            size = ogs_nas_eps_decode_registration_wait_range(&tracking_area_update_reject->disaster_return_wait_range, pkbuf);
2110
0
            if (size < 0) {
2111
0
               ogs_error("ogs_nas_eps_decode_registration_wait_range() failed");
2112
0
               return size;
2113
0
            }
2114
2115
0
            tracking_area_update_reject->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT_DISASTER_RETURN_WAIT_RANGE_PRESENT;
2116
0
            decoded += size;
2117
0
            break;
2118
0
        default:
2119
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2120
0
            break;
2121
0
        }
2122
0
    }
2123
2124
0
    return decoded;
2125
0
}
2126
2127
int ogs_nas_eps_decode_extended_service_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2128
0
{
2129
0
    ogs_nas_eps_extended_service_request_t *extended_service_request = &message->emm.extended_service_request;
2130
0
    int decoded = 0;
2131
0
    int size = 0;
2132
2133
0
    ogs_trace("[NAS] Decode EXTENDED_SERVICE_REQUEST\n");
2134
2135
0
    size = ogs_nas_eps_decode_service_type(&extended_service_request->service_type, pkbuf);
2136
0
    if (size < 0) {
2137
0
        ogs_error("ogs_nas_eps_decode_service_type() failed");
2138
0
        return size;
2139
0
    }
2140
2141
0
    decoded += size;
2142
2143
0
    size = ogs_nas_eps_decode_mobile_identity(&extended_service_request->m_tmsi, pkbuf);
2144
0
    if (size < 0) {
2145
0
        ogs_error("ogs_nas_eps_decode_mobile_identity() failed");
2146
0
        return size;
2147
0
    }
2148
2149
0
    decoded += size;
2150
2151
0
    while (pkbuf->len > 0) {
2152
0
        uint8_t *buffer = pkbuf->data;
2153
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2154
2155
0
        size = sizeof(uint8_t);
2156
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
2157
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
2158
0
           return OGS_ERROR;
2159
0
        }
2160
0
        decoded += size;
2161
2162
0
        switch (type) {
2163
0
        case OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST_CSFB_RESPONSE_TYPE:
2164
0
            decoded--;
2165
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
2166
0
            size = ogs_nas_eps_decode_csfb_response(&extended_service_request->csfb_response, pkbuf);
2167
0
            if (size < 0) {
2168
0
               ogs_error("ogs_nas_eps_decode_csfb_response() failed");
2169
0
               return size;
2170
0
            }
2171
2172
0
            extended_service_request->presencemask |= OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST_CSFB_RESPONSE_PRESENT;
2173
0
            decoded += size;
2174
0
            break;
2175
0
        case OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST_EPS_BEARER_CONTEXT_STATUS_TYPE:
2176
0
            size = ogs_nas_eps_decode_eps_bearer_context_status(&extended_service_request->eps_bearer_context_status, pkbuf);
2177
0
            if (size < 0) {
2178
0
               ogs_error("ogs_nas_eps_decode_eps_bearer_context_status() failed");
2179
0
               return size;
2180
0
            }
2181
2182
0
            extended_service_request->presencemask |= OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST_EPS_BEARER_CONTEXT_STATUS_PRESENT;
2183
0
            decoded += size;
2184
0
            break;
2185
0
        case OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST_DEVICE_PROPERTIES_TYPE:
2186
0
            decoded--;
2187
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
2188
0
            size = ogs_nas_eps_decode_device_properties(&extended_service_request->device_properties, pkbuf);
2189
0
            if (size < 0) {
2190
0
               ogs_error("ogs_nas_eps_decode_device_properties() failed");
2191
0
               return size;
2192
0
            }
2193
2194
0
            extended_service_request->presencemask |= OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST_DEVICE_PROPERTIES_PRESENT;
2195
0
            decoded += size;
2196
0
            break;
2197
0
        case OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST_UE_REQUEST_TYPE_TYPE:
2198
0
            size = ogs_nas_eps_decode_ue_request_type(&extended_service_request->ue_request_type, pkbuf);
2199
0
            if (size < 0) {
2200
0
               ogs_error("ogs_nas_eps_decode_ue_request_type() failed");
2201
0
               return size;
2202
0
            }
2203
2204
0
            extended_service_request->presencemask |= OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST_UE_REQUEST_TYPE_PRESENT;
2205
0
            decoded += size;
2206
0
            break;
2207
0
        case OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST_PAGING_RESTRICTION_TYPE:
2208
0
            size = ogs_nas_eps_decode_paging_restriction(&extended_service_request->paging_restriction, pkbuf);
2209
0
            if (size < 0) {
2210
0
               ogs_error("ogs_nas_eps_decode_paging_restriction() failed");
2211
0
               return size;
2212
0
            }
2213
2214
0
            extended_service_request->presencemask |= OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST_PAGING_RESTRICTION_PRESENT;
2215
0
            decoded += size;
2216
0
            break;
2217
0
        default:
2218
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2219
0
            break;
2220
0
        }
2221
0
    }
2222
2223
0
    return decoded;
2224
0
}
2225
2226
int ogs_nas_eps_decode_service_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2227
0
{
2228
0
    ogs_nas_eps_service_request_t *service_request = &message->emm.service_request;
2229
0
    int decoded = 0;
2230
0
    int size = 0;
2231
2232
0
    ogs_trace("[NAS] Decode SERVICE_REQUEST\n");
2233
2234
0
    size = ogs_nas_eps_decode_ksi_and_sequence_number(&service_request->ksi_and_sequence_number, pkbuf);
2235
0
    if (size < 0) {
2236
0
        ogs_error("ogs_nas_eps_decode_ksi_and_sequence_number() failed");
2237
0
        return size;
2238
0
    }
2239
2240
0
    decoded += size;
2241
2242
0
    size = ogs_nas_eps_decode_short_mac(&service_request->message_authentication_code, pkbuf);
2243
0
    if (size < 0) {
2244
0
        ogs_error("ogs_nas_eps_decode_short_mac() failed");
2245
0
        return size;
2246
0
    }
2247
2248
0
    decoded += size;
2249
2250
0
    return decoded;
2251
0
}
2252
2253
int ogs_nas_eps_decode_service_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2254
0
{
2255
0
    ogs_nas_eps_service_reject_t *service_reject = &message->emm.service_reject;
2256
0
    int decoded = 0;
2257
0
    int size = 0;
2258
2259
0
    ogs_trace("[NAS] Decode SERVICE_REJECT\n");
2260
2261
0
    size = ogs_nas_eps_decode_emm_cause(&service_reject->emm_cause, pkbuf);
2262
0
    if (size < 0) {
2263
0
        ogs_error("ogs_nas_eps_decode_emm_cause() failed");
2264
0
        return size;
2265
0
    }
2266
2267
0
    decoded += size;
2268
2269
0
    while (pkbuf->len > 0) {
2270
0
        uint8_t *buffer = pkbuf->data;
2271
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2272
2273
0
        size = sizeof(uint8_t);
2274
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
2275
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
2276
0
           return OGS_ERROR;
2277
0
        }
2278
0
        decoded += size;
2279
2280
0
        switch (type) {
2281
0
        case OGS_NAS_EPS_SERVICE_REJECT_T3442_VALUE_TYPE:
2282
0
            size = ogs_nas_eps_decode_gprs_timer(&service_reject->t3442_value, pkbuf);
2283
0
            if (size < 0) {
2284
0
               ogs_error("ogs_nas_eps_decode_gprs_timer() failed");
2285
0
               return size;
2286
0
            }
2287
2288
0
            service_reject->presencemask |= OGS_NAS_EPS_SERVICE_REJECT_T3442_VALUE_PRESENT;
2289
0
            decoded += size;
2290
0
            break;
2291
0
        case OGS_NAS_EPS_SERVICE_REJECT_T3346_VALUE_TYPE:
2292
0
            size = ogs_nas_eps_decode_gprs_timer_2(&service_reject->t3346_value, pkbuf);
2293
0
            if (size < 0) {
2294
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_2() failed");
2295
0
               return size;
2296
0
            }
2297
2298
0
            service_reject->presencemask |= OGS_NAS_EPS_SERVICE_REJECT_T3346_VALUE_PRESENT;
2299
0
            decoded += size;
2300
0
            break;
2301
0
        case OGS_NAS_EPS_SERVICE_REJECT_T3448_VALUE_TYPE:
2302
0
            size = ogs_nas_eps_decode_gprs_timer_2(&service_reject->t3448_value, pkbuf);
2303
0
            if (size < 0) {
2304
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_2() failed");
2305
0
               return size;
2306
0
            }
2307
2308
0
            service_reject->presencemask |= OGS_NAS_EPS_SERVICE_REJECT_T3448_VALUE_PRESENT;
2309
0
            decoded += size;
2310
0
            break;
2311
0
        case OGS_NAS_EPS_SERVICE_REJECT_LOWER_BOUND_TIMER_VALUE_TYPE:
2312
0
            size = ogs_nas_eps_decode_gprs_timer_3(&service_reject->lower_bound_timer_value, pkbuf);
2313
0
            if (size < 0) {
2314
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_3() failed");
2315
0
               return size;
2316
0
            }
2317
2318
0
            service_reject->presencemask |= OGS_NAS_EPS_SERVICE_REJECT_LOWER_BOUND_TIMER_VALUE_PRESENT;
2319
0
            decoded += size;
2320
0
            break;
2321
0
        case OGS_NAS_EPS_SERVICE_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_TYPE:
2322
0
            size = ogs_nas_eps_decode_tracking_area_identity_list(&service_reject->forbidden_tai_for_the_list_of_forbidden_tracking_areas_for_roaming, pkbuf);
2323
0
            if (size < 0) {
2324
0
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
2325
0
               return size;
2326
0
            }
2327
2328
0
            service_reject->presencemask |= OGS_NAS_EPS_SERVICE_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_PRESENT;
2329
0
            decoded += size;
2330
0
            break;
2331
0
        case OGS_NAS_EPS_SERVICE_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_TYPE:
2332
0
            size = ogs_nas_eps_decode_tracking_area_identity_list(&service_reject->forbidden_tai_for_the_list_of_forbidden_tracking_areas_forregional_provision_of_service, pkbuf);
2333
0
            if (size < 0) {
2334
0
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
2335
0
               return size;
2336
0
            }
2337
2338
0
            service_reject->presencemask |= OGS_NAS_EPS_SERVICE_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_PRESENT;
2339
0
            decoded += size;
2340
0
            break;
2341
0
        case OGS_NAS_EPS_SERVICE_REJECT_ACCESS_TECHNOLOGY_UTILIZATION_CONTROL_TYPE:
2342
0
            size = ogs_nas_eps_decode_access_technology_utilization_control(&service_reject->access_technology_utilization_control, pkbuf);
2343
0
            if (size < 0) {
2344
0
               ogs_error("ogs_nas_eps_decode_access_technology_utilization_control() failed");
2345
0
               return size;
2346
0
            }
2347
2348
0
            service_reject->presencemask |= OGS_NAS_EPS_SERVICE_REJECT_ACCESS_TECHNOLOGY_UTILIZATION_CONTROL_PRESENT;
2349
0
            decoded += size;
2350
0
            break;
2351
0
        case OGS_NAS_EPS_SERVICE_REJECT_S_F_SATELLITE_OPERATION_PARAMETERS_TYPE:
2352
0
            size = ogs_nas_eps_decode_s_f_satellite_operation_parameters(&service_reject->s_f_satellite_operation_parameters, pkbuf);
2353
0
            if (size < 0) {
2354
0
               ogs_error("ogs_nas_eps_decode_s_f_satellite_operation_parameters() failed");
2355
0
               return size;
2356
0
            }
2357
2358
0
            service_reject->presencemask |= OGS_NAS_EPS_SERVICE_REJECT_S_F_SATELLITE_OPERATION_PARAMETERS_PRESENT;
2359
0
            decoded += size;
2360
0
            break;
2361
0
        case OGS_NAS_EPS_SERVICE_REJECT_DISASTER_RETURN_WAIT_RANGE_TYPE:
2362
0
            size = ogs_nas_eps_decode_registration_wait_range(&service_reject->disaster_return_wait_range, pkbuf);
2363
0
            if (size < 0) {
2364
0
               ogs_error("ogs_nas_eps_decode_registration_wait_range() failed");
2365
0
               return size;
2366
0
            }
2367
2368
0
            service_reject->presencemask |= OGS_NAS_EPS_SERVICE_REJECT_DISASTER_RETURN_WAIT_RANGE_PRESENT;
2369
0
            decoded += size;
2370
0
            break;
2371
0
        default:
2372
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2373
0
            break;
2374
0
        }
2375
0
    }
2376
2377
0
    return decoded;
2378
0
}
2379
2380
int ogs_nas_eps_decode_guti_reallocation_command(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2381
0
{
2382
0
    ogs_nas_eps_guti_reallocation_command_t *guti_reallocation_command = &message->emm.guti_reallocation_command;
2383
0
    int decoded = 0;
2384
0
    int size = 0;
2385
2386
0
    ogs_trace("[NAS] Decode GUTI_REALLOCATION_COMMAND\n");
2387
2388
0
    size = ogs_nas_eps_decode_eps_mobile_identity(&guti_reallocation_command->guti, pkbuf);
2389
0
    if (size < 0) {
2390
0
        ogs_error("ogs_nas_eps_decode_eps_mobile_identity() failed");
2391
0
        return size;
2392
0
    }
2393
2394
0
    decoded += size;
2395
2396
0
    while (pkbuf->len > 0) {
2397
0
        uint8_t *buffer = pkbuf->data;
2398
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2399
2400
0
        size = sizeof(uint8_t);
2401
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
2402
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
2403
0
           return OGS_ERROR;
2404
0
        }
2405
0
        decoded += size;
2406
2407
0
        switch (type) {
2408
0
        case OGS_NAS_EPS_GUTI_REALLOCATION_COMMAND_TAI_LIST_TYPE:
2409
0
            size = ogs_nas_eps_decode_tracking_area_identity_list(&guti_reallocation_command->tai_list, pkbuf);
2410
0
            if (size < 0) {
2411
0
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
2412
0
               return size;
2413
0
            }
2414
2415
0
            guti_reallocation_command->presencemask |= OGS_NAS_EPS_GUTI_REALLOCATION_COMMAND_TAI_LIST_PRESENT;
2416
0
            decoded += size;
2417
0
            break;
2418
0
        case OGS_NAS_EPS_GUTI_REALLOCATION_COMMAND_DCN_ID_TYPE:
2419
0
            size = ogs_nas_eps_decode_dcn_id(&guti_reallocation_command->dcn_id, pkbuf);
2420
0
            if (size < 0) {
2421
0
               ogs_error("ogs_nas_eps_decode_dcn_id() failed");
2422
0
               return size;
2423
0
            }
2424
2425
0
            guti_reallocation_command->presencemask |= OGS_NAS_EPS_GUTI_REALLOCATION_COMMAND_DCN_ID_PRESENT;
2426
0
            decoded += size;
2427
0
            break;
2428
0
        case OGS_NAS_EPS_GUTI_REALLOCATION_COMMAND_UE_RADIO_CAPABILITY_ID_TYPE:
2429
0
            size = ogs_nas_eps_decode_ue_radio_capability_id(&guti_reallocation_command->ue_radio_capability_id, pkbuf);
2430
0
            if (size < 0) {
2431
0
               ogs_error("ogs_nas_eps_decode_ue_radio_capability_id() failed");
2432
0
               return size;
2433
0
            }
2434
2435
0
            guti_reallocation_command->presencemask |= OGS_NAS_EPS_GUTI_REALLOCATION_COMMAND_UE_RADIO_CAPABILITY_ID_PRESENT;
2436
0
            decoded += size;
2437
0
            break;
2438
0
        case OGS_NAS_EPS_GUTI_REALLOCATION_COMMAND_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_TYPE:
2439
0
            decoded--;
2440
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
2441
0
            size = ogs_nas_eps_decode_ue_radio_capability_id_deletion_indication(&guti_reallocation_command->ue_radio_capability_id_deletion_indication, pkbuf);
2442
0
            if (size < 0) {
2443
0
               ogs_error("ogs_nas_eps_decode_ue_radio_capability_id_deletion_indication() failed");
2444
0
               return size;
2445
0
            }
2446
2447
0
            guti_reallocation_command->presencemask |= OGS_NAS_EPS_GUTI_REALLOCATION_COMMAND_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_PRESENT;
2448
0
            decoded += size;
2449
0
            break;
2450
0
        case OGS_NAS_EPS_GUTI_REALLOCATION_COMMAND_ACCESS_TECHNOLOGY_UTILIZATION_CONTROL_TYPE:
2451
0
            size = ogs_nas_eps_decode_access_technology_utilization_control(&guti_reallocation_command->access_technology_utilization_control, pkbuf);
2452
0
            if (size < 0) {
2453
0
               ogs_error("ogs_nas_eps_decode_access_technology_utilization_control() failed");
2454
0
               return size;
2455
0
            }
2456
2457
0
            guti_reallocation_command->presencemask |= OGS_NAS_EPS_GUTI_REALLOCATION_COMMAND_ACCESS_TECHNOLOGY_UTILIZATION_CONTROL_PRESENT;
2458
0
            decoded += size;
2459
0
            break;
2460
0
        default:
2461
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2462
0
            break;
2463
0
        }
2464
0
    }
2465
2466
0
    return decoded;
2467
0
}
2468
2469
int ogs_nas_eps_decode_authentication_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2470
0
{
2471
0
    ogs_nas_eps_authentication_request_t *authentication_request = &message->emm.authentication_request;
2472
0
    int decoded = 0;
2473
0
    int size = 0;
2474
2475
0
    ogs_trace("[NAS] Decode AUTHENTICATION_REQUEST\n");
2476
2477
0
    size = ogs_nas_eps_decode_key_set_identifier(&authentication_request->nas_key_set_identifierasme, pkbuf);
2478
0
    if (size < 0) {
2479
0
        ogs_error("ogs_nas_eps_decode_key_set_identifier() failed");
2480
0
        return size;
2481
0
    }
2482
2483
0
    decoded += size;
2484
2485
0
    size = ogs_nas_eps_decode_authentication_parameter_rand(&authentication_request->authentication_parameter_rand, pkbuf);
2486
0
    if (size < 0) {
2487
0
        ogs_error("ogs_nas_eps_decode_authentication_parameter_rand() failed");
2488
0
        return size;
2489
0
    }
2490
2491
0
    decoded += size;
2492
2493
0
    size = ogs_nas_eps_decode_authentication_parameter_autn(&authentication_request->authentication_parameter_autn, pkbuf);
2494
0
    if (size < 0) {
2495
0
        ogs_error("ogs_nas_eps_decode_authentication_parameter_autn() failed");
2496
0
        return size;
2497
0
    }
2498
2499
0
    decoded += size;
2500
2501
0
    return decoded;
2502
0
}
2503
2504
int ogs_nas_eps_decode_authentication_response(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2505
0
{
2506
0
    ogs_nas_eps_authentication_response_t *authentication_response = &message->emm.authentication_response;
2507
0
    int decoded = 0;
2508
0
    int size = 0;
2509
2510
0
    ogs_trace("[NAS] Decode AUTHENTICATION_RESPONSE\n");
2511
2512
0
    size = ogs_nas_eps_decode_authentication_response_parameter(&authentication_response->authentication_response_parameter, pkbuf);
2513
0
    if (size < 0) {
2514
0
        ogs_error("ogs_nas_eps_decode_authentication_response_parameter() failed");
2515
0
        return size;
2516
0
    }
2517
2518
0
    decoded += size;
2519
2520
0
    return decoded;
2521
0
}
2522
2523
int ogs_nas_eps_decode_identity_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2524
0
{
2525
0
    ogs_nas_eps_identity_request_t *identity_request = &message->emm.identity_request;
2526
0
    int decoded = 0;
2527
0
    int size = 0;
2528
2529
0
    ogs_trace("[NAS] Decode IDENTITY_REQUEST\n");
2530
2531
0
    size = ogs_nas_eps_decode_identity_type_2(&identity_request->identity_type, pkbuf);
2532
0
    if (size < 0) {
2533
0
        ogs_error("ogs_nas_eps_decode_identity_type_2() failed");
2534
0
        return size;
2535
0
    }
2536
2537
0
    decoded += size;
2538
2539
0
    return decoded;
2540
0
}
2541
2542
int ogs_nas_eps_decode_identity_response(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2543
0
{
2544
0
    ogs_nas_eps_identity_response_t *identity_response = &message->emm.identity_response;
2545
0
    int decoded = 0;
2546
0
    int size = 0;
2547
2548
0
    ogs_trace("[NAS] Decode IDENTITY_RESPONSE\n");
2549
2550
0
    size = ogs_nas_eps_decode_mobile_identity(&identity_response->mobile_identity, pkbuf);
2551
0
    if (size < 0) {
2552
0
        ogs_error("ogs_nas_eps_decode_mobile_identity() failed");
2553
0
        return size;
2554
0
    }
2555
2556
0
    decoded += size;
2557
2558
0
    return decoded;
2559
0
}
2560
2561
int ogs_nas_eps_decode_authentication_failure(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2562
0
{
2563
0
    ogs_nas_eps_authentication_failure_t *authentication_failure = &message->emm.authentication_failure;
2564
0
    int decoded = 0;
2565
0
    int size = 0;
2566
2567
0
    ogs_trace("[NAS] Decode AUTHENTICATION_FAILURE\n");
2568
2569
0
    size = ogs_nas_eps_decode_emm_cause(&authentication_failure->emm_cause, pkbuf);
2570
0
    if (size < 0) {
2571
0
        ogs_error("ogs_nas_eps_decode_emm_cause() failed");
2572
0
        return size;
2573
0
    }
2574
2575
0
    decoded += size;
2576
2577
0
    while (pkbuf->len > 0) {
2578
0
        uint8_t *buffer = pkbuf->data;
2579
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2580
2581
0
        size = sizeof(uint8_t);
2582
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
2583
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
2584
0
           return OGS_ERROR;
2585
0
        }
2586
0
        decoded += size;
2587
2588
0
        switch (type) {
2589
0
        case OGS_NAS_EPS_AUTHENTICATION_FAILURE_AUTHENTICATION_FAILURE_PARAMETER_TYPE:
2590
0
            size = ogs_nas_eps_decode_authentication_failure_parameter(&authentication_failure->authentication_failure_parameter, pkbuf);
2591
0
            if (size < 0) {
2592
0
               ogs_error("ogs_nas_eps_decode_authentication_failure_parameter() failed");
2593
0
               return size;
2594
0
            }
2595
2596
0
            authentication_failure->presencemask |= OGS_NAS_EPS_AUTHENTICATION_FAILURE_AUTHENTICATION_FAILURE_PARAMETER_PRESENT;
2597
0
            decoded += size;
2598
0
            break;
2599
0
        default:
2600
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2601
0
            break;
2602
0
        }
2603
0
    }
2604
2605
0
    return decoded;
2606
0
}
2607
2608
int ogs_nas_eps_decode_security_mode_command(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2609
0
{
2610
0
    ogs_nas_eps_security_mode_command_t *security_mode_command = &message->emm.security_mode_command;
2611
0
    int decoded = 0;
2612
0
    int size = 0;
2613
2614
0
    ogs_trace("[NAS] Decode SECURITY_MODE_COMMAND\n");
2615
2616
0
    size = ogs_nas_eps_decode_security_algorithms(&security_mode_command->selected_nas_security_algorithms, pkbuf);
2617
0
    if (size < 0) {
2618
0
        ogs_error("ogs_nas_eps_decode_security_algorithms() failed");
2619
0
        return size;
2620
0
    }
2621
2622
0
    decoded += size;
2623
2624
0
    size = ogs_nas_eps_decode_key_set_identifier(&security_mode_command->nas_key_set_identifier, pkbuf);
2625
0
    if (size < 0) {
2626
0
        ogs_error("ogs_nas_eps_decode_key_set_identifier() failed");
2627
0
        return size;
2628
0
    }
2629
2630
0
    decoded += size;
2631
2632
0
    size = ogs_nas_eps_decode_ue_security_capability(&security_mode_command->replayed_ue_security_capabilities, pkbuf);
2633
0
    if (size < 0) {
2634
0
        ogs_error("ogs_nas_eps_decode_ue_security_capability() failed");
2635
0
        return size;
2636
0
    }
2637
2638
0
    decoded += size;
2639
2640
0
    while (pkbuf->len > 0) {
2641
0
        uint8_t *buffer = pkbuf->data;
2642
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2643
2644
0
        size = sizeof(uint8_t);
2645
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
2646
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
2647
0
           return OGS_ERROR;
2648
0
        }
2649
0
        decoded += size;
2650
2651
0
        switch (type) {
2652
0
        case OGS_NAS_EPS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_TYPE:
2653
0
            decoded--;
2654
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
2655
0
            size = ogs_nas_eps_decode_imeisv_request(&security_mode_command->imeisv_request, pkbuf);
2656
0
            if (size < 0) {
2657
0
               ogs_error("ogs_nas_eps_decode_imeisv_request() failed");
2658
0
               return size;
2659
0
            }
2660
2661
0
            security_mode_command->presencemask |= OGS_NAS_EPS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_PRESENT;
2662
0
            decoded += size;
2663
0
            break;
2664
0
        case OGS_NAS_EPS_SECURITY_MODE_COMMAND_REPLAYED_NONCEUE_TYPE:
2665
0
            size = ogs_nas_eps_decode_nonce(&security_mode_command->replayed_nonceue, pkbuf);
2666
0
            if (size < 0) {
2667
0
               ogs_error("ogs_nas_eps_decode_nonce() failed");
2668
0
               return size;
2669
0
            }
2670
2671
0
            security_mode_command->presencemask |= OGS_NAS_EPS_SECURITY_MODE_COMMAND_REPLAYED_NONCEUE_PRESENT;
2672
0
            decoded += size;
2673
0
            break;
2674
0
        case OGS_NAS_EPS_SECURITY_MODE_COMMAND_NONCEMME_TYPE:
2675
0
            size = ogs_nas_eps_decode_nonce(&security_mode_command->noncemme, pkbuf);
2676
0
            if (size < 0) {
2677
0
               ogs_error("ogs_nas_eps_decode_nonce() failed");
2678
0
               return size;
2679
0
            }
2680
2681
0
            security_mode_command->presencemask |= OGS_NAS_EPS_SECURITY_MODE_COMMAND_NONCEMME_PRESENT;
2682
0
            decoded += size;
2683
0
            break;
2684
0
        case OGS_NAS_EPS_SECURITY_MODE_COMMAND_HASHMME_TYPE:
2685
0
            size = ogs_nas_eps_decode_hashmme(&security_mode_command->hashmme, pkbuf);
2686
0
            if (size < 0) {
2687
0
               ogs_error("ogs_nas_eps_decode_hashmme() failed");
2688
0
               return size;
2689
0
            }
2690
2691
0
            security_mode_command->presencemask |= OGS_NAS_EPS_SECURITY_MODE_COMMAND_HASHMME_PRESENT;
2692
0
            decoded += size;
2693
0
            break;
2694
0
        case OGS_NAS_EPS_SECURITY_MODE_COMMAND_REPLAYED_UE_ADDITIONAL_SECURITY_CAPABILITY_TYPE:
2695
0
            size = ogs_nas_eps_decode_ue_additional_security_capability(&security_mode_command->replayed_ue_additional_security_capability, pkbuf);
2696
0
            if (size < 0) {
2697
0
               ogs_error("ogs_nas_eps_decode_ue_additional_security_capability() failed");
2698
0
               return size;
2699
0
            }
2700
2701
0
            security_mode_command->presencemask |= OGS_NAS_EPS_SECURITY_MODE_COMMAND_REPLAYED_UE_ADDITIONAL_SECURITY_CAPABILITY_PRESENT;
2702
0
            decoded += size;
2703
0
            break;
2704
0
        case OGS_NAS_EPS_SECURITY_MODE_COMMAND_UE_RADIO_CAPABILITY_ID_REQUEST_TYPE:
2705
0
            size = ogs_nas_eps_decode_ue_radio_capability_id_request(&security_mode_command->ue_radio_capability_id_request, pkbuf);
2706
0
            if (size < 0) {
2707
0
               ogs_error("ogs_nas_eps_decode_ue_radio_capability_id_request() failed");
2708
0
               return size;
2709
0
            }
2710
2711
0
            security_mode_command->presencemask |= OGS_NAS_EPS_SECURITY_MODE_COMMAND_UE_RADIO_CAPABILITY_ID_REQUEST_PRESENT;
2712
0
            decoded += size;
2713
0
            break;
2714
0
        case OGS_NAS_EPS_SECURITY_MODE_COMMAND_UE_COARSE_LOCATION_INFORMATION_REQUEST_TYPE:
2715
0
            decoded--;
2716
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
2717
0
            size = ogs_nas_eps_decode_ue_information_request(&security_mode_command->ue_coarse_location_information_request, pkbuf);
2718
0
            if (size < 0) {
2719
0
               ogs_error("ogs_nas_eps_decode_ue_information_request() failed");
2720
0
               return size;
2721
0
            }
2722
2723
0
            security_mode_command->presencemask |= OGS_NAS_EPS_SECURITY_MODE_COMMAND_UE_COARSE_LOCATION_INFORMATION_REQUEST_PRESENT;
2724
0
            decoded += size;
2725
0
            break;
2726
0
        default:
2727
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2728
0
            break;
2729
0
        }
2730
0
    }
2731
2732
0
    return decoded;
2733
0
}
2734
2735
int ogs_nas_eps_decode_security_mode_complete(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2736
0
{
2737
0
    ogs_nas_eps_security_mode_complete_t *security_mode_complete = &message->emm.security_mode_complete;
2738
0
    int decoded = 0;
2739
0
    int size = 0;
2740
2741
0
    ogs_trace("[NAS] Decode SECURITY_MODE_COMPLETE\n");
2742
2743
0
    while (pkbuf->len > 0) {
2744
0
        uint8_t *buffer = pkbuf->data;
2745
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2746
2747
0
        size = sizeof(uint8_t);
2748
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
2749
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
2750
0
           return OGS_ERROR;
2751
0
        }
2752
0
        decoded += size;
2753
2754
0
        switch (type) {
2755
0
        case OGS_NAS_EPS_SECURITY_MODE_COMPLETE_IMEISV_TYPE:
2756
0
            size = ogs_nas_eps_decode_mobile_identity(&security_mode_complete->imeisv, pkbuf);
2757
0
            if (size < 0) {
2758
0
               ogs_error("ogs_nas_eps_decode_mobile_identity() failed");
2759
0
               return size;
2760
0
            }
2761
2762
0
            security_mode_complete->presencemask |= OGS_NAS_EPS_SECURITY_MODE_COMPLETE_IMEISV_PRESENT;
2763
0
            decoded += size;
2764
0
            break;
2765
0
        case OGS_NAS_EPS_SECURITY_MODE_COMPLETE_REPLAYED_NAS_MESSAGE_CONTAINER_TYPE:
2766
0
            size = ogs_nas_eps_decode_replayed_nas_message_container(&security_mode_complete->replayed_nas_message_container, pkbuf);
2767
0
            if (size < 0) {
2768
0
               ogs_error("ogs_nas_eps_decode_replayed_nas_message_container() failed");
2769
0
               return size;
2770
0
            }
2771
2772
0
            security_mode_complete->presencemask |= OGS_NAS_EPS_SECURITY_MODE_COMPLETE_REPLAYED_NAS_MESSAGE_CONTAINER_PRESENT;
2773
0
            decoded += size;
2774
0
            break;
2775
0
        case OGS_NAS_EPS_SECURITY_MODE_COMPLETE_UE_RADIO_CAPABILITY_ID_TYPE:
2776
0
            size = ogs_nas_eps_decode_ue_radio_capability_id(&security_mode_complete->ue_radio_capability_id, pkbuf);
2777
0
            if (size < 0) {
2778
0
               ogs_error("ogs_nas_eps_decode_ue_radio_capability_id() failed");
2779
0
               return size;
2780
0
            }
2781
2782
0
            security_mode_complete->presencemask |= OGS_NAS_EPS_SECURITY_MODE_COMPLETE_UE_RADIO_CAPABILITY_ID_PRESENT;
2783
0
            decoded += size;
2784
0
            break;
2785
0
        case OGS_NAS_EPS_SECURITY_MODE_COMPLETE_UE_COARSE_LOCATION_INFORMATION_TYPE:
2786
0
            size = ogs_nas_eps_decode_ue_coarse_location_information(&security_mode_complete->ue_coarse_location_information, pkbuf);
2787
0
            if (size < 0) {
2788
0
               ogs_error("ogs_nas_eps_decode_ue_coarse_location_information() failed");
2789
0
               return size;
2790
0
            }
2791
2792
0
            security_mode_complete->presencemask |= OGS_NAS_EPS_SECURITY_MODE_COMPLETE_UE_COARSE_LOCATION_INFORMATION_PRESENT;
2793
0
            decoded += size;
2794
0
            break;
2795
0
        default:
2796
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2797
0
            break;
2798
0
        }
2799
0
    }
2800
2801
0
    return decoded;
2802
0
}
2803
2804
int ogs_nas_eps_decode_security_mode_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2805
0
{
2806
0
    ogs_nas_eps_security_mode_reject_t *security_mode_reject = &message->emm.security_mode_reject;
2807
0
    int decoded = 0;
2808
0
    int size = 0;
2809
2810
0
    ogs_trace("[NAS] Decode SECURITY_MODE_REJECT\n");
2811
2812
0
    size = ogs_nas_eps_decode_emm_cause(&security_mode_reject->emm_cause, pkbuf);
2813
0
    if (size < 0) {
2814
0
        ogs_error("ogs_nas_eps_decode_emm_cause() failed");
2815
0
        return size;
2816
0
    }
2817
2818
0
    decoded += size;
2819
2820
0
    return decoded;
2821
0
}
2822
2823
int ogs_nas_eps_decode_emm_status(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2824
0
{
2825
0
    ogs_nas_eps_emm_status_t *emm_status = &message->emm.emm_status;
2826
0
    int decoded = 0;
2827
0
    int size = 0;
2828
2829
0
    ogs_trace("[NAS] Decode EMM_STATUS\n");
2830
2831
0
    size = ogs_nas_eps_decode_emm_cause(&emm_status->emm_cause, pkbuf);
2832
0
    if (size < 0) {
2833
0
        ogs_error("ogs_nas_eps_decode_emm_cause() failed");
2834
0
        return size;
2835
0
    }
2836
2837
0
    decoded += size;
2838
2839
0
    return decoded;
2840
0
}
2841
2842
int ogs_nas_eps_decode_emm_information(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2843
0
{
2844
0
    ogs_nas_eps_emm_information_t *emm_information = &message->emm.emm_information;
2845
0
    int decoded = 0;
2846
0
    int size = 0;
2847
2848
0
    ogs_trace("[NAS] Decode EMM_INFORMATION\n");
2849
2850
0
    while (pkbuf->len > 0) {
2851
0
        uint8_t *buffer = pkbuf->data;
2852
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2853
2854
0
        size = sizeof(uint8_t);
2855
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
2856
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
2857
0
           return OGS_ERROR;
2858
0
        }
2859
0
        decoded += size;
2860
2861
0
        switch (type) {
2862
0
        case OGS_NAS_EPS_EMM_INFORMATION_FULL_NAME_FOR_NETWORK_TYPE:
2863
0
            size = ogs_nas_eps_decode_network_name(&emm_information->full_name_for_network, pkbuf);
2864
0
            if (size < 0) {
2865
0
               ogs_error("ogs_nas_eps_decode_network_name() failed");
2866
0
               return size;
2867
0
            }
2868
2869
0
            emm_information->presencemask |= OGS_NAS_EPS_EMM_INFORMATION_FULL_NAME_FOR_NETWORK_PRESENT;
2870
0
            decoded += size;
2871
0
            break;
2872
0
        case OGS_NAS_EPS_EMM_INFORMATION_SHORT_NAME_FOR_NETWORK_TYPE:
2873
0
            size = ogs_nas_eps_decode_network_name(&emm_information->short_name_for_network, pkbuf);
2874
0
            if (size < 0) {
2875
0
               ogs_error("ogs_nas_eps_decode_network_name() failed");
2876
0
               return size;
2877
0
            }
2878
2879
0
            emm_information->presencemask |= OGS_NAS_EPS_EMM_INFORMATION_SHORT_NAME_FOR_NETWORK_PRESENT;
2880
0
            decoded += size;
2881
0
            break;
2882
0
        case OGS_NAS_EPS_EMM_INFORMATION_LOCAL_TIME_ZONE_TYPE:
2883
0
            size = ogs_nas_eps_decode_time_zone(&emm_information->local_time_zone, pkbuf);
2884
0
            if (size < 0) {
2885
0
               ogs_error("ogs_nas_eps_decode_time_zone() failed");
2886
0
               return size;
2887
0
            }
2888
2889
0
            emm_information->presencemask |= OGS_NAS_EPS_EMM_INFORMATION_LOCAL_TIME_ZONE_PRESENT;
2890
0
            decoded += size;
2891
0
            break;
2892
0
        case OGS_NAS_EPS_EMM_INFORMATION_UNIVERSAL_TIME_AND_LOCAL_TIME_ZONE_TYPE:
2893
0
            size = ogs_nas_eps_decode_time_zone_and_time(&emm_information->universal_time_and_local_time_zone, pkbuf);
2894
0
            if (size < 0) {
2895
0
               ogs_error("ogs_nas_eps_decode_time_zone_and_time() failed");
2896
0
               return size;
2897
0
            }
2898
2899
0
            emm_information->presencemask |= OGS_NAS_EPS_EMM_INFORMATION_UNIVERSAL_TIME_AND_LOCAL_TIME_ZONE_PRESENT;
2900
0
            decoded += size;
2901
0
            break;
2902
0
        case OGS_NAS_EPS_EMM_INFORMATION_NETWORK_DAYLIGHT_SAVING_TIME_TYPE:
2903
0
            size = ogs_nas_eps_decode_daylight_saving_time(&emm_information->network_daylight_saving_time, pkbuf);
2904
0
            if (size < 0) {
2905
0
               ogs_error("ogs_nas_eps_decode_daylight_saving_time() failed");
2906
0
               return size;
2907
0
            }
2908
2909
0
            emm_information->presencemask |= OGS_NAS_EPS_EMM_INFORMATION_NETWORK_DAYLIGHT_SAVING_TIME_PRESENT;
2910
0
            decoded += size;
2911
0
            break;
2912
0
        default:
2913
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2914
0
            break;
2915
0
        }
2916
0
    }
2917
2918
0
    return decoded;
2919
0
}
2920
2921
int ogs_nas_eps_decode_downlink_nas_transport(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2922
0
{
2923
0
    ogs_nas_eps_downlink_nas_transport_t *downlink_nas_transport = &message->emm.downlink_nas_transport;
2924
0
    int decoded = 0;
2925
0
    int size = 0;
2926
2927
0
    ogs_trace("[NAS] Decode DOWNLINK_NAS_TRANSPORT\n");
2928
2929
0
    size = ogs_nas_eps_decode_eps_message_container(&downlink_nas_transport->nas_message_container, pkbuf);
2930
0
    if (size < 0) {
2931
0
        ogs_error("ogs_nas_eps_decode_eps_message_container() failed");
2932
0
        return size;
2933
0
    }
2934
2935
0
    decoded += size;
2936
2937
0
    return decoded;
2938
0
}
2939
2940
int ogs_nas_eps_decode_uplink_nas_transport(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2941
0
{
2942
0
    ogs_nas_eps_uplink_nas_transport_t *uplink_nas_transport = &message->emm.uplink_nas_transport;
2943
0
    int decoded = 0;
2944
0
    int size = 0;
2945
2946
0
    ogs_trace("[NAS] Decode UPLINK_NAS_TRANSPORT\n");
2947
2948
0
    size = ogs_nas_eps_decode_eps_message_container(&uplink_nas_transport->nas_message_container, pkbuf);
2949
0
    if (size < 0) {
2950
0
        ogs_error("ogs_nas_eps_decode_eps_message_container() failed");
2951
0
        return size;
2952
0
    }
2953
2954
0
    decoded += size;
2955
2956
0
    return decoded;
2957
0
}
2958
2959
int ogs_nas_eps_decode_cs_service_notification(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2960
0
{
2961
0
    ogs_nas_eps_cs_service_notification_t *cs_service_notification = &message->emm.cs_service_notification;
2962
0
    int decoded = 0;
2963
0
    int size = 0;
2964
2965
0
    ogs_trace("[NAS] Decode CS_SERVICE_NOTIFICATION\n");
2966
2967
0
    size = ogs_nas_eps_decode_paging_identity(&cs_service_notification->paging_identity, pkbuf);
2968
0
    if (size < 0) {
2969
0
        ogs_error("ogs_nas_eps_decode_paging_identity() failed");
2970
0
        return size;
2971
0
    }
2972
2973
0
    decoded += size;
2974
2975
0
    while (pkbuf->len > 0) {
2976
0
        uint8_t *buffer = pkbuf->data;
2977
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2978
2979
0
        size = sizeof(uint8_t);
2980
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
2981
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
2982
0
           return OGS_ERROR;
2983
0
        }
2984
0
        decoded += size;
2985
2986
0
        switch (type) {
2987
0
        case OGS_NAS_EPS_CS_SERVICE_NOTIFICATION_CLI_TYPE:
2988
0
            size = ogs_nas_eps_decode_cli(&cs_service_notification->cli, pkbuf);
2989
0
            if (size < 0) {
2990
0
               ogs_error("ogs_nas_eps_decode_cli() failed");
2991
0
               return size;
2992
0
            }
2993
2994
0
            cs_service_notification->presencemask |= OGS_NAS_EPS_CS_SERVICE_NOTIFICATION_CLI_PRESENT;
2995
0
            decoded += size;
2996
0
            break;
2997
0
        case OGS_NAS_EPS_CS_SERVICE_NOTIFICATION_SS_CODE_TYPE:
2998
0
            size = ogs_nas_eps_decode_ss_code(&cs_service_notification->ss_code, pkbuf);
2999
0
            if (size < 0) {
3000
0
               ogs_error("ogs_nas_eps_decode_ss_code() failed");
3001
0
               return size;
3002
0
            }
3003
3004
0
            cs_service_notification->presencemask |= OGS_NAS_EPS_CS_SERVICE_NOTIFICATION_SS_CODE_PRESENT;
3005
0
            decoded += size;
3006
0
            break;
3007
0
        case OGS_NAS_EPS_CS_SERVICE_NOTIFICATION_LCS_INDICATOR_TYPE:
3008
0
            size = ogs_nas_eps_decode_lcs_indicator(&cs_service_notification->lcs_indicator, pkbuf);
3009
0
            if (size < 0) {
3010
0
               ogs_error("ogs_nas_eps_decode_lcs_indicator() failed");
3011
0
               return size;
3012
0
            }
3013
3014
0
            cs_service_notification->presencemask |= OGS_NAS_EPS_CS_SERVICE_NOTIFICATION_LCS_INDICATOR_PRESENT;
3015
0
            decoded += size;
3016
0
            break;
3017
0
        case OGS_NAS_EPS_CS_SERVICE_NOTIFICATION_LCS_CLIENT_IDENTITY_TYPE:
3018
0
            size = ogs_nas_eps_decode_lcs_client_identity(&cs_service_notification->lcs_client_identity, pkbuf);
3019
0
            if (size < 0) {
3020
0
               ogs_error("ogs_nas_eps_decode_lcs_client_identity() failed");
3021
0
               return size;
3022
0
            }
3023
3024
0
            cs_service_notification->presencemask |= OGS_NAS_EPS_CS_SERVICE_NOTIFICATION_LCS_CLIENT_IDENTITY_PRESENT;
3025
0
            decoded += size;
3026
0
            break;
3027
0
        default:
3028
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
3029
0
            break;
3030
0
        }
3031
0
    }
3032
3033
0
    return decoded;
3034
0
}
3035
3036
int ogs_nas_eps_decode_uplink_generic_nas_transport(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
3037
0
{
3038
0
    ogs_nas_eps_uplink_generic_nas_transport_t *uplink_generic_nas_transport = &message->emm.uplink_generic_nas_transport;
3039
0
    int decoded = 0;
3040
0
    int size = 0;
3041
3042
0
    ogs_trace("[NAS] Decode UPLINK_GENERIC_NAS_TRANSPORT\n");
3043
3044
0
    size = ogs_nas_eps_decode_generic_message_container_type(&uplink_generic_nas_transport->generic_message_container_type, pkbuf);
3045
0
    if (size < 0) {
3046
0
        ogs_error("ogs_nas_eps_decode_generic_message_container_type() failed");
3047
0
        return size;
3048
0
    }
3049
3050
0
    decoded += size;
3051
3052
0
    size = ogs_nas_eps_decode_generic_message_container(&uplink_generic_nas_transport->generic_message_container, pkbuf);
3053
0
    if (size < 0) {
3054
0
        ogs_error("ogs_nas_eps_decode_generic_message_container() failed");
3055
0
        return size;
3056
0
    }
3057
3058
0
    decoded += size;
3059
3060
0
    while (pkbuf->len > 0) {
3061
0
        uint8_t *buffer = pkbuf->data;
3062
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
3063
3064
0
        size = sizeof(uint8_t);
3065
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
3066
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
3067
0
           return OGS_ERROR;
3068
0
        }
3069
0
        decoded += size;
3070
3071
0
        switch (type) {
3072
0
        case OGS_NAS_EPS_UPLINK_GENERIC_NAS_TRANSPORT_ADDITIONAL_INFORMATION_TYPE:
3073
0
            size = ogs_nas_eps_decode_additional_information(&uplink_generic_nas_transport->additional_information, pkbuf);
3074
0
            if (size < 0) {
3075
0
               ogs_error("ogs_nas_eps_decode_additional_information() failed");
3076
0
               return size;
3077
0
            }
3078
3079
0
            uplink_generic_nas_transport->presencemask |= OGS_NAS_EPS_UPLINK_GENERIC_NAS_TRANSPORT_ADDITIONAL_INFORMATION_PRESENT;
3080
0
            decoded += size;
3081
0
            break;
3082
0
        default:
3083
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
3084
0
            break;
3085
0
        }
3086
0
    }
3087
3088
0
    return decoded;
3089
0
}
3090
3091
int ogs_nas_eps_decode_downlink_generic_nas_transport(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
3092
0
{
3093
0
    ogs_nas_eps_downlink_generic_nas_transport_t *downlink_generic_nas_transport = &message->emm.downlink_generic_nas_transport;
3094
0
    int decoded = 0;
3095
0
    int size = 0;
3096
3097
0
    ogs_trace("[NAS] Decode DOWNLINK_GENERIC_NAS_TRANSPORT\n");
3098
3099
0
    size = ogs_nas_eps_decode_generic_message_container_type(&downlink_generic_nas_transport->generic_message_container_type, pkbuf);
3100
0
    if (size < 0) {
3101
0
        ogs_error("ogs_nas_eps_decode_generic_message_container_type() failed");
3102
0
        return size;
3103
0
    }
3104
3105
0
    decoded += size;
3106
3107
0
    size = ogs_nas_eps_decode_generic_message_container(&downlink_generic_nas_transport->generic_message_container, pkbuf);
3108
0
    if (size < 0) {
3109
0
        ogs_error("ogs_nas_eps_decode_generic_message_container() failed");
3110
0
        return size;
3111
0
    }
3112
3113
0
    decoded += size;
3114
3115
0
    while (pkbuf->len > 0) {
3116
0
        uint8_t *buffer = pkbuf->data;
3117
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
3118
3119
0
        size = sizeof(uint8_t);
3120
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
3121
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
3122
0
           return OGS_ERROR;
3123
0
        }
3124
0
        decoded += size;
3125
3126
0
        switch (type) {
3127
0
        case OGS_NAS_EPS_DOWNLINK_GENERIC_NAS_TRANSPORT_ADDITIONAL_INFORMATION_TYPE:
3128
0
            size = ogs_nas_eps_decode_additional_information(&downlink_generic_nas_transport->additional_information, pkbuf);
3129
0
            if (size < 0) {
3130
0
               ogs_error("ogs_nas_eps_decode_additional_information() failed");
3131
0
               return size;
3132
0
            }
3133
3134
0
            downlink_generic_nas_transport->presencemask |= OGS_NAS_EPS_DOWNLINK_GENERIC_NAS_TRANSPORT_ADDITIONAL_INFORMATION_PRESENT;
3135
0
            decoded += size;
3136
0
            break;
3137
0
        default:
3138
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
3139
0
            break;
3140
0
        }
3141
0
    }
3142
3143
0
    return decoded;
3144
0
}
3145
3146
int ogs_nas_eps_decode_activate_default_eps_bearer_context_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
3147
0
{
3148
0
    ogs_nas_eps_activate_default_eps_bearer_context_request_t *activate_default_eps_bearer_context_request = &message->esm.activate_default_eps_bearer_context_request;
3149
0
    int decoded = 0;
3150
0
    int size = 0;
3151
3152
0
    ogs_trace("[NAS] Decode ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST\n");
3153
3154
0
    size = ogs_nas_eps_decode_eps_quality_of_service(&activate_default_eps_bearer_context_request->eps_qos, pkbuf);
3155
0
    if (size < 0) {
3156
0
        ogs_error("ogs_nas_eps_decode_eps_quality_of_service() failed");
3157
0
        return size;
3158
0
    }
3159
3160
0
    decoded += size;
3161
3162
0
    size = ogs_nas_eps_decode_access_point_name(&activate_default_eps_bearer_context_request->access_point_name, pkbuf);
3163
0
    if (size < 0) {
3164
0
        ogs_error("ogs_nas_eps_decode_access_point_name() failed");
3165
0
        return size;
3166
0
    }
3167
3168
0
    decoded += size;
3169
3170
0
    size = ogs_nas_eps_decode_pdn_address(&activate_default_eps_bearer_context_request->pdn_address, pkbuf);
3171
0
    if (size < 0) {
3172
0
        ogs_error("ogs_nas_eps_decode_pdn_address() failed");
3173
0
        return size;
3174
0
    }
3175
3176
0
    decoded += size;
3177
3178
0
    while (pkbuf->len > 0) {
3179
0
        uint8_t *buffer = pkbuf->data;
3180
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
3181
3182
0
        size = sizeof(uint8_t);
3183
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
3184
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
3185
0
           return OGS_ERROR;
3186
0
        }
3187
0
        decoded += size;
3188
3189
0
        switch (type) {
3190
0
        case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_TRANSACTION_IDENTIFIER_TYPE:
3191
0
            size = ogs_nas_eps_decode_transaction_identifier(&activate_default_eps_bearer_context_request->transaction_identifier, pkbuf);
3192
0
            if (size < 0) {
3193
0
               ogs_error("ogs_nas_eps_decode_transaction_identifier() failed");
3194
0
               return size;
3195
0
            }
3196
3197
0
            activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_TRANSACTION_IDENTIFIER_PRESENT;
3198
0
            decoded += size;
3199
0
            break;
3200
0
        case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_QOS_TYPE:
3201
0
            size = ogs_nas_eps_decode_quality_of_service(&activate_default_eps_bearer_context_request->negotiated_qos, pkbuf);
3202
0
            if (size < 0) {
3203
0
               ogs_error("ogs_nas_eps_decode_quality_of_service() failed");
3204
0
               return size;
3205
0
            }
3206
3207
0
            activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_QOS_PRESENT;
3208
0
            decoded += size;
3209
0
            break;
3210
0
        case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_TYPE:
3211
0
            size = ogs_nas_eps_decode_llc_service_access_point_identifier(&activate_default_eps_bearer_context_request->negotiated_llc_sapi, pkbuf);
3212
0
            if (size < 0) {
3213
0
               ogs_error("ogs_nas_eps_decode_llc_service_access_point_identifier() failed");
3214
0
               return size;
3215
0
            }
3216
3217
0
            activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_PRESENT;
3218
0
            decoded += size;
3219
0
            break;
3220
0
        case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_TYPE:
3221
0
            decoded--;
3222
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
3223
0
            size = ogs_nas_eps_decode_radio_priority(&activate_default_eps_bearer_context_request->radio_priority, pkbuf);
3224
0
            if (size < 0) {
3225
0
               ogs_error("ogs_nas_eps_decode_radio_priority() failed");
3226
0
               return size;
3227
0
            }
3228
3229
0
            activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_PRESENT;
3230
0
            decoded += size;
3231
0
            break;
3232
0
        case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_TYPE:
3233
0
            size = ogs_nas_eps_decode_packet_flow_identifier(&activate_default_eps_bearer_context_request->packet_flow_identifier, pkbuf);
3234
0
            if (size < 0) {
3235
0
               ogs_error("ogs_nas_eps_decode_packet_flow_identifier() failed");
3236
0
               return size;
3237
0
            }
3238
3239
0
            activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_PRESENT;
3240
0
            decoded += size;
3241
0
            break;
3242
0
        case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_APN_AMBR_TYPE:
3243
0
            size = ogs_nas_eps_decode_apn_aggregate_maximum_bit_rate(&activate_default_eps_bearer_context_request->apn_ambr, pkbuf);
3244
0
            if (size < 0) {
3245
0
               ogs_error("ogs_nas_eps_decode_apn_aggregate_maximum_bit_rate() failed");
3246
0
               return size;
3247
0
            }
3248
3249
0
            activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_APN_AMBR_PRESENT;
3250
0
            decoded += size;
3251
0
            break;
3252
0
        case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_ESM_CAUSE_TYPE:
3253
0
            size = ogs_nas_eps_decode_esm_cause(&activate_default_eps_bearer_context_request->esm_cause, pkbuf);
3254
0
            if (size < 0) {
3255
0
               ogs_error("ogs_nas_eps_decode_esm_cause() failed");
3256
0
               return size;
3257
0
            }
3258
3259
0
            activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_ESM_CAUSE_PRESENT;
3260
0
            decoded += size;
3261
0
            break;
3262
0
        case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
3263
0
            size = ogs_nas_eps_decode_protocol_configuration_options(&activate_default_eps_bearer_context_request->protocol_configuration_options, pkbuf);
3264
0
            if (size < 0) {
3265
0
               ogs_error("ogs_nas_eps_decode_protocol_configuration_options() failed");
3266
0
               return size;
3267
0
            }
3268
3269
0
            activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
3270
0
            decoded += size;
3271
0
            break;
3272
0
        case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_CONNECTIVITY_TYPE_TYPE:
3273
0
            decoded--;
3274
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
3275
0
            size = ogs_nas_eps_decode_connectivity_type(&activate_default_eps_bearer_context_request->connectivity_type, pkbuf);
3276
0
            if (size < 0) {
3277
0
               ogs_error("ogs_nas_eps_decode_connectivity_type() failed");
3278
0
               return size;
3279
0
            }
3280
3281
0
            activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_CONNECTIVITY_TYPE_PRESENT;
3282
0
            decoded += size;
3283
0
            break;
3284
0
        case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_TYPE:
3285
0
            decoded--;
3286
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
3287
0
            size = ogs_nas_eps_decode_wlan_offload_acceptability(&activate_default_eps_bearer_context_request->wlan_offload_indication, pkbuf);
3288
0
            if (size < 0) {
3289
0
               ogs_error("ogs_nas_eps_decode_wlan_offload_acceptability() failed");
3290
0
               return size;
3291
0
            }
3292
3293
0
            activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_PRESENT;
3294
0
            decoded += size;
3295
0
            break;
3296
0
        case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_TYPE:
3297
0
            size = ogs_nas_eps_decode_nbifom_container(&activate_default_eps_bearer_context_request->nbifom_container, pkbuf);
3298
0
            if (size < 0) {
3299
0
               ogs_error("ogs_nas_eps_decode_nbifom_container() failed");
3300
0
               return size;
3301
0
            }
3302
3303
0
            activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_PRESENT;
3304
0
            decoded += size;
3305
0
            break;
3306
0
        case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_HEADER_COMPRESSION_CONFIGURATION_TYPE:
3307
0
            size = ogs_nas_eps_decode_header_compression_configuration(&activate_default_eps_bearer_context_request->header_compression_configuration, pkbuf);
3308
0
            if (size < 0) {
3309
0
               ogs_error("ogs_nas_eps_decode_header_compression_configuration() failed");
3310
0
               return size;
3311
0
            }
3312
3313
0
            activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_HEADER_COMPRESSION_CONFIGURATION_PRESENT;
3314
0
            decoded += size;
3315
0
            break;
3316
0
        case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_CONTROL_PLANE_ONLY_INDICATION_TYPE:
3317
0
            decoded--;
3318
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
3319
0
            size = ogs_nas_eps_decode_control_plane_only_indication(&activate_default_eps_bearer_context_request->control_plane_only_indication, pkbuf);
3320
0
            if (size < 0) {
3321
0
               ogs_error("ogs_nas_eps_decode_control_plane_only_indication() failed");
3322
0
               return size;
3323
0
            }
3324
3325
0
            activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_CONTROL_PLANE_ONLY_INDICATION_PRESENT;
3326
0
            decoded += size;
3327
0
            break;
3328
0
        case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
3329
0
            size = ogs_nas_eps_decode_extended_protocol_configuration_options(&activate_default_eps_bearer_context_request->extended_protocol_configuration_options, pkbuf);
3330
0
            if (size < 0) {
3331
0
               ogs_error("ogs_nas_eps_decode_extended_protocol_configuration_options() failed");
3332
0
               return size;
3333
0
            }
3334
3335
0
            activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
3336
0
            decoded += size;
3337
0
            break;
3338
0
        case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_SERVING_PLMN_RATE_CONTROL_TYPE:
3339
0
            size = ogs_nas_eps_decode_serving_plmn_rate_control(&activate_default_eps_bearer_context_request->serving_plmn_rate_control, pkbuf);
3340
0
            if (size < 0) {
3341
0
               ogs_error("ogs_nas_eps_decode_serving_plmn_rate_control() failed");
3342
0
               return size;
3343
0
            }
3344
3345
0
            activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_SERVING_PLMN_RATE_CONTROL_PRESENT;
3346
0
            decoded += size;
3347
0
            break;
3348
0
        case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_APN_AMBR_TYPE:
3349
0
            size = ogs_nas_eps_decode_extended_apn_aggregate_maximum_bit_rate(&activate_default_eps_bearer_context_request->extended_apn_ambr, pkbuf);
3350
0
            if (size < 0) {
3351
0
               ogs_error("ogs_nas_eps_decode_extended_apn_aggregate_maximum_bit_rate() failed");
3352
0
               return size;
3353
0
            }
3354
3355
0
            activate_default_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_APN_AMBR_PRESENT;
3356
0
            decoded += size;
3357
0
            break;
3358
0
        default:
3359
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
3360
0
            break;
3361
0
        }
3362
0
    }
3363
3364
0
    return decoded;
3365
0
}
3366
3367
int ogs_nas_eps_decode_activate_default_eps_bearer_context_accept(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
3368
0
{
3369
0
    ogs_nas_eps_activate_default_eps_bearer_context_accept_t *activate_default_eps_bearer_context_accept = &message->esm.activate_default_eps_bearer_context_accept;
3370
0
    int decoded = 0;
3371
0
    int size = 0;
3372
3373
0
    ogs_trace("[NAS] Decode ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT\n");
3374
3375
0
    while (pkbuf->len > 0) {
3376
0
        uint8_t *buffer = pkbuf->data;
3377
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
3378
3379
0
        size = sizeof(uint8_t);
3380
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
3381
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
3382
0
           return OGS_ERROR;
3383
0
        }
3384
0
        decoded += size;
3385
3386
0
        switch (type) {
3387
0
        case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
3388
0
            size = ogs_nas_eps_decode_protocol_configuration_options(&activate_default_eps_bearer_context_accept->protocol_configuration_options, pkbuf);
3389
0
            if (size < 0) {
3390
0
               ogs_error("ogs_nas_eps_decode_protocol_configuration_options() failed");
3391
0
               return size;
3392
0
            }
3393
3394
0
            activate_default_eps_bearer_context_accept->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
3395
0
            decoded += size;
3396
0
            break;
3397
0
        case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
3398
0
            size = ogs_nas_eps_decode_extended_protocol_configuration_options(&activate_default_eps_bearer_context_accept->extended_protocol_configuration_options, pkbuf);
3399
0
            if (size < 0) {
3400
0
               ogs_error("ogs_nas_eps_decode_extended_protocol_configuration_options() failed");
3401
0
               return size;
3402
0
            }
3403
3404
0
            activate_default_eps_bearer_context_accept->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
3405
0
            decoded += size;
3406
0
            break;
3407
0
        default:
3408
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
3409
0
            break;
3410
0
        }
3411
0
    }
3412
3413
0
    return decoded;
3414
0
}
3415
3416
int ogs_nas_eps_decode_activate_default_eps_bearer_context_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
3417
0
{
3418
0
    ogs_nas_eps_activate_default_eps_bearer_context_reject_t *activate_default_eps_bearer_context_reject = &message->esm.activate_default_eps_bearer_context_reject;
3419
0
    int decoded = 0;
3420
0
    int size = 0;
3421
3422
0
    ogs_trace("[NAS] Decode ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT\n");
3423
3424
0
    size = ogs_nas_eps_decode_esm_cause(&activate_default_eps_bearer_context_reject->esm_cause, pkbuf);
3425
0
    if (size < 0) {
3426
0
        ogs_error("ogs_nas_eps_decode_esm_cause() failed");
3427
0
        return size;
3428
0
    }
3429
3430
0
    decoded += size;
3431
3432
0
    while (pkbuf->len > 0) {
3433
0
        uint8_t *buffer = pkbuf->data;
3434
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
3435
3436
0
        size = sizeof(uint8_t);
3437
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
3438
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
3439
0
           return OGS_ERROR;
3440
0
        }
3441
0
        decoded += size;
3442
3443
0
        switch (type) {
3444
0
        case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
3445
0
            size = ogs_nas_eps_decode_protocol_configuration_options(&activate_default_eps_bearer_context_reject->protocol_configuration_options, pkbuf);
3446
0
            if (size < 0) {
3447
0
               ogs_error("ogs_nas_eps_decode_protocol_configuration_options() failed");
3448
0
               return size;
3449
0
            }
3450
3451
0
            activate_default_eps_bearer_context_reject->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
3452
0
            decoded += size;
3453
0
            break;
3454
0
        case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
3455
0
            size = ogs_nas_eps_decode_extended_protocol_configuration_options(&activate_default_eps_bearer_context_reject->extended_protocol_configuration_options, pkbuf);
3456
0
            if (size < 0) {
3457
0
               ogs_error("ogs_nas_eps_decode_extended_protocol_configuration_options() failed");
3458
0
               return size;
3459
0
            }
3460
3461
0
            activate_default_eps_bearer_context_reject->presencemask |= OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
3462
0
            decoded += size;
3463
0
            break;
3464
0
        default:
3465
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
3466
0
            break;
3467
0
        }
3468
0
    }
3469
3470
0
    return decoded;
3471
0
}
3472
3473
int ogs_nas_eps_decode_activate_dedicated_eps_bearer_context_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
3474
0
{
3475
0
    ogs_nas_eps_activate_dedicated_eps_bearer_context_request_t *activate_dedicated_eps_bearer_context_request = &message->esm.activate_dedicated_eps_bearer_context_request;
3476
0
    int decoded = 0;
3477
0
    int size = 0;
3478
3479
0
    ogs_trace("[NAS] Decode ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST\n");
3480
3481
0
    size = ogs_nas_eps_decode_linked_eps_bearer_identity(&activate_dedicated_eps_bearer_context_request->linked_eps_bearer_identity, pkbuf);
3482
0
    if (size < 0) {
3483
0
        ogs_error("ogs_nas_eps_decode_linked_eps_bearer_identity() failed");
3484
0
        return size;
3485
0
    }
3486
3487
0
    decoded += size;
3488
3489
0
    size = ogs_nas_eps_decode_eps_quality_of_service(&activate_dedicated_eps_bearer_context_request->eps_qos, pkbuf);
3490
0
    if (size < 0) {
3491
0
        ogs_error("ogs_nas_eps_decode_eps_quality_of_service() failed");
3492
0
        return size;
3493
0
    }
3494
3495
0
    decoded += size;
3496
3497
0
    size = ogs_nas_eps_decode_traffic_flow_template(&activate_dedicated_eps_bearer_context_request->tft, pkbuf);
3498
0
    if (size < 0) {
3499
0
        ogs_error("ogs_nas_eps_decode_traffic_flow_template() failed");
3500
0
        return size;
3501
0
    }
3502
3503
0
    decoded += size;
3504
3505
0
    while (pkbuf->len > 0) {
3506
0
        uint8_t *buffer = pkbuf->data;
3507
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
3508
3509
0
        size = sizeof(uint8_t);
3510
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
3511
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
3512
0
           return OGS_ERROR;
3513
0
        }
3514
0
        decoded += size;
3515
3516
0
        switch (type) {
3517
0
        case OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_TRANSACTION_IDENTIFIER_TYPE:
3518
0
            size = ogs_nas_eps_decode_transaction_identifier(&activate_dedicated_eps_bearer_context_request->transaction_identifier, pkbuf);
3519
0
            if (size < 0) {
3520
0
               ogs_error("ogs_nas_eps_decode_transaction_identifier() failed");
3521
0
               return size;
3522
0
            }
3523
3524
0
            activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_TRANSACTION_IDENTIFIER_PRESENT;
3525
0
            decoded += size;
3526
0
            break;
3527
0
        case OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_QOS_TYPE:
3528
0
            size = ogs_nas_eps_decode_quality_of_service(&activate_dedicated_eps_bearer_context_request->negotiated_qos, pkbuf);
3529
0
            if (size < 0) {
3530
0
               ogs_error("ogs_nas_eps_decode_quality_of_service() failed");
3531
0
               return size;
3532
0
            }
3533
3534
0
            activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_QOS_PRESENT;
3535
0
            decoded += size;
3536
0
            break;
3537
0
        case OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_TYPE:
3538
0
            size = ogs_nas_eps_decode_llc_service_access_point_identifier(&activate_dedicated_eps_bearer_context_request->negotiated_llc_sapi, pkbuf);
3539
0
            if (size < 0) {
3540
0
               ogs_error("ogs_nas_eps_decode_llc_service_access_point_identifier() failed");
3541
0
               return size;
3542
0
            }
3543
3544
0
            activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_PRESENT;
3545
0
            decoded += size;
3546
0
            break;
3547
0
        case OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_TYPE:
3548
0
            decoded--;
3549
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
3550
0
            size = ogs_nas_eps_decode_radio_priority(&activate_dedicated_eps_bearer_context_request->radio_priority, pkbuf);
3551
0
            if (size < 0) {
3552
0
               ogs_error("ogs_nas_eps_decode_radio_priority() failed");
3553
0
               return size;
3554
0
            }
3555
3556
0
            activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_PRESENT;
3557
0
            decoded += size;
3558
0
            break;
3559
0
        case OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_TYPE:
3560
0
            size = ogs_nas_eps_decode_packet_flow_identifier(&activate_dedicated_eps_bearer_context_request->packet_flow_identifier, pkbuf);
3561
0
            if (size < 0) {
3562
0
               ogs_error("ogs_nas_eps_decode_packet_flow_identifier() failed");
3563
0
               return size;
3564
0
            }
3565
3566
0
            activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_PRESENT;
3567
0
            decoded += size;
3568
0
            break;
3569
0
        case OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
3570
0
            size = ogs_nas_eps_decode_protocol_configuration_options(&activate_dedicated_eps_bearer_context_request->protocol_configuration_options, pkbuf);
3571
0
            if (size < 0) {
3572
0
               ogs_error("ogs_nas_eps_decode_protocol_configuration_options() failed");
3573
0
               return size;
3574
0
            }
3575
3576
0
            activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
3577
0
            decoded += size;
3578
0
            break;
3579
0
        case OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_TYPE:
3580
0
            decoded--;
3581
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
3582
0
            size = ogs_nas_eps_decode_wlan_offload_acceptability(&activate_dedicated_eps_bearer_context_request->wlan_offload_indication, pkbuf);
3583
0
            if (size < 0) {
3584
0
               ogs_error("ogs_nas_eps_decode_wlan_offload_acceptability() failed");
3585
0
               return size;
3586
0
            }
3587
3588
0
            activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_PRESENT;
3589
0
            decoded += size;
3590
0
            break;
3591
0
        case OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_TYPE:
3592
0
            size = ogs_nas_eps_decode_nbifom_container(&activate_dedicated_eps_bearer_context_request->nbifom_container, pkbuf);
3593
0
            if (size < 0) {
3594
0
               ogs_error("ogs_nas_eps_decode_nbifom_container() failed");
3595
0
               return size;
3596
0
            }
3597
3598
0
            activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_PRESENT;
3599
0
            decoded += size;
3600
0
            break;
3601
0
        case OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
3602
0
            size = ogs_nas_eps_decode_extended_protocol_configuration_options(&activate_dedicated_eps_bearer_context_request->extended_protocol_configuration_options, pkbuf);
3603
0
            if (size < 0) {
3604
0
               ogs_error("ogs_nas_eps_decode_extended_protocol_configuration_options() failed");
3605
0
               return size;
3606
0
            }
3607
3608
0
            activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
3609
0
            decoded += size;
3610
0
            break;
3611
0
        case OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_EPS_QOS_TYPE:
3612
0
            size = ogs_nas_eps_decode_extended_quality_of_service(&activate_dedicated_eps_bearer_context_request->extended_eps_qos, pkbuf);
3613
0
            if (size < 0) {
3614
0
               ogs_error("ogs_nas_eps_decode_extended_quality_of_service() failed");
3615
0
               return size;
3616
0
            }
3617
3618
0
            activate_dedicated_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_EPS_QOS_PRESENT;
3619
0
            decoded += size;
3620
0
            break;
3621
0
        default:
3622
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
3623
0
            break;
3624
0
        }
3625
0
    }
3626
3627
0
    return decoded;
3628
0
}
3629
3630
int ogs_nas_eps_decode_activate_dedicated_eps_bearer_context_accept(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
3631
0
{
3632
0
    ogs_nas_eps_activate_dedicated_eps_bearer_context_accept_t *activate_dedicated_eps_bearer_context_accept = &message->esm.activate_dedicated_eps_bearer_context_accept;
3633
0
    int decoded = 0;
3634
0
    int size = 0;
3635
3636
0
    ogs_trace("[NAS] Decode ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT\n");
3637
3638
0
    while (pkbuf->len > 0) {
3639
0
        uint8_t *buffer = pkbuf->data;
3640
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
3641
3642
0
        size = sizeof(uint8_t);
3643
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
3644
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
3645
0
           return OGS_ERROR;
3646
0
        }
3647
0
        decoded += size;
3648
3649
0
        switch (type) {
3650
0
        case OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
3651
0
            size = ogs_nas_eps_decode_protocol_configuration_options(&activate_dedicated_eps_bearer_context_accept->protocol_configuration_options, pkbuf);
3652
0
            if (size < 0) {
3653
0
               ogs_error("ogs_nas_eps_decode_protocol_configuration_options() failed");
3654
0
               return size;
3655
0
            }
3656
3657
0
            activate_dedicated_eps_bearer_context_accept->presencemask |= OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
3658
0
            decoded += size;
3659
0
            break;
3660
0
        case OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_NBIFOM_CONTAINER_TYPE:
3661
0
            size = ogs_nas_eps_decode_nbifom_container(&activate_dedicated_eps_bearer_context_accept->nbifom_container, pkbuf);
3662
0
            if (size < 0) {
3663
0
               ogs_error("ogs_nas_eps_decode_nbifom_container() failed");
3664
0
               return size;
3665
0
            }
3666
3667
0
            activate_dedicated_eps_bearer_context_accept->presencemask |= OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_NBIFOM_CONTAINER_PRESENT;
3668
0
            decoded += size;
3669
0
            break;
3670
0
        case OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
3671
0
            size = ogs_nas_eps_decode_extended_protocol_configuration_options(&activate_dedicated_eps_bearer_context_accept->extended_protocol_configuration_options, pkbuf);
3672
0
            if (size < 0) {
3673
0
               ogs_error("ogs_nas_eps_decode_extended_protocol_configuration_options() failed");
3674
0
               return size;
3675
0
            }
3676
3677
0
            activate_dedicated_eps_bearer_context_accept->presencemask |= OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
3678
0
            decoded += size;
3679
0
            break;
3680
0
        default:
3681
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
3682
0
            break;
3683
0
        }
3684
0
    }
3685
3686
0
    return decoded;
3687
0
}
3688
3689
int ogs_nas_eps_decode_activate_dedicated_eps_bearer_context_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
3690
0
{
3691
0
    ogs_nas_eps_activate_dedicated_eps_bearer_context_reject_t *activate_dedicated_eps_bearer_context_reject = &message->esm.activate_dedicated_eps_bearer_context_reject;
3692
0
    int decoded = 0;
3693
0
    int size = 0;
3694
3695
0
    ogs_trace("[NAS] Decode ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT\n");
3696
3697
0
    size = ogs_nas_eps_decode_esm_cause(&activate_dedicated_eps_bearer_context_reject->esm_cause, pkbuf);
3698
0
    if (size < 0) {
3699
0
        ogs_error("ogs_nas_eps_decode_esm_cause() failed");
3700
0
        return size;
3701
0
    }
3702
3703
0
    decoded += size;
3704
3705
0
    while (pkbuf->len > 0) {
3706
0
        uint8_t *buffer = pkbuf->data;
3707
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
3708
3709
0
        size = sizeof(uint8_t);
3710
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
3711
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
3712
0
           return OGS_ERROR;
3713
0
        }
3714
0
        decoded += size;
3715
3716
0
        switch (type) {
3717
0
        case OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
3718
0
            size = ogs_nas_eps_decode_protocol_configuration_options(&activate_dedicated_eps_bearer_context_reject->protocol_configuration_options, pkbuf);
3719
0
            if (size < 0) {
3720
0
               ogs_error("ogs_nas_eps_decode_protocol_configuration_options() failed");
3721
0
               return size;
3722
0
            }
3723
3724
0
            activate_dedicated_eps_bearer_context_reject->presencemask |= OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
3725
0
            decoded += size;
3726
0
            break;
3727
0
        case OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_NBIFOM_CONTAINER_TYPE:
3728
0
            size = ogs_nas_eps_decode_nbifom_container(&activate_dedicated_eps_bearer_context_reject->nbifom_container, pkbuf);
3729
0
            if (size < 0) {
3730
0
               ogs_error("ogs_nas_eps_decode_nbifom_container() failed");
3731
0
               return size;
3732
0
            }
3733
3734
0
            activate_dedicated_eps_bearer_context_reject->presencemask |= OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_NBIFOM_CONTAINER_PRESENT;
3735
0
            decoded += size;
3736
0
            break;
3737
0
        case OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
3738
0
            size = ogs_nas_eps_decode_extended_protocol_configuration_options(&activate_dedicated_eps_bearer_context_reject->extended_protocol_configuration_options, pkbuf);
3739
0
            if (size < 0) {
3740
0
               ogs_error("ogs_nas_eps_decode_extended_protocol_configuration_options() failed");
3741
0
               return size;
3742
0
            }
3743
3744
0
            activate_dedicated_eps_bearer_context_reject->presencemask |= OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
3745
0
            decoded += size;
3746
0
            break;
3747
0
        default:
3748
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
3749
0
            break;
3750
0
        }
3751
0
    }
3752
3753
0
    return decoded;
3754
0
}
3755
3756
int ogs_nas_eps_decode_modify_eps_bearer_context_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
3757
0
{
3758
0
    ogs_nas_eps_modify_eps_bearer_context_request_t *modify_eps_bearer_context_request = &message->esm.modify_eps_bearer_context_request;
3759
0
    int decoded = 0;
3760
0
    int size = 0;
3761
3762
0
    ogs_trace("[NAS] Decode MODIFY_EPS_BEARER_CONTEXT_REQUEST\n");
3763
3764
0
    while (pkbuf->len > 0) {
3765
0
        uint8_t *buffer = pkbuf->data;
3766
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
3767
3768
0
        size = sizeof(uint8_t);
3769
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
3770
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
3771
0
           return OGS_ERROR;
3772
0
        }
3773
0
        decoded += size;
3774
3775
0
        switch (type) {
3776
0
        case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEW_EPS_QOS_TYPE:
3777
0
            size = ogs_nas_eps_decode_eps_quality_of_service(&modify_eps_bearer_context_request->new_eps_qos, pkbuf);
3778
0
            if (size < 0) {
3779
0
               ogs_error("ogs_nas_eps_decode_eps_quality_of_service() failed");
3780
0
               return size;
3781
0
            }
3782
3783
0
            modify_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEW_EPS_QOS_PRESENT;
3784
0
            decoded += size;
3785
0
            break;
3786
0
        case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_TFT_TYPE:
3787
0
            size = ogs_nas_eps_decode_traffic_flow_template(&modify_eps_bearer_context_request->tft, pkbuf);
3788
0
            if (size < 0) {
3789
0
               ogs_error("ogs_nas_eps_decode_traffic_flow_template() failed");
3790
0
               return size;
3791
0
            }
3792
3793
0
            modify_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_TFT_PRESENT;
3794
0
            decoded += size;
3795
0
            break;
3796
0
        case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEW_QOS_TYPE:
3797
0
            size = ogs_nas_eps_decode_quality_of_service(&modify_eps_bearer_context_request->new_qos, pkbuf);
3798
0
            if (size < 0) {
3799
0
               ogs_error("ogs_nas_eps_decode_quality_of_service() failed");
3800
0
               return size;
3801
0
            }
3802
3803
0
            modify_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEW_QOS_PRESENT;
3804
0
            decoded += size;
3805
0
            break;
3806
0
        case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_TYPE:
3807
0
            size = ogs_nas_eps_decode_llc_service_access_point_identifier(&modify_eps_bearer_context_request->negotiated_llc_sapi, pkbuf);
3808
0
            if (size < 0) {
3809
0
               ogs_error("ogs_nas_eps_decode_llc_service_access_point_identifier() failed");
3810
0
               return size;
3811
0
            }
3812
3813
0
            modify_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NEGOTIATED_LLC_SAPI_PRESENT;
3814
0
            decoded += size;
3815
0
            break;
3816
0
        case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_TYPE:
3817
0
            decoded--;
3818
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
3819
0
            size = ogs_nas_eps_decode_radio_priority(&modify_eps_bearer_context_request->radio_priority, pkbuf);
3820
0
            if (size < 0) {
3821
0
               ogs_error("ogs_nas_eps_decode_radio_priority() failed");
3822
0
               return size;
3823
0
            }
3824
3825
0
            modify_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_RADIO_PRIORITY_PRESENT;
3826
0
            decoded += size;
3827
0
            break;
3828
0
        case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_TYPE:
3829
0
            size = ogs_nas_eps_decode_packet_flow_identifier(&modify_eps_bearer_context_request->packet_flow_identifier, pkbuf);
3830
0
            if (size < 0) {
3831
0
               ogs_error("ogs_nas_eps_decode_packet_flow_identifier() failed");
3832
0
               return size;
3833
0
            }
3834
3835
0
            modify_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_PACKET_FLOW_IDENTIFIER_PRESENT;
3836
0
            decoded += size;
3837
0
            break;
3838
0
        case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_APN_AMBR_TYPE:
3839
0
            size = ogs_nas_eps_decode_apn_aggregate_maximum_bit_rate(&modify_eps_bearer_context_request->apn_ambr, pkbuf);
3840
0
            if (size < 0) {
3841
0
               ogs_error("ogs_nas_eps_decode_apn_aggregate_maximum_bit_rate() failed");
3842
0
               return size;
3843
0
            }
3844
3845
0
            modify_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_APN_AMBR_PRESENT;
3846
0
            decoded += size;
3847
0
            break;
3848
0
        case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
3849
0
            size = ogs_nas_eps_decode_protocol_configuration_options(&modify_eps_bearer_context_request->protocol_configuration_options, pkbuf);
3850
0
            if (size < 0) {
3851
0
               ogs_error("ogs_nas_eps_decode_protocol_configuration_options() failed");
3852
0
               return size;
3853
0
            }
3854
3855
0
            modify_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
3856
0
            decoded += size;
3857
0
            break;
3858
0
        case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_TYPE:
3859
0
            decoded--;
3860
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
3861
0
            size = ogs_nas_eps_decode_wlan_offload_acceptability(&modify_eps_bearer_context_request->wlan_offload_indication, pkbuf);
3862
0
            if (size < 0) {
3863
0
               ogs_error("ogs_nas_eps_decode_wlan_offload_acceptability() failed");
3864
0
               return size;
3865
0
            }
3866
3867
0
            modify_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_PRESENT;
3868
0
            decoded += size;
3869
0
            break;
3870
0
        case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_TYPE:
3871
0
            size = ogs_nas_eps_decode_nbifom_container(&modify_eps_bearer_context_request->nbifom_container, pkbuf);
3872
0
            if (size < 0) {
3873
0
               ogs_error("ogs_nas_eps_decode_nbifom_container() failed");
3874
0
               return size;
3875
0
            }
3876
3877
0
            modify_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_PRESENT;
3878
0
            decoded += size;
3879
0
            break;
3880
0
        case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_HEADER_COMPRESSION_CONFIGURATION_TYPE:
3881
0
            size = ogs_nas_eps_decode_header_compression_configuration(&modify_eps_bearer_context_request->header_compression_configuration, pkbuf);
3882
0
            if (size < 0) {
3883
0
               ogs_error("ogs_nas_eps_decode_header_compression_configuration() failed");
3884
0
               return size;
3885
0
            }
3886
3887
0
            modify_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_HEADER_COMPRESSION_CONFIGURATION_PRESENT;
3888
0
            decoded += size;
3889
0
            break;
3890
0
        case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
3891
0
            size = ogs_nas_eps_decode_extended_protocol_configuration_options(&modify_eps_bearer_context_request->extended_protocol_configuration_options, pkbuf);
3892
0
            if (size < 0) {
3893
0
               ogs_error("ogs_nas_eps_decode_extended_protocol_configuration_options() failed");
3894
0
               return size;
3895
0
            }
3896
3897
0
            modify_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
3898
0
            decoded += size;
3899
0
            break;
3900
0
        case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_APN_AMBR_TYPE:
3901
0
            size = ogs_nas_eps_decode_extended_apn_aggregate_maximum_bit_rate(&modify_eps_bearer_context_request->extended_apn_ambr, pkbuf);
3902
0
            if (size < 0) {
3903
0
               ogs_error("ogs_nas_eps_decode_extended_apn_aggregate_maximum_bit_rate() failed");
3904
0
               return size;
3905
0
            }
3906
3907
0
            modify_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_APN_AMBR_PRESENT;
3908
0
            decoded += size;
3909
0
            break;
3910
0
        case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_EPS_QOS_TYPE:
3911
0
            size = ogs_nas_eps_decode_extended_quality_of_service(&modify_eps_bearer_context_request->extended_eps_qos, pkbuf);
3912
0
            if (size < 0) {
3913
0
               ogs_error("ogs_nas_eps_decode_extended_quality_of_service() failed");
3914
0
               return size;
3915
0
            }
3916
3917
0
            modify_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_EPS_QOS_PRESENT;
3918
0
            decoded += size;
3919
0
            break;
3920
0
        default:
3921
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
3922
0
            break;
3923
0
        }
3924
0
    }
3925
3926
0
    return decoded;
3927
0
}
3928
3929
int ogs_nas_eps_decode_modify_eps_bearer_context_accept(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
3930
0
{
3931
0
    ogs_nas_eps_modify_eps_bearer_context_accept_t *modify_eps_bearer_context_accept = &message->esm.modify_eps_bearer_context_accept;
3932
0
    int decoded = 0;
3933
0
    int size = 0;
3934
3935
0
    ogs_trace("[NAS] Decode MODIFY_EPS_BEARER_CONTEXT_ACCEPT\n");
3936
3937
0
    while (pkbuf->len > 0) {
3938
0
        uint8_t *buffer = pkbuf->data;
3939
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
3940
3941
0
        size = sizeof(uint8_t);
3942
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
3943
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
3944
0
           return OGS_ERROR;
3945
0
        }
3946
0
        decoded += size;
3947
3948
0
        switch (type) {
3949
0
        case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
3950
0
            size = ogs_nas_eps_decode_protocol_configuration_options(&modify_eps_bearer_context_accept->protocol_configuration_options, pkbuf);
3951
0
            if (size < 0) {
3952
0
               ogs_error("ogs_nas_eps_decode_protocol_configuration_options() failed");
3953
0
               return size;
3954
0
            }
3955
3956
0
            modify_eps_bearer_context_accept->presencemask |= OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
3957
0
            decoded += size;
3958
0
            break;
3959
0
        case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_NBIFOM_CONTAINER_TYPE:
3960
0
            size = ogs_nas_eps_decode_nbifom_container(&modify_eps_bearer_context_accept->nbifom_container, pkbuf);
3961
0
            if (size < 0) {
3962
0
               ogs_error("ogs_nas_eps_decode_nbifom_container() failed");
3963
0
               return size;
3964
0
            }
3965
3966
0
            modify_eps_bearer_context_accept->presencemask |= OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_NBIFOM_CONTAINER_PRESENT;
3967
0
            decoded += size;
3968
0
            break;
3969
0
        case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
3970
0
            size = ogs_nas_eps_decode_extended_protocol_configuration_options(&modify_eps_bearer_context_accept->extended_protocol_configuration_options, pkbuf);
3971
0
            if (size < 0) {
3972
0
               ogs_error("ogs_nas_eps_decode_extended_protocol_configuration_options() failed");
3973
0
               return size;
3974
0
            }
3975
3976
0
            modify_eps_bearer_context_accept->presencemask |= OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
3977
0
            decoded += size;
3978
0
            break;
3979
0
        default:
3980
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
3981
0
            break;
3982
0
        }
3983
0
    }
3984
3985
0
    return decoded;
3986
0
}
3987
3988
int ogs_nas_eps_decode_modify_eps_bearer_context_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
3989
0
{
3990
0
    ogs_nas_eps_modify_eps_bearer_context_reject_t *modify_eps_bearer_context_reject = &message->esm.modify_eps_bearer_context_reject;
3991
0
    int decoded = 0;
3992
0
    int size = 0;
3993
3994
0
    ogs_trace("[NAS] Decode MODIFY_EPS_BEARER_CONTEXT_REJECT\n");
3995
3996
0
    size = ogs_nas_eps_decode_esm_cause(&modify_eps_bearer_context_reject->esm_cause, pkbuf);
3997
0
    if (size < 0) {
3998
0
        ogs_error("ogs_nas_eps_decode_esm_cause() failed");
3999
0
        return size;
4000
0
    }
4001
4002
0
    decoded += size;
4003
4004
0
    while (pkbuf->len > 0) {
4005
0
        uint8_t *buffer = pkbuf->data;
4006
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
4007
4008
0
        size = sizeof(uint8_t);
4009
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
4010
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
4011
0
           return OGS_ERROR;
4012
0
        }
4013
0
        decoded += size;
4014
4015
0
        switch (type) {
4016
0
        case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4017
0
            size = ogs_nas_eps_decode_protocol_configuration_options(&modify_eps_bearer_context_reject->protocol_configuration_options, pkbuf);
4018
0
            if (size < 0) {
4019
0
               ogs_error("ogs_nas_eps_decode_protocol_configuration_options() failed");
4020
0
               return size;
4021
0
            }
4022
4023
0
            modify_eps_bearer_context_reject->presencemask |= OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4024
0
            decoded += size;
4025
0
            break;
4026
0
        case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REJECT_NBIFOM_CONTAINER_TYPE:
4027
0
            size = ogs_nas_eps_decode_nbifom_container(&modify_eps_bearer_context_reject->nbifom_container, pkbuf);
4028
0
            if (size < 0) {
4029
0
               ogs_error("ogs_nas_eps_decode_nbifom_container() failed");
4030
0
               return size;
4031
0
            }
4032
4033
0
            modify_eps_bearer_context_reject->presencemask |= OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REJECT_NBIFOM_CONTAINER_PRESENT;
4034
0
            decoded += size;
4035
0
            break;
4036
0
        case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4037
0
            size = ogs_nas_eps_decode_extended_protocol_configuration_options(&modify_eps_bearer_context_reject->extended_protocol_configuration_options, pkbuf);
4038
0
            if (size < 0) {
4039
0
               ogs_error("ogs_nas_eps_decode_extended_protocol_configuration_options() failed");
4040
0
               return size;
4041
0
            }
4042
4043
0
            modify_eps_bearer_context_reject->presencemask |= OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4044
0
            decoded += size;
4045
0
            break;
4046
0
        default:
4047
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
4048
0
            break;
4049
0
        }
4050
0
    }
4051
4052
0
    return decoded;
4053
0
}
4054
4055
int ogs_nas_eps_decode_deactivate_eps_bearer_context_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
4056
0
{
4057
0
    ogs_nas_eps_deactivate_eps_bearer_context_request_t *deactivate_eps_bearer_context_request = &message->esm.deactivate_eps_bearer_context_request;
4058
0
    int decoded = 0;
4059
0
    int size = 0;
4060
4061
0
    ogs_trace("[NAS] Decode DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST\n");
4062
4063
0
    size = ogs_nas_eps_decode_esm_cause(&deactivate_eps_bearer_context_request->esm_cause, pkbuf);
4064
0
    if (size < 0) {
4065
0
        ogs_error("ogs_nas_eps_decode_esm_cause() failed");
4066
0
        return size;
4067
0
    }
4068
4069
0
    decoded += size;
4070
4071
0
    while (pkbuf->len > 0) {
4072
0
        uint8_t *buffer = pkbuf->data;
4073
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
4074
4075
0
        size = sizeof(uint8_t);
4076
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
4077
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
4078
0
           return OGS_ERROR;
4079
0
        }
4080
0
        decoded += size;
4081
4082
0
        switch (type) {
4083
0
        case OGS_NAS_EPS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4084
0
            size = ogs_nas_eps_decode_protocol_configuration_options(&deactivate_eps_bearer_context_request->protocol_configuration_options, pkbuf);
4085
0
            if (size < 0) {
4086
0
               ogs_error("ogs_nas_eps_decode_protocol_configuration_options() failed");
4087
0
               return size;
4088
0
            }
4089
4090
0
            deactivate_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4091
0
            decoded += size;
4092
0
            break;
4093
0
        case OGS_NAS_EPS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_T3396_VALUE_TYPE:
4094
0
            size = ogs_nas_eps_decode_gprs_timer_3(&deactivate_eps_bearer_context_request->t3396_value, pkbuf);
4095
0
            if (size < 0) {
4096
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_3() failed");
4097
0
               return size;
4098
0
            }
4099
4100
0
            deactivate_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_T3396_VALUE_PRESENT;
4101
0
            decoded += size;
4102
0
            break;
4103
0
        case OGS_NAS_EPS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_TYPE:
4104
0
            decoded--;
4105
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
4106
0
            size = ogs_nas_eps_decode_wlan_offload_acceptability(&deactivate_eps_bearer_context_request->wlan_offload_indication, pkbuf);
4107
0
            if (size < 0) {
4108
0
               ogs_error("ogs_nas_eps_decode_wlan_offload_acceptability() failed");
4109
0
               return size;
4110
0
            }
4111
4112
0
            deactivate_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_WLAN_OFFLOAD_INDICATION_PRESENT;
4113
0
            decoded += size;
4114
0
            break;
4115
0
        case OGS_NAS_EPS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_TYPE:
4116
0
            size = ogs_nas_eps_decode_nbifom_container(&deactivate_eps_bearer_context_request->nbifom_container, pkbuf);
4117
0
            if (size < 0) {
4118
0
               ogs_error("ogs_nas_eps_decode_nbifom_container() failed");
4119
0
               return size;
4120
0
            }
4121
4122
0
            deactivate_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_NBIFOM_CONTAINER_PRESENT;
4123
0
            decoded += size;
4124
0
            break;
4125
0
        case OGS_NAS_EPS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4126
0
            size = ogs_nas_eps_decode_extended_protocol_configuration_options(&deactivate_eps_bearer_context_request->extended_protocol_configuration_options, pkbuf);
4127
0
            if (size < 0) {
4128
0
               ogs_error("ogs_nas_eps_decode_extended_protocol_configuration_options() failed");
4129
0
               return size;
4130
0
            }
4131
4132
0
            deactivate_eps_bearer_context_request->presencemask |= OGS_NAS_EPS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4133
0
            decoded += size;
4134
0
            break;
4135
0
        default:
4136
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
4137
0
            break;
4138
0
        }
4139
0
    }
4140
4141
0
    return decoded;
4142
0
}
4143
4144
int ogs_nas_eps_decode_deactivate_eps_bearer_context_accept(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
4145
0
{
4146
0
    ogs_nas_eps_deactivate_eps_bearer_context_accept_t *deactivate_eps_bearer_context_accept = &message->esm.deactivate_eps_bearer_context_accept;
4147
0
    int decoded = 0;
4148
0
    int size = 0;
4149
4150
0
    ogs_trace("[NAS] Decode DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT\n");
4151
4152
0
    while (pkbuf->len > 0) {
4153
0
        uint8_t *buffer = pkbuf->data;
4154
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
4155
4156
0
        size = sizeof(uint8_t);
4157
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
4158
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
4159
0
           return OGS_ERROR;
4160
0
        }
4161
0
        decoded += size;
4162
4163
0
        switch (type) {
4164
0
        case OGS_NAS_EPS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4165
0
            size = ogs_nas_eps_decode_protocol_configuration_options(&deactivate_eps_bearer_context_accept->protocol_configuration_options, pkbuf);
4166
0
            if (size < 0) {
4167
0
               ogs_error("ogs_nas_eps_decode_protocol_configuration_options() failed");
4168
0
               return size;
4169
0
            }
4170
4171
0
            deactivate_eps_bearer_context_accept->presencemask |= OGS_NAS_EPS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4172
0
            decoded += size;
4173
0
            break;
4174
0
        case OGS_NAS_EPS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4175
0
            size = ogs_nas_eps_decode_extended_protocol_configuration_options(&deactivate_eps_bearer_context_accept->extended_protocol_configuration_options, pkbuf);
4176
0
            if (size < 0) {
4177
0
               ogs_error("ogs_nas_eps_decode_extended_protocol_configuration_options() failed");
4178
0
               return size;
4179
0
            }
4180
4181
0
            deactivate_eps_bearer_context_accept->presencemask |= OGS_NAS_EPS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4182
0
            decoded += size;
4183
0
            break;
4184
0
        default:
4185
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
4186
0
            break;
4187
0
        }
4188
0
    }
4189
4190
0
    return decoded;
4191
0
}
4192
4193
int ogs_nas_eps_decode_pdn_connectivity_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
4194
0
{
4195
0
    ogs_nas_eps_pdn_connectivity_request_t *pdn_connectivity_request = &message->esm.pdn_connectivity_request;
4196
0
    int decoded = 0;
4197
0
    int size = 0;
4198
4199
0
    ogs_trace("[NAS] Decode PDN_CONNECTIVITY_REQUEST\n");
4200
4201
0
    size = ogs_nas_eps_decode_request_type(&pdn_connectivity_request->request_type, pkbuf);
4202
0
    if (size < 0) {
4203
0
        ogs_error("ogs_nas_eps_decode_request_type() failed");
4204
0
        return size;
4205
0
    }
4206
4207
0
    decoded += size;
4208
4209
0
    while (pkbuf->len > 0) {
4210
0
        uint8_t *buffer = pkbuf->data;
4211
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
4212
4213
0
        size = sizeof(uint8_t);
4214
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
4215
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
4216
0
           return OGS_ERROR;
4217
0
        }
4218
0
        decoded += size;
4219
4220
0
        switch (type) {
4221
0
        case OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST_ESM_INFORMATION_TRANSFER_FLAG_TYPE:
4222
0
            decoded--;
4223
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
4224
0
            size = ogs_nas_eps_decode_esm_information_transfer_flag(&pdn_connectivity_request->esm_information_transfer_flag, pkbuf);
4225
0
            if (size < 0) {
4226
0
               ogs_error("ogs_nas_eps_decode_esm_information_transfer_flag() failed");
4227
0
               return size;
4228
0
            }
4229
4230
0
            pdn_connectivity_request->presencemask |= OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST_ESM_INFORMATION_TRANSFER_FLAG_PRESENT;
4231
0
            decoded += size;
4232
0
            break;
4233
0
        case OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST_ACCESS_POINT_NAME_TYPE:
4234
0
            size = ogs_nas_eps_decode_access_point_name(&pdn_connectivity_request->access_point_name, pkbuf);
4235
0
            if (size < 0) {
4236
0
               ogs_error("ogs_nas_eps_decode_access_point_name() failed");
4237
0
               return size;
4238
0
            }
4239
4240
0
            pdn_connectivity_request->presencemask |= OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST_ACCESS_POINT_NAME_PRESENT;
4241
0
            decoded += size;
4242
0
            break;
4243
0
        case OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4244
0
            size = ogs_nas_eps_decode_protocol_configuration_options(&pdn_connectivity_request->protocol_configuration_options, pkbuf);
4245
0
            if (size < 0) {
4246
0
               ogs_error("ogs_nas_eps_decode_protocol_configuration_options() failed");
4247
0
               return size;
4248
0
            }
4249
4250
0
            pdn_connectivity_request->presencemask |= OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4251
0
            decoded += size;
4252
0
            break;
4253
0
        case OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST_DEVICE_PROPERTIES_TYPE:
4254
0
            decoded--;
4255
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
4256
0
            size = ogs_nas_eps_decode_device_properties(&pdn_connectivity_request->device_properties, pkbuf);
4257
0
            if (size < 0) {
4258
0
               ogs_error("ogs_nas_eps_decode_device_properties() failed");
4259
0
               return size;
4260
0
            }
4261
4262
0
            pdn_connectivity_request->presencemask |= OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST_DEVICE_PROPERTIES_PRESENT;
4263
0
            decoded += size;
4264
0
            break;
4265
0
        case OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST_NBIFOM_CONTAINER_TYPE:
4266
0
            size = ogs_nas_eps_decode_nbifom_container(&pdn_connectivity_request->nbifom_container, pkbuf);
4267
0
            if (size < 0) {
4268
0
               ogs_error("ogs_nas_eps_decode_nbifom_container() failed");
4269
0
               return size;
4270
0
            }
4271
4272
0
            pdn_connectivity_request->presencemask |= OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST_NBIFOM_CONTAINER_PRESENT;
4273
0
            decoded += size;
4274
0
            break;
4275
0
        case OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST_HEADER_COMPRESSION_CONFIGURATION_TYPE:
4276
0
            size = ogs_nas_eps_decode_header_compression_configuration(&pdn_connectivity_request->header_compression_configuration, pkbuf);
4277
0
            if (size < 0) {
4278
0
               ogs_error("ogs_nas_eps_decode_header_compression_configuration() failed");
4279
0
               return size;
4280
0
            }
4281
4282
0
            pdn_connectivity_request->presencemask |= OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST_HEADER_COMPRESSION_CONFIGURATION_PRESENT;
4283
0
            decoded += size;
4284
0
            break;
4285
0
        case OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4286
0
            size = ogs_nas_eps_decode_extended_protocol_configuration_options(&pdn_connectivity_request->extended_protocol_configuration_options, pkbuf);
4287
0
            if (size < 0) {
4288
0
               ogs_error("ogs_nas_eps_decode_extended_protocol_configuration_options() failed");
4289
0
               return size;
4290
0
            }
4291
4292
0
            pdn_connectivity_request->presencemask |= OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4293
0
            decoded += size;
4294
0
            break;
4295
0
        default:
4296
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
4297
0
            break;
4298
0
        }
4299
0
    }
4300
4301
0
    return decoded;
4302
0
}
4303
4304
int ogs_nas_eps_decode_pdn_connectivity_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
4305
0
{
4306
0
    ogs_nas_eps_pdn_connectivity_reject_t *pdn_connectivity_reject = &message->esm.pdn_connectivity_reject;
4307
0
    int decoded = 0;
4308
0
    int size = 0;
4309
4310
0
    ogs_trace("[NAS] Decode PDN_CONNECTIVITY_REJECT\n");
4311
4312
0
    size = ogs_nas_eps_decode_esm_cause(&pdn_connectivity_reject->esm_cause, pkbuf);
4313
0
    if (size < 0) {
4314
0
        ogs_error("ogs_nas_eps_decode_esm_cause() failed");
4315
0
        return size;
4316
0
    }
4317
4318
0
    decoded += size;
4319
4320
0
    while (pkbuf->len > 0) {
4321
0
        uint8_t *buffer = pkbuf->data;
4322
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
4323
4324
0
        size = sizeof(uint8_t);
4325
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
4326
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
4327
0
           return OGS_ERROR;
4328
0
        }
4329
0
        decoded += size;
4330
4331
0
        switch (type) {
4332
0
        case OGS_NAS_EPS_PDN_CONNECTIVITY_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4333
0
            size = ogs_nas_eps_decode_protocol_configuration_options(&pdn_connectivity_reject->protocol_configuration_options, pkbuf);
4334
0
            if (size < 0) {
4335
0
               ogs_error("ogs_nas_eps_decode_protocol_configuration_options() failed");
4336
0
               return size;
4337
0
            }
4338
4339
0
            pdn_connectivity_reject->presencemask |= OGS_NAS_EPS_PDN_CONNECTIVITY_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4340
0
            decoded += size;
4341
0
            break;
4342
0
        case OGS_NAS_EPS_PDN_CONNECTIVITY_REJECT_BACK_OFF_TIMER_VALUE_TYPE:
4343
0
            size = ogs_nas_eps_decode_gprs_timer_3(&pdn_connectivity_reject->back_off_timer_value, pkbuf);
4344
0
            if (size < 0) {
4345
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_3() failed");
4346
0
               return size;
4347
0
            }
4348
4349
0
            pdn_connectivity_reject->presencemask |= OGS_NAS_EPS_PDN_CONNECTIVITY_REJECT_BACK_OFF_TIMER_VALUE_PRESENT;
4350
0
            decoded += size;
4351
0
            break;
4352
0
        case OGS_NAS_EPS_PDN_CONNECTIVITY_REJECT_RE_ATTEMPT_INDICATOR_TYPE:
4353
0
            size = ogs_nas_eps_decode_re_attempt_indicator(&pdn_connectivity_reject->re_attempt_indicator, pkbuf);
4354
0
            if (size < 0) {
4355
0
               ogs_error("ogs_nas_eps_decode_re_attempt_indicator() failed");
4356
0
               return size;
4357
0
            }
4358
4359
0
            pdn_connectivity_reject->presencemask |= OGS_NAS_EPS_PDN_CONNECTIVITY_REJECT_RE_ATTEMPT_INDICATOR_PRESENT;
4360
0
            decoded += size;
4361
0
            break;
4362
0
        case OGS_NAS_EPS_PDN_CONNECTIVITY_REJECT_NBIFOM_CONTAINER_TYPE:
4363
0
            size = ogs_nas_eps_decode_nbifom_container(&pdn_connectivity_reject->nbifom_container, pkbuf);
4364
0
            if (size < 0) {
4365
0
               ogs_error("ogs_nas_eps_decode_nbifom_container() failed");
4366
0
               return size;
4367
0
            }
4368
4369
0
            pdn_connectivity_reject->presencemask |= OGS_NAS_EPS_PDN_CONNECTIVITY_REJECT_NBIFOM_CONTAINER_PRESENT;
4370
0
            decoded += size;
4371
0
            break;
4372
0
        case OGS_NAS_EPS_PDN_CONNECTIVITY_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4373
0
            size = ogs_nas_eps_decode_extended_protocol_configuration_options(&pdn_connectivity_reject->extended_protocol_configuration_options, pkbuf);
4374
0
            if (size < 0) {
4375
0
               ogs_error("ogs_nas_eps_decode_extended_protocol_configuration_options() failed");
4376
0
               return size;
4377
0
            }
4378
4379
0
            pdn_connectivity_reject->presencemask |= OGS_NAS_EPS_PDN_CONNECTIVITY_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4380
0
            decoded += size;
4381
0
            break;
4382
0
        default:
4383
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
4384
0
            break;
4385
0
        }
4386
0
    }
4387
4388
0
    return decoded;
4389
0
}
4390
4391
int ogs_nas_eps_decode_pdn_disconnect_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
4392
0
{
4393
0
    ogs_nas_eps_pdn_disconnect_request_t *pdn_disconnect_request = &message->esm.pdn_disconnect_request;
4394
0
    int decoded = 0;
4395
0
    int size = 0;
4396
4397
0
    ogs_trace("[NAS] Decode PDN_DISCONNECT_REQUEST\n");
4398
4399
0
    size = ogs_nas_eps_decode_linked_eps_bearer_identity(&pdn_disconnect_request->linked_eps_bearer_identity, pkbuf);
4400
0
    if (size < 0) {
4401
0
        ogs_error("ogs_nas_eps_decode_linked_eps_bearer_identity() failed");
4402
0
        return size;
4403
0
    }
4404
4405
0
    decoded += size;
4406
4407
0
    while (pkbuf->len > 0) {
4408
0
        uint8_t *buffer = pkbuf->data;
4409
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
4410
4411
0
        size = sizeof(uint8_t);
4412
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
4413
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
4414
0
           return OGS_ERROR;
4415
0
        }
4416
0
        decoded += size;
4417
4418
0
        switch (type) {
4419
0
        case OGS_NAS_EPS_PDN_DISCONNECT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4420
0
            size = ogs_nas_eps_decode_protocol_configuration_options(&pdn_disconnect_request->protocol_configuration_options, pkbuf);
4421
0
            if (size < 0) {
4422
0
               ogs_error("ogs_nas_eps_decode_protocol_configuration_options() failed");
4423
0
               return size;
4424
0
            }
4425
4426
0
            pdn_disconnect_request->presencemask |= OGS_NAS_EPS_PDN_DISCONNECT_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4427
0
            decoded += size;
4428
0
            break;
4429
0
        case OGS_NAS_EPS_PDN_DISCONNECT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4430
0
            size = ogs_nas_eps_decode_extended_protocol_configuration_options(&pdn_disconnect_request->extended_protocol_configuration_options, pkbuf);
4431
0
            if (size < 0) {
4432
0
               ogs_error("ogs_nas_eps_decode_extended_protocol_configuration_options() failed");
4433
0
               return size;
4434
0
            }
4435
4436
0
            pdn_disconnect_request->presencemask |= OGS_NAS_EPS_PDN_DISCONNECT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4437
0
            decoded += size;
4438
0
            break;
4439
0
        default:
4440
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
4441
0
            break;
4442
0
        }
4443
0
    }
4444
4445
0
    return decoded;
4446
0
}
4447
4448
int ogs_nas_eps_decode_pdn_disconnect_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
4449
0
{
4450
0
    ogs_nas_eps_pdn_disconnect_reject_t *pdn_disconnect_reject = &message->esm.pdn_disconnect_reject;
4451
0
    int decoded = 0;
4452
0
    int size = 0;
4453
4454
0
    ogs_trace("[NAS] Decode PDN_DISCONNECT_REJECT\n");
4455
4456
0
    size = ogs_nas_eps_decode_esm_cause(&pdn_disconnect_reject->esm_cause, pkbuf);
4457
0
    if (size < 0) {
4458
0
        ogs_error("ogs_nas_eps_decode_esm_cause() failed");
4459
0
        return size;
4460
0
    }
4461
4462
0
    decoded += size;
4463
4464
0
    while (pkbuf->len > 0) {
4465
0
        uint8_t *buffer = pkbuf->data;
4466
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
4467
4468
0
        size = sizeof(uint8_t);
4469
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
4470
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
4471
0
           return OGS_ERROR;
4472
0
        }
4473
0
        decoded += size;
4474
4475
0
        switch (type) {
4476
0
        case OGS_NAS_EPS_PDN_DISCONNECT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4477
0
            size = ogs_nas_eps_decode_protocol_configuration_options(&pdn_disconnect_reject->protocol_configuration_options, pkbuf);
4478
0
            if (size < 0) {
4479
0
               ogs_error("ogs_nas_eps_decode_protocol_configuration_options() failed");
4480
0
               return size;
4481
0
            }
4482
4483
0
            pdn_disconnect_reject->presencemask |= OGS_NAS_EPS_PDN_DISCONNECT_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4484
0
            decoded += size;
4485
0
            break;
4486
0
        case OGS_NAS_EPS_PDN_DISCONNECT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4487
0
            size = ogs_nas_eps_decode_extended_protocol_configuration_options(&pdn_disconnect_reject->extended_protocol_configuration_options, pkbuf);
4488
0
            if (size < 0) {
4489
0
               ogs_error("ogs_nas_eps_decode_extended_protocol_configuration_options() failed");
4490
0
               return size;
4491
0
            }
4492
4493
0
            pdn_disconnect_reject->presencemask |= OGS_NAS_EPS_PDN_DISCONNECT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4494
0
            decoded += size;
4495
0
            break;
4496
0
        default:
4497
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
4498
0
            break;
4499
0
        }
4500
0
    }
4501
4502
0
    return decoded;
4503
0
}
4504
4505
int ogs_nas_eps_decode_bearer_resource_allocation_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
4506
0
{
4507
0
    ogs_nas_eps_bearer_resource_allocation_request_t *bearer_resource_allocation_request = &message->esm.bearer_resource_allocation_request;
4508
0
    int decoded = 0;
4509
0
    int size = 0;
4510
4511
0
    ogs_trace("[NAS] Decode BEARER_RESOURCE_ALLOCATION_REQUEST\n");
4512
4513
0
    size = ogs_nas_eps_decode_linked_eps_bearer_identity(&bearer_resource_allocation_request->linked_eps_bearer_identity, pkbuf);
4514
0
    if (size < 0) {
4515
0
        ogs_error("ogs_nas_eps_decode_linked_eps_bearer_identity() failed");
4516
0
        return size;
4517
0
    }
4518
4519
0
    decoded += size;
4520
4521
0
    size = ogs_nas_eps_decode_traffic_flow_aggregate_description(&bearer_resource_allocation_request->traffic_flow_aggregate, pkbuf);
4522
0
    if (size < 0) {
4523
0
        ogs_error("ogs_nas_eps_decode_traffic_flow_aggregate_description() failed");
4524
0
        return size;
4525
0
    }
4526
4527
0
    decoded += size;
4528
4529
0
    size = ogs_nas_eps_decode_eps_quality_of_service(&bearer_resource_allocation_request->required_traffic_flow_qos, pkbuf);
4530
0
    if (size < 0) {
4531
0
        ogs_error("ogs_nas_eps_decode_eps_quality_of_service() failed");
4532
0
        return size;
4533
0
    }
4534
4535
0
    decoded += size;
4536
4537
0
    while (pkbuf->len > 0) {
4538
0
        uint8_t *buffer = pkbuf->data;
4539
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
4540
4541
0
        size = sizeof(uint8_t);
4542
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
4543
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
4544
0
           return OGS_ERROR;
4545
0
        }
4546
0
        decoded += size;
4547
4548
0
        switch (type) {
4549
0
        case OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4550
0
            size = ogs_nas_eps_decode_protocol_configuration_options(&bearer_resource_allocation_request->protocol_configuration_options, pkbuf);
4551
0
            if (size < 0) {
4552
0
               ogs_error("ogs_nas_eps_decode_protocol_configuration_options() failed");
4553
0
               return size;
4554
0
            }
4555
4556
0
            bearer_resource_allocation_request->presencemask |= OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4557
0
            decoded += size;
4558
0
            break;
4559
0
        case OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REQUEST_DEVICE_PROPERTIES_TYPE:
4560
0
            decoded--;
4561
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
4562
0
            size = ogs_nas_eps_decode_device_properties(&bearer_resource_allocation_request->device_properties, pkbuf);
4563
0
            if (size < 0) {
4564
0
               ogs_error("ogs_nas_eps_decode_device_properties() failed");
4565
0
               return size;
4566
0
            }
4567
4568
0
            bearer_resource_allocation_request->presencemask |= OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REQUEST_DEVICE_PROPERTIES_PRESENT;
4569
0
            decoded += size;
4570
0
            break;
4571
0
        case OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REQUEST_NBIFOM_CONTAINER_TYPE:
4572
0
            size = ogs_nas_eps_decode_nbifom_container(&bearer_resource_allocation_request->nbifom_container, pkbuf);
4573
0
            if (size < 0) {
4574
0
               ogs_error("ogs_nas_eps_decode_nbifom_container() failed");
4575
0
               return size;
4576
0
            }
4577
4578
0
            bearer_resource_allocation_request->presencemask |= OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REQUEST_NBIFOM_CONTAINER_PRESENT;
4579
0
            decoded += size;
4580
0
            break;
4581
0
        case OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4582
0
            size = ogs_nas_eps_decode_extended_protocol_configuration_options(&bearer_resource_allocation_request->extended_protocol_configuration_options, pkbuf);
4583
0
            if (size < 0) {
4584
0
               ogs_error("ogs_nas_eps_decode_extended_protocol_configuration_options() failed");
4585
0
               return size;
4586
0
            }
4587
4588
0
            bearer_resource_allocation_request->presencemask |= OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4589
0
            decoded += size;
4590
0
            break;
4591
0
        case OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REQUEST_EXTENDED_EPS_QOS_TYPE:
4592
0
            size = ogs_nas_eps_decode_extended_quality_of_service(&bearer_resource_allocation_request->extended_eps_qos, pkbuf);
4593
0
            if (size < 0) {
4594
0
               ogs_error("ogs_nas_eps_decode_extended_quality_of_service() failed");
4595
0
               return size;
4596
0
            }
4597
4598
0
            bearer_resource_allocation_request->presencemask |= OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REQUEST_EXTENDED_EPS_QOS_PRESENT;
4599
0
            decoded += size;
4600
0
            break;
4601
0
        default:
4602
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
4603
0
            break;
4604
0
        }
4605
0
    }
4606
4607
0
    return decoded;
4608
0
}
4609
4610
int ogs_nas_eps_decode_bearer_resource_allocation_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
4611
0
{
4612
0
    ogs_nas_eps_bearer_resource_allocation_reject_t *bearer_resource_allocation_reject = &message->esm.bearer_resource_allocation_reject;
4613
0
    int decoded = 0;
4614
0
    int size = 0;
4615
4616
0
    ogs_trace("[NAS] Decode BEARER_RESOURCE_ALLOCATION_REJECT\n");
4617
4618
0
    size = ogs_nas_eps_decode_esm_cause(&bearer_resource_allocation_reject->esm_cause, pkbuf);
4619
0
    if (size < 0) {
4620
0
        ogs_error("ogs_nas_eps_decode_esm_cause() failed");
4621
0
        return size;
4622
0
    }
4623
4624
0
    decoded += size;
4625
4626
0
    while (pkbuf->len > 0) {
4627
0
        uint8_t *buffer = pkbuf->data;
4628
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
4629
4630
0
        size = sizeof(uint8_t);
4631
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
4632
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
4633
0
           return OGS_ERROR;
4634
0
        }
4635
0
        decoded += size;
4636
4637
0
        switch (type) {
4638
0
        case OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4639
0
            size = ogs_nas_eps_decode_protocol_configuration_options(&bearer_resource_allocation_reject->protocol_configuration_options, pkbuf);
4640
0
            if (size < 0) {
4641
0
               ogs_error("ogs_nas_eps_decode_protocol_configuration_options() failed");
4642
0
               return size;
4643
0
            }
4644
4645
0
            bearer_resource_allocation_reject->presencemask |= OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4646
0
            decoded += size;
4647
0
            break;
4648
0
        case OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REJECT_BACK_OFF_TIMER_VALUE_TYPE:
4649
0
            size = ogs_nas_eps_decode_gprs_timer_3(&bearer_resource_allocation_reject->back_off_timer_value, pkbuf);
4650
0
            if (size < 0) {
4651
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_3() failed");
4652
0
               return size;
4653
0
            }
4654
4655
0
            bearer_resource_allocation_reject->presencemask |= OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REJECT_BACK_OFF_TIMER_VALUE_PRESENT;
4656
0
            decoded += size;
4657
0
            break;
4658
0
        case OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REJECT_RE_ATTEMPT_INDICATOR_TYPE:
4659
0
            size = ogs_nas_eps_decode_re_attempt_indicator(&bearer_resource_allocation_reject->re_attempt_indicator, pkbuf);
4660
0
            if (size < 0) {
4661
0
               ogs_error("ogs_nas_eps_decode_re_attempt_indicator() failed");
4662
0
               return size;
4663
0
            }
4664
4665
0
            bearer_resource_allocation_reject->presencemask |= OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REJECT_RE_ATTEMPT_INDICATOR_PRESENT;
4666
0
            decoded += size;
4667
0
            break;
4668
0
        case OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REJECT_NBIFOM_CONTAINER_TYPE:
4669
0
            size = ogs_nas_eps_decode_nbifom_container(&bearer_resource_allocation_reject->nbifom_container, pkbuf);
4670
0
            if (size < 0) {
4671
0
               ogs_error("ogs_nas_eps_decode_nbifom_container() failed");
4672
0
               return size;
4673
0
            }
4674
4675
0
            bearer_resource_allocation_reject->presencemask |= OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REJECT_NBIFOM_CONTAINER_PRESENT;
4676
0
            decoded += size;
4677
0
            break;
4678
0
        case OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4679
0
            size = ogs_nas_eps_decode_extended_protocol_configuration_options(&bearer_resource_allocation_reject->extended_protocol_configuration_options, pkbuf);
4680
0
            if (size < 0) {
4681
0
               ogs_error("ogs_nas_eps_decode_extended_protocol_configuration_options() failed");
4682
0
               return size;
4683
0
            }
4684
4685
0
            bearer_resource_allocation_reject->presencemask |= OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4686
0
            decoded += size;
4687
0
            break;
4688
0
        default:
4689
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
4690
0
            break;
4691
0
        }
4692
0
    }
4693
4694
0
    return decoded;
4695
0
}
4696
4697
int ogs_nas_eps_decode_bearer_resource_modification_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
4698
0
{
4699
0
    ogs_nas_eps_bearer_resource_modification_request_t *bearer_resource_modification_request = &message->esm.bearer_resource_modification_request;
4700
0
    int decoded = 0;
4701
0
    int size = 0;
4702
4703
0
    ogs_trace("[NAS] Decode BEARER_RESOURCE_MODIFICATION_REQUEST\n");
4704
4705
0
    size = ogs_nas_eps_decode_linked_eps_bearer_identity(&bearer_resource_modification_request->eps_bearer_identity_for_packet_filter, pkbuf);
4706
0
    if (size < 0) {
4707
0
        ogs_error("ogs_nas_eps_decode_linked_eps_bearer_identity() failed");
4708
0
        return size;
4709
0
    }
4710
4711
0
    decoded += size;
4712
4713
0
    size = ogs_nas_eps_decode_traffic_flow_aggregate_description(&bearer_resource_modification_request->traffic_flow_aggregate, pkbuf);
4714
0
    if (size < 0) {
4715
0
        ogs_error("ogs_nas_eps_decode_traffic_flow_aggregate_description() failed");
4716
0
        return size;
4717
0
    }
4718
4719
0
    decoded += size;
4720
4721
0
    while (pkbuf->len > 0) {
4722
0
        uint8_t *buffer = pkbuf->data;
4723
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
4724
4725
0
        size = sizeof(uint8_t);
4726
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
4727
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
4728
0
           return OGS_ERROR;
4729
0
        }
4730
0
        decoded += size;
4731
4732
0
        switch (type) {
4733
0
        case OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST_REQUIRED_TRAFFIC_FLOW_QOS_TYPE:
4734
0
            size = ogs_nas_eps_decode_eps_quality_of_service(&bearer_resource_modification_request->required_traffic_flow_qos, pkbuf);
4735
0
            if (size < 0) {
4736
0
               ogs_error("ogs_nas_eps_decode_eps_quality_of_service() failed");
4737
0
               return size;
4738
0
            }
4739
4740
0
            bearer_resource_modification_request->presencemask |= OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST_REQUIRED_TRAFFIC_FLOW_QOS_PRESENT;
4741
0
            decoded += size;
4742
0
            break;
4743
0
        case OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST_ESM_CAUSE_TYPE:
4744
0
            size = ogs_nas_eps_decode_esm_cause(&bearer_resource_modification_request->esm_cause, pkbuf);
4745
0
            if (size < 0) {
4746
0
               ogs_error("ogs_nas_eps_decode_esm_cause() failed");
4747
0
               return size;
4748
0
            }
4749
4750
0
            bearer_resource_modification_request->presencemask |= OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST_ESM_CAUSE_PRESENT;
4751
0
            decoded += size;
4752
0
            break;
4753
0
        case OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4754
0
            size = ogs_nas_eps_decode_protocol_configuration_options(&bearer_resource_modification_request->protocol_configuration_options, pkbuf);
4755
0
            if (size < 0) {
4756
0
               ogs_error("ogs_nas_eps_decode_protocol_configuration_options() failed");
4757
0
               return size;
4758
0
            }
4759
4760
0
            bearer_resource_modification_request->presencemask |= OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4761
0
            decoded += size;
4762
0
            break;
4763
0
        case OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST_DEVICE_PROPERTIES_TYPE:
4764
0
            decoded--;
4765
0
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
4766
0
            size = ogs_nas_eps_decode_device_properties(&bearer_resource_modification_request->device_properties, pkbuf);
4767
0
            if (size < 0) {
4768
0
               ogs_error("ogs_nas_eps_decode_device_properties() failed");
4769
0
               return size;
4770
0
            }
4771
4772
0
            bearer_resource_modification_request->presencemask |= OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST_DEVICE_PROPERTIES_PRESENT;
4773
0
            decoded += size;
4774
0
            break;
4775
0
        case OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST_NBIFOM_CONTAINER_TYPE:
4776
0
            size = ogs_nas_eps_decode_nbifom_container(&bearer_resource_modification_request->nbifom_container, pkbuf);
4777
0
            if (size < 0) {
4778
0
               ogs_error("ogs_nas_eps_decode_nbifom_container() failed");
4779
0
               return size;
4780
0
            }
4781
4782
0
            bearer_resource_modification_request->presencemask |= OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST_NBIFOM_CONTAINER_PRESENT;
4783
0
            decoded += size;
4784
0
            break;
4785
0
        case OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST_HEADER_COMPRESSION_CONFIGURATION_TYPE:
4786
0
            size = ogs_nas_eps_decode_header_compression_configuration(&bearer_resource_modification_request->header_compression_configuration, pkbuf);
4787
0
            if (size < 0) {
4788
0
               ogs_error("ogs_nas_eps_decode_header_compression_configuration() failed");
4789
0
               return size;
4790
0
            }
4791
4792
0
            bearer_resource_modification_request->presencemask |= OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST_HEADER_COMPRESSION_CONFIGURATION_PRESENT;
4793
0
            decoded += size;
4794
0
            break;
4795
0
        case OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4796
0
            size = ogs_nas_eps_decode_extended_protocol_configuration_options(&bearer_resource_modification_request->extended_protocol_configuration_options, pkbuf);
4797
0
            if (size < 0) {
4798
0
               ogs_error("ogs_nas_eps_decode_extended_protocol_configuration_options() failed");
4799
0
               return size;
4800
0
            }
4801
4802
0
            bearer_resource_modification_request->presencemask |= OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4803
0
            decoded += size;
4804
0
            break;
4805
0
        case OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST_EXTENDED_EPS_QOS_TYPE:
4806
0
            size = ogs_nas_eps_decode_extended_quality_of_service(&bearer_resource_modification_request->extended_eps_qos, pkbuf);
4807
0
            if (size < 0) {
4808
0
               ogs_error("ogs_nas_eps_decode_extended_quality_of_service() failed");
4809
0
               return size;
4810
0
            }
4811
4812
0
            bearer_resource_modification_request->presencemask |= OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST_EXTENDED_EPS_QOS_PRESENT;
4813
0
            decoded += size;
4814
0
            break;
4815
0
        default:
4816
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
4817
0
            break;
4818
0
        }
4819
0
    }
4820
4821
0
    return decoded;
4822
0
}
4823
4824
int ogs_nas_eps_decode_bearer_resource_modification_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
4825
0
{
4826
0
    ogs_nas_eps_bearer_resource_modification_reject_t *bearer_resource_modification_reject = &message->esm.bearer_resource_modification_reject;
4827
0
    int decoded = 0;
4828
0
    int size = 0;
4829
4830
0
    ogs_trace("[NAS] Decode BEARER_RESOURCE_MODIFICATION_REJECT\n");
4831
4832
0
    size = ogs_nas_eps_decode_esm_cause(&bearer_resource_modification_reject->esm_cause, pkbuf);
4833
0
    if (size < 0) {
4834
0
        ogs_error("ogs_nas_eps_decode_esm_cause() failed");
4835
0
        return size;
4836
0
    }
4837
4838
0
    decoded += size;
4839
4840
0
    while (pkbuf->len > 0) {
4841
0
        uint8_t *buffer = pkbuf->data;
4842
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
4843
4844
0
        size = sizeof(uint8_t);
4845
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
4846
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
4847
0
           return OGS_ERROR;
4848
0
        }
4849
0
        decoded += size;
4850
4851
0
        switch (type) {
4852
0
        case OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4853
0
            size = ogs_nas_eps_decode_protocol_configuration_options(&bearer_resource_modification_reject->protocol_configuration_options, pkbuf);
4854
0
            if (size < 0) {
4855
0
               ogs_error("ogs_nas_eps_decode_protocol_configuration_options() failed");
4856
0
               return size;
4857
0
            }
4858
4859
0
            bearer_resource_modification_reject->presencemask |= OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REJECT_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4860
0
            decoded += size;
4861
0
            break;
4862
0
        case OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REJECT_BACK_OFF_TIMER_VALUE_TYPE:
4863
0
            size = ogs_nas_eps_decode_gprs_timer_3(&bearer_resource_modification_reject->back_off_timer_value, pkbuf);
4864
0
            if (size < 0) {
4865
0
               ogs_error("ogs_nas_eps_decode_gprs_timer_3() failed");
4866
0
               return size;
4867
0
            }
4868
4869
0
            bearer_resource_modification_reject->presencemask |= OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REJECT_BACK_OFF_TIMER_VALUE_PRESENT;
4870
0
            decoded += size;
4871
0
            break;
4872
0
        case OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REJECT_RE_ATTEMPT_INDICATOR_TYPE:
4873
0
            size = ogs_nas_eps_decode_re_attempt_indicator(&bearer_resource_modification_reject->re_attempt_indicator, pkbuf);
4874
0
            if (size < 0) {
4875
0
               ogs_error("ogs_nas_eps_decode_re_attempt_indicator() failed");
4876
0
               return size;
4877
0
            }
4878
4879
0
            bearer_resource_modification_reject->presencemask |= OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REJECT_RE_ATTEMPT_INDICATOR_PRESENT;
4880
0
            decoded += size;
4881
0
            break;
4882
0
        case OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REJECT_NBIFOM_CONTAINER_TYPE:
4883
0
            size = ogs_nas_eps_decode_nbifom_container(&bearer_resource_modification_reject->nbifom_container, pkbuf);
4884
0
            if (size < 0) {
4885
0
               ogs_error("ogs_nas_eps_decode_nbifom_container() failed");
4886
0
               return size;
4887
0
            }
4888
4889
0
            bearer_resource_modification_reject->presencemask |= OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REJECT_NBIFOM_CONTAINER_PRESENT;
4890
0
            decoded += size;
4891
0
            break;
4892
0
        case OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4893
0
            size = ogs_nas_eps_decode_extended_protocol_configuration_options(&bearer_resource_modification_reject->extended_protocol_configuration_options, pkbuf);
4894
0
            if (size < 0) {
4895
0
               ogs_error("ogs_nas_eps_decode_extended_protocol_configuration_options() failed");
4896
0
               return size;
4897
0
            }
4898
4899
0
            bearer_resource_modification_reject->presencemask |= OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4900
0
            decoded += size;
4901
0
            break;
4902
0
        default:
4903
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
4904
0
            break;
4905
0
        }
4906
0
    }
4907
4908
0
    return decoded;
4909
0
}
4910
4911
int ogs_nas_eps_decode_esm_information_response(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
4912
0
{
4913
0
    ogs_nas_eps_esm_information_response_t *esm_information_response = &message->esm.esm_information_response;
4914
0
    int decoded = 0;
4915
0
    int size = 0;
4916
4917
0
    ogs_trace("[NAS] Decode ESM_INFORMATION_RESPONSE\n");
4918
4919
0
    while (pkbuf->len > 0) {
4920
0
        uint8_t *buffer = pkbuf->data;
4921
0
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
4922
4923
0
        size = sizeof(uint8_t);
4924
0
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
4925
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
4926
0
           return OGS_ERROR;
4927
0
        }
4928
0
        decoded += size;
4929
4930
0
        switch (type) {
4931
0
        case OGS_NAS_EPS_ESM_INFORMATION_RESPONSE_ACCESS_POINT_NAME_TYPE:
4932
0
            size = ogs_nas_eps_decode_access_point_name(&esm_information_response->access_point_name, pkbuf);
4933
0
            if (size < 0) {
4934
0
               ogs_error("ogs_nas_eps_decode_access_point_name() failed");
4935
0
               return size;
4936
0
            }
4937
4938
0
            esm_information_response->presencemask |= OGS_NAS_EPS_ESM_INFORMATION_RESPONSE_ACCESS_POINT_NAME_PRESENT;
4939
0
            decoded += size;
4940
0
            break;
4941
0
        case OGS_NAS_EPS_ESM_INFORMATION_RESPONSE_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4942
0
            size = ogs_nas_eps_decode_protocol_configuration_options(&esm_information_response->protocol_configuration_options, pkbuf);
4943
0
            if (size < 0) {
4944
0
               ogs_error("ogs_nas_eps_decode_protocol_configuration_options() failed");
4945
0
               return size;
4946
0
            }
4947
4948
0
            esm_information_response->presencemask |= OGS_NAS_EPS_ESM_INFORMATION_RESPONSE_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4949
0
            decoded += size;
4950
0
            break;
4951
0
        case OGS_NAS_EPS_ESM_INFORMATION_RESPONSE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4952
0
            size = ogs_nas_eps_decode_extended_protocol_configuration_options(&esm_information_response->extended_protocol_configuration_options, pkbuf);
4953
0
            if (size < 0) {
4954
0
               ogs_error("ogs_nas_eps_decode_extended_protocol_configuration_options() failed");
4955
0
               return size;
4956
0
            }
4957
4958
0
            esm_information_response->presencemask |= OGS_NAS_EPS_ESM_INFORMATION_RESPONSE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4959
0
            decoded += size;
4960
0
            break;
4961
0
        default:
4962
0
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
4963
0
            break;
4964
0
        }
4965
0
    }
4966
4967
0
    return decoded;
4968
0
}
4969
4970
int ogs_nas_eps_decode_esm_status(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
4971
0
{
4972
0
    ogs_nas_eps_esm_status_t *esm_status = &message->esm.esm_status;
4973
0
    int decoded = 0;
4974
0
    int size = 0;
4975
4976
0
    ogs_trace("[NAS] Decode ESM_STATUS\n");
4977
4978
0
    size = ogs_nas_eps_decode_esm_cause(&esm_status->esm_cause, pkbuf);
4979
0
    if (size < 0) {
4980
0
        ogs_error("ogs_nas_eps_decode_esm_cause() failed");
4981
0
        return size;
4982
0
    }
4983
4984
0
    decoded += size;
4985
4986
0
    return decoded;
4987
0
}
4988
4989
int ogs_nas_emm_decode(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
4990
0
{
4991
0
    int size = 0;
4992
0
    int decoded = 0;
4993
4994
0
    ogs_assert(pkbuf);
4995
0
    ogs_assert(pkbuf->data);
4996
4997
0
    size = sizeof(ogs_nas_emm_header_t);
4998
0
    if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
4999
0
       ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
5000
0
       return OGS_ERROR;
5001
0
    }
5002
5003
0
    memset(message, 0, sizeof(ogs_nas_eps_message_t));
5004
0
    memcpy(&message->emm.h, pkbuf->data - size, size);
5005
0
    decoded += size;
5006
5007
0
    if (message->emm.h.security_header_type >=
5008
0
            OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE) {
5009
0
        ogs_assert(ogs_pkbuf_push(pkbuf, 1));
5010
0
        decoded -= 1;
5011
0
        size = ogs_nas_eps_decode_service_request(message, pkbuf);
5012
0
        if (size < 0) {
5013
0
            ogs_error("ogs_nas_eps_decode_service_request() failed");
5014
0
            return OGS_ERROR;
5015
0
        }
5016
0
        decoded += size;
5017
5018
0
        goto out;
5019
0
    }
5020
5021
0
    switch (message->emm.h.message_type) {
5022
0
    case OGS_NAS_EPS_ATTACH_REQUEST:
5023
0
        size = ogs_nas_eps_decode_attach_request(message, pkbuf);
5024
0
        if (size < 0) {
5025
0
           ogs_error("ogs_nas_eps_decode_attach_request() failed");
5026
0
           return OGS_ERROR;
5027
0
        }
5028
5029
0
        decoded += size;
5030
0
        break;
5031
0
    case OGS_NAS_EPS_ATTACH_ACCEPT:
5032
0
        size = ogs_nas_eps_decode_attach_accept(message, pkbuf);
5033
0
        if (size < 0) {
5034
0
           ogs_error("ogs_nas_eps_decode_attach_accept() failed");
5035
0
           return OGS_ERROR;
5036
0
        }
5037
5038
0
        decoded += size;
5039
0
        break;
5040
0
    case OGS_NAS_EPS_ATTACH_COMPLETE:
5041
0
        size = ogs_nas_eps_decode_attach_complete(message, pkbuf);
5042
0
        if (size < 0) {
5043
0
           ogs_error("ogs_nas_eps_decode_attach_complete() failed");
5044
0
           return OGS_ERROR;
5045
0
        }
5046
5047
0
        decoded += size;
5048
0
        break;
5049
0
    case OGS_NAS_EPS_ATTACH_REJECT:
5050
0
        size = ogs_nas_eps_decode_attach_reject(message, pkbuf);
5051
0
        if (size < 0) {
5052
0
           ogs_error("ogs_nas_eps_decode_attach_reject() failed");
5053
0
           return OGS_ERROR;
5054
0
        }
5055
5056
0
        decoded += size;
5057
0
        break;
5058
0
    case OGS_NAS_EPS_DETACH_REQUEST:
5059
0
        size = ogs_nas_eps_decode_detach_request_from_ue(message, pkbuf);
5060
0
        if (size < 0) {
5061
0
           ogs_error("ogs_nas_eps_decode_detach_request_from_ue() failed");
5062
0
           return OGS_ERROR;
5063
0
        }
5064
5065
0
        decoded += size;
5066
0
        break;
5067
0
    case OGS_NAS_EPS_DETACH_ACCEPT:
5068
0
        break;
5069
0
    case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST:
5070
0
        size = ogs_nas_eps_decode_tracking_area_update_request(message, pkbuf);
5071
0
        if (size < 0) {
5072
0
           ogs_error("ogs_nas_eps_decode_tracking_area_update_request() failed");
5073
0
           return OGS_ERROR;
5074
0
        }
5075
5076
0
        decoded += size;
5077
0
        break;
5078
0
    case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT:
5079
0
        size = ogs_nas_eps_decode_tracking_area_update_accept(message, pkbuf);
5080
0
        if (size < 0) {
5081
0
           ogs_error("ogs_nas_eps_decode_tracking_area_update_accept() failed");
5082
0
           return OGS_ERROR;
5083
0
        }
5084
5085
0
        decoded += size;
5086
0
        break;
5087
0
    case OGS_NAS_EPS_TRACKING_AREA_UPDATE_COMPLETE:
5088
0
        break;
5089
0
    case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT:
5090
0
        size = ogs_nas_eps_decode_tracking_area_update_reject(message, pkbuf);
5091
0
        if (size < 0) {
5092
0
           ogs_error("ogs_nas_eps_decode_tracking_area_update_reject() failed");
5093
0
           return OGS_ERROR;
5094
0
        }
5095
5096
0
        decoded += size;
5097
0
        break;
5098
0
    case OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST:
5099
0
        size = ogs_nas_eps_decode_extended_service_request(message, pkbuf);
5100
0
        if (size < 0) {
5101
0
           ogs_error("ogs_nas_eps_decode_extended_service_request() failed");
5102
0
           return OGS_ERROR;
5103
0
        }
5104
5105
0
        decoded += size;
5106
0
        break;
5107
0
    case OGS_NAS_EPS_SERVICE_REJECT:
5108
0
        size = ogs_nas_eps_decode_service_reject(message, pkbuf);
5109
0
        if (size < 0) {
5110
0
           ogs_error("ogs_nas_eps_decode_service_reject() failed");
5111
0
           return OGS_ERROR;
5112
0
        }
5113
5114
0
        decoded += size;
5115
0
        break;
5116
0
    case OGS_NAS_EPS_GUTI_REALLOCATION_COMMAND:
5117
0
        size = ogs_nas_eps_decode_guti_reallocation_command(message, pkbuf);
5118
0
        if (size < 0) {
5119
0
           ogs_error("ogs_nas_eps_decode_guti_reallocation_command() failed");
5120
0
           return OGS_ERROR;
5121
0
        }
5122
5123
0
        decoded += size;
5124
0
        break;
5125
0
    case OGS_NAS_EPS_GUTI_REALLOCATION_COMPLETE:
5126
0
        break;
5127
0
    case OGS_NAS_EPS_AUTHENTICATION_REQUEST:
5128
0
        size = ogs_nas_eps_decode_authentication_request(message, pkbuf);
5129
0
        if (size < 0) {
5130
0
           ogs_error("ogs_nas_eps_decode_authentication_request() failed");
5131
0
           return OGS_ERROR;
5132
0
        }
5133
5134
0
        decoded += size;
5135
0
        break;
5136
0
    case OGS_NAS_EPS_AUTHENTICATION_RESPONSE:
5137
0
        size = ogs_nas_eps_decode_authentication_response(message, pkbuf);
5138
0
        if (size < 0) {
5139
0
           ogs_error("ogs_nas_eps_decode_authentication_response() failed");
5140
0
           return OGS_ERROR;
5141
0
        }
5142
5143
0
        decoded += size;
5144
0
        break;
5145
0
    case OGS_NAS_EPS_AUTHENTICATION_REJECT:
5146
0
        break;
5147
0
    case OGS_NAS_EPS_IDENTITY_REQUEST:
5148
0
        size = ogs_nas_eps_decode_identity_request(message, pkbuf);
5149
0
        if (size < 0) {
5150
0
           ogs_error("ogs_nas_eps_decode_identity_request() failed");
5151
0
           return OGS_ERROR;
5152
0
        }
5153
5154
0
        decoded += size;
5155
0
        break;
5156
0
    case OGS_NAS_EPS_IDENTITY_RESPONSE:
5157
0
        size = ogs_nas_eps_decode_identity_response(message, pkbuf);
5158
0
        if (size < 0) {
5159
0
           ogs_error("ogs_nas_eps_decode_identity_response() failed");
5160
0
           return OGS_ERROR;
5161
0
        }
5162
5163
0
        decoded += size;
5164
0
        break;
5165
0
    case OGS_NAS_EPS_AUTHENTICATION_FAILURE:
5166
0
        size = ogs_nas_eps_decode_authentication_failure(message, pkbuf);
5167
0
        if (size < 0) {
5168
0
           ogs_error("ogs_nas_eps_decode_authentication_failure() failed");
5169
0
           return OGS_ERROR;
5170
0
        }
5171
5172
0
        decoded += size;
5173
0
        break;
5174
0
    case OGS_NAS_EPS_SECURITY_MODE_COMMAND:
5175
0
        size = ogs_nas_eps_decode_security_mode_command(message, pkbuf);
5176
0
        if (size < 0) {
5177
0
           ogs_error("ogs_nas_eps_decode_security_mode_command() failed");
5178
0
           return OGS_ERROR;
5179
0
        }
5180
5181
0
        decoded += size;
5182
0
        break;
5183
0
    case OGS_NAS_EPS_SECURITY_MODE_COMPLETE:
5184
0
        size = ogs_nas_eps_decode_security_mode_complete(message, pkbuf);
5185
0
        if (size < 0) {
5186
0
           ogs_error("ogs_nas_eps_decode_security_mode_complete() failed");
5187
0
           return OGS_ERROR;
5188
0
        }
5189
5190
0
        decoded += size;
5191
0
        break;
5192
0
    case OGS_NAS_EPS_SECURITY_MODE_REJECT:
5193
0
        size = ogs_nas_eps_decode_security_mode_reject(message, pkbuf);
5194
0
        if (size < 0) {
5195
0
           ogs_error("ogs_nas_eps_decode_security_mode_reject() failed");
5196
0
           return OGS_ERROR;
5197
0
        }
5198
5199
0
        decoded += size;
5200
0
        break;
5201
0
    case OGS_NAS_EPS_EMM_STATUS:
5202
0
        size = ogs_nas_eps_decode_emm_status(message, pkbuf);
5203
0
        if (size < 0) {
5204
0
           ogs_error("ogs_nas_eps_decode_emm_status() failed");
5205
0
           return OGS_ERROR;
5206
0
        }
5207
5208
0
        decoded += size;
5209
0
        break;
5210
0
    case OGS_NAS_EPS_EMM_INFORMATION:
5211
0
        size = ogs_nas_eps_decode_emm_information(message, pkbuf);
5212
0
        if (size < 0) {
5213
0
           ogs_error("ogs_nas_eps_decode_emm_information() failed");
5214
0
           return OGS_ERROR;
5215
0
        }
5216
5217
0
        decoded += size;
5218
0
        break;
5219
0
    case OGS_NAS_EPS_DOWNLINK_NAS_TRANSPORT:
5220
0
        size = ogs_nas_eps_decode_downlink_nas_transport(message, pkbuf);
5221
0
        if (size < 0) {
5222
0
           ogs_error("ogs_nas_eps_decode_downlink_nas_transport() failed");
5223
0
           return OGS_ERROR;
5224
0
        }
5225
5226
0
        decoded += size;
5227
0
        break;
5228
0
    case OGS_NAS_EPS_UPLINK_NAS_TRANSPORT:
5229
0
        size = ogs_nas_eps_decode_uplink_nas_transport(message, pkbuf);
5230
0
        if (size < 0) {
5231
0
           ogs_error("ogs_nas_eps_decode_uplink_nas_transport() failed");
5232
0
           return OGS_ERROR;
5233
0
        }
5234
5235
0
        decoded += size;
5236
0
        break;
5237
0
    case OGS_NAS_EPS_CS_SERVICE_NOTIFICATION:
5238
0
        size = ogs_nas_eps_decode_cs_service_notification(message, pkbuf);
5239
0
        if (size < 0) {
5240
0
           ogs_error("ogs_nas_eps_decode_cs_service_notification() failed");
5241
0
           return OGS_ERROR;
5242
0
        }
5243
5244
0
        decoded += size;
5245
0
        break;
5246
0
    case OGS_NAS_EPS_UPLINK_GENERIC_NAS_TRANSPORT:
5247
0
        size = ogs_nas_eps_decode_uplink_generic_nas_transport(message, pkbuf);
5248
0
        if (size < 0) {
5249
0
           ogs_error("ogs_nas_eps_decode_uplink_generic_nas_transport() failed");
5250
0
           return OGS_ERROR;
5251
0
        }
5252
5253
0
        decoded += size;
5254
0
        break;
5255
0
    case OGS_NAS_EPS_DOWNLINK_GENERIC_NAS_TRANSPORT:
5256
0
        size = ogs_nas_eps_decode_downlink_generic_nas_transport(message, pkbuf);
5257
0
        if (size < 0) {
5258
0
           ogs_error("ogs_nas_eps_decode_downlink_generic_nas_transport() failed");
5259
0
           return OGS_ERROR;
5260
0
        }
5261
5262
0
        decoded += size;
5263
0
        break;
5264
0
    default:
5265
0
        ogs_error("Unknown message type (0x%x) or not implemented", 
5266
0
                message->emm.h.message_type);
5267
0
        break;
5268
0
    }
5269
5270
0
out:
5271
0
    ogs_assert(ogs_pkbuf_push(pkbuf, decoded));
5272
5273
0
    return OGS_OK;
5274
0
}
5275
int ogs_nas_esm_decode(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
5276
0
{
5277
0
    int size = 0;
5278
0
    int decoded = 0;
5279
5280
0
    ogs_assert(pkbuf);
5281
0
    ogs_assert(pkbuf->data);
5282
5283
0
    size = sizeof(ogs_nas_esm_header_t);
5284
0
    if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
5285
0
       ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
5286
0
       return OGS_ERROR;
5287
0
    }
5288
5289
0
    memset(message, 0, sizeof(ogs_nas_eps_message_t));
5290
0
    memcpy(&message->esm.h, pkbuf->data - size, size);
5291
0
    decoded += size;
5292
5293
0
    switch (message->esm.h.message_type) {
5294
0
    case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST:
5295
0
        size = ogs_nas_eps_decode_activate_default_eps_bearer_context_request(message, pkbuf);
5296
0
        if (size < 0) {
5297
0
           ogs_error("ogs_nas_eps_decode_activate_default_eps_bearer_context_request() failed");
5298
0
           return OGS_ERROR;
5299
0
        }
5300
5301
0
        decoded += size;
5302
0
        break;
5303
0
    case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT:
5304
0
        size = ogs_nas_eps_decode_activate_default_eps_bearer_context_accept(message, pkbuf);
5305
0
        if (size < 0) {
5306
0
           ogs_error("ogs_nas_eps_decode_activate_default_eps_bearer_context_accept() failed");
5307
0
           return OGS_ERROR;
5308
0
        }
5309
5310
0
        decoded += size;
5311
0
        break;
5312
0
    case OGS_NAS_EPS_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REJECT:
5313
0
        size = ogs_nas_eps_decode_activate_default_eps_bearer_context_reject(message, pkbuf);
5314
0
        if (size < 0) {
5315
0
           ogs_error("ogs_nas_eps_decode_activate_default_eps_bearer_context_reject() failed");
5316
0
           return OGS_ERROR;
5317
0
        }
5318
5319
0
        decoded += size;
5320
0
        break;
5321
0
    case OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST:
5322
0
        size = ogs_nas_eps_decode_activate_dedicated_eps_bearer_context_request(message, pkbuf);
5323
0
        if (size < 0) {
5324
0
           ogs_error("ogs_nas_eps_decode_activate_dedicated_eps_bearer_context_request() failed");
5325
0
           return OGS_ERROR;
5326
0
        }
5327
5328
0
        decoded += size;
5329
0
        break;
5330
0
    case OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_ACCEPT:
5331
0
        size = ogs_nas_eps_decode_activate_dedicated_eps_bearer_context_accept(message, pkbuf);
5332
0
        if (size < 0) {
5333
0
           ogs_error("ogs_nas_eps_decode_activate_dedicated_eps_bearer_context_accept() failed");
5334
0
           return OGS_ERROR;
5335
0
        }
5336
5337
0
        decoded += size;
5338
0
        break;
5339
0
    case OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REJECT:
5340
0
        size = ogs_nas_eps_decode_activate_dedicated_eps_bearer_context_reject(message, pkbuf);
5341
0
        if (size < 0) {
5342
0
           ogs_error("ogs_nas_eps_decode_activate_dedicated_eps_bearer_context_reject() failed");
5343
0
           return OGS_ERROR;
5344
0
        }
5345
5346
0
        decoded += size;
5347
0
        break;
5348
0
    case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST:
5349
0
        size = ogs_nas_eps_decode_modify_eps_bearer_context_request(message, pkbuf);
5350
0
        if (size < 0) {
5351
0
           ogs_error("ogs_nas_eps_decode_modify_eps_bearer_context_request() failed");
5352
0
           return OGS_ERROR;
5353
0
        }
5354
5355
0
        decoded += size;
5356
0
        break;
5357
0
    case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT:
5358
0
        size = ogs_nas_eps_decode_modify_eps_bearer_context_accept(message, pkbuf);
5359
0
        if (size < 0) {
5360
0
           ogs_error("ogs_nas_eps_decode_modify_eps_bearer_context_accept() failed");
5361
0
           return OGS_ERROR;
5362
0
        }
5363
5364
0
        decoded += size;
5365
0
        break;
5366
0
    case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REJECT:
5367
0
        size = ogs_nas_eps_decode_modify_eps_bearer_context_reject(message, pkbuf);
5368
0
        if (size < 0) {
5369
0
           ogs_error("ogs_nas_eps_decode_modify_eps_bearer_context_reject() failed");
5370
0
           return OGS_ERROR;
5371
0
        }
5372
5373
0
        decoded += size;
5374
0
        break;
5375
0
    case OGS_NAS_EPS_DEACTIVATE_EPS_BEARER_CONTEXT_REQUEST:
5376
0
        size = ogs_nas_eps_decode_deactivate_eps_bearer_context_request(message, pkbuf);
5377
0
        if (size < 0) {
5378
0
           ogs_error("ogs_nas_eps_decode_deactivate_eps_bearer_context_request() failed");
5379
0
           return OGS_ERROR;
5380
0
        }
5381
5382
0
        decoded += size;
5383
0
        break;
5384
0
    case OGS_NAS_EPS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT:
5385
0
        size = ogs_nas_eps_decode_deactivate_eps_bearer_context_accept(message, pkbuf);
5386
0
        if (size < 0) {
5387
0
           ogs_error("ogs_nas_eps_decode_deactivate_eps_bearer_context_accept() failed");
5388
0
           return OGS_ERROR;
5389
0
        }
5390
5391
0
        decoded += size;
5392
0
        break;
5393
0
    case OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST:
5394
0
        size = ogs_nas_eps_decode_pdn_connectivity_request(message, pkbuf);
5395
0
        if (size < 0) {
5396
0
           ogs_error("ogs_nas_eps_decode_pdn_connectivity_request() failed");
5397
0
           return OGS_ERROR;
5398
0
        }
5399
5400
0
        decoded += size;
5401
0
        break;
5402
0
    case OGS_NAS_EPS_PDN_CONNECTIVITY_REJECT:
5403
0
        size = ogs_nas_eps_decode_pdn_connectivity_reject(message, pkbuf);
5404
0
        if (size < 0) {
5405
0
           ogs_error("ogs_nas_eps_decode_pdn_connectivity_reject() failed");
5406
0
           return OGS_ERROR;
5407
0
        }
5408
5409
0
        decoded += size;
5410
0
        break;
5411
0
    case OGS_NAS_EPS_PDN_DISCONNECT_REQUEST:
5412
0
        size = ogs_nas_eps_decode_pdn_disconnect_request(message, pkbuf);
5413
0
        if (size < 0) {
5414
0
           ogs_error("ogs_nas_eps_decode_pdn_disconnect_request() failed");
5415
0
           return OGS_ERROR;
5416
0
        }
5417
5418
0
        decoded += size;
5419
0
        break;
5420
0
    case OGS_NAS_EPS_PDN_DISCONNECT_REJECT:
5421
0
        size = ogs_nas_eps_decode_pdn_disconnect_reject(message, pkbuf);
5422
0
        if (size < 0) {
5423
0
           ogs_error("ogs_nas_eps_decode_pdn_disconnect_reject() failed");
5424
0
           return OGS_ERROR;
5425
0
        }
5426
5427
0
        decoded += size;
5428
0
        break;
5429
0
    case OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REQUEST:
5430
0
        size = ogs_nas_eps_decode_bearer_resource_allocation_request(message, pkbuf);
5431
0
        if (size < 0) {
5432
0
           ogs_error("ogs_nas_eps_decode_bearer_resource_allocation_request() failed");
5433
0
           return OGS_ERROR;
5434
0
        }
5435
5436
0
        decoded += size;
5437
0
        break;
5438
0
    case OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REJECT:
5439
0
        size = ogs_nas_eps_decode_bearer_resource_allocation_reject(message, pkbuf);
5440
0
        if (size < 0) {
5441
0
           ogs_error("ogs_nas_eps_decode_bearer_resource_allocation_reject() failed");
5442
0
           return OGS_ERROR;
5443
0
        }
5444
5445
0
        decoded += size;
5446
0
        break;
5447
0
    case OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST:
5448
0
        size = ogs_nas_eps_decode_bearer_resource_modification_request(message, pkbuf);
5449
0
        if (size < 0) {
5450
0
           ogs_error("ogs_nas_eps_decode_bearer_resource_modification_request() failed");
5451
0
           return OGS_ERROR;
5452
0
        }
5453
5454
0
        decoded += size;
5455
0
        break;
5456
0
    case OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REJECT:
5457
0
        size = ogs_nas_eps_decode_bearer_resource_modification_reject(message, pkbuf);
5458
0
        if (size < 0) {
5459
0
           ogs_error("ogs_nas_eps_decode_bearer_resource_modification_reject() failed");
5460
0
           return OGS_ERROR;
5461
0
        }
5462
5463
0
        decoded += size;
5464
0
        break;
5465
0
    case OGS_NAS_EPS_ESM_INFORMATION_REQUEST:
5466
0
        break;
5467
0
    case OGS_NAS_EPS_ESM_INFORMATION_RESPONSE:
5468
0
        size = ogs_nas_eps_decode_esm_information_response(message, pkbuf);
5469
0
        if (size < 0) {
5470
0
           ogs_error("ogs_nas_eps_decode_esm_information_response() failed");
5471
0
           return OGS_ERROR;
5472
0
        }
5473
5474
0
        decoded += size;
5475
0
        break;
5476
0
    case OGS_NAS_EPS_ESM_STATUS:
5477
0
        size = ogs_nas_eps_decode_esm_status(message, pkbuf);
5478
0
        if (size < 0) {
5479
0
           ogs_error("ogs_nas_eps_decode_esm_status() failed");
5480
0
           return OGS_ERROR;
5481
0
        }
5482
5483
0
        decoded += size;
5484
0
        break;
5485
0
    default:
5486
0
        ogs_error("Unknown message type (0x%x) or not implemented", 
5487
0
               message->esm.h.message_type);
5488
0
        break;
5489
0
    }
5490
5491
0
    ogs_assert(ogs_pkbuf_push(pkbuf, decoded));
5492
5493
0
    return OGS_OK;
5494
0
}
5495