Coverage Report

Created: 2025-12-14 06:20

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
339
{
88
339
    ogs_nas_eps_attach_request_t *attach_request = &message->emm.attach_request;
89
339
    int decoded = 0;
90
339
    int size = 0;
91
92
339
    ogs_trace("[NAS] Decode ATTACH_REQUEST\n");
93
94
339
    size = ogs_nas_eps_decode_eps_attach_type(&attach_request->eps_attach_type, pkbuf);
95
339
    if (size < 0) {
96
0
        ogs_error("ogs_nas_eps_decode_eps_attach_type() failed");
97
0
        return size;
98
0
    }
99
100
339
    decoded += size;
101
102
339
    size = ogs_nas_eps_decode_eps_mobile_identity(&attach_request->eps_mobile_identity, pkbuf);
103
339
    if (size < 0) {
104
2
        ogs_error("ogs_nas_eps_decode_eps_mobile_identity() failed");
105
2
        return size;
106
2
    }
107
108
337
    decoded += size;
109
110
337
    size = ogs_nas_eps_decode_ue_network_capability(&attach_request->ue_network_capability, pkbuf);
111
337
    if (size < 0) {
112
7
        ogs_error("ogs_nas_eps_decode_ue_network_capability() failed");
113
7
        return size;
114
7
    }
115
116
330
    decoded += size;
117
118
330
    size = ogs_nas_eps_decode_esm_message_container(&attach_request->esm_message_container, pkbuf);
119
330
    if (size < 0) {
120
5
        ogs_error("ogs_nas_eps_decode_esm_message_container() failed");
121
5
        return size;
122
5
    }
123
124
325
    decoded += size;
125
126
15.7k
    while (pkbuf->len > 0) {
127
15.4k
        uint8_t *buffer = pkbuf->data;
128
15.4k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
129
130
15.4k
        size = sizeof(uint8_t);
131
15.4k
        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
15.4k
        decoded += size;
136
137
15.4k
        switch (type) {
138
205
        case OGS_NAS_EPS_ATTACH_REQUEST_OLD_P_TMSI_SIGNATURE_TYPE:
139
205
            size = ogs_nas_eps_decode_p_tmsi_signature(&attach_request->old_p_tmsi_signature, pkbuf);
140
205
            if (size < 0) {
141
1
               ogs_error("ogs_nas_eps_decode_p_tmsi_signature() failed");
142
1
               return size;
143
1
            }
144
145
204
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_OLD_P_TMSI_SIGNATURE_PRESENT;
146
204
            decoded += size;
147
204
            break;
148
227
        case OGS_NAS_EPS_ATTACH_REQUEST_ADDITIONAL_GUTI_TYPE:
149
227
            size = ogs_nas_eps_decode_eps_mobile_identity(&attach_request->additional_guti, pkbuf);
150
227
            if (size < 0) {
151
1
               ogs_error("ogs_nas_eps_decode_eps_mobile_identity() failed");
152
1
               return size;
153
1
            }
154
155
226
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_ADDITIONAL_GUTI_PRESENT;
156
226
            decoded += size;
157
226
            break;
158
207
        case OGS_NAS_EPS_ATTACH_REQUEST_LAST_VISITED_REGISTERED_TAI_TYPE:
159
207
            size = ogs_nas_eps_decode_tracking_area_identity(&attach_request->last_visited_registered_tai, pkbuf);
160
207
            if (size < 0) {
161
1
               ogs_error("ogs_nas_eps_decode_tracking_area_identity() failed");
162
1
               return size;
163
1
            }
164
165
206
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_LAST_VISITED_REGISTERED_TAI_PRESENT;
166
206
            decoded += size;
167
206
            break;
168
224
        case OGS_NAS_EPS_ATTACH_REQUEST_DRX_PARAMETER_TYPE:
169
224
            size = ogs_nas_eps_decode_drx_parameter(&attach_request->drx_parameter, pkbuf);
170
224
            if (size < 0) {
171
1
               ogs_error("ogs_nas_eps_decode_drx_parameter() failed");
172
1
               return size;
173
1
            }
174
175
223
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_DRX_PARAMETER_PRESENT;
176
223
            decoded += size;
177
223
            break;
178
244
        case OGS_NAS_EPS_ATTACH_REQUEST_MS_NETWORK_CAPABILITY_TYPE:
179
244
            size = ogs_nas_eps_decode_ms_network_capability(&attach_request->ms_network_capability, pkbuf);
180
244
            if (size < 0) {
181
1
               ogs_error("ogs_nas_eps_decode_ms_network_capability() failed");
182
1
               return size;
183
1
            }
184
185
243
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_MS_NETWORK_CAPABILITY_PRESENT;
186
243
            decoded += size;
187
243
            break;
188
303
        case OGS_NAS_EPS_ATTACH_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_TYPE:
189
303
            size = ogs_nas_eps_decode_location_area_identification(&attach_request->old_location_area_identification, pkbuf);
190
303
            if (size < 0) {
191
1
               ogs_error("ogs_nas_eps_decode_location_area_identification() failed");
192
1
               return size;
193
1
            }
194
195
302
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_PRESENT;
196
302
            decoded += size;
197
302
            break;
198
615
        case OGS_NAS_EPS_ATTACH_REQUEST_TMSI_STATUS_TYPE:
199
615
            decoded--;
200
615
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
201
615
            size = ogs_nas_eps_decode_tmsi_status(&attach_request->tmsi_status, pkbuf);
202
615
            if (size < 0) {
203
0
               ogs_error("ogs_nas_eps_decode_tmsi_status() failed");
204
0
               return size;
205
0
            }
206
207
615
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_TMSI_STATUS_PRESENT;
208
615
            decoded += size;
209
615
            break;
210
212
        case OGS_NAS_EPS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_2_TYPE:
211
212
            size = ogs_nas_eps_decode_mobile_station_classmark_2(&attach_request->mobile_station_classmark_2, pkbuf);
212
212
            if (size < 0) {
213
1
               ogs_error("ogs_nas_eps_decode_mobile_station_classmark_2() failed");
214
1
               return size;
215
1
            }
216
217
211
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_2_PRESENT;
218
211
            decoded += size;
219
211
            break;
220
209
        case OGS_NAS_EPS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_3_TYPE:
221
209
            size = ogs_nas_eps_decode_mobile_station_classmark_3(&attach_request->mobile_station_classmark_3, pkbuf);
222
209
            if (size < 0) {
223
1
               ogs_error("ogs_nas_eps_decode_mobile_station_classmark_3() failed");
224
1
               return size;
225
1
            }
226
227
208
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_MOBILE_STATION_CLASSMARK_3_PRESENT;
228
208
            decoded += size;
229
208
            break;
230
211
        case OGS_NAS_EPS_ATTACH_REQUEST_SUPPORTED_CODECS_TYPE:
231
211
            size = ogs_nas_eps_decode_supported_codec_list(&attach_request->supported_codecs, pkbuf);
232
211
            if (size < 0) {
233
1
               ogs_error("ogs_nas_eps_decode_supported_codec_list() failed");
234
1
               return size;
235
1
            }
236
237
210
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_SUPPORTED_CODECS_PRESENT;
238
210
            decoded += size;
239
210
            break;
240
2.50k
        case OGS_NAS_EPS_ATTACH_REQUEST_ADDITIONAL_UPDATE_TYPE_TYPE:
241
2.50k
            decoded--;
242
2.50k
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
243
2.50k
            size = ogs_nas_eps_decode_additional_update_type(&attach_request->additional_update_type, pkbuf);
244
2.50k
            if (size < 0) {
245
0
               ogs_error("ogs_nas_eps_decode_additional_update_type() failed");
246
0
               return size;
247
0
            }
248
249
2.50k
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_ADDITIONAL_UPDATE_TYPE_PRESENT;
250
2.50k
            decoded += size;
251
2.50k
            break;
252
216
        case OGS_NAS_EPS_ATTACH_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_TYPE:
253
216
            size = ogs_nas_eps_decode_voice_domain_preference_and_ue_usage_setting(&attach_request->voice_domain_preference_and_ue_usage_setting, pkbuf);
254
216
            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
215
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_PRESENT;
260
215
            decoded += size;
261
215
            break;
262
758
        case OGS_NAS_EPS_ATTACH_REQUEST_DEVICE_PROPERTIES_TYPE:
263
758
            decoded--;
264
758
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
265
758
            size = ogs_nas_eps_decode_device_properties(&attach_request->device_properties, pkbuf);
266
758
            if (size < 0) {
267
0
               ogs_error("ogs_nas_eps_decode_device_properties() failed");
268
0
               return size;
269
0
            }
270
271
758
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_DEVICE_PROPERTIES_PRESENT;
272
758
            decoded += size;
273
758
            break;
274
559
        case OGS_NAS_EPS_ATTACH_REQUEST_OLD_GUTI_TYPE_TYPE:
275
559
            decoded--;
276
559
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
277
559
            size = ogs_nas_eps_decode_guti_type(&attach_request->old_guti_type, pkbuf);
278
559
            if (size < 0) {
279
0
               ogs_error("ogs_nas_eps_decode_guti_type() failed");
280
0
               return size;
281
0
            }
282
283
559
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_OLD_GUTI_TYPE_PRESENT;
284
559
            decoded += size;
285
559
            break;
286
658
        case OGS_NAS_EPS_ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_TYPE:
287
658
            decoded--;
288
658
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
289
658
            size = ogs_nas_eps_decode_ms_network_feature_support(&attach_request->ms_network_feature_support, pkbuf);
290
658
            if (size < 0) {
291
0
               ogs_error("ogs_nas_eps_decode_ms_network_feature_support() failed");
292
0
               return size;
293
0
            }
294
295
658
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_PRESENT;
296
658
            decoded += size;
297
658
            break;
298
209
        case OGS_NAS_EPS_ATTACH_REQUEST_TMSI_BASED_NRI_CONTAINER_TYPE:
299
209
            size = ogs_nas_eps_decode_network_resource_identifier_container(&attach_request->tmsi_based_nri_container, pkbuf);
300
209
            if (size < 0) {
301
3
               ogs_error("ogs_nas_eps_decode_network_resource_identifier_container() failed");
302
3
               return size;
303
3
            }
304
305
206
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_TMSI_BASED_NRI_CONTAINER_PRESENT;
306
206
            decoded += size;
307
206
            break;
308
222
        case OGS_NAS_EPS_ATTACH_REQUEST_T3324_VALUE_TYPE:
309
222
            size = ogs_nas_eps_decode_gprs_timer_2(&attach_request->t3324_value, pkbuf);
310
222
            if (size < 0) {
311
2
               ogs_error("ogs_nas_eps_decode_gprs_timer_2() failed");
312
2
               return size;
313
2
            }
314
315
220
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_T3324_VALUE_PRESENT;
316
220
            decoded += size;
317
220
            break;
318
200
        case OGS_NAS_EPS_ATTACH_REQUEST_T3412_EXTENDED_VALUE_TYPE:
319
200
            size = ogs_nas_eps_decode_gprs_timer_3(&attach_request->t3412_extended_value, pkbuf);
320
200
            if (size < 0) {
321
1
               ogs_error("ogs_nas_eps_decode_gprs_timer_3() failed");
322
1
               return size;
323
1
            }
324
325
199
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_T3412_EXTENDED_VALUE_PRESENT;
326
199
            decoded += size;
327
199
            break;
328
209
        case OGS_NAS_EPS_ATTACH_REQUEST_EXTENDED_DRX_PARAMETERS_TYPE:
329
209
            size = ogs_nas_eps_decode_extended_drx_parameters(&attach_request->extended_drx_parameters, pkbuf);
330
209
            if (size < 0) {
331
2
               ogs_error("ogs_nas_eps_decode_extended_drx_parameters() failed");
332
2
               return size;
333
2
            }
334
335
207
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_EXTENDED_DRX_PARAMETERS_PRESENT;
336
207
            decoded += size;
337
207
            break;
338
226
        case OGS_NAS_EPS_ATTACH_REQUEST_UE_ADDITIONAL_SECURITY_CAPABILITY_TYPE:
339
226
            size = ogs_nas_eps_decode_ue_additional_security_capability(&attach_request->ue_additional_security_capability, pkbuf);
340
226
            if (size < 0) {
341
1
               ogs_error("ogs_nas_eps_decode_ue_additional_security_capability() failed");
342
1
               return size;
343
1
            }
344
345
225
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_UE_ADDITIONAL_SECURITY_CAPABILITY_PRESENT;
346
225
            decoded += size;
347
225
            break;
348
204
        case OGS_NAS_EPS_ATTACH_REQUEST_UE_STATUS_TYPE:
349
204
            size = ogs_nas_eps_decode_ue_status(&attach_request->ue_status, pkbuf);
350
204
            if (size < 0) {
351
1
               ogs_error("ogs_nas_eps_decode_ue_status() failed");
352
1
               return size;
353
1
            }
354
355
203
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_UE_STATUS_PRESENT;
356
203
            decoded += size;
357
203
            break;
358
339
        case OGS_NAS_EPS_ATTACH_REQUEST_ADDITIONAL_INFORMATION_REQUESTED_TYPE:
359
339
            size = ogs_nas_eps_decode_additional_information_requested(&attach_request->additional_information_requested, pkbuf);
360
339
            if (size < 0) {
361
1
               ogs_error("ogs_nas_eps_decode_additional_information_requested() failed");
362
1
               return size;
363
1
            }
364
365
338
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_ADDITIONAL_INFORMATION_REQUESTED_PRESENT;
366
338
            decoded += size;
367
338
            break;
368
198
        case OGS_NAS_EPS_ATTACH_REQUEST_N1_UE_NETWORK_CAPABILITY_TYPE:
369
198
            size = ogs_nas_eps_decode_n1_ue_network_capability(&attach_request->n1_ue_network_capability, pkbuf);
370
198
            if (size < 0) {
371
1
               ogs_error("ogs_nas_eps_decode_n1_ue_network_capability() failed");
372
1
               return size;
373
1
            }
374
375
197
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_N1_UE_NETWORK_CAPABILITY_PRESENT;
376
197
            decoded += size;
377
197
            break;
378
206
        case OGS_NAS_EPS_ATTACH_REQUEST_UE_RADIO_CAPABILITY_ID_AVAILABILITY_TYPE:
379
206
            size = ogs_nas_eps_decode_ue_radio_capability_id_availability(&attach_request->ue_radio_capability_id_availability, pkbuf);
380
206
            if (size < 0) {
381
2
               ogs_error("ogs_nas_eps_decode_ue_radio_capability_id_availability() failed");
382
2
               return size;
383
2
            }
384
385
204
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_UE_RADIO_CAPABILITY_ID_AVAILABILITY_PRESENT;
386
204
            decoded += size;
387
204
            break;
388
345
        case OGS_NAS_EPS_ATTACH_REQUEST_REQUESTED_WUS_ASSISTANCE_INFORMATION_TYPE:
389
345
            size = ogs_nas_eps_decode_wus_assistance_information(&attach_request->requested_wus_assistance_information, pkbuf);
390
345
            if (size < 0) {
391
1
               ogs_error("ogs_nas_eps_decode_wus_assistance_information() failed");
392
1
               return size;
393
1
            }
394
395
344
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_REQUESTED_WUS_ASSISTANCE_INFORMATION_PRESENT;
396
344
            decoded += size;
397
344
            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
351
        case OGS_NAS_EPS_ATTACH_REQUEST_REQUESTED_IMSI_OFFSET_TYPE:
409
351
            size = ogs_nas_eps_decode_imsi_offset(&attach_request->requested_imsi_offset, pkbuf);
410
351
            if (size < 0) {
411
1
               ogs_error("ogs_nas_eps_decode_imsi_offset() failed");
412
1
               return size;
413
1
            }
414
415
350
            attach_request->presencemask |= OGS_NAS_EPS_ATTACH_REQUEST_REQUESTED_IMSI_OFFSET_PRESENT;
416
350
            decoded += size;
417
350
            break;
418
5.23k
        default:
419
5.23k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
420
5.23k
            break;
421
15.4k
        }
422
15.4k
    }
423
424
298
    return decoded;
425
325
}
426
427
int ogs_nas_eps_decode_attach_accept(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
428
362
{
429
362
    ogs_nas_eps_attach_accept_t *attach_accept = &message->emm.attach_accept;
430
362
    int decoded = 0;
431
362
    int size = 0;
432
433
362
    ogs_trace("[NAS] Decode ATTACH_ACCEPT\n");
434
435
362
    size = ogs_nas_eps_decode_eps_attach_result(&attach_accept->eps_attach_result, pkbuf);
436
362
    if (size < 0) {
437
0
        ogs_error("ogs_nas_eps_decode_eps_attach_result() failed");
438
0
        return size;
439
0
    }
440
441
362
    decoded += size;
442
443
362
    size = ogs_nas_eps_decode_gprs_timer(&attach_accept->t3412_value, pkbuf);
444
362
    if (size < 0) {
445
0
        ogs_error("ogs_nas_eps_decode_gprs_timer() failed");
446
0
        return size;
447
0
    }
448
449
362
    decoded += size;
450
451
362
    size = ogs_nas_eps_decode_tracking_area_identity_list(&attach_accept->tai_list, pkbuf);
452
362
    if (size < 0) {
453
2
        ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
454
2
        return size;
455
2
    }
456
457
360
    decoded += size;
458
459
360
    size = ogs_nas_eps_decode_esm_message_container(&attach_accept->esm_message_container, pkbuf);
460
360
    if (size < 0) {
461
8
        ogs_error("ogs_nas_eps_decode_esm_message_container() failed");
462
8
        return size;
463
8
    }
464
465
352
    decoded += size;
466
467
16.5k
    while (pkbuf->len > 0) {
468
16.2k
        uint8_t *buffer = pkbuf->data;
469
16.2k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
470
471
16.2k
        size = sizeof(uint8_t);
472
16.2k
        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
16.2k
        decoded += size;
477
478
16.2k
        switch (type) {
479
217
        case OGS_NAS_EPS_ATTACH_ACCEPT_GUTI_TYPE:
480
217
            size = ogs_nas_eps_decode_eps_mobile_identity(&attach_accept->guti, pkbuf);
481
217
            if (size < 0) {
482
1
               ogs_error("ogs_nas_eps_decode_eps_mobile_identity() failed");
483
1
               return size;
484
1
            }
485
486
216
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_GUTI_PRESENT;
487
216
            decoded += size;
488
216
            break;
489
213
        case OGS_NAS_EPS_ATTACH_ACCEPT_LOCATION_AREA_IDENTIFICATION_TYPE:
490
213
            size = ogs_nas_eps_decode_location_area_identification(&attach_accept->location_area_identification, pkbuf);
491
213
            if (size < 0) {
492
2
               ogs_error("ogs_nas_eps_decode_location_area_identification() failed");
493
2
               return size;
494
2
            }
495
496
211
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_LOCATION_AREA_IDENTIFICATION_PRESENT;
497
211
            decoded += size;
498
211
            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
198
        case OGS_NAS_EPS_ATTACH_ACCEPT_EMM_CAUSE_TYPE:
510
198
            size = ogs_nas_eps_decode_emm_cause(&attach_accept->emm_cause, pkbuf);
511
198
            if (size < 0) {
512
1
               ogs_error("ogs_nas_eps_decode_emm_cause() failed");
513
1
               return size;
514
1
            }
515
516
197
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_EMM_CAUSE_PRESENT;
517
197
            decoded += size;
518
197
            break;
519
298
        case OGS_NAS_EPS_ATTACH_ACCEPT_T3402_VALUE_TYPE:
520
298
            size = ogs_nas_eps_decode_gprs_timer(&attach_accept->t3402_value, pkbuf);
521
298
            if (size < 0) {
522
1
               ogs_error("ogs_nas_eps_decode_gprs_timer() failed");
523
1
               return size;
524
1
            }
525
526
297
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_T3402_VALUE_PRESENT;
527
297
            decoded += size;
528
297
            break;
529
254
        case OGS_NAS_EPS_ATTACH_ACCEPT_T3423_VALUE_TYPE:
530
254
            size = ogs_nas_eps_decode_gprs_timer(&attach_accept->t3423_value, pkbuf);
531
254
            if (size < 0) {
532
1
               ogs_error("ogs_nas_eps_decode_gprs_timer() failed");
533
1
               return size;
534
1
            }
535
536
253
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_T3423_VALUE_PRESENT;
537
253
            decoded += size;
538
253
            break;
539
239
        case OGS_NAS_EPS_ATTACH_ACCEPT_EQUIVALENT_PLMNS_TYPE:
540
239
            size = ogs_nas_eps_decode_plmn_list(&attach_accept->equivalent_plmns, pkbuf);
541
239
            if (size < 0) {
542
1
               ogs_error("ogs_nas_eps_decode_plmn_list() failed");
543
1
               return size;
544
1
            }
545
546
238
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_EQUIVALENT_PLMNS_PRESENT;
547
238
            decoded += size;
548
238
            break;
549
233
        case OGS_NAS_EPS_ATTACH_ACCEPT_EMERGENCY_NUMBER_LIST_TYPE:
550
233
            size = ogs_nas_eps_decode_emergency_number_list(&attach_accept->emergency_number_list, pkbuf);
551
233
            if (size < 0) {
552
1
               ogs_error("ogs_nas_eps_decode_emergency_number_list() failed");
553
1
               return size;
554
1
            }
555
556
232
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_EMERGENCY_NUMBER_LIST_PRESENT;
557
232
            decoded += size;
558
232
            break;
559
196
        case OGS_NAS_EPS_ATTACH_ACCEPT_EPS_NETWORK_FEATURE_SUPPORT_TYPE:
560
196
            size = ogs_nas_eps_decode_eps_network_feature_support(&attach_accept->eps_network_feature_support, pkbuf);
561
196
            if (size < 0) {
562
1
               ogs_error("ogs_nas_eps_decode_eps_network_feature_support() failed");
563
1
               return size;
564
1
            }
565
566
195
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_EPS_NETWORK_FEATURE_SUPPORT_PRESENT;
567
195
            decoded += size;
568
195
            break;
569
1.51k
        case OGS_NAS_EPS_ATTACH_ACCEPT_ADDITIONAL_UPDATE_RESULT_TYPE:
570
1.51k
            decoded--;
571
1.51k
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
572
1.51k
            size = ogs_nas_eps_decode_additional_update_result(&attach_accept->additional_update_result, pkbuf);
573
1.51k
            if (size < 0) {
574
0
               ogs_error("ogs_nas_eps_decode_additional_update_result() failed");
575
0
               return size;
576
0
            }
577
578
1.51k
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_ADDITIONAL_UPDATE_RESULT_PRESENT;
579
1.51k
            decoded += size;
580
1.51k
            break;
581
233
        case OGS_NAS_EPS_ATTACH_ACCEPT_T3412_EXTENDED_VALUE_TYPE:
582
233
            size = ogs_nas_eps_decode_gprs_timer_3(&attach_accept->t3412_extended_value, pkbuf);
583
233
            if (size < 0) {
584
1
               ogs_error("ogs_nas_eps_decode_gprs_timer_3() failed");
585
1
               return size;
586
1
            }
587
588
232
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_T3412_EXTENDED_VALUE_PRESENT;
589
232
            decoded += size;
590
232
            break;
591
200
        case OGS_NAS_EPS_ATTACH_ACCEPT_T3324_VALUE_TYPE:
592
200
            size = ogs_nas_eps_decode_gprs_timer_2(&attach_accept->t3324_value, pkbuf);
593
200
            if (size < 0) {
594
1
               ogs_error("ogs_nas_eps_decode_gprs_timer_2() failed");
595
1
               return size;
596
1
            }
597
598
199
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_T3324_VALUE_PRESENT;
599
199
            decoded += size;
600
199
            break;
601
206
        case OGS_NAS_EPS_ATTACH_ACCEPT_EXTENDED_DRX_PARAMETERS_TYPE:
602
206
            size = ogs_nas_eps_decode_extended_drx_parameters(&attach_accept->extended_drx_parameters, pkbuf);
603
206
            if (size < 0) {
604
1
               ogs_error("ogs_nas_eps_decode_extended_drx_parameters() failed");
605
1
               return size;
606
1
            }
607
608
205
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_EXTENDED_DRX_PARAMETERS_PRESENT;
609
205
            decoded += size;
610
205
            break;
611
219
        case OGS_NAS_EPS_ATTACH_ACCEPT_DCN_ID_TYPE:
612
219
            size = ogs_nas_eps_decode_dcn_id(&attach_accept->dcn_id, pkbuf);
613
219
            if (size < 0) {
614
1
               ogs_error("ogs_nas_eps_decode_dcn_id() failed");
615
1
               return size;
616
1
            }
617
618
218
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_DCN_ID_PRESENT;
619
218
            decoded += size;
620
218
            break;
621
632
        case OGS_NAS_EPS_ATTACH_ACCEPT_SMS_SERVICES_STATUS_TYPE:
622
632
            decoded--;
623
632
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
624
632
            size = ogs_nas_eps_decode_sms_services_status(&attach_accept->sms_services_status, pkbuf);
625
632
            if (size < 0) {
626
0
               ogs_error("ogs_nas_eps_decode_sms_services_status() failed");
627
0
               return size;
628
0
            }
629
630
632
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_SMS_SERVICES_STATUS_PRESENT;
631
632
            decoded += size;
632
632
            break;
633
593
        case OGS_NAS_EPS_ATTACH_ACCEPT_NON__NW_PROVIDED_POLICIES_TYPE:
634
593
            decoded--;
635
593
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
636
593
            size = ogs_nas_eps_decode_non__nw_provided_policies(&attach_accept->non__nw_provided_policies, pkbuf);
637
593
            if (size < 0) {
638
0
               ogs_error("ogs_nas_eps_decode_non__nw_provided_policies() failed");
639
0
               return size;
640
0
            }
641
642
593
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_NON__NW_PROVIDED_POLICIES_PRESENT;
643
593
            decoded += size;
644
593
            break;
645
277
        case OGS_NAS_EPS_ATTACH_ACCEPT_T3448_VALUE_TYPE:
646
277
            size = ogs_nas_eps_decode_gprs_timer_2(&attach_accept->t3448_value, pkbuf);
647
277
            if (size < 0) {
648
1
               ogs_error("ogs_nas_eps_decode_gprs_timer_2() failed");
649
1
               return size;
650
1
            }
651
652
276
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_T3448_VALUE_PRESENT;
653
276
            decoded += size;
654
276
            break;
655
463
        case OGS_NAS_EPS_ATTACH_ACCEPT_NETWORK_POLICY_TYPE:
656
463
            decoded--;
657
463
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
658
463
            size = ogs_nas_eps_decode_network_policy(&attach_accept->network_policy, pkbuf);
659
463
            if (size < 0) {
660
0
               ogs_error("ogs_nas_eps_decode_network_policy() failed");
661
0
               return size;
662
0
            }
663
664
463
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_NETWORK_POLICY_PRESENT;
665
463
            decoded += size;
666
463
            break;
667
208
        case OGS_NAS_EPS_ATTACH_ACCEPT_T3447_VALUE_TYPE:
668
208
            size = ogs_nas_eps_decode_gprs_timer_3(&attach_accept->t3447_value, pkbuf);
669
208
            if (size < 0) {
670
1
               ogs_error("ogs_nas_eps_decode_gprs_timer_3() failed");
671
1
               return size;
672
1
            }
673
674
207
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_T3447_VALUE_PRESENT;
675
207
            decoded += size;
676
207
            break;
677
210
        case OGS_NAS_EPS_ATTACH_ACCEPT_EXTENDED_EMERGENCY_NUMBER_LIST_TYPE:
678
210
            size = ogs_nas_eps_decode_extended_emergency_number_list(&attach_accept->extended_emergency_number_list, pkbuf);
679
210
            if (size < 0) {
680
6
               ogs_error("ogs_nas_eps_decode_extended_emergency_number_list() failed");
681
6
               return size;
682
6
            }
683
684
204
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_EXTENDED_EMERGENCY_NUMBER_LIST_PRESENT;
685
204
            decoded += size;
686
204
            break;
687
205
        case OGS_NAS_EPS_ATTACH_ACCEPT_CIPHERING_KEY_DATA_TYPE:
688
205
            size = ogs_nas_eps_decode_ciphering_key_data(&attach_accept->ciphering_key_data, pkbuf);
689
205
            if (size < 0) {
690
2
               ogs_error("ogs_nas_eps_decode_ciphering_key_data() failed");
691
2
               return size;
692
2
            }
693
694
203
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_CIPHERING_KEY_DATA_PRESENT;
695
203
            decoded += size;
696
203
            break;
697
209
        case OGS_NAS_EPS_ATTACH_ACCEPT_UE_RADIO_CAPABILITY_ID_TYPE:
698
209
            size = ogs_nas_eps_decode_ue_radio_capability_id(&attach_accept->ue_radio_capability_id, pkbuf);
699
209
            if (size < 0) {
700
1
               ogs_error("ogs_nas_eps_decode_ue_radio_capability_id() failed");
701
1
               return size;
702
1
            }
703
704
208
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_UE_RADIO_CAPABILITY_ID_PRESENT;
705
208
            decoded += size;
706
208
            break;
707
691
        case OGS_NAS_EPS_ATTACH_ACCEPT_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_TYPE:
708
691
            decoded--;
709
691
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
710
691
            size = ogs_nas_eps_decode_ue_radio_capability_id_deletion_indication(&attach_accept->ue_radio_capability_id_deletion_indication, pkbuf);
711
691
            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
691
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_PRESENT;
717
691
            decoded += size;
718
691
            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
199
        case OGS_NAS_EPS_ATTACH_ACCEPT_NEGOTIATED_DRX_PARAMETER_IN_NB_S1_MODE_TYPE:
730
199
            size = ogs_nas_eps_decode_nb_s1_drx_parameter(&attach_accept->negotiated_drx_parameter_in_nb_s1_mode, pkbuf);
731
199
            if (size < 0) {
732
1
               ogs_error("ogs_nas_eps_decode_nb_s1_drx_parameter() failed");
733
1
               return size;
734
1
            }
735
736
198
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_NEGOTIATED_DRX_PARAMETER_IN_NB_S1_MODE_PRESENT;
737
198
            decoded += size;
738
198
            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
206
        case OGS_NAS_EPS_ATTACH_ACCEPT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_TYPE:
750
206
            size = ogs_nas_eps_decode_tracking_area_identity_list(&attach_accept->forbidden_tai_for_the_list_of_forbidden_tracking_areas_for_roaming, pkbuf);
751
206
            if (size < 0) {
752
1
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
753
1
               return size;
754
1
            }
755
756
205
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_PRESENT;
757
205
            decoded += size;
758
205
            break;
759
204
        case OGS_NAS_EPS_ATTACH_ACCEPT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_TYPE:
760
204
            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
204
            if (size < 0) {
762
1
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
763
1
               return size;
764
1
            }
765
766
203
            attach_accept->presencemask |= OGS_NAS_EPS_ATTACH_ACCEPT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_PRESENT;
767
203
            decoded += size;
768
203
            break;
769
7.23k
        default:
770
7.23k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
771
7.23k
            break;
772
16.2k
        }
773
16.2k
    }
774
775
322
    return decoded;
776
352
}
777
778
int ogs_nas_eps_decode_attach_complete(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
779
30
{
780
30
    ogs_nas_eps_attach_complete_t *attach_complete = &message->emm.attach_complete;
781
30
    int decoded = 0;
782
30
    int size = 0;
783
784
30
    ogs_trace("[NAS] Decode ATTACH_COMPLETE\n");
785
786
30
    size = ogs_nas_eps_decode_esm_message_container(&attach_complete->esm_message_container, pkbuf);
787
30
    if (size < 0) {
788
17
        ogs_error("ogs_nas_eps_decode_esm_message_container() failed");
789
17
        return size;
790
17
    }
791
792
13
    decoded += size;
793
794
13
    return decoded;
795
30
}
796
797
int ogs_nas_eps_decode_attach_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
798
129
{
799
129
    ogs_nas_eps_attach_reject_t *attach_reject = &message->emm.attach_reject;
800
129
    int decoded = 0;
801
129
    int size = 0;
802
803
129
    ogs_trace("[NAS] Decode ATTACH_REJECT\n");
804
805
129
    size = ogs_nas_eps_decode_emm_cause(&attach_reject->emm_cause, pkbuf);
806
129
    if (size < 0) {
807
0
        ogs_error("ogs_nas_eps_decode_emm_cause() failed");
808
0
        return size;
809
0
    }
810
811
129
    decoded += size;
812
813
7.06k
    while (pkbuf->len > 0) {
814
6.95k
        uint8_t *buffer = pkbuf->data;
815
6.95k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
816
817
6.95k
        size = sizeof(uint8_t);
818
6.95k
        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
6.95k
        decoded += size;
823
824
6.95k
        switch (type) {
825
274
        case OGS_NAS_EPS_ATTACH_REJECT_ESM_MESSAGE_CONTAINER_TYPE:
826
274
            size = ogs_nas_eps_decode_esm_message_container(&attach_reject->esm_message_container, pkbuf);
827
274
            if (size < 0) {
828
8
               ogs_error("ogs_nas_eps_decode_esm_message_container() failed");
829
8
               return size;
830
8
            }
831
832
266
            attach_reject->presencemask |= OGS_NAS_EPS_ATTACH_REJECT_ESM_MESSAGE_CONTAINER_PRESENT;
833
266
            decoded += size;
834
266
            break;
835
312
        case OGS_NAS_EPS_ATTACH_REJECT_T3346_VALUE_TYPE:
836
312
            size = ogs_nas_eps_decode_gprs_timer_2(&attach_reject->t3346_value, pkbuf);
837
312
            if (size < 0) {
838
2
               ogs_error("ogs_nas_eps_decode_gprs_timer_2() failed");
839
2
               return size;
840
2
            }
841
842
310
            attach_reject->presencemask |= OGS_NAS_EPS_ATTACH_REJECT_T3346_VALUE_PRESENT;
843
310
            decoded += size;
844
310
            break;
845
199
        case OGS_NAS_EPS_ATTACH_REJECT_T3402_VALUE_TYPE:
846
199
            size = ogs_nas_eps_decode_gprs_timer_2(&attach_reject->t3402_value, pkbuf);
847
199
            if (size < 0) {
848
2
               ogs_error("ogs_nas_eps_decode_gprs_timer_2() failed");
849
2
               return size;
850
2
            }
851
852
197
            attach_reject->presencemask |= OGS_NAS_EPS_ATTACH_REJECT_T3402_VALUE_PRESENT;
853
197
            decoded += size;
854
197
            break;
855
676
        case OGS_NAS_EPS_ATTACH_REJECT_EXTENDED_EMM_CAUSE_TYPE:
856
676
            decoded--;
857
676
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
858
676
            size = ogs_nas_eps_decode_extended_emm_cause(&attach_reject->extended_emm_cause, pkbuf);
859
676
            if (size < 0) {
860
0
               ogs_error("ogs_nas_eps_decode_extended_emm_cause() failed");
861
0
               return size;
862
0
            }
863
864
676
            attach_reject->presencemask |= OGS_NAS_EPS_ATTACH_REJECT_EXTENDED_EMM_CAUSE_PRESENT;
865
676
            decoded += size;
866
676
            break;
867
290
        case OGS_NAS_EPS_ATTACH_REJECT_LOWER_BOUND_TIMER_VALUE_TYPE:
868
290
            size = ogs_nas_eps_decode_gprs_timer_3(&attach_reject->lower_bound_timer_value, pkbuf);
869
290
            if (size < 0) {
870
5
               ogs_error("ogs_nas_eps_decode_gprs_timer_3() failed");
871
5
               return size;
872
5
            }
873
874
285
            attach_reject->presencemask |= OGS_NAS_EPS_ATTACH_REJECT_LOWER_BOUND_TIMER_VALUE_PRESENT;
875
285
            decoded += size;
876
285
            break;
877
281
        case OGS_NAS_EPS_ATTACH_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_TYPE:
878
281
            size = ogs_nas_eps_decode_tracking_area_identity_list(&attach_reject->forbidden_tai_for_the_list_of_forbidden_tracking_areas_for_roaming, pkbuf);
879
281
            if (size < 0) {
880
2
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
881
2
               return size;
882
2
            }
883
884
279
            attach_reject->presencemask |= OGS_NAS_EPS_ATTACH_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_PRESENT;
885
279
            decoded += size;
886
279
            break;
887
272
        case OGS_NAS_EPS_ATTACH_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_TYPE:
888
272
            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
272
            if (size < 0) {
890
1
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
891
1
               return size;
892
1
            }
893
894
271
            attach_reject->presencemask |= OGS_NAS_EPS_ATTACH_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_PRESENT;
895
271
            decoded += size;
896
271
            break;
897
4.65k
        default:
898
4.65k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
899
4.65k
            break;
900
6.95k
        }
901
6.95k
    }
902
903
109
    return decoded;
904
129
}
905
906
int ogs_nas_eps_decode_detach_request_from_ue(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
907
12
{
908
12
    ogs_nas_eps_detach_request_from_ue_t *detach_request_from_ue = &message->emm.detach_request_from_ue;
909
12
    int decoded = 0;
910
12
    int size = 0;
911
912
12
    ogs_trace("[NAS] Decode DETACH_REQUEST\n");
913
914
12
    size = ogs_nas_eps_decode_detach_type(&detach_request_from_ue->detach_type, pkbuf);
915
12
    if (size < 0) {
916
0
        ogs_error("ogs_nas_eps_decode_detach_type() failed");
917
0
        return size;
918
0
    }
919
920
12
    decoded += size;
921
922
12
    size = ogs_nas_eps_decode_eps_mobile_identity(&detach_request_from_ue->eps_mobile_identity, pkbuf);
923
12
    if (size < 0) {
924
1
        ogs_error("ogs_nas_eps_decode_eps_mobile_identity() failed");
925
1
        return size;
926
1
    }
927
928
11
    decoded += size;
929
930
11
    return decoded;
931
12
}
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
649
{
1012
649
    ogs_nas_eps_tracking_area_update_request_t *tracking_area_update_request = &message->emm.tracking_area_update_request;
1013
649
    int decoded = 0;
1014
649
    int size = 0;
1015
1016
649
    ogs_trace("[NAS] Decode TRACKING_AREA_UPDATE_REQUEST\n");
1017
1018
649
    size = ogs_nas_eps_decode_eps_update_type(&tracking_area_update_request->eps_update_type, pkbuf);
1019
649
    if (size < 0) {
1020
0
        ogs_error("ogs_nas_eps_decode_eps_update_type() failed");
1021
0
        return size;
1022
0
    }
1023
1024
649
    decoded += size;
1025
1026
649
    size = ogs_nas_eps_decode_eps_mobile_identity(&tracking_area_update_request->old_guti, pkbuf);
1027
649
    if (size < 0) {
1028
4
        ogs_error("ogs_nas_eps_decode_eps_mobile_identity() failed");
1029
4
        return size;
1030
4
    }
1031
1032
645
    decoded += size;
1033
1034
36.2k
    while (pkbuf->len > 0) {
1035
35.7k
        uint8_t *buffer = pkbuf->data;
1036
35.7k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
1037
1038
35.7k
        size = sizeof(uint8_t);
1039
35.7k
        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
35.7k
        decoded += size;
1044
1045
35.7k
        switch (type) {
1046
1.00k
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_NON_CURRENT_NATIVE_NAS_KEY_SET_IDENTIFIER_TYPE:
1047
1.00k
            decoded--;
1048
1.00k
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1049
1.00k
            size = ogs_nas_eps_decode_key_set_identifier(&tracking_area_update_request->non_current_native_nas_key_set_identifier, pkbuf);
1050
1.00k
            if (size < 0) {
1051
0
               ogs_error("ogs_nas_eps_decode_key_set_identifier() failed");
1052
0
               return size;
1053
0
            }
1054
1055
1.00k
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_NON_CURRENT_NATIVE_NAS_KEY_SET_IDENTIFIER_PRESENT;
1056
1.00k
            decoded += size;
1057
1.00k
            break;
1058
1.03k
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_GPRS_CIPHERING_KEY_SEQUENCE_NUMBER_TYPE:
1059
1.03k
            decoded--;
1060
1.03k
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1061
1.03k
            size = ogs_nas_eps_decode_ciphering_key_sequence_number(&tracking_area_update_request->gprs_ciphering_key_sequence_number, pkbuf);
1062
1.03k
            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.03k
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_GPRS_CIPHERING_KEY_SEQUENCE_NUMBER_PRESENT;
1068
1.03k
            decoded += size;
1069
1.03k
            break;
1070
375
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_OLD_P_TMSI_SIGNATURE_TYPE:
1071
375
            size = ogs_nas_eps_decode_p_tmsi_signature(&tracking_area_update_request->old_p_tmsi_signature, pkbuf);
1072
375
            if (size < 0) {
1073
3
               ogs_error("ogs_nas_eps_decode_p_tmsi_signature() failed");
1074
3
               return size;
1075
3
            }
1076
1077
372
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_OLD_P_TMSI_SIGNATURE_PRESENT;
1078
372
            decoded += size;
1079
372
            break;
1080
603
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_GUTI_TYPE:
1081
603
            size = ogs_nas_eps_decode_eps_mobile_identity(&tracking_area_update_request->additional_guti, pkbuf);
1082
603
            if (size < 0) {
1083
6
               ogs_error("ogs_nas_eps_decode_eps_mobile_identity() failed");
1084
6
               return size;
1085
6
            }
1086
1087
597
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_GUTI_PRESENT;
1088
597
            decoded += size;
1089
597
            break;
1090
282
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_NONCEUE_TYPE:
1091
282
            size = ogs_nas_eps_decode_nonce(&tracking_area_update_request->nonceue, pkbuf);
1092
282
            if (size < 0) {
1093
5
               ogs_error("ogs_nas_eps_decode_nonce() failed");
1094
5
               return size;
1095
5
            }
1096
1097
277
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_NONCEUE_PRESENT;
1098
277
            decoded += size;
1099
277
            break;
1100
386
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_NETWORK_CAPABILITY_TYPE:
1101
386
            size = ogs_nas_eps_decode_ue_network_capability(&tracking_area_update_request->ue_network_capability, pkbuf);
1102
386
            if (size < 0) {
1103
6
               ogs_error("ogs_nas_eps_decode_ue_network_capability() failed");
1104
6
               return size;
1105
6
            }
1106
1107
380
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_NETWORK_CAPABILITY_PRESENT;
1108
380
            decoded += size;
1109
380
            break;
1110
519
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_LAST_VISITED_REGISTERED_TAI_TYPE:
1111
519
            size = ogs_nas_eps_decode_tracking_area_identity(&tracking_area_update_request->last_visited_registered_tai, pkbuf);
1112
519
            if (size < 0) {
1113
8
               ogs_error("ogs_nas_eps_decode_tracking_area_identity() failed");
1114
8
               return size;
1115
8
            }
1116
1117
511
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_LAST_VISITED_REGISTERED_TAI_PRESENT;
1118
511
            decoded += size;
1119
511
            break;
1120
452
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_DRX_PARAMETER_TYPE:
1121
452
            size = ogs_nas_eps_decode_drx_parameter(&tracking_area_update_request->drx_parameter, pkbuf);
1122
452
            if (size < 0) {
1123
4
               ogs_error("ogs_nas_eps_decode_drx_parameter() failed");
1124
4
               return size;
1125
4
            }
1126
1127
448
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_DRX_PARAMETER_PRESENT;
1128
448
            decoded += size;
1129
448
            break;
1130
886
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_RADIO_CAPABILITY_INFORMATION_UPDATE_NEEDED_TYPE:
1131
886
            decoded--;
1132
886
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1133
886
            size = ogs_nas_eps_decode_ue_radio_capability_information_update_needed(&tracking_area_update_request->ue_radio_capability_information_update_needed, pkbuf);
1134
886
            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
886
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_RADIO_CAPABILITY_INFORMATION_UPDATE_NEEDED_PRESENT;
1140
886
            decoded += size;
1141
886
            break;
1142
227
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_EPS_BEARER_CONTEXT_STATUS_TYPE:
1143
227
            size = ogs_nas_eps_decode_eps_bearer_context_status(&tracking_area_update_request->eps_bearer_context_status, pkbuf);
1144
227
            if (size < 0) {
1145
2
               ogs_error("ogs_nas_eps_decode_eps_bearer_context_status() failed");
1146
2
               return size;
1147
2
            }
1148
1149
225
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_EPS_BEARER_CONTEXT_STATUS_PRESENT;
1150
225
            decoded += size;
1151
225
            break;
1152
295
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_MS_NETWORK_CAPABILITY_TYPE:
1153
295
            size = ogs_nas_eps_decode_ms_network_capability(&tracking_area_update_request->ms_network_capability, pkbuf);
1154
295
            if (size < 0) {
1155
9
               ogs_error("ogs_nas_eps_decode_ms_network_capability() failed");
1156
9
               return size;
1157
9
            }
1158
1159
286
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_MS_NETWORK_CAPABILITY_PRESENT;
1160
286
            decoded += size;
1161
286
            break;
1162
441
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_TYPE:
1163
441
            size = ogs_nas_eps_decode_location_area_identification(&tracking_area_update_request->old_location_area_identification, pkbuf);
1164
441
            if (size < 0) {
1165
2
               ogs_error("ogs_nas_eps_decode_location_area_identification() failed");
1166
2
               return size;
1167
2
            }
1168
1169
439
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_PRESENT;
1170
439
            decoded += size;
1171
439
            break;
1172
993
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_TMSI_STATUS_TYPE:
1173
993
            decoded--;
1174
993
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1175
993
            size = ogs_nas_eps_decode_tmsi_status(&tracking_area_update_request->tmsi_status, pkbuf);
1176
993
            if (size < 0) {
1177
0
               ogs_error("ogs_nas_eps_decode_tmsi_status() failed");
1178
0
               return size;
1179
0
            }
1180
1181
993
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_TMSI_STATUS_PRESENT;
1182
993
            decoded += size;
1183
993
            break;
1184
291
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_MOBILE_STATION_CLASSMARK_2_TYPE:
1185
291
            size = ogs_nas_eps_decode_mobile_station_classmark_2(&tracking_area_update_request->mobile_station_classmark_2, pkbuf);
1186
291
            if (size < 0) {
1187
9
               ogs_error("ogs_nas_eps_decode_mobile_station_classmark_2() failed");
1188
9
               return size;
1189
9
            }
1190
1191
282
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_MOBILE_STATION_CLASSMARK_2_PRESENT;
1192
282
            decoded += size;
1193
282
            break;
1194
285
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_MOBILE_STATION_CLASSMARK_3_TYPE:
1195
285
            size = ogs_nas_eps_decode_mobile_station_classmark_3(&tracking_area_update_request->mobile_station_classmark_3, pkbuf);
1196
285
            if (size < 0) {
1197
7
               ogs_error("ogs_nas_eps_decode_mobile_station_classmark_3() failed");
1198
7
               return size;
1199
7
            }
1200
1201
278
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_MOBILE_STATION_CLASSMARK_3_PRESENT;
1202
278
            decoded += size;
1203
278
            break;
1204
282
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_SUPPORTED_CODECS_TYPE:
1205
282
            size = ogs_nas_eps_decode_supported_codec_list(&tracking_area_update_request->supported_codecs, pkbuf);
1206
282
            if (size < 0) {
1207
6
               ogs_error("ogs_nas_eps_decode_supported_codec_list() failed");
1208
6
               return size;
1209
6
            }
1210
1211
276
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_SUPPORTED_CODECS_PRESENT;
1212
276
            decoded += size;
1213
276
            break;
1214
5.29k
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_UPDATE_TYPE_TYPE:
1215
5.29k
            decoded--;
1216
5.29k
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1217
5.29k
            size = ogs_nas_eps_decode_additional_update_type(&tracking_area_update_request->additional_update_type, pkbuf);
1218
5.29k
            if (size < 0) {
1219
0
               ogs_error("ogs_nas_eps_decode_additional_update_type() failed");
1220
0
               return size;
1221
0
            }
1222
1223
5.29k
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_UPDATE_TYPE_PRESENT;
1224
5.29k
            decoded += size;
1225
5.29k
            break;
1226
238
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_TYPE:
1227
238
            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
238
            if (size < 0) {
1229
6
               ogs_error("ogs_nas_eps_decode_voice_domain_preference_and_ue_usage_setting() failed");
1230
6
               return size;
1231
6
            }
1232
1233
232
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_PRESENT;
1234
232
            decoded += size;
1235
232
            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.01k
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_DEVICE_PROPERTIES_TYPE:
1249
1.01k
            decoded--;
1250
1.01k
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1251
1.01k
            size = ogs_nas_eps_decode_device_properties(&tracking_area_update_request->device_properties, pkbuf);
1252
1.01k
            if (size < 0) {
1253
0
               ogs_error("ogs_nas_eps_decode_device_properties() failed");
1254
0
               return size;
1255
0
            }
1256
1257
1.01k
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_DEVICE_PROPERTIES_PRESENT;
1258
1.01k
            decoded += size;
1259
1.01k
            break;
1260
1.56k
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_MS_NETWORK_FEATURE_SUPPORT_TYPE:
1261
1.56k
            decoded--;
1262
1.56k
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1263
1.56k
            size = ogs_nas_eps_decode_ms_network_feature_support(&tracking_area_update_request->ms_network_feature_support, pkbuf);
1264
1.56k
            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.56k
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_MS_NETWORK_FEATURE_SUPPORT_PRESENT;
1270
1.56k
            decoded += size;
1271
1.56k
            break;
1272
407
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_TMSI_BASED_NRI_CONTAINER_TYPE:
1273
407
            size = ogs_nas_eps_decode_network_resource_identifier_container(&tracking_area_update_request->tmsi_based_nri_container, pkbuf);
1274
407
            if (size < 0) {
1275
14
               ogs_error("ogs_nas_eps_decode_network_resource_identifier_container() failed");
1276
14
               return size;
1277
14
            }
1278
1279
393
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_TMSI_BASED_NRI_CONTAINER_PRESENT;
1280
393
            decoded += size;
1281
393
            break;
1282
228
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_T3324_VALUE_TYPE:
1283
228
            size = ogs_nas_eps_decode_gprs_timer_2(&tracking_area_update_request->t3324_value, pkbuf);
1284
228
            if (size < 0) {
1285
1
               ogs_error("ogs_nas_eps_decode_gprs_timer_2() failed");
1286
1
               return size;
1287
1
            }
1288
1289
227
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_T3324_VALUE_PRESENT;
1290
227
            decoded += size;
1291
227
            break;
1292
260
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_T3412_EXTENDED_VALUE_TYPE:
1293
260
            size = ogs_nas_eps_decode_gprs_timer_3(&tracking_area_update_request->t3412_extended_value, pkbuf);
1294
260
            if (size < 0) {
1295
2
               ogs_error("ogs_nas_eps_decode_gprs_timer_3() failed");
1296
2
               return size;
1297
2
            }
1298
1299
258
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_T3412_EXTENDED_VALUE_PRESENT;
1300
258
            decoded += size;
1301
258
            break;
1302
212
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_EXTENDED_DRX_PARAMETERS_TYPE:
1303
212
            size = ogs_nas_eps_decode_extended_drx_parameters(&tracking_area_update_request->extended_drx_parameters, pkbuf);
1304
212
            if (size < 0) {
1305
2
               ogs_error("ogs_nas_eps_decode_extended_drx_parameters() failed");
1306
2
               return size;
1307
2
            }
1308
1309
210
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_EXTENDED_DRX_PARAMETERS_PRESENT;
1310
210
            decoded += size;
1311
210
            break;
1312
374
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_ADDITIONAL_SECURITY_CAPABILITY_TYPE:
1313
374
            size = ogs_nas_eps_decode_ue_additional_security_capability(&tracking_area_update_request->ue_additional_security_capability, pkbuf);
1314
374
            if (size < 0) {
1315
7
               ogs_error("ogs_nas_eps_decode_ue_additional_security_capability() failed");
1316
7
               return size;
1317
7
            }
1318
1319
367
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_ADDITIONAL_SECURITY_CAPABILITY_PRESENT;
1320
367
            decoded += size;
1321
367
            break;
1322
274
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_STATUS_TYPE:
1323
274
            size = ogs_nas_eps_decode_ue_status(&tracking_area_update_request->ue_status, pkbuf);
1324
274
            if (size < 0) {
1325
9
               ogs_error("ogs_nas_eps_decode_ue_status() failed");
1326
9
               return size;
1327
9
            }
1328
1329
265
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_STATUS_PRESENT;
1330
265
            decoded += size;
1331
265
            break;
1332
437
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_INFORMATION_REQUESTED_TYPE:
1333
437
            size = ogs_nas_eps_decode_additional_information_requested(&tracking_area_update_request->additional_information_requested, pkbuf);
1334
437
            if (size < 0) {
1335
9
               ogs_error("ogs_nas_eps_decode_additional_information_requested() failed");
1336
9
               return size;
1337
9
            }
1338
1339
428
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_ADDITIONAL_INFORMATION_REQUESTED_PRESENT;
1340
428
            decoded += size;
1341
428
            break;
1342
406
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_N1_UE_NETWORK_CAPABILITY_TYPE:
1343
406
            size = ogs_nas_eps_decode_n1_ue_network_capability(&tracking_area_update_request->n1_ue_network_capability, pkbuf);
1344
406
            if (size < 0) {
1345
10
               ogs_error("ogs_nas_eps_decode_n1_ue_network_capability() failed");
1346
10
               return size;
1347
10
            }
1348
1349
396
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_N1_UE_NETWORK_CAPABILITY_PRESENT;
1350
396
            decoded += size;
1351
396
            break;
1352
353
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_RADIO_CAPABILITY_ID_AVAILABILITY_TYPE:
1353
353
            size = ogs_nas_eps_decode_ue_radio_capability_id_availability(&tracking_area_update_request->ue_radio_capability_id_availability, pkbuf);
1354
353
            if (size < 0) {
1355
12
               ogs_error("ogs_nas_eps_decode_ue_radio_capability_id_availability() failed");
1356
12
               return size;
1357
12
            }
1358
1359
341
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_RADIO_CAPABILITY_ID_AVAILABILITY_PRESENT;
1360
341
            decoded += size;
1361
341
            break;
1362
246
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_REQUESTED_WUS_ASSISTANCE_INFORMATION_TYPE:
1363
246
            size = ogs_nas_eps_decode_wus_assistance_information(&tracking_area_update_request->requested_wus_assistance_information, pkbuf);
1364
246
            if (size < 0) {
1365
1
               ogs_error("ogs_nas_eps_decode_wus_assistance_information() failed");
1366
1
               return size;
1367
1
            }
1368
1369
245
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_REQUESTED_WUS_ASSISTANCE_INFORMATION_PRESENT;
1370
245
            decoded += size;
1371
245
            break;
1372
245
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_DRX_PARAMETER_IN_NB_S1_MODE_TYPE:
1373
245
            size = ogs_nas_eps_decode_nb_s1_drx_parameter(&tracking_area_update_request->drx_parameter_in_nb_s1_mode, pkbuf);
1374
245
            if (size < 0) {
1375
2
               ogs_error("ogs_nas_eps_decode_nb_s1_drx_parameter() failed");
1376
2
               return size;
1377
2
            }
1378
1379
243
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_DRX_PARAMETER_IN_NB_S1_MODE_PRESENT;
1380
243
            decoded += size;
1381
243
            break;
1382
254
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_REQUESTED_IMSI_OFFSET_TYPE:
1383
254
            size = ogs_nas_eps_decode_imsi_offset(&tracking_area_update_request->requested_imsi_offset, pkbuf);
1384
254
            if (size < 0) {
1385
3
               ogs_error("ogs_nas_eps_decode_imsi_offset() failed");
1386
3
               return size;
1387
3
            }
1388
1389
251
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_REQUESTED_IMSI_OFFSET_PRESENT;
1390
251
            decoded += size;
1391
251
            break;
1392
439
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_REQUEST_TYPE_TYPE:
1393
439
            size = ogs_nas_eps_decode_ue_request_type(&tracking_area_update_request->ue_request_type, pkbuf);
1394
439
            if (size < 0) {
1395
7
               ogs_error("ogs_nas_eps_decode_ue_request_type() failed");
1396
7
               return size;
1397
7
            }
1398
1399
432
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_UE_REQUEST_TYPE_PRESENT;
1400
432
            decoded += size;
1401
432
            break;
1402
438
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_PAGING_RESTRICTION_TYPE:
1403
438
            size = ogs_nas_eps_decode_paging_restriction(&tracking_area_update_request->paging_restriction, pkbuf);
1404
438
            if (size < 0) {
1405
8
               ogs_error("ogs_nas_eps_decode_paging_restriction() failed");
1406
8
               return size;
1407
8
            }
1408
1409
430
            tracking_area_update_request->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST_PAGING_RESTRICTION_PRESENT;
1410
430
            decoded += size;
1411
430
            break;
1412
13.6k
        default:
1413
13.6k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
1414
13.6k
            break;
1415
35.7k
        }
1416
35.7k
    }
1417
1418
485
    return decoded;
1419
645
}
1420
1421
int ogs_nas_eps_decode_tracking_area_update_accept(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
1422
676
{
1423
676
    ogs_nas_eps_tracking_area_update_accept_t *tracking_area_update_accept = &message->emm.tracking_area_update_accept;
1424
676
    int decoded = 0;
1425
676
    int size = 0;
1426
1427
676
    ogs_trace("[NAS] Decode TRACKING_AREA_UPDATE_ACCEPT\n");
1428
1429
676
    size = ogs_nas_eps_decode_eps_update_result(&tracking_area_update_accept->eps_update_result, pkbuf);
1430
676
    if (size < 0) {
1431
0
        ogs_error("ogs_nas_eps_decode_eps_update_result() failed");
1432
0
        return size;
1433
0
    }
1434
1435
676
    decoded += size;
1436
1437
29.4k
    while (pkbuf->len > 0) {
1438
28.9k
        uint8_t *buffer = pkbuf->data;
1439
28.9k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
1440
1441
28.9k
        size = sizeof(uint8_t);
1442
28.9k
        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
28.9k
        decoded += size;
1447
1448
28.9k
        switch (type) {
1449
228
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3412_VALUE_TYPE:
1450
228
            size = ogs_nas_eps_decode_gprs_timer(&tracking_area_update_accept->t3412_value, pkbuf);
1451
228
            if (size < 0) {
1452
2
               ogs_error("ogs_nas_eps_decode_gprs_timer() failed");
1453
2
               return size;
1454
2
            }
1455
1456
226
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3412_VALUE_PRESENT;
1457
226
            decoded += size;
1458
226
            break;
1459
268
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_GUTI_TYPE:
1460
268
            size = ogs_nas_eps_decode_eps_mobile_identity(&tracking_area_update_accept->guti, pkbuf);
1461
268
            if (size < 0) {
1462
1
               ogs_error("ogs_nas_eps_decode_eps_mobile_identity() failed");
1463
1
               return size;
1464
1
            }
1465
1466
267
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_GUTI_PRESENT;
1467
267
            decoded += size;
1468
267
            break;
1469
216
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_TAI_LIST_TYPE:
1470
216
            size = ogs_nas_eps_decode_tracking_area_identity_list(&tracking_area_update_accept->tai_list, pkbuf);
1471
216
            if (size < 0) {
1472
4
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
1473
4
               return size;
1474
4
            }
1475
1476
212
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_TAI_LIST_PRESENT;
1477
212
            decoded += size;
1478
212
            break;
1479
490
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EPS_BEARER_CONTEXT_STATUS_TYPE:
1480
490
            size = ogs_nas_eps_decode_eps_bearer_context_status(&tracking_area_update_accept->eps_bearer_context_status, pkbuf);
1481
490
            if (size < 0) {
1482
14
               ogs_error("ogs_nas_eps_decode_eps_bearer_context_status() failed");
1483
14
               return size;
1484
14
            }
1485
1486
476
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EPS_BEARER_CONTEXT_STATUS_PRESENT;
1487
476
            decoded += size;
1488
476
            break;
1489
386
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_LOCATION_AREA_IDENTIFICATION_TYPE:
1490
386
            size = ogs_nas_eps_decode_location_area_identification(&tracking_area_update_accept->location_area_identification, pkbuf);
1491
386
            if (size < 0) {
1492
6
               ogs_error("ogs_nas_eps_decode_location_area_identification() failed");
1493
6
               return size;
1494
6
            }
1495
1496
380
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_LOCATION_AREA_IDENTIFICATION_PRESENT;
1497
380
            decoded += size;
1498
380
            break;
1499
290
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_MS_IDENTITY_TYPE:
1500
290
            size = ogs_nas_eps_decode_mobile_identity(&tracking_area_update_accept->ms_identity, pkbuf);
1501
290
            if (size < 0) {
1502
2
               ogs_error("ogs_nas_eps_decode_mobile_identity() failed");
1503
2
               return size;
1504
2
            }
1505
1506
288
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_MS_IDENTITY_PRESENT;
1507
288
            decoded += size;
1508
288
            break;
1509
418
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EMM_CAUSE_TYPE:
1510
418
            size = ogs_nas_eps_decode_emm_cause(&tracking_area_update_accept->emm_cause, pkbuf);
1511
418
            if (size < 0) {
1512
6
               ogs_error("ogs_nas_eps_decode_emm_cause() failed");
1513
6
               return size;
1514
6
            }
1515
1516
412
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EMM_CAUSE_PRESENT;
1517
412
            decoded += size;
1518
412
            break;
1519
269
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3402_VALUE_TYPE:
1520
269
            size = ogs_nas_eps_decode_gprs_timer(&tracking_area_update_accept->t3402_value, pkbuf);
1521
269
            if (size < 0) {
1522
2
               ogs_error("ogs_nas_eps_decode_gprs_timer() failed");
1523
2
               return size;
1524
2
            }
1525
1526
267
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3402_VALUE_PRESENT;
1527
267
            decoded += size;
1528
267
            break;
1529
317
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3423_VALUE_TYPE:
1530
317
            size = ogs_nas_eps_decode_gprs_timer(&tracking_area_update_accept->t3423_value, pkbuf);
1531
317
            if (size < 0) {
1532
3
               ogs_error("ogs_nas_eps_decode_gprs_timer() failed");
1533
3
               return size;
1534
3
            }
1535
1536
314
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3423_VALUE_PRESENT;
1537
314
            decoded += size;
1538
314
            break;
1539
632
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EQUIVALENT_PLMNS_TYPE:
1540
632
            size = ogs_nas_eps_decode_plmn_list(&tracking_area_update_accept->equivalent_plmns, pkbuf);
1541
632
            if (size < 0) {
1542
14
               ogs_error("ogs_nas_eps_decode_plmn_list() failed");
1543
14
               return size;
1544
14
            }
1545
1546
618
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EQUIVALENT_PLMNS_PRESENT;
1547
618
            decoded += size;
1548
618
            break;
1549
244
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EMERGENCY_NUMBER_LIST_TYPE:
1550
244
            size = ogs_nas_eps_decode_emergency_number_list(&tracking_area_update_accept->emergency_number_list, pkbuf);
1551
244
            if (size < 0) {
1552
4
               ogs_error("ogs_nas_eps_decode_emergency_number_list() failed");
1553
4
               return size;
1554
4
            }
1555
1556
240
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EMERGENCY_NUMBER_LIST_PRESENT;
1557
240
            decoded += size;
1558
240
            break;
1559
450
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EPS_NETWORK_FEATURE_SUPPORT_TYPE:
1560
450
            size = ogs_nas_eps_decode_eps_network_feature_support(&tracking_area_update_accept->eps_network_feature_support, pkbuf);
1561
450
            if (size < 0) {
1562
15
               ogs_error("ogs_nas_eps_decode_eps_network_feature_support() failed");
1563
15
               return size;
1564
15
            }
1565
1566
435
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EPS_NETWORK_FEATURE_SUPPORT_PRESENT;
1567
435
            decoded += size;
1568
435
            break;
1569
3.89k
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_ADDITIONAL_UPDATE_RESULT_TYPE:
1570
3.89k
            decoded--;
1571
3.89k
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1572
3.89k
            size = ogs_nas_eps_decode_additional_update_result(&tracking_area_update_accept->additional_update_result, pkbuf);
1573
3.89k
            if (size < 0) {
1574
0
               ogs_error("ogs_nas_eps_decode_additional_update_result() failed");
1575
0
               return size;
1576
0
            }
1577
1578
3.89k
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_ADDITIONAL_UPDATE_RESULT_PRESENT;
1579
3.89k
            decoded += size;
1580
3.89k
            break;
1581
253
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3412_EXTENDED_VALUE_TYPE:
1582
253
            size = ogs_nas_eps_decode_gprs_timer_3(&tracking_area_update_accept->t3412_extended_value, pkbuf);
1583
253
            if (size < 0) {
1584
4
               ogs_error("ogs_nas_eps_decode_gprs_timer_3() failed");
1585
4
               return size;
1586
4
            }
1587
1588
249
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3412_EXTENDED_VALUE_PRESENT;
1589
249
            decoded += size;
1590
249
            break;
1591
265
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3324_VALUE_TYPE:
1592
265
            size = ogs_nas_eps_decode_gprs_timer_2(&tracking_area_update_accept->t3324_value, pkbuf);
1593
265
            if (size < 0) {
1594
2
               ogs_error("ogs_nas_eps_decode_gprs_timer_2() failed");
1595
2
               return size;
1596
2
            }
1597
1598
263
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3324_VALUE_PRESENT;
1599
263
            decoded += size;
1600
263
            break;
1601
427
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EXTENDED_DRX_PARAMETERS_TYPE:
1602
427
            size = ogs_nas_eps_decode_extended_drx_parameters(&tracking_area_update_accept->extended_drx_parameters, pkbuf);
1603
427
            if (size < 0) {
1604
9
               ogs_error("ogs_nas_eps_decode_extended_drx_parameters() failed");
1605
9
               return size;
1606
9
            }
1607
1608
418
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EXTENDED_DRX_PARAMETERS_PRESENT;
1609
418
            decoded += size;
1610
418
            break;
1611
427
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_HEADER_COMPRESSION_CONFIGURATION_STATUS_TYPE:
1612
427
            size = ogs_nas_eps_decode_header_compression_configuration_status(&tracking_area_update_accept->header_compression_configuration_status, pkbuf);
1613
427
            if (size < 0) {
1614
14
               ogs_error("ogs_nas_eps_decode_header_compression_configuration_status() failed");
1615
14
               return size;
1616
14
            }
1617
1618
413
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_HEADER_COMPRESSION_CONFIGURATION_STATUS_PRESENT;
1619
413
            decoded += size;
1620
413
            break;
1621
481
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_DCN_ID_TYPE:
1622
481
            size = ogs_nas_eps_decode_dcn_id(&tracking_area_update_accept->dcn_id, pkbuf);
1623
481
            if (size < 0) {
1624
9
               ogs_error("ogs_nas_eps_decode_dcn_id() failed");
1625
9
               return size;
1626
9
            }
1627
1628
472
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_DCN_ID_PRESENT;
1629
472
            decoded += size;
1630
472
            break;
1631
1.32k
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_SMS_SERVICES_STATUS_TYPE:
1632
1.32k
            decoded--;
1633
1.32k
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1634
1.32k
            size = ogs_nas_eps_decode_sms_services_status(&tracking_area_update_accept->sms_services_status, pkbuf);
1635
1.32k
            if (size < 0) {
1636
0
               ogs_error("ogs_nas_eps_decode_sms_services_status() failed");
1637
0
               return size;
1638
0
            }
1639
1640
1.32k
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_SMS_SERVICES_STATUS_PRESENT;
1641
1.32k
            decoded += size;
1642
1.32k
            break;
1643
755
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_NON__NW_POLICIES_TYPE:
1644
755
            decoded--;
1645
755
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1646
755
            size = ogs_nas_eps_decode_non__nw_provided_policies(&tracking_area_update_accept->non__nw_policies, pkbuf);
1647
755
            if (size < 0) {
1648
0
               ogs_error("ogs_nas_eps_decode_non__nw_provided_policies() failed");
1649
0
               return size;
1650
0
            }
1651
1652
755
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_NON__NW_POLICIES_PRESENT;
1653
755
            decoded += size;
1654
755
            break;
1655
255
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3448_VALUE_TYPE:
1656
255
            size = ogs_nas_eps_decode_gprs_timer_2(&tracking_area_update_accept->t3448_value, pkbuf);
1657
255
            if (size < 0) {
1658
3
               ogs_error("ogs_nas_eps_decode_gprs_timer_2() failed");
1659
3
               return size;
1660
3
            }
1661
1662
252
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3448_VALUE_PRESENT;
1663
252
            decoded += size;
1664
252
            break;
1665
1.01k
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_NETWORK_POLICY_TYPE:
1666
1.01k
            decoded--;
1667
1.01k
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1668
1.01k
            size = ogs_nas_eps_decode_network_policy(&tracking_area_update_accept->network_policy, pkbuf);
1669
1.01k
            if (size < 0) {
1670
0
               ogs_error("ogs_nas_eps_decode_network_policy() failed");
1671
0
               return size;
1672
0
            }
1673
1674
1.01k
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_NETWORK_POLICY_PRESENT;
1675
1.01k
            decoded += size;
1676
1.01k
            break;
1677
522
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3447_VALUE_TYPE:
1678
522
            size = ogs_nas_eps_decode_gprs_timer_3(&tracking_area_update_accept->t3447_value, pkbuf);
1679
522
            if (size < 0) {
1680
6
               ogs_error("ogs_nas_eps_decode_gprs_timer_3() failed");
1681
6
               return size;
1682
6
            }
1683
1684
516
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_T3447_VALUE_PRESENT;
1685
516
            decoded += size;
1686
516
            break;
1687
278
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EXTENDED_EMERGENCY_NUMBER_LIST_TYPE:
1688
278
            size = ogs_nas_eps_decode_extended_emergency_number_list(&tracking_area_update_accept->extended_emergency_number_list, pkbuf);
1689
278
            if (size < 0) {
1690
26
               ogs_error("ogs_nas_eps_decode_extended_emergency_number_list() failed");
1691
26
               return size;
1692
26
            }
1693
1694
252
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EXTENDED_EMERGENCY_NUMBER_LIST_PRESENT;
1695
252
            decoded += size;
1696
252
            break;
1697
302
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_CIPHERING_KEY_DATA_TYPE:
1698
302
            size = ogs_nas_eps_decode_ciphering_key_data(&tracking_area_update_accept->ciphering_key_data, pkbuf);
1699
302
            if (size < 0) {
1700
30
               ogs_error("ogs_nas_eps_decode_ciphering_key_data() failed");
1701
30
               return size;
1702
30
            }
1703
1704
272
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_CIPHERING_KEY_DATA_PRESENT;
1705
272
            decoded += size;
1706
272
            break;
1707
238
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_UE_RADIO_CAPABILITY_ID_TYPE:
1708
238
            size = ogs_nas_eps_decode_ue_radio_capability_id(&tracking_area_update_accept->ue_radio_capability_id, pkbuf);
1709
238
            if (size < 0) {
1710
1
               ogs_error("ogs_nas_eps_decode_ue_radio_capability_id() failed");
1711
1
               return size;
1712
1
            }
1713
1714
237
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_UE_RADIO_CAPABILITY_ID_PRESENT;
1715
237
            decoded += size;
1716
237
            break;
1717
1.53k
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_TYPE:
1718
1.53k
            decoded--;
1719
1.53k
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1720
1.53k
            size = ogs_nas_eps_decode_ue_radio_capability_id_deletion_indication(&tracking_area_update_accept->ue_radio_capability_id_deletion_indication, pkbuf);
1721
1.53k
            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.53k
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_PRESENT;
1727
1.53k
            decoded += size;
1728
1.53k
            break;
1729
234
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_NEGOTIATED_WUS_ASSISTANCE_INFORMATION_TYPE:
1730
234
            size = ogs_nas_eps_decode_wus_assistance_information(&tracking_area_update_accept->negotiated_wus_assistance_information, pkbuf);
1731
234
            if (size < 0) {
1732
4
               ogs_error("ogs_nas_eps_decode_wus_assistance_information() failed");
1733
4
               return size;
1734
4
            }
1735
1736
230
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_NEGOTIATED_WUS_ASSISTANCE_INFORMATION_PRESENT;
1737
230
            decoded += size;
1738
230
            break;
1739
428
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_NEGOTIATED_DRX_PARAMETER_IN_NB_S1_MODE_TYPE:
1740
428
            size = ogs_nas_eps_decode_nb_s1_drx_parameter(&tracking_area_update_accept->negotiated_drx_parameter_in_nb_s1_mode, pkbuf);
1741
428
            if (size < 0) {
1742
9
               ogs_error("ogs_nas_eps_decode_nb_s1_drx_parameter() failed");
1743
9
               return size;
1744
9
            }
1745
1746
419
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_NEGOTIATED_DRX_PARAMETER_IN_NB_S1_MODE_PRESENT;
1747
419
            decoded += size;
1748
419
            break;
1749
283
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_NEGOTIATED_IMSI_OFFSET_TYPE:
1750
283
            size = ogs_nas_eps_decode_imsi_offset(&tracking_area_update_accept->negotiated_imsi_offset, pkbuf);
1751
283
            if (size < 0) {
1752
11
               ogs_error("ogs_nas_eps_decode_imsi_offset() failed");
1753
11
               return size;
1754
11
            }
1755
1756
272
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_NEGOTIATED_IMSI_OFFSET_PRESENT;
1757
272
            decoded += size;
1758
272
            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
12
               ogs_error("ogs_nas_eps_decode_eps_additional_request_result() failed");
1763
12
               return size;
1764
12
            }
1765
1766
386
            tracking_area_update_accept->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_EPS_ADDITIONAL_REQUEST_RESULT_PRESENT;
1767
386
            decoded += size;
1768
386
            break;
1769
212
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_TYPE:
1770
212
            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
212
            if (size < 0) {
1772
1
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
1773
1
               return size;
1774
1
            }
1775
1776
211
            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
211
            decoded += size;
1778
211
            break;
1779
268
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_TYPE:
1780
268
            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
268
            if (size < 0) {
1782
1
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
1783
1
               return size;
1784
1
            }
1785
1786
267
            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
267
            decoded += size;
1788
267
            break;
1789
10.9k
        default:
1790
10.9k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
1791
10.9k
            break;
1792
28.9k
        }
1793
28.9k
    }
1794
1795
461
    return decoded;
1796
676
}
1797
1798
int ogs_nas_eps_decode_tracking_area_update_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
1799
99
{
1800
99
    ogs_nas_eps_tracking_area_update_reject_t *tracking_area_update_reject = &message->emm.tracking_area_update_reject;
1801
99
    int decoded = 0;
1802
99
    int size = 0;
1803
1804
99
    ogs_trace("[NAS] Decode TRACKING_AREA_UPDATE_REJECT\n");
1805
1806
99
    size = ogs_nas_eps_decode_emm_cause(&tracking_area_update_reject->emm_cause, pkbuf);
1807
99
    if (size < 0) {
1808
0
        ogs_error("ogs_nas_eps_decode_emm_cause() failed");
1809
0
        return size;
1810
0
    }
1811
1812
99
    decoded += size;
1813
1814
4.30k
    while (pkbuf->len > 0) {
1815
4.21k
        uint8_t *buffer = pkbuf->data;
1816
4.21k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
1817
1818
4.21k
        size = sizeof(uint8_t);
1819
4.21k
        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
4.21k
        decoded += size;
1824
1825
4.21k
        switch (type) {
1826
277
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT_T3346_VALUE_TYPE:
1827
277
            size = ogs_nas_eps_decode_gprs_timer_2(&tracking_area_update_reject->t3346_value, pkbuf);
1828
277
            if (size < 0) {
1829
6
               ogs_error("ogs_nas_eps_decode_gprs_timer_2() failed");
1830
6
               return size;
1831
6
            }
1832
1833
271
            tracking_area_update_reject->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT_T3346_VALUE_PRESENT;
1834
271
            decoded += size;
1835
271
            break;
1836
740
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT_EXTENDED_EMM_CAUSE_TYPE:
1837
740
            decoded--;
1838
740
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1839
740
            size = ogs_nas_eps_decode_extended_emm_cause(&tracking_area_update_reject->extended_emm_cause, pkbuf);
1840
740
            if (size < 0) {
1841
0
               ogs_error("ogs_nas_eps_decode_extended_emm_cause() failed");
1842
0
               return size;
1843
0
            }
1844
1845
740
            tracking_area_update_reject->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT_EXTENDED_EMM_CAUSE_PRESENT;
1846
740
            decoded += size;
1847
740
            break;
1848
227
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT_LOWER_BOUND_TIMER_VALUE_TYPE:
1849
227
            size = ogs_nas_eps_decode_gprs_timer_3(&tracking_area_update_reject->lower_bound_timer_value, pkbuf);
1850
227
            if (size < 0) {
1851
4
               ogs_error("ogs_nas_eps_decode_gprs_timer_3() failed");
1852
4
               return size;
1853
4
            }
1854
1855
223
            tracking_area_update_reject->presencemask |= OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT_LOWER_BOUND_TIMER_VALUE_PRESENT;
1856
223
            decoded += size;
1857
223
            break;
1858
212
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_TYPE:
1859
212
            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
212
            if (size < 0) {
1861
1
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
1862
1
               return size;
1863
1
            }
1864
1865
211
            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
211
            decoded += size;
1867
211
            break;
1868
206
        case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_TYPE:
1869
206
            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
206
            if (size < 0) {
1871
1
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
1872
1
               return size;
1873
1
            }
1874
1875
205
            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
205
            decoded += size;
1877
205
            break;
1878
2.55k
        default:
1879
2.55k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
1880
2.55k
            break;
1881
4.21k
        }
1882
4.21k
    }
1883
1884
87
    return decoded;
1885
99
}
1886
1887
int ogs_nas_eps_decode_extended_service_request(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
1888
123
{
1889
123
    ogs_nas_eps_extended_service_request_t *extended_service_request = &message->emm.extended_service_request;
1890
123
    int decoded = 0;
1891
123
    int size = 0;
1892
1893
123
    ogs_trace("[NAS] Decode EXTENDED_SERVICE_REQUEST\n");
1894
1895
123
    size = ogs_nas_eps_decode_service_type(&extended_service_request->service_type, pkbuf);
1896
123
    if (size < 0) {
1897
0
        ogs_error("ogs_nas_eps_decode_service_type() failed");
1898
0
        return size;
1899
0
    }
1900
1901
123
    decoded += size;
1902
1903
123
    size = ogs_nas_eps_decode_mobile_identity(&extended_service_request->m_tmsi, pkbuf);
1904
123
    if (size < 0) {
1905
2
        ogs_error("ogs_nas_eps_decode_mobile_identity() failed");
1906
2
        return size;
1907
2
    }
1908
1909
121
    decoded += size;
1910
1911
11.0k
    while (pkbuf->len > 0) {
1912
10.9k
        uint8_t *buffer = pkbuf->data;
1913
10.9k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
1914
1915
10.9k
        size = sizeof(uint8_t);
1916
10.9k
        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
10.9k
        decoded += size;
1921
1922
10.9k
        switch (type) {
1923
1.73k
        case OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST_CSFB_RESPONSE_TYPE:
1924
1.73k
            decoded--;
1925
1.73k
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1926
1.73k
            size = ogs_nas_eps_decode_csfb_response(&extended_service_request->csfb_response, pkbuf);
1927
1.73k
            if (size < 0) {
1928
0
               ogs_error("ogs_nas_eps_decode_csfb_response() failed");
1929
0
               return size;
1930
0
            }
1931
1932
1.73k
            extended_service_request->presencemask |= OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST_CSFB_RESPONSE_PRESENT;
1933
1.73k
            decoded += size;
1934
1.73k
            break;
1935
201
        case OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST_EPS_BEARER_CONTEXT_STATUS_TYPE:
1936
201
            size = ogs_nas_eps_decode_eps_bearer_context_status(&extended_service_request->eps_bearer_context_status, pkbuf);
1937
201
            if (size < 0) {
1938
3
               ogs_error("ogs_nas_eps_decode_eps_bearer_context_status() failed");
1939
3
               return size;
1940
3
            }
1941
1942
198
            extended_service_request->presencemask |= OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST_EPS_BEARER_CONTEXT_STATUS_PRESENT;
1943
198
            decoded += size;
1944
198
            break;
1945
840
        case OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST_DEVICE_PROPERTIES_TYPE:
1946
840
            decoded--;
1947
840
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1948
840
            size = ogs_nas_eps_decode_device_properties(&extended_service_request->device_properties, pkbuf);
1949
840
            if (size < 0) {
1950
0
               ogs_error("ogs_nas_eps_decode_device_properties() failed");
1951
0
               return size;
1952
0
            }
1953
1954
840
            extended_service_request->presencemask |= OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST_DEVICE_PROPERTIES_PRESENT;
1955
840
            decoded += size;
1956
840
            break;
1957
289
        case OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST_UE_REQUEST_TYPE_TYPE:
1958
289
            size = ogs_nas_eps_decode_ue_request_type(&extended_service_request->ue_request_type, pkbuf);
1959
289
            if (size < 0) {
1960
14
               ogs_error("ogs_nas_eps_decode_ue_request_type() failed");
1961
14
               return size;
1962
14
            }
1963
1964
275
            extended_service_request->presencemask |= OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST_UE_REQUEST_TYPE_PRESENT;
1965
275
            decoded += size;
1966
275
            break;
1967
283
        case OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST_PAGING_RESTRICTION_TYPE:
1968
283
            size = ogs_nas_eps_decode_paging_restriction(&extended_service_request->paging_restriction, pkbuf);
1969
283
            if (size < 0) {
1970
4
               ogs_error("ogs_nas_eps_decode_paging_restriction() failed");
1971
4
               return size;
1972
4
            }
1973
1974
279
            extended_service_request->presencemask |= OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST_PAGING_RESTRICTION_PRESENT;
1975
279
            decoded += size;
1976
279
            break;
1977
7.57k
        default:
1978
7.57k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
1979
7.57k
            break;
1980
10.9k
        }
1981
10.9k
    }
1982
1983
100
    return decoded;
1984
121
}
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
114
{
2015
114
    ogs_nas_eps_service_reject_t *service_reject = &message->emm.service_reject;
2016
114
    int decoded = 0;
2017
114
    int size = 0;
2018
2019
114
    ogs_trace("[NAS] Decode SERVICE_REJECT\n");
2020
2021
114
    size = ogs_nas_eps_decode_emm_cause(&service_reject->emm_cause, pkbuf);
2022
114
    if (size < 0) {
2023
0
        ogs_error("ogs_nas_eps_decode_emm_cause() failed");
2024
0
        return size;
2025
0
    }
2026
2027
114
    decoded += size;
2028
2029
6.09k
    while (pkbuf->len > 0) {
2030
5.99k
        uint8_t *buffer = pkbuf->data;
2031
5.99k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2032
2033
5.99k
        size = sizeof(uint8_t);
2034
5.99k
        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.99k
        decoded += size;
2039
2040
5.99k
        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
2
               ogs_error("ogs_nas_eps_decode_gprs_timer() failed");
2045
2
               return size;
2046
2
            }
2047
2048
213
            service_reject->presencemask |= OGS_NAS_EPS_SERVICE_REJECT_T3442_VALUE_PRESENT;
2049
213
            decoded += size;
2050
213
            break;
2051
274
        case OGS_NAS_EPS_SERVICE_REJECT_T3346_VALUE_TYPE:
2052
274
            size = ogs_nas_eps_decode_gprs_timer_2(&service_reject->t3346_value, pkbuf);
2053
274
            if (size < 0) {
2054
1
               ogs_error("ogs_nas_eps_decode_gprs_timer_2() failed");
2055
1
               return size;
2056
1
            }
2057
2058
273
            service_reject->presencemask |= OGS_NAS_EPS_SERVICE_REJECT_T3346_VALUE_PRESENT;
2059
273
            decoded += size;
2060
273
            break;
2061
235
        case OGS_NAS_EPS_SERVICE_REJECT_T3448_VALUE_TYPE:
2062
235
            size = ogs_nas_eps_decode_gprs_timer_2(&service_reject->t3448_value, pkbuf);
2063
235
            if (size < 0) {
2064
5
               ogs_error("ogs_nas_eps_decode_gprs_timer_2() failed");
2065
5
               return size;
2066
5
            }
2067
2068
230
            service_reject->presencemask |= OGS_NAS_EPS_SERVICE_REJECT_T3448_VALUE_PRESENT;
2069
230
            decoded += size;
2070
230
            break;
2071
201
        case OGS_NAS_EPS_SERVICE_REJECT_LOWER_BOUND_TIMER_VALUE_TYPE:
2072
201
            size = ogs_nas_eps_decode_gprs_timer_3(&service_reject->lower_bound_timer_value, pkbuf);
2073
201
            if (size < 0) {
2074
2
               ogs_error("ogs_nas_eps_decode_gprs_timer_3() failed");
2075
2
               return size;
2076
2
            }
2077
2078
199
            service_reject->presencemask |= OGS_NAS_EPS_SERVICE_REJECT_LOWER_BOUND_TIMER_VALUE_PRESENT;
2079
199
            decoded += size;
2080
199
            break;
2081
332
        case OGS_NAS_EPS_SERVICE_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_TYPE:
2082
332
            size = ogs_nas_eps_decode_tracking_area_identity_list(&service_reject->forbidden_tai_for_the_list_of_forbidden_tracking_areas_for_roaming, pkbuf);
2083
332
            if (size < 0) {
2084
2
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
2085
2
               return size;
2086
2
            }
2087
2088
330
            service_reject->presencemask |= OGS_NAS_EPS_SERVICE_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_PRESENT;
2089
330
            decoded += size;
2090
330
            break;
2091
235
        case OGS_NAS_EPS_SERVICE_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_TYPE:
2092
235
            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
235
            if (size < 0) {
2094
4
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
2095
4
               return size;
2096
4
            }
2097
2098
231
            service_reject->presencemask |= OGS_NAS_EPS_SERVICE_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_PRESENT;
2099
231
            decoded += size;
2100
231
            break;
2101
4.50k
        default:
2102
4.50k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2103
4.50k
            break;
2104
5.99k
        }
2105
5.99k
    }
2106
2107
98
    return decoded;
2108
114
}
2109
2110
int ogs_nas_eps_decode_guti_reallocation_command(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2111
109
{
2112
109
    ogs_nas_eps_guti_reallocation_command_t *guti_reallocation_command = &message->emm.guti_reallocation_command;
2113
109
    int decoded = 0;
2114
109
    int size = 0;
2115
2116
109
    ogs_trace("[NAS] Decode GUTI_REALLOCATION_COMMAND\n");
2117
2118
109
    size = ogs_nas_eps_decode_eps_mobile_identity(&guti_reallocation_command->guti, pkbuf);
2119
109
    if (size < 0) {
2120
5
        ogs_error("ogs_nas_eps_decode_eps_mobile_identity() failed");
2121
5
        return size;
2122
5
    }
2123
2124
104
    decoded += size;
2125
2126
6.66k
    while (pkbuf->len > 0) {
2127
6.57k
        uint8_t *buffer = pkbuf->data;
2128
6.57k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2129
2130
6.57k
        size = sizeof(uint8_t);
2131
6.57k
        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
6.57k
        decoded += size;
2136
2137
6.57k
        switch (type) {
2138
233
        case OGS_NAS_EPS_GUTI_REALLOCATION_COMMAND_TAI_LIST_TYPE:
2139
233
            size = ogs_nas_eps_decode_tracking_area_identity_list(&guti_reallocation_command->tai_list, pkbuf);
2140
233
            if (size < 0) {
2141
1
               ogs_error("ogs_nas_eps_decode_tracking_area_identity_list() failed");
2142
1
               return size;
2143
1
            }
2144
2145
232
            guti_reallocation_command->presencemask |= OGS_NAS_EPS_GUTI_REALLOCATION_COMMAND_TAI_LIST_PRESENT;
2146
232
            decoded += size;
2147
232
            break;
2148
303
        case OGS_NAS_EPS_GUTI_REALLOCATION_COMMAND_DCN_ID_TYPE:
2149
303
            size = ogs_nas_eps_decode_dcn_id(&guti_reallocation_command->dcn_id, pkbuf);
2150
303
            if (size < 0) {
2151
5
               ogs_error("ogs_nas_eps_decode_dcn_id() failed");
2152
5
               return size;
2153
5
            }
2154
2155
298
            guti_reallocation_command->presencemask |= OGS_NAS_EPS_GUTI_REALLOCATION_COMMAND_DCN_ID_PRESENT;
2156
298
            decoded += size;
2157
298
            break;
2158
224
        case OGS_NAS_EPS_GUTI_REALLOCATION_COMMAND_UE_RADIO_CAPABILITY_ID_TYPE:
2159
224
            size = ogs_nas_eps_decode_ue_radio_capability_id(&guti_reallocation_command->ue_radio_capability_id, pkbuf);
2160
224
            if (size < 0) {
2161
1
               ogs_error("ogs_nas_eps_decode_ue_radio_capability_id() failed");
2162
1
               return size;
2163
1
            }
2164
2165
223
            guti_reallocation_command->presencemask |= OGS_NAS_EPS_GUTI_REALLOCATION_COMMAND_UE_RADIO_CAPABILITY_ID_PRESENT;
2166
223
            decoded += size;
2167
223
            break;
2168
531
        case OGS_NAS_EPS_GUTI_REALLOCATION_COMMAND_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_TYPE:
2169
531
            decoded--;
2170
531
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
2171
531
            size = ogs_nas_eps_decode_ue_radio_capability_id_deletion_indication(&guti_reallocation_command->ue_radio_capability_id_deletion_indication, pkbuf);
2172
531
            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
531
            guti_reallocation_command->presencemask |= OGS_NAS_EPS_GUTI_REALLOCATION_COMMAND_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_PRESENT;
2178
531
            decoded += size;
2179
531
            break;
2180
5.28k
        default:
2181
5.28k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2182
5.28k
            break;
2183
6.57k
        }
2184
6.57k
    }
2185
2186
97
    return decoded;
2187
104
}
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
10
        ogs_error("ogs_nas_eps_decode_authentication_parameter_autn() failed");
2216
10
        return size;
2217
10
    }
2218
2219
25
    decoded += size;
2220
2221
25
    return decoded;
2222
35
}
2223
2224
int ogs_nas_eps_decode_authentication_response(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2225
22
{
2226
22
    ogs_nas_eps_authentication_response_t *authentication_response = &message->emm.authentication_response;
2227
22
    int decoded = 0;
2228
22
    int size = 0;
2229
2230
22
    ogs_trace("[NAS] Decode AUTHENTICATION_RESPONSE\n");
2231
2232
22
    size = ogs_nas_eps_decode_authentication_response_parameter(&authentication_response->authentication_response_parameter, pkbuf);
2233
22
    if (size < 0) {
2234
4
        ogs_error("ogs_nas_eps_decode_authentication_response_parameter() failed");
2235
4
        return size;
2236
4
    }
2237
2238
18
    decoded += size;
2239
2240
18
    return decoded;
2241
22
}
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
3
        ogs_error("ogs_nas_eps_decode_mobile_identity() failed");
2273
3
        return size;
2274
3
    }
2275
2276
14
    decoded += size;
2277
2278
14
    return decoded;
2279
17
}
2280
2281
int ogs_nas_eps_decode_authentication_failure(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2282
67
{
2283
67
    ogs_nas_eps_authentication_failure_t *authentication_failure = &message->emm.authentication_failure;
2284
67
    int decoded = 0;
2285
67
    int size = 0;
2286
2287
67
    ogs_trace("[NAS] Decode AUTHENTICATION_FAILURE\n");
2288
2289
67
    size = ogs_nas_eps_decode_emm_cause(&authentication_failure->emm_cause, pkbuf);
2290
67
    if (size < 0) {
2291
0
        ogs_error("ogs_nas_eps_decode_emm_cause() failed");
2292
0
        return size;
2293
0
    }
2294
2295
67
    decoded += size;
2296
2297
3.86k
    while (pkbuf->len > 0) {
2298
3.81k
        uint8_t *buffer = pkbuf->data;
2299
3.81k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2300
2301
3.81k
        size = sizeof(uint8_t);
2302
3.81k
        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.81k
        decoded += size;
2307
2308
3.81k
        switch (type) {
2309
502
        case OGS_NAS_EPS_AUTHENTICATION_FAILURE_AUTHENTICATION_FAILURE_PARAMETER_TYPE:
2310
502
            size = ogs_nas_eps_decode_authentication_failure_parameter(&authentication_failure->authentication_failure_parameter, pkbuf);
2311
502
            if (size < 0) {
2312
13
               ogs_error("ogs_nas_eps_decode_authentication_failure_parameter() failed");
2313
13
               return size;
2314
13
            }
2315
2316
489
            authentication_failure->presencemask |= OGS_NAS_EPS_AUTHENTICATION_FAILURE_AUTHENTICATION_FAILURE_PARAMETER_PRESENT;
2317
489
            decoded += size;
2318
489
            break;
2319
3.31k
        default:
2320
3.31k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2321
3.31k
            break;
2322
3.81k
        }
2323
3.81k
    }
2324
2325
54
    return decoded;
2326
67
}
2327
2328
int ogs_nas_eps_decode_security_mode_command(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2329
125
{
2330
125
    ogs_nas_eps_security_mode_command_t *security_mode_command = &message->emm.security_mode_command;
2331
125
    int decoded = 0;
2332
125
    int size = 0;
2333
2334
125
    ogs_trace("[NAS] Decode SECURITY_MODE_COMMAND\n");
2335
2336
125
    size = ogs_nas_eps_decode_security_algorithms(&security_mode_command->selected_nas_security_algorithms, pkbuf);
2337
125
    if (size < 0) {
2338
0
        ogs_error("ogs_nas_eps_decode_security_algorithms() failed");
2339
0
        return size;
2340
0
    }
2341
2342
125
    decoded += size;
2343
2344
125
    size = ogs_nas_eps_decode_key_set_identifier(&security_mode_command->nas_key_set_identifier, pkbuf);
2345
125
    if (size < 0) {
2346
0
        ogs_error("ogs_nas_eps_decode_key_set_identifier() failed");
2347
0
        return size;
2348
0
    }
2349
2350
125
    decoded += size;
2351
2352
125
    size = ogs_nas_eps_decode_ue_security_capability(&security_mode_command->replayed_ue_security_capabilities, pkbuf);
2353
125
    if (size < 0) {
2354
2
        ogs_error("ogs_nas_eps_decode_ue_security_capability() failed");
2355
2
        return size;
2356
2
    }
2357
2358
123
    decoded += size;
2359
2360
7.73k
    while (pkbuf->len > 0) {
2361
7.63k
        uint8_t *buffer = pkbuf->data;
2362
7.63k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2363
2364
7.63k
        size = sizeof(uint8_t);
2365
7.63k
        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.63k
        decoded += size;
2370
2371
7.63k
        switch (type) {
2372
902
        case OGS_NAS_EPS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_TYPE:
2373
902
            decoded--;
2374
902
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
2375
902
            size = ogs_nas_eps_decode_imeisv_request(&security_mode_command->imeisv_request, pkbuf);
2376
902
            if (size < 0) {
2377
0
               ogs_error("ogs_nas_eps_decode_imeisv_request() failed");
2378
0
               return size;
2379
0
            }
2380
2381
902
            security_mode_command->presencemask |= OGS_NAS_EPS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_PRESENT;
2382
902
            decoded += size;
2383
902
            break;
2384
208
        case OGS_NAS_EPS_SECURITY_MODE_COMMAND_REPLAYED_NONCEUE_TYPE:
2385
208
            size = ogs_nas_eps_decode_nonce(&security_mode_command->replayed_nonceue, pkbuf);
2386
208
            if (size < 0) {
2387
2
               ogs_error("ogs_nas_eps_decode_nonce() failed");
2388
2
               return size;
2389
2
            }
2390
2391
206
            security_mode_command->presencemask |= OGS_NAS_EPS_SECURITY_MODE_COMMAND_REPLAYED_NONCEUE_PRESENT;
2392
206
            decoded += size;
2393
206
            break;
2394
196
        case OGS_NAS_EPS_SECURITY_MODE_COMMAND_NONCEMME_TYPE:
2395
196
            size = ogs_nas_eps_decode_nonce(&security_mode_command->noncemme, pkbuf);
2396
196
            if (size < 0) {
2397
1
               ogs_error("ogs_nas_eps_decode_nonce() failed");
2398
1
               return size;
2399
1
            }
2400
2401
195
            security_mode_command->presencemask |= OGS_NAS_EPS_SECURITY_MODE_COMMAND_NONCEMME_PRESENT;
2402
195
            decoded += size;
2403
195
            break;
2404
392
        case OGS_NAS_EPS_SECURITY_MODE_COMMAND_HASHMME_TYPE:
2405
392
            size = ogs_nas_eps_decode_hashmme(&security_mode_command->hashmme, pkbuf);
2406
392
            if (size < 0) {
2407
8
               ogs_error("ogs_nas_eps_decode_hashmme() failed");
2408
8
               return size;
2409
8
            }
2410
2411
384
            security_mode_command->presencemask |= OGS_NAS_EPS_SECURITY_MODE_COMMAND_HASHMME_PRESENT;
2412
384
            decoded += size;
2413
384
            break;
2414
207
        case OGS_NAS_EPS_SECURITY_MODE_COMMAND_REPLAYED_UE_ADDITIONAL_SECURITY_CAPABILITY_TYPE:
2415
207
            size = ogs_nas_eps_decode_ue_additional_security_capability(&security_mode_command->replayed_ue_additional_security_capability, pkbuf);
2416
207
            if (size < 0) {
2417
2
               ogs_error("ogs_nas_eps_decode_ue_additional_security_capability() failed");
2418
2
               return size;
2419
2
            }
2420
2421
205
            security_mode_command->presencemask |= OGS_NAS_EPS_SECURITY_MODE_COMMAND_REPLAYED_UE_ADDITIONAL_SECURITY_CAPABILITY_PRESENT;
2422
205
            decoded += size;
2423
205
            break;
2424
548
        case OGS_NAS_EPS_SECURITY_MODE_COMMAND_UE_RADIO_CAPABILITY_ID_REQUEST_TYPE:
2425
548
            size = ogs_nas_eps_decode_ue_radio_capability_id_request(&security_mode_command->ue_radio_capability_id_request, pkbuf);
2426
548
            if (size < 0) {
2427
10
               ogs_error("ogs_nas_eps_decode_ue_radio_capability_id_request() failed");
2428
10
               return size;
2429
10
            }
2430
2431
538
            security_mode_command->presencemask |= OGS_NAS_EPS_SECURITY_MODE_COMMAND_UE_RADIO_CAPABILITY_ID_REQUEST_PRESENT;
2432
538
            decoded += size;
2433
538
            break;
2434
5.18k
        default:
2435
5.18k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2436
5.18k
            break;
2437
7.63k
        }
2438
7.63k
    }
2439
2440
100
    return decoded;
2441
123
}
2442
2443
int ogs_nas_eps_decode_security_mode_complete(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2444
129
{
2445
129
    ogs_nas_eps_security_mode_complete_t *security_mode_complete = &message->emm.security_mode_complete;
2446
129
    int decoded = 0;
2447
129
    int size = 0;
2448
2449
129
    ogs_trace("[NAS] Decode SECURITY_MODE_COMPLETE\n");
2450
2451
6.68k
    while (pkbuf->len > 0) {
2452
6.59k
        uint8_t *buffer = pkbuf->data;
2453
6.59k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2454
2455
6.59k
        size = sizeof(uint8_t);
2456
6.59k
        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
6.59k
        decoded += size;
2461
2462
6.59k
        switch (type) {
2463
570
        case OGS_NAS_EPS_SECURITY_MODE_COMPLETE_IMEISV_TYPE:
2464
570
            size = ogs_nas_eps_decode_mobile_identity(&security_mode_complete->imeisv, pkbuf);
2465
570
            if (size < 0) {
2466
6
               ogs_error("ogs_nas_eps_decode_mobile_identity() failed");
2467
6
               return size;
2468
6
            }
2469
2470
564
            security_mode_complete->presencemask |= OGS_NAS_EPS_SECURITY_MODE_COMPLETE_IMEISV_PRESENT;
2471
564
            decoded += size;
2472
564
            break;
2473
445
        case OGS_NAS_EPS_SECURITY_MODE_COMPLETE_REPLAYED_NAS_MESSAGE_CONTAINER_TYPE:
2474
445
            size = ogs_nas_eps_decode_replayed_nas_message_container(&security_mode_complete->replayed_nas_message_container, pkbuf);
2475
445
            if (size < 0) {
2476
29
               ogs_error("ogs_nas_eps_decode_replayed_nas_message_container() failed");
2477
29
               return size;
2478
29
            }
2479
2480
416
            security_mode_complete->presencemask |= OGS_NAS_EPS_SECURITY_MODE_COMPLETE_REPLAYED_NAS_MESSAGE_CONTAINER_PRESENT;
2481
416
            decoded += size;
2482
416
            break;
2483
376
        case OGS_NAS_EPS_SECURITY_MODE_COMPLETE_UE_RADIO_CAPABILITY_ID_TYPE:
2484
376
            size = ogs_nas_eps_decode_ue_radio_capability_id(&security_mode_complete->ue_radio_capability_id, pkbuf);
2485
376
            if (size < 0) {
2486
8
               ogs_error("ogs_nas_eps_decode_ue_radio_capability_id() failed");
2487
8
               return size;
2488
8
            }
2489
2490
368
            security_mode_complete->presencemask |= OGS_NAS_EPS_SECURITY_MODE_COMPLETE_UE_RADIO_CAPABILITY_ID_PRESENT;
2491
368
            decoded += size;
2492
368
            break;
2493
5.20k
        default:
2494
5.20k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2495
5.20k
            break;
2496
6.59k
        }
2497
6.59k
    }
2498
2499
86
    return decoded;
2500
129
}
2501
2502
int ogs_nas_eps_decode_security_mode_reject(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2503
2
{
2504
2
    ogs_nas_eps_security_mode_reject_t *security_mode_reject = &message->emm.security_mode_reject;
2505
2
    int decoded = 0;
2506
2
    int size = 0;
2507
2508
2
    ogs_trace("[NAS] Decode SECURITY_MODE_REJECT\n");
2509
2510
2
    size = ogs_nas_eps_decode_emm_cause(&security_mode_reject->emm_cause, pkbuf);
2511
2
    if (size < 0) {
2512
0
        ogs_error("ogs_nas_eps_decode_emm_cause() failed");
2513
0
        return size;
2514
0
    }
2515
2516
2
    decoded += size;
2517
2518
2
    return decoded;
2519
2
}
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
130
{
2542
130
    ogs_nas_eps_emm_information_t *emm_information = &message->emm.emm_information;
2543
130
    int decoded = 0;
2544
130
    int size = 0;
2545
2546
130
    ogs_trace("[NAS] Decode EMM_INFORMATION\n");
2547
2548
5.02k
    while (pkbuf->len > 0) {
2549
4.93k
        uint8_t *buffer = pkbuf->data;
2550
4.93k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2551
2552
4.93k
        size = sizeof(uint8_t);
2553
4.93k
        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
4.93k
        decoded += size;
2558
2559
4.93k
        switch (type) {
2560
276
        case OGS_NAS_EPS_EMM_INFORMATION_FULL_NAME_FOR_NETWORK_TYPE:
2561
276
            size = ogs_nas_eps_decode_network_name(&emm_information->full_name_for_network, pkbuf);
2562
276
            if (size < 0) {
2563
5
               ogs_error("ogs_nas_eps_decode_network_name() failed");
2564
5
               return size;
2565
5
            }
2566
2567
271
            emm_information->presencemask |= OGS_NAS_EPS_EMM_INFORMATION_FULL_NAME_FOR_NETWORK_PRESENT;
2568
271
            decoded += size;
2569
271
            break;
2570
253
        case OGS_NAS_EPS_EMM_INFORMATION_SHORT_NAME_FOR_NETWORK_TYPE:
2571
253
            size = ogs_nas_eps_decode_network_name(&emm_information->short_name_for_network, pkbuf);
2572
253
            if (size < 0) {
2573
7
               ogs_error("ogs_nas_eps_decode_network_name() failed");
2574
7
               return size;
2575
7
            }
2576
2577
246
            emm_information->presencemask |= OGS_NAS_EPS_EMM_INFORMATION_SHORT_NAME_FOR_NETWORK_PRESENT;
2578
246
            decoded += size;
2579
246
            break;
2580
396
        case OGS_NAS_EPS_EMM_INFORMATION_LOCAL_TIME_ZONE_TYPE:
2581
396
            size = ogs_nas_eps_decode_time_zone(&emm_information->local_time_zone, pkbuf);
2582
396
            if (size < 0) {
2583
6
               ogs_error("ogs_nas_eps_decode_time_zone() failed");
2584
6
               return size;
2585
6
            }
2586
2587
390
            emm_information->presencemask |= OGS_NAS_EPS_EMM_INFORMATION_LOCAL_TIME_ZONE_PRESENT;
2588
390
            decoded += size;
2589
390
            break;
2590
255
        case OGS_NAS_EPS_EMM_INFORMATION_UNIVERSAL_TIME_AND_LOCAL_TIME_ZONE_TYPE:
2591
255
            size = ogs_nas_eps_decode_time_zone_and_time(&emm_information->universal_time_and_local_time_zone, pkbuf);
2592
255
            if (size < 0) {
2593
6
               ogs_error("ogs_nas_eps_decode_time_zone_and_time() failed");
2594
6
               return size;
2595
6
            }
2596
2597
249
            emm_information->presencemask |= OGS_NAS_EPS_EMM_INFORMATION_UNIVERSAL_TIME_AND_LOCAL_TIME_ZONE_PRESENT;
2598
249
            decoded += size;
2599
249
            break;
2600
393
        case OGS_NAS_EPS_EMM_INFORMATION_NETWORK_DAYLIGHT_SAVING_TIME_TYPE:
2601
393
            size = ogs_nas_eps_decode_daylight_saving_time(&emm_information->network_daylight_saving_time, pkbuf);
2602
393
            if (size < 0) {
2603
9
               ogs_error("ogs_nas_eps_decode_daylight_saving_time() failed");
2604
9
               return size;
2605
9
            }
2606
2607
384
            emm_information->presencemask |= OGS_NAS_EPS_EMM_INFORMATION_NETWORK_DAYLIGHT_SAVING_TIME_PRESENT;
2608
384
            decoded += size;
2609
384
            break;
2610
3.35k
        default:
2611
3.35k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2612
3.35k
            break;
2613
4.93k
        }
2614
4.93k
    }
2615
2616
97
    return decoded;
2617
130
}
2618
2619
int ogs_nas_eps_decode_downlink_nas_transport(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2620
26
{
2621
26
    ogs_nas_eps_downlink_nas_transport_t *downlink_nas_transport = &message->emm.downlink_nas_transport;
2622
26
    int decoded = 0;
2623
26
    int size = 0;
2624
2625
26
    ogs_trace("[NAS] Decode DOWNLINK_NAS_TRANSPORT\n");
2626
2627
26
    size = ogs_nas_eps_decode_eps_message_container(&downlink_nas_transport->nas_message_container, pkbuf);
2628
26
    if (size < 0) {
2629
6
        ogs_error("ogs_nas_eps_decode_eps_message_container() failed");
2630
6
        return size;
2631
6
    }
2632
2633
20
    decoded += size;
2634
2635
20
    return decoded;
2636
26
}
2637
2638
int ogs_nas_eps_decode_uplink_nas_transport(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2639
37
{
2640
37
    ogs_nas_eps_uplink_nas_transport_t *uplink_nas_transport = &message->emm.uplink_nas_transport;
2641
37
    int decoded = 0;
2642
37
    int size = 0;
2643
2644
37
    ogs_trace("[NAS] Decode UPLINK_NAS_TRANSPORT\n");
2645
2646
37
    size = ogs_nas_eps_decode_eps_message_container(&uplink_nas_transport->nas_message_container, pkbuf);
2647
37
    if (size < 0) {
2648
4
        ogs_error("ogs_nas_eps_decode_eps_message_container() failed");
2649
4
        return size;
2650
4
    }
2651
2652
33
    decoded += size;
2653
2654
33
    return decoded;
2655
37
}
2656
2657
int ogs_nas_eps_decode_cs_service_notification(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2658
109
{
2659
109
    ogs_nas_eps_cs_service_notification_t *cs_service_notification = &message->emm.cs_service_notification;
2660
109
    int decoded = 0;
2661
109
    int size = 0;
2662
2663
109
    ogs_trace("[NAS] Decode CS_SERVICE_NOTIFICATION\n");
2664
2665
109
    size = ogs_nas_eps_decode_paging_identity(&cs_service_notification->paging_identity, pkbuf);
2666
109
    if (size < 0) {
2667
0
        ogs_error("ogs_nas_eps_decode_paging_identity() failed");
2668
0
        return size;
2669
0
    }
2670
2671
109
    decoded += size;
2672
2673
5.42k
    while (pkbuf->len > 0) {
2674
5.34k
        uint8_t *buffer = pkbuf->data;
2675
5.34k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2676
2677
5.34k
        size = sizeof(uint8_t);
2678
5.34k
        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
5.34k
        decoded += size;
2683
2684
5.34k
        switch (type) {
2685
429
        case OGS_NAS_EPS_CS_SERVICE_NOTIFICATION_CLI_TYPE:
2686
429
            size = ogs_nas_eps_decode_cli(&cs_service_notification->cli, pkbuf);
2687
429
            if (size < 0) {
2688
12
               ogs_error("ogs_nas_eps_decode_cli() failed");
2689
12
               return size;
2690
12
            }
2691
2692
417
            cs_service_notification->presencemask |= OGS_NAS_EPS_CS_SERVICE_NOTIFICATION_CLI_PRESENT;
2693
417
            decoded += size;
2694
417
            break;
2695
212
        case OGS_NAS_EPS_CS_SERVICE_NOTIFICATION_SS_CODE_TYPE:
2696
212
            size = ogs_nas_eps_decode_ss_code(&cs_service_notification->ss_code, pkbuf);
2697
212
            if (size < 0) {
2698
2
               ogs_error("ogs_nas_eps_decode_ss_code() failed");
2699
2
               return size;
2700
2
            }
2701
2702
210
            cs_service_notification->presencemask |= OGS_NAS_EPS_CS_SERVICE_NOTIFICATION_SS_CODE_PRESENT;
2703
210
            decoded += size;
2704
210
            break;
2705
730
        case OGS_NAS_EPS_CS_SERVICE_NOTIFICATION_LCS_INDICATOR_TYPE:
2706
730
            size = ogs_nas_eps_decode_lcs_indicator(&cs_service_notification->lcs_indicator, pkbuf);
2707
730
            if (size < 0) {
2708
6
               ogs_error("ogs_nas_eps_decode_lcs_indicator() failed");
2709
6
               return size;
2710
6
            }
2711
2712
724
            cs_service_notification->presencemask |= OGS_NAS_EPS_CS_SERVICE_NOTIFICATION_LCS_INDICATOR_PRESENT;
2713
724
            decoded += size;
2714
724
            break;
2715
454
        case OGS_NAS_EPS_CS_SERVICE_NOTIFICATION_LCS_CLIENT_IDENTITY_TYPE:
2716
454
            size = ogs_nas_eps_decode_lcs_client_identity(&cs_service_notification->lcs_client_identity, pkbuf);
2717
454
            if (size < 0) {
2718
8
               ogs_error("ogs_nas_eps_decode_lcs_client_identity() failed");
2719
8
               return size;
2720
8
            }
2721
2722
446
            cs_service_notification->presencemask |= OGS_NAS_EPS_CS_SERVICE_NOTIFICATION_LCS_CLIENT_IDENTITY_PRESENT;
2723
446
            decoded += size;
2724
446
            break;
2725
3.52k
        default:
2726
3.52k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2727
3.52k
            break;
2728
5.34k
        }
2729
5.34k
    }
2730
2731
81
    return decoded;
2732
109
}
2733
2734
int ogs_nas_eps_decode_uplink_generic_nas_transport(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2735
85
{
2736
85
    ogs_nas_eps_uplink_generic_nas_transport_t *uplink_generic_nas_transport = &message->emm.uplink_generic_nas_transport;
2737
85
    int decoded = 0;
2738
85
    int size = 0;
2739
2740
85
    ogs_trace("[NAS] Decode UPLINK_GENERIC_NAS_TRANSPORT\n");
2741
2742
85
    size = ogs_nas_eps_decode_generic_message_container_type(&uplink_generic_nas_transport->generic_message_container_type, pkbuf);
2743
85
    if (size < 0) {
2744
0
        ogs_error("ogs_nas_eps_decode_generic_message_container_type() failed");
2745
0
        return size;
2746
0
    }
2747
2748
85
    decoded += size;
2749
2750
85
    size = ogs_nas_eps_decode_generic_message_container(&uplink_generic_nas_transport->generic_message_container, pkbuf);
2751
85
    if (size < 0) {
2752
14
        ogs_error("ogs_nas_eps_decode_generic_message_container() failed");
2753
14
        return size;
2754
14
    }
2755
2756
71
    decoded += size;
2757
2758
4.54k
    while (pkbuf->len > 0) {
2759
4.47k
        uint8_t *buffer = pkbuf->data;
2760
4.47k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2761
2762
4.47k
        size = sizeof(uint8_t);
2763
4.47k
        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.47k
        decoded += size;
2768
2769
4.47k
        switch (type) {
2770
268
        case OGS_NAS_EPS_UPLINK_GENERIC_NAS_TRANSPORT_ADDITIONAL_INFORMATION_TYPE:
2771
268
            size = ogs_nas_eps_decode_additional_information(&uplink_generic_nas_transport->additional_information, pkbuf);
2772
268
            if (size < 0) {
2773
5
               ogs_error("ogs_nas_eps_decode_additional_information() failed");
2774
5
               return size;
2775
5
            }
2776
2777
263
            uplink_generic_nas_transport->presencemask |= OGS_NAS_EPS_UPLINK_GENERIC_NAS_TRANSPORT_ADDITIONAL_INFORMATION_PRESENT;
2778
263
            decoded += size;
2779
263
            break;
2780
4.20k
        default:
2781
4.20k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2782
4.20k
            break;
2783
4.47k
        }
2784
4.47k
    }
2785
2786
66
    return decoded;
2787
71
}
2788
2789
int ogs_nas_eps_decode_downlink_generic_nas_transport(ogs_nas_eps_message_t *message, ogs_pkbuf_t *pkbuf)
2790
73
{
2791
73
    ogs_nas_eps_downlink_generic_nas_transport_t *downlink_generic_nas_transport = &message->emm.downlink_generic_nas_transport;
2792
73
    int decoded = 0;
2793
73
    int size = 0;
2794
2795
73
    ogs_trace("[NAS] Decode DOWNLINK_GENERIC_NAS_TRANSPORT\n");
2796
2797
73
    size = ogs_nas_eps_decode_generic_message_container_type(&downlink_generic_nas_transport->generic_message_container_type, pkbuf);
2798
73
    if (size < 0) {
2799
0
        ogs_error("ogs_nas_eps_decode_generic_message_container_type() failed");
2800
0
        return size;
2801
0
    }
2802
2803
73
    decoded += size;
2804
2805
73
    size = ogs_nas_eps_decode_generic_message_container(&downlink_generic_nas_transport->generic_message_container, pkbuf);
2806
73
    if (size < 0) {
2807
11
        ogs_error("ogs_nas_eps_decode_generic_message_container() failed");
2808
11
        return size;
2809
11
    }
2810
2811
62
    decoded += size;
2812
2813
3.11k
    while (pkbuf->len > 0) {
2814
3.05k
        uint8_t *buffer = pkbuf->data;
2815
3.05k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2816
2817
3.05k
        size = sizeof(uint8_t);
2818
3.05k
        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
3.05k
        decoded += size;
2823
2824
3.05k
        switch (type) {
2825
241
        case OGS_NAS_EPS_DOWNLINK_GENERIC_NAS_TRANSPORT_ADDITIONAL_INFORMATION_TYPE:
2826
241
            size = ogs_nas_eps_decode_additional_information(&downlink_generic_nas_transport->additional_information, pkbuf);
2827
241
            if (size < 0) {
2828
7
               ogs_error("ogs_nas_eps_decode_additional_information() failed");
2829
7
               return size;
2830
7
            }
2831
2832
234
            downlink_generic_nas_transport->presencemask |= OGS_NAS_EPS_DOWNLINK_GENERIC_NAS_TRANSPORT_ADDITIONAL_INFORMATION_PRESENT;
2833
234
            decoded += size;
2834
234
            break;
2835
2.81k
        default:
2836
2.81k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2837
2.81k
            break;
2838
3.05k
        }
2839
3.05k
    }
2840
2841
55
    return decoded;
2842
62
}
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.54k
{
4689
3.54k
    int size = 0;
4690
3.54k
    int decoded = 0;
4691
4692
3.54k
    ogs_assert(pkbuf);
4693
3.54k
    ogs_assert(pkbuf->data);
4694
4695
3.54k
    size = sizeof(ogs_nas_emm_header_t);
4696
3.54k
    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.54k
    memset(message, 0, sizeof(ogs_nas_eps_message_t));
4702
3.54k
    memcpy(&message->emm.h, pkbuf->data - size, size);
4703
3.54k
    decoded += size;
4704
4705
3.54k
    if (message->emm.h.security_header_type >=
4706
3.54k
            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.52k
    switch (message->emm.h.message_type) {
4717
339
    case OGS_NAS_EPS_ATTACH_REQUEST:
4718
339
        size = ogs_nas_eps_decode_attach_request(message, pkbuf);
4719
339
        if (size < 0) {
4720
41
           ogs_error("ogs_nas_5gs_decode_attach_request() failed");
4721
41
           return size;
4722
41
        }
4723
4724
298
        decoded += size;
4725
298
        break;
4726
362
    case OGS_NAS_EPS_ATTACH_ACCEPT:
4727
362
        size = ogs_nas_eps_decode_attach_accept(message, pkbuf);
4728
362
        if (size < 0) {
4729
40
           ogs_error("ogs_nas_5gs_decode_attach_accept() failed");
4730
40
           return size;
4731
40
        }
4732
4733
322
        decoded += size;
4734
322
        break;
4735
30
    case OGS_NAS_EPS_ATTACH_COMPLETE:
4736
30
        size = ogs_nas_eps_decode_attach_complete(message, pkbuf);
4737
30
        if (size < 0) {
4738
17
           ogs_error("ogs_nas_5gs_decode_attach_complete() failed");
4739
17
           return size;
4740
17
        }
4741
4742
13
        decoded += size;
4743
13
        break;
4744
129
    case OGS_NAS_EPS_ATTACH_REJECT:
4745
129
        size = ogs_nas_eps_decode_attach_reject(message, pkbuf);
4746
129
        if (size < 0) {
4747
20
           ogs_error("ogs_nas_5gs_decode_attach_reject() failed");
4748
20
           return size;
4749
20
        }
4750
4751
109
        decoded += size;
4752
109
        break;
4753
12
    case OGS_NAS_EPS_DETACH_REQUEST:
4754
12
        size = ogs_nas_eps_decode_detach_request_from_ue(message, pkbuf);
4755
12
        if (size < 0) {
4756
1
           ogs_error("ogs_nas_5gs_decode_detach_request_from_ue() failed");
4757
1
           return size;
4758
1
        }
4759
4760
11
        decoded += size;
4761
11
        break;
4762
1
    case OGS_NAS_EPS_DETACH_ACCEPT:
4763
1
        break;
4764
649
    case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST:
4765
649
        size = ogs_nas_eps_decode_tracking_area_update_request(message, pkbuf);
4766
649
        if (size < 0) {
4767
164
           ogs_error("ogs_nas_5gs_decode_tracking_area_update_request() failed");
4768
164
           return size;
4769
164
        }
4770
4771
485
        decoded += size;
4772
485
        break;
4773
676
    case OGS_NAS_EPS_TRACKING_AREA_UPDATE_ACCEPT:
4774
676
        size = ogs_nas_eps_decode_tracking_area_update_accept(message, pkbuf);
4775
676
        if (size < 0) {
4776
215
           ogs_error("ogs_nas_5gs_decode_tracking_area_update_accept() failed");
4777
215
           return size;
4778
215
        }
4779
4780
461
        decoded += size;
4781
461
        break;
4782
1
    case OGS_NAS_EPS_TRACKING_AREA_UPDATE_COMPLETE:
4783
1
        break;
4784
99
    case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REJECT:
4785
99
        size = ogs_nas_eps_decode_tracking_area_update_reject(message, pkbuf);
4786
99
        if (size < 0) {
4787
12
           ogs_error("ogs_nas_5gs_decode_tracking_area_update_reject() failed");
4788
12
           return size;
4789
12
        }
4790
4791
87
        decoded += size;
4792
87
        break;
4793
123
    case OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST:
4794
123
        size = ogs_nas_eps_decode_extended_service_request(message, pkbuf);
4795
123
        if (size < 0) {
4796
23
           ogs_error("ogs_nas_5gs_decode_extended_service_request() failed");
4797
23
           return size;
4798
23
        }
4799
4800
100
        decoded += size;
4801
100
        break;
4802
114
    case OGS_NAS_EPS_SERVICE_REJECT:
4803
114
        size = ogs_nas_eps_decode_service_reject(message, pkbuf);
4804
114
        if (size < 0) {
4805
16
           ogs_error("ogs_nas_5gs_decode_service_reject() failed");
4806
16
           return size;
4807
16
        }
4808
4809
98
        decoded += size;
4810
98
        break;
4811
109
    case OGS_NAS_EPS_GUTI_REALLOCATION_COMMAND:
4812
109
        size = ogs_nas_eps_decode_guti_reallocation_command(message, pkbuf);
4813
109
        if (size < 0) {
4814
12
           ogs_error("ogs_nas_5gs_decode_guti_reallocation_command() failed");
4815
12
           return size;
4816
12
        }
4817
4818
97
        decoded += size;
4819
97
        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
18
           ogs_error("ogs_nas_5gs_decode_authentication_request() failed");
4826
18
           return size;
4827
18
        }
4828
4829
25
        decoded += size;
4830
25
        break;
4831
22
    case OGS_NAS_EPS_AUTHENTICATION_RESPONSE:
4832
22
        size = ogs_nas_eps_decode_authentication_response(message, pkbuf);
4833
22
        if (size < 0) {
4834
4
           ogs_error("ogs_nas_5gs_decode_authentication_response() failed");
4835
4
           return size;
4836
4
        }
4837
4838
18
        decoded += size;
4839
18
        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
3
           ogs_error("ogs_nas_5gs_decode_identity_response() failed");
4855
3
           return size;
4856
3
        }
4857
4858
14
        decoded += size;
4859
14
        break;
4860
67
    case OGS_NAS_EPS_AUTHENTICATION_FAILURE:
4861
67
        size = ogs_nas_eps_decode_authentication_failure(message, pkbuf);
4862
67
        if (size < 0) {
4863
13
           ogs_error("ogs_nas_5gs_decode_authentication_failure() failed");
4864
13
           return size;
4865
13
        }
4866
4867
54
        decoded += size;
4868
54
        break;
4869
125
    case OGS_NAS_EPS_SECURITY_MODE_COMMAND:
4870
125
        size = ogs_nas_eps_decode_security_mode_command(message, pkbuf);
4871
125
        if (size < 0) {
4872
25
           ogs_error("ogs_nas_5gs_decode_security_mode_command() failed");
4873
25
           return size;
4874
25
        }
4875
4876
100
        decoded += size;
4877
100
        break;
4878
129
    case OGS_NAS_EPS_SECURITY_MODE_COMPLETE:
4879
129
        size = ogs_nas_eps_decode_security_mode_complete(message, pkbuf);
4880
129
        if (size < 0) {
4881
43
           ogs_error("ogs_nas_5gs_decode_security_mode_complete() failed");
4882
43
           return size;
4883
43
        }
4884
4885
86
        decoded += size;
4886
86
        break;
4887
2
    case OGS_NAS_EPS_SECURITY_MODE_REJECT:
4888
2
        size = ogs_nas_eps_decode_security_mode_reject(message, pkbuf);
4889
2
        if (size < 0) {
4890
0
           ogs_error("ogs_nas_5gs_decode_security_mode_reject() failed");
4891
0
           return size;
4892
0
        }
4893
4894
2
        decoded += size;
4895
2
        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
130
    case OGS_NAS_EPS_EMM_INFORMATION:
4906
130
        size = ogs_nas_eps_decode_emm_information(message, pkbuf);
4907
130
        if (size < 0) {
4908
33
           ogs_error("ogs_nas_5gs_decode_emm_information() failed");
4909
33
           return size;
4910
33
        }
4911
4912
97
        decoded += size;
4913
97
        break;
4914
26
    case OGS_NAS_EPS_DOWNLINK_NAS_TRANSPORT:
4915
26
        size = ogs_nas_eps_decode_downlink_nas_transport(message, pkbuf);
4916
26
        if (size < 0) {
4917
6
           ogs_error("ogs_nas_5gs_decode_downlink_nas_transport() failed");
4918
6
           return size;
4919
6
        }
4920
4921
20
        decoded += size;
4922
20
        break;
4923
37
    case OGS_NAS_EPS_UPLINK_NAS_TRANSPORT:
4924
37
        size = ogs_nas_eps_decode_uplink_nas_transport(message, pkbuf);
4925
37
        if (size < 0) {
4926
4
           ogs_error("ogs_nas_5gs_decode_uplink_nas_transport() failed");
4927
4
           return size;
4928
4
        }
4929
4930
33
        decoded += size;
4931
33
        break;
4932
109
    case OGS_NAS_EPS_CS_SERVICE_NOTIFICATION:
4933
109
        size = ogs_nas_eps_decode_cs_service_notification(message, pkbuf);
4934
109
        if (size < 0) {
4935
28
           ogs_error("ogs_nas_5gs_decode_cs_service_notification() failed");
4936
28
           return size;
4937
28
        }
4938
4939
81
        decoded += size;
4940
81
        break;
4941
85
    case OGS_NAS_EPS_UPLINK_GENERIC_NAS_TRANSPORT:
4942
85
        size = ogs_nas_eps_decode_uplink_generic_nas_transport(message, pkbuf);
4943
85
        if (size < 0) {
4944
19
           ogs_error("ogs_nas_5gs_decode_uplink_generic_nas_transport() failed");
4945
19
           return size;
4946
19
        }
4947
4948
66
        decoded += size;
4949
66
        break;
4950
73
    case OGS_NAS_EPS_DOWNLINK_GENERIC_NAS_TRANSPORT:
4951
73
        size = ogs_nas_eps_decode_downlink_generic_nas_transport(message, pkbuf);
4952
73
        if (size < 0) {
4953
18
           ogs_error("ogs_nas_5gs_decode_downlink_generic_nas_transport() failed");
4954
18
           return size;
4955
18
        }
4956
4957
55
        decoded += size;
4958
55
        break;
4959
1
    default:
4960
1
        ogs_error("Unknown message type (0x%x) or not implemented", 
4961
1
                message->emm.h.message_type);
4962
1
        break;
4963
3.52k
    }
4964
4965
2.76k
out:
4966
2.76k
    ogs_assert(ogs_pkbuf_push(pkbuf, decoded));
4967
4968
2.76k
    return OGS_OK;
4969
2.76k
}
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