Coverage Report

Created: 2025-11-16 06:50

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