Coverage Report

Created: 2026-11-06 06:15

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/open5gs/lib/nas/5gs/decoder.c
Line
Count
Source
1
/*
2
 * The MIT License
3
 *
4
 * Copyright (C) 2019-2026 by Sukchan Lee <acetcom@gmail.com>
5
 *
6
 * This file is part of Open5GS.
7
 *
8
 * Permission is hereby granted, free of charge, to any person obtaining
9
 * a copy of this software and associated documentation files (the
10
 * "Software"), to deal in the Software without restriction, including
11
 * without limitation the rights to use, copy, modify, merge, publish,
12
 * distribute, sublicense, and/or sell copies of the Software, and to
13
 * permit persons to whom the Software is furnished to do so, subject to
14
 * the following conditions:
15
 *
16
 * The above copyright notice and this permission notice shall be
17
 * included in all copies or substantial portions of the Software.
18
 *
19
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
23
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
24
 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
25
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26
 */
27
28
/*******************************************************************************
29
 * This file had been created by nas-message.py script v0.2.0
30
 * Please do not modify this file but regenerate it via script.
31
 * Created on: 2026-11-03 17:52:26.739768 by pespin
32
 * from r19.6.2/24501-j62-ch8-ch9.docx
33
 ******************************************************************************/
34
35
#include "ogs-nas-5gs.h"
36
37
int ogs_nas_5gs_decode_registration_request(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
38
int ogs_nas_5gs_decode_registration_accept(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
39
int ogs_nas_5gs_decode_registration_complete(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
40
int ogs_nas_5gs_decode_registration_reject(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
41
int ogs_nas_5gs_decode_deregistration_request_from_ue(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
42
int ogs_nas_5gs_decode_deregistration_request_to_ue(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
43
int ogs_nas_5gs_decode_service_request(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
44
int ogs_nas_5gs_decode_service_reject(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
45
int ogs_nas_5gs_decode_service_accept(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
46
int ogs_nas_5gs_decode_configuration_update_command(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
47
int ogs_nas_5gs_decode_authentication_request(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
48
int ogs_nas_5gs_decode_authentication_response(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
49
int ogs_nas_5gs_decode_authentication_reject(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
50
int ogs_nas_5gs_decode_authentication_failure(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
51
int ogs_nas_5gs_decode_authentication_result(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
52
int ogs_nas_5gs_decode_identity_request(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
53
int ogs_nas_5gs_decode_identity_response(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
54
int ogs_nas_5gs_decode_security_mode_command(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
55
int ogs_nas_5gs_decode_security_mode_complete(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
56
int ogs_nas_5gs_decode_security_mode_reject(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
57
int ogs_nas_5gs_decode_5gmm_status(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
58
int ogs_nas_5gs_decode_notification(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
59
int ogs_nas_5gs_decode_notification_response(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
60
int ogs_nas_5gs_decode_ul_nas_transport(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
61
int ogs_nas_5gs_decode_dl_nas_transport(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
62
int ogs_nas_5gs_decode_pdu_session_establishment_request(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
63
int ogs_nas_5gs_decode_pdu_session_establishment_accept(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
64
int ogs_nas_5gs_decode_pdu_session_establishment_reject(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
65
int ogs_nas_5gs_decode_pdu_session_authentication_command(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
66
int ogs_nas_5gs_decode_pdu_session_authentication_complete(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
67
int ogs_nas_5gs_decode_pdu_session_authentication_result(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
68
int ogs_nas_5gs_decode_pdu_session_modification_request(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
69
int ogs_nas_5gs_decode_pdu_session_modification_reject(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
70
int ogs_nas_5gs_decode_pdu_session_modification_command(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
71
int ogs_nas_5gs_decode_pdu_session_modification_complete(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
72
int ogs_nas_5gs_decode_pdu_session_modification_command_reject(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
73
int ogs_nas_5gs_decode_pdu_session_release_request(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
74
int ogs_nas_5gs_decode_pdu_session_release_reject(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
75
int ogs_nas_5gs_decode_pdu_session_release_command(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
76
int ogs_nas_5gs_decode_pdu_session_release_complete(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
77
int ogs_nas_5gs_decode_5gsm_status(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf);
78
int ogs_nas_5gs_decode_registration_request(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
79
655
{
80
655
    ogs_nas_5gs_registration_request_t *registration_request = &message->gmm.registration_request;
81
655
    int decoded = 0;
82
655
    int size = 0;
83
84
655
    ogs_trace("[NAS] Decode REGISTRATION_REQUEST\n");
85
86
655
    size = ogs_nas_5gs_decode_5gs_registration_type(&registration_request->registration_type, pkbuf);
87
655
    if (size < 0) {
88
0
        ogs_error("ogs_nas_5gs_decode_5gs_registration_type() failed");
89
0
        return size;
90
0
    }
91
92
655
    decoded += size;
93
94
655
    size = ogs_nas_5gs_decode_5gs_mobile_identity(&registration_request->mobile_identity, pkbuf);
95
655
    if (size < 0) {
96
8
        ogs_error("ogs_nas_5gs_decode_5gs_mobile_identity() failed");
97
8
        return size;
98
8
    }
99
100
647
    decoded += size;
101
102
13.9k
    while (pkbuf->len > 0) {
103
13.4k
        uint8_t *buffer = pkbuf->data;
104
13.4k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
105
106
13.4k
        size = sizeof(uint8_t);
107
13.4k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
108
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
109
0
           return OGS_ERROR;
110
0
        }
111
13.4k
        decoded += size;
112
113
13.4k
        switch(type) {
114
434
        case OGS_NAS_5GS_REGISTRATION_REQUEST_NON_CURRENT_NATIVE_NAS_KEY_SET_IDENTIFIER_TYPE:
115
434
            decoded--;
116
434
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
117
434
            size = ogs_nas_5gs_decode_key_set_identifier(&registration_request->non_current_native_nas_key_set_identifier, pkbuf);
118
434
            if (size < 0) {
119
0
               ogs_error("ogs_nas_5gs_decode_key_set_identifier() failed");
120
0
               return size;
121
0
            }
122
123
434
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_NON_CURRENT_NATIVE_NAS_KEY_SET_IDENTIFIER_PRESENT;
124
434
            decoded += size;
125
434
            break;
126
249
        case OGS_NAS_5GS_REGISTRATION_REQUEST_5GMM_CAPABILITY_TYPE:
127
249
            size = ogs_nas_5gs_decode_5gmm_capability(&registration_request->gmm_capability, pkbuf);
128
249
            if (size < 0) {
129
11
               ogs_error("ogs_nas_5gs_decode_5gmm_capability() failed");
130
11
               return size;
131
11
            }
132
133
238
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_5GMM_CAPABILITY_PRESENT;
134
238
            decoded += size;
135
238
            break;
136
205
        case OGS_NAS_5GS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_TYPE:
137
205
            size = ogs_nas_5gs_decode_ue_security_capability(&registration_request->ue_security_capability, pkbuf);
138
205
            if (size < 0) {
139
4
               ogs_error("ogs_nas_5gs_decode_ue_security_capability() failed");
140
4
               return size;
141
4
            }
142
143
201
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_UE_SECURITY_CAPABILITY_PRESENT;
144
201
            decoded += size;
145
201
            break;
146
206
        case OGS_NAS_5GS_REGISTRATION_REQUEST_REQUESTED_NSSAI_TYPE:
147
206
            size = ogs_nas_5gs_decode_nssai(&registration_request->requested_nssai, pkbuf);
148
206
            if (size < 0) {
149
1
               ogs_error("ogs_nas_5gs_decode_nssai() failed");
150
1
               return size;
151
1
            }
152
153
205
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_REQUESTED_NSSAI_PRESENT;
154
205
            decoded += size;
155
205
            break;
156
275
        case OGS_NAS_5GS_REGISTRATION_REQUEST_LAST_VISITED_REGISTERED_TAI_TYPE:
157
275
            size = ogs_nas_5gs_decode_5gs_tracking_area_identity(&registration_request->last_visited_registered_tai, pkbuf);
158
275
            if (size < 0) {
159
8
               ogs_error("ogs_nas_5gs_decode_5gs_tracking_area_identity() failed");
160
8
               return size;
161
8
            }
162
163
267
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_LAST_VISITED_REGISTERED_TAI_PRESENT;
164
267
            decoded += size;
165
267
            break;
166
272
        case OGS_NAS_5GS_REGISTRATION_REQUEST_S1_UE_NETWORK_CAPABILITY_TYPE:
167
272
            size = ogs_nas_5gs_decode_s1_ue_network_capability(&registration_request->s1_ue_network_capability, pkbuf);
168
272
            if (size < 0) {
169
6
               ogs_error("ogs_nas_5gs_decode_s1_ue_network_capability() failed");
170
6
               return size;
171
6
            }
172
173
266
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_S1_UE_NETWORK_CAPABILITY_PRESENT;
174
266
            decoded += size;
175
266
            break;
176
206
        case OGS_NAS_5GS_REGISTRATION_REQUEST_UPLINK_DATA_STATUS_TYPE:
177
206
            size = ogs_nas_5gs_decode_uplink_data_status(&registration_request->uplink_data_status, pkbuf);
178
206
            if (size < 0) {
179
6
               ogs_error("ogs_nas_5gs_decode_uplink_data_status() failed");
180
6
               return size;
181
6
            }
182
183
200
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_UPLINK_DATA_STATUS_PRESENT;
184
200
            decoded += size;
185
200
            break;
186
206
        case OGS_NAS_5GS_REGISTRATION_REQUEST_PDU_SESSION_STATUS_TYPE:
187
206
            size = ogs_nas_5gs_decode_pdu_session_status(&registration_request->pdu_session_status, pkbuf);
188
206
            if (size < 0) {
189
1
               ogs_error("ogs_nas_5gs_decode_pdu_session_status() failed");
190
1
               return size;
191
1
            }
192
193
205
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_PDU_SESSION_STATUS_PRESENT;
194
205
            decoded += size;
195
205
            break;
196
485
        case OGS_NAS_5GS_REGISTRATION_REQUEST_MICO_INDICATION_TYPE:
197
485
            decoded--;
198
485
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
199
485
            size = ogs_nas_5gs_decode_mico_indication(&registration_request->mico_indication, pkbuf);
200
485
            if (size < 0) {
201
0
               ogs_error("ogs_nas_5gs_decode_mico_indication() failed");
202
0
               return size;
203
0
            }
204
205
485
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_MICO_INDICATION_PRESENT;
206
485
            decoded += size;
207
485
            break;
208
206
        case OGS_NAS_5GS_REGISTRATION_REQUEST_UE_STATUS_TYPE:
209
206
            size = ogs_nas_5gs_decode_ue_status(&registration_request->ue_status, pkbuf);
210
206
            if (size < 0) {
211
6
               ogs_error("ogs_nas_5gs_decode_ue_status() failed");
212
6
               return size;
213
6
            }
214
215
200
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_UE_STATUS_PRESENT;
216
200
            decoded += size;
217
200
            break;
218
236
        case OGS_NAS_5GS_REGISTRATION_REQUEST_ADDITIONAL_GUTI_TYPE:
219
236
            size = ogs_nas_5gs_decode_5gs_mobile_identity(&registration_request->additional_guti, pkbuf);
220
236
            if (size < 0) {
221
1
               ogs_error("ogs_nas_5gs_decode_5gs_mobile_identity() failed");
222
1
               return size;
223
1
            }
224
225
235
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_ADDITIONAL_GUTI_PRESENT;
226
235
            decoded += size;
227
235
            break;
228
210
        case OGS_NAS_5GS_REGISTRATION_REQUEST_ALLOWED_PDU_SESSION_STATUS_TYPE:
229
210
            size = ogs_nas_5gs_decode_allowed_pdu_session_status(&registration_request->allowed_pdu_session_status, pkbuf);
230
210
            if (size < 0) {
231
2
               ogs_error("ogs_nas_5gs_decode_allowed_pdu_session_status() failed");
232
2
               return size;
233
2
            }
234
235
208
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_ALLOWED_PDU_SESSION_STATUS_PRESENT;
236
208
            decoded += size;
237
208
            break;
238
214
        case OGS_NAS_5GS_REGISTRATION_REQUEST_UE_USAGE_SETTING_TYPE:
239
214
            size = ogs_nas_5gs_decode_ue_usage_setting(&registration_request->ue_usage_setting, pkbuf);
240
214
            if (size < 0) {
241
6
               ogs_error("ogs_nas_5gs_decode_ue_usage_setting() failed");
242
6
               return size;
243
6
            }
244
245
208
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_UE_USAGE_SETTING_PRESENT;
246
208
            decoded += size;
247
208
            break;
248
201
        case OGS_NAS_5GS_REGISTRATION_REQUEST_REQUESTED_DRX_PARAMETERS_TYPE:
249
201
            size = ogs_nas_5gs_decode_5gs_drx_parameters(&registration_request->requested_drx_parameters, pkbuf);
250
201
            if (size < 0) {
251
1
               ogs_error("ogs_nas_5gs_decode_5gs_drx_parameters() failed");
252
1
               return size;
253
1
            }
254
255
200
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_REQUESTED_DRX_PARAMETERS_PRESENT;
256
200
            decoded += size;
257
200
            break;
258
335
        case OGS_NAS_5GS_REGISTRATION_REQUEST_EPS_NAS_MESSAGE_CONTAINER_TYPE:
259
335
            size = ogs_nas_5gs_decode_eps_nas_message_container(&registration_request->eps_nas_message_container, pkbuf);
260
335
            if (size < 0) {
261
28
               ogs_error("ogs_nas_5gs_decode_eps_nas_message_container() failed");
262
28
               return size;
263
28
            }
264
265
307
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_EPS_NAS_MESSAGE_CONTAINER_PRESENT;
266
307
            decoded += size;
267
307
            break;
268
208
        case OGS_NAS_5GS_REGISTRATION_REQUEST_LADN_INDICATION_TYPE:
269
208
            size = ogs_nas_5gs_decode_ladn_indication(&registration_request->ladn_indication, pkbuf);
270
208
            if (size < 0) {
271
7
               ogs_error("ogs_nas_5gs_decode_ladn_indication() failed");
272
7
               return size;
273
7
            }
274
275
201
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_LADN_INDICATION_PRESENT;
276
201
            decoded += size;
277
201
            break;
278
747
        case OGS_NAS_5GS_REGISTRATION_REQUEST_PAYLOAD_CONTAINER_TYPE_TYPE:
279
747
            decoded--;
280
747
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
281
747
            size = ogs_nas_5gs_decode_payload_container_type(&registration_request->payload_container_type, pkbuf);
282
747
            if (size < 0) {
283
0
               ogs_error("ogs_nas_5gs_decode_payload_container_type() failed");
284
0
               return size;
285
0
            }
286
287
747
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_PAYLOAD_CONTAINER_TYPE_PRESENT;
288
747
            decoded += size;
289
747
            break;
290
251
        case OGS_NAS_5GS_REGISTRATION_REQUEST_PAYLOAD_CONTAINER_TYPE:
291
251
            size = ogs_nas_5gs_decode_payload_container(&registration_request->payload_container, pkbuf);
292
251
            if (size < 0) {
293
2
               ogs_error("ogs_nas_5gs_decode_payload_container() failed");
294
2
               return size;
295
2
            }
296
297
249
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_PAYLOAD_CONTAINER_PRESENT;
298
249
            decoded += size;
299
249
            break;
300
583
        case OGS_NAS_5GS_REGISTRATION_REQUEST_NETWORK_SLICING_INDICATION_TYPE:
301
583
            decoded--;
302
583
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
303
583
            size = ogs_nas_5gs_decode_network_slicing_indication(&registration_request->network_slicing_indication, pkbuf);
304
583
            if (size < 0) {
305
0
               ogs_error("ogs_nas_5gs_decode_network_slicing_indication() failed");
306
0
               return size;
307
0
            }
308
309
583
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_NETWORK_SLICING_INDICATION_PRESENT;
310
583
            decoded += size;
311
583
            break;
312
199
        case OGS_NAS_5GS_REGISTRATION_REQUEST_5GS_UPDATE_TYPE_TYPE:
313
199
            size = ogs_nas_5gs_decode_5gs_update_type(&registration_request->update_type, pkbuf);
314
199
            if (size < 0) {
315
4
               ogs_error("ogs_nas_5gs_decode_5gs_update_type() failed");
316
4
               return size;
317
4
            }
318
319
195
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_5GS_UPDATE_TYPE_PRESENT;
320
195
            decoded += size;
321
195
            break;
322
206
        case OGS_NAS_5GS_REGISTRATION_REQUEST_MOBILE_STATION_CLASSMARK_2_TYPE:
323
206
            size = ogs_nas_5gs_decode_mobile_station_classmark_2(&registration_request->mobile_station_classmark_2, pkbuf);
324
206
            if (size < 0) {
325
6
               ogs_error("ogs_nas_5gs_decode_mobile_station_classmark_2() failed");
326
6
               return size;
327
6
            }
328
329
200
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_MOBILE_STATION_CLASSMARK_2_PRESENT;
330
200
            decoded += size;
331
200
            break;
332
212
        case OGS_NAS_5GS_REGISTRATION_REQUEST_SUPPORTED_CODECS_TYPE:
333
212
            size = ogs_nas_5gs_decode_supported_codec_list(&registration_request->supported_codecs, pkbuf);
334
212
            if (size < 0) {
335
3
               ogs_error("ogs_nas_5gs_decode_supported_codec_list() failed");
336
3
               return size;
337
3
            }
338
339
209
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_SUPPORTED_CODECS_PRESENT;
340
209
            decoded += size;
341
209
            break;
342
197
        case OGS_NAS_5GS_REGISTRATION_REQUEST_NAS_MESSAGE_CONTAINER_TYPE:
343
197
            size = ogs_nas_5gs_decode_message_container(&registration_request->nas_message_container, pkbuf);
344
197
            if (size < 0) {
345
1
               ogs_error("ogs_nas_5gs_decode_message_container() failed");
346
1
               return size;
347
1
            }
348
349
196
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT;
350
196
            decoded += size;
351
196
            break;
352
229
        case OGS_NAS_5GS_REGISTRATION_REQUEST_EPS_BEARER_CONTEXT_STATUS_TYPE:
353
229
            size = ogs_nas_5gs_decode_eps_bearer_context_status(&registration_request->eps_bearer_context_status, pkbuf);
354
229
            if (size < 0) {
355
1
               ogs_error("ogs_nas_5gs_decode_eps_bearer_context_status() failed");
356
1
               return size;
357
1
            }
358
359
228
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_EPS_BEARER_CONTEXT_STATUS_PRESENT;
360
228
            decoded += size;
361
228
            break;
362
196
        case OGS_NAS_5GS_REGISTRATION_REQUEST_REQUESTED_EXTENDED_DRX_PARAMETERS_TYPE:
363
196
            size = ogs_nas_5gs_decode_extended_drx_parameters(&registration_request->requested_extended_drx_parameters, pkbuf);
364
196
            if (size < 0) {
365
1
               ogs_error("ogs_nas_5gs_decode_extended_drx_parameters() failed");
366
1
               return size;
367
1
            }
368
369
195
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_REQUESTED_EXTENDED_DRX_PARAMETERS_PRESENT;
370
195
            decoded += size;
371
195
            break;
372
195
        case OGS_NAS_5GS_REGISTRATION_REQUEST_T3324_VALUE_TYPE:
373
195
            size = ogs_nas_5gs_decode_gprs_timer_3(&registration_request->t3324_value, pkbuf);
374
195
            if (size < 0) {
375
1
               ogs_error("ogs_nas_5gs_decode_gprs_timer_3() failed");
376
1
               return size;
377
1
            }
378
379
194
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_T3324_VALUE_PRESENT;
380
194
            decoded += size;
381
194
            break;
382
203
        case OGS_NAS_5GS_REGISTRATION_REQUEST_UE_RADIO_CAPABILITY_ID_TYPE:
383
203
            size = ogs_nas_5gs_decode_ue_radio_capability_id(&registration_request->ue_radio_capability_id, pkbuf);
384
203
            if (size < 0) {
385
1
               ogs_error("ogs_nas_5gs_decode_ue_radio_capability_id() failed");
386
1
               return size;
387
1
            }
388
389
202
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_UE_RADIO_CAPABILITY_ID_PRESENT;
390
202
            decoded += size;
391
202
            break;
392
203
        case OGS_NAS_5GS_REGISTRATION_REQUEST_REQUESTED_MAPPED_NSSAI_TYPE:
393
203
            size = ogs_nas_5gs_decode_mapped_nssai(&registration_request->requested_mapped_nssai, pkbuf);
394
203
            if (size < 0) {
395
3
               ogs_error("ogs_nas_5gs_decode_mapped_nssai() failed");
396
3
               return size;
397
3
            }
398
399
200
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_REQUESTED_MAPPED_NSSAI_PRESENT;
400
200
            decoded += size;
401
200
            break;
402
254
        case OGS_NAS_5GS_REGISTRATION_REQUEST_ADDITIONAL_INFORMATION_REQUESTED_TYPE:
403
254
            size = ogs_nas_5gs_decode_additional_information_requested(&registration_request->additional_information_requested, pkbuf);
404
254
            if (size < 0) {
405
7
               ogs_error("ogs_nas_5gs_decode_additional_information_requested() failed");
406
7
               return size;
407
7
            }
408
409
247
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_ADDITIONAL_INFORMATION_REQUESTED_PRESENT;
410
247
            decoded += size;
411
247
            break;
412
197
        case OGS_NAS_5GS_REGISTRATION_REQUEST_REQUESTED_WUS_ASSISTANCE_INFORMATION_TYPE:
413
197
            size = ogs_nas_5gs_decode_wus_assistance_information(&registration_request->requested_wus_assistance_information, pkbuf);
414
197
            if (size < 0) {
415
1
               ogs_error("ogs_nas_5gs_decode_wus_assistance_information() failed");
416
1
               return size;
417
1
            }
418
419
196
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_REQUESTED_WUS_ASSISTANCE_INFORMATION_PRESENT;
420
196
            decoded += size;
421
196
            break;
422
549
        case OGS_NAS_5GS_REGISTRATION_REQUEST_N5GC_INDICATION_TYPE:
423
549
            decoded--;
424
549
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
425
549
            size = ogs_nas_5gs_decode_n5gc_indication(&registration_request->n5gc_indication, pkbuf);
426
549
            if (size < 0) {
427
0
               ogs_error("ogs_nas_5gs_decode_n5gc_indication() failed");
428
0
               return size;
429
0
            }
430
431
549
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_N5GC_INDICATION_PRESENT;
432
549
            decoded += size;
433
549
            break;
434
198
        case OGS_NAS_5GS_REGISTRATION_REQUEST_REQUESTED_NB_N1_MODE_DRX_PARAMETERS_TYPE:
435
198
            size = ogs_nas_5gs_decode_nb_n1_mode_drx_parameters(&registration_request->requested_nb_n1_mode_drx_parameters, pkbuf);
436
198
            if (size < 0) {
437
1
               ogs_error("ogs_nas_5gs_decode_nb_n1_mode_drx_parameters() failed");
438
1
               return size;
439
1
            }
440
441
197
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_REQUESTED_NB_N1_MODE_DRX_PARAMETERS_PRESENT;
442
197
            decoded += size;
443
197
            break;
444
321
        case OGS_NAS_5GS_REGISTRATION_REQUEST_UE_REQUEST_TYPE_TYPE:
445
321
            size = ogs_nas_5gs_decode_ue_request_type(&registration_request->ue_request_type, pkbuf);
446
321
            if (size < 0) {
447
1
               ogs_error("ogs_nas_5gs_decode_ue_request_type() failed");
448
1
               return size;
449
1
            }
450
451
320
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_UE_REQUEST_TYPE_PRESENT;
452
320
            decoded += size;
453
320
            break;
454
246
        case OGS_NAS_5GS_REGISTRATION_REQUEST_PAGING_RESTRICTION_TYPE:
455
246
            size = ogs_nas_5gs_decode_paging_restriction(&registration_request->paging_restriction, pkbuf);
456
246
            if (size < 0) {
457
9
               ogs_error("ogs_nas_5gs_decode_paging_restriction() failed");
458
9
               return size;
459
9
            }
460
461
237
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_PAGING_RESTRICTION_PRESENT;
462
237
            decoded += size;
463
237
            break;
464
205
        case OGS_NAS_5GS_REGISTRATION_REQUEST_SERVICE_LEVEL_AA_CONTAINER_TYPE:
465
205
            size = ogs_nas_5gs_decode_service_level_aa_container(&registration_request->service_level_aa_container, pkbuf);
466
205
            if (size < 0) {
467
2
               ogs_error("ogs_nas_5gs_decode_service_level_aa_container() failed");
468
2
               return size;
469
2
            }
470
471
203
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_SERVICE_LEVEL_AA_CONTAINER_PRESENT;
472
203
            decoded += size;
473
203
            break;
474
250
        case OGS_NAS_5GS_REGISTRATION_REQUEST_NID_TYPE:
475
250
            size = ogs_nas_5gs_decode_nid(&registration_request->nid, pkbuf);
476
250
            if (size < 0) {
477
2
               ogs_error("ogs_nas_5gs_decode_nid() failed");
478
2
               return size;
479
2
            }
480
481
248
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_NID_PRESENT;
482
248
            decoded += size;
483
248
            break;
484
258
        case OGS_NAS_5GS_REGISTRATION_REQUEST_UE_DETERMINED_PLMN_WITH_DISASTER_CONDITION_TYPE:
485
258
            size = ogs_nas_5gs_decode_plmn_identity(&registration_request->ue_determined_plmn_with_disaster_condition, pkbuf);
486
258
            if (size < 0) {
487
9
               ogs_error("ogs_nas_5gs_decode_plmn_identity() failed");
488
9
               return size;
489
9
            }
490
491
249
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_UE_DETERMINED_PLMN_WITH_DISASTER_CONDITION_PRESENT;
492
249
            decoded += size;
493
249
            break;
494
210
        case OGS_NAS_5GS_REGISTRATION_REQUEST_REQUESTED_PEIPS_ASSISTANCE_INFORMATION_TYPE:
495
210
            size = ogs_nas_5gs_decode_peips_assistance_information(&registration_request->requested_peips_assistance_information, pkbuf);
496
210
            if (size < 0) {
497
1
               ogs_error("ogs_nas_5gs_decode_peips_assistance_information() failed");
498
1
               return size;
499
1
            }
500
501
209
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_REQUESTED_PEIPS_ASSISTANCE_INFORMATION_PRESENT;
502
209
            decoded += size;
503
209
            break;
504
197
        case OGS_NAS_5GS_REGISTRATION_REQUEST_REQUESTED_T3512_VALUE_TYPE:
505
197
            size = ogs_nas_5gs_decode_gprs_timer_3(&registration_request->requested_t3512_value, pkbuf);
506
197
            if (size < 0) {
507
1
               ogs_error("ogs_nas_5gs_decode_gprs_timer_3() failed");
508
1
               return size;
509
1
            }
510
511
196
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_REQUESTED_T3512_VALUE_PRESENT;
512
196
            decoded += size;
513
196
            break;
514
205
        case OGS_NAS_5GS_REGISTRATION_REQUEST_UNAVAILABILITY_INFORMATION_TYPE:
515
205
            size = ogs_nas_5gs_decode_unavailability_information(&registration_request->unavailability_information, pkbuf);
516
205
            if (size < 0) {
517
5
               ogs_error("ogs_nas_5gs_decode_unavailability_information() failed");
518
5
               return size;
519
5
            }
520
521
200
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_UNAVAILABILITY_INFORMATION_PRESENT;
522
200
            decoded += size;
523
200
            break;
524
214
        case OGS_NAS_5GS_REGISTRATION_REQUEST_NON_3GPP_PATH_SWITCHING_INFORMATION_TYPE:
525
214
            size = ogs_nas_5gs_decode_non_3gpp_path_switching_information(&registration_request->non_3gpp_path_switching_information, pkbuf);
526
214
            if (size < 0) {
527
7
               ogs_error("ogs_nas_5gs_decode_non_3gpp_path_switching_information() failed");
528
7
               return size;
529
7
            }
530
531
207
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_NON_3GPP_PATH_SWITCHING_INFORMATION_PRESENT;
532
207
            decoded += size;
533
207
            break;
534
208
        case OGS_NAS_5GS_REGISTRATION_REQUEST_AUN3_INDICATION_TYPE:
535
208
            size = ogs_nas_5gs_decode_aun3_indication(&registration_request->aun3_indication, pkbuf);
536
208
            if (size < 0) {
537
6
               ogs_error("ogs_nas_5gs_decode_aun3_indication() failed");
538
6
               return size;
539
6
            }
540
541
202
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_AUN3_INDICATION_PRESENT;
542
202
            decoded += size;
543
202
            break;
544
195
        case OGS_NAS_5GS_REGISTRATION_REQUEST_REQUESTED_LP_WUSPS_ASSISTANCE_INFORMATION_TYPE:
545
195
            size = ogs_nas_5gs_decode_lp_wusps_assistance_information(&registration_request->requested_lp_wusps_assistance_information, pkbuf);
546
195
            if (size < 0) {
547
1
               ogs_error("ogs_nas_5gs_decode_lp_wusps_assistance_information() failed");
548
1
               return size;
549
1
            }
550
551
194
            registration_request->presencemask |= OGS_NAS_5GS_REGISTRATION_REQUEST_REQUESTED_LP_WUSPS_ASSISTANCE_INFORMATION_PRESENT;
552
194
            decoded += size;
553
194
            break;
554
2.15k
        default:
555
2.15k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
556
2.15k
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
557
2.15k
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
558
2.15k
            if (size < 0) {
559
15
               ogs_error("ogs_nas_skip_unknown_ie() failed");
560
15
               return size;
561
15
            }
562
563
2.14k
            decoded += size;
564
2.14k
            break;
565
13.4k
        }
566
13.4k
    }
567
568
468
    return decoded;
569
647
}
570
571
int ogs_nas_5gs_decode_registration_accept(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
572
981
{
573
981
    ogs_nas_5gs_registration_accept_t *registration_accept = &message->gmm.registration_accept;
574
981
    int decoded = 0;
575
981
    int size = 0;
576
577
981
    ogs_trace("[NAS] Decode REGISTRATION_ACCEPT\n");
578
579
981
    size = ogs_nas_5gs_decode_5gs_registration_result(&registration_accept->registration_result, pkbuf);
580
981
    if (size < 0) {
581
9
        ogs_error("ogs_nas_5gs_decode_5gs_registration_result() failed");
582
9
        return size;
583
9
    }
584
585
972
    decoded += size;
586
587
19.6k
    while (pkbuf->len > 0) {
588
18.9k
        uint8_t *buffer = pkbuf->data;
589
18.9k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
590
591
18.9k
        size = sizeof(uint8_t);
592
18.9k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
593
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
594
0
           return OGS_ERROR;
595
0
        }
596
18.9k
        decoded += size;
597
598
18.9k
        switch(type) {
599
196
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_5G_GUTI_TYPE:
600
196
            size = ogs_nas_5gs_decode_5gs_mobile_identity(&registration_accept->guti, pkbuf);
601
196
            if (size < 0) {
602
1
               ogs_error("ogs_nas_5gs_decode_5gs_mobile_identity() failed");
603
1
               return size;
604
1
            }
605
606
195
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_5G_GUTI_PRESENT;
607
195
            decoded += size;
608
195
            break;
609
214
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_EQUIVALENT_PLMNS_TYPE:
610
214
            size = ogs_nas_5gs_decode_plmn_list(&registration_accept->equivalent_plmns, pkbuf);
611
214
            if (size < 0) {
612
8
               ogs_error("ogs_nas_5gs_decode_plmn_list() failed");
613
8
               return size;
614
8
            }
615
616
206
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_EQUIVALENT_PLMNS_PRESENT;
617
206
            decoded += size;
618
206
            break;
619
226
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_TAI_LIST_TYPE:
620
226
            size = ogs_nas_5gs_decode_5gs_tracking_area_identity_list(&registration_accept->tai_list, pkbuf);
621
226
            if (size < 0) {
622
1
               ogs_error("ogs_nas_5gs_decode_5gs_tracking_area_identity_list() failed");
623
1
               return size;
624
1
            }
625
626
225
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_TAI_LIST_PRESENT;
627
225
            decoded += size;
628
225
            break;
629
270
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_ALLOWED_NSSAI_TYPE:
630
270
            size = ogs_nas_5gs_decode_nssai(&registration_accept->allowed_nssai, pkbuf);
631
270
            if (size < 0) {
632
2
               ogs_error("ogs_nas_5gs_decode_nssai() failed");
633
2
               return size;
634
2
            }
635
636
268
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_ALLOWED_NSSAI_PRESENT;
637
268
            decoded += size;
638
268
            break;
639
218
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_REJECTED_NSSAI_TYPE:
640
218
            size = ogs_nas_5gs_decode_rejected_nssai(&registration_accept->rejected_nssai, pkbuf);
641
218
            if (size < 0) {
642
1
               ogs_error("ogs_nas_5gs_decode_rejected_nssai() failed");
643
1
               return size;
644
1
            }
645
646
217
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_REJECTED_NSSAI_PRESENT;
647
217
            decoded += size;
648
217
            break;
649
204
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_CONFIGURED_NSSAI_TYPE:
650
204
            size = ogs_nas_5gs_decode_nssai(&registration_accept->configured_nssai, pkbuf);
651
204
            if (size < 0) {
652
2
               ogs_error("ogs_nas_5gs_decode_nssai() failed");
653
2
               return size;
654
2
            }
655
656
202
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_CONFIGURED_NSSAI_PRESENT;
657
202
            decoded += size;
658
202
            break;
659
234
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_5GS_NETWORK_FEATURE_SUPPORT_TYPE:
660
234
            size = ogs_nas_5gs_decode_5gs_network_feature_support(&registration_accept->network_feature_support, pkbuf);
661
234
            if (size < 0) {
662
7
               ogs_error("ogs_nas_5gs_decode_5gs_network_feature_support() failed");
663
7
               return size;
664
7
            }
665
666
227
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_5GS_NETWORK_FEATURE_SUPPORT_PRESENT;
667
227
            decoded += size;
668
227
            break;
669
199
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_PDU_SESSION_STATUS_TYPE:
670
199
            size = ogs_nas_5gs_decode_pdu_session_status(&registration_accept->pdu_session_status, pkbuf);
671
199
            if (size < 0) {
672
1
               ogs_error("ogs_nas_5gs_decode_pdu_session_status() failed");
673
1
               return size;
674
1
            }
675
676
198
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_PDU_SESSION_STATUS_PRESENT;
677
198
            decoded += size;
678
198
            break;
679
202
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_TYPE:
680
202
            size = ogs_nas_5gs_decode_pdu_session_reactivation_result(&registration_accept->pdu_session_reactivation_result, pkbuf);
681
202
            if (size < 0) {
682
2
               ogs_error("ogs_nas_5gs_decode_pdu_session_reactivation_result() failed");
683
2
               return size;
684
2
            }
685
686
200
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_PRESENT;
687
200
            decoded += size;
688
200
            break;
689
203
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_ERROR_CAUSE_TYPE:
690
203
            size = ogs_nas_5gs_decode_pdu_session_reactivation_result_error_cause(&registration_accept->pdu_session_reactivation_result_error_cause, pkbuf);
691
203
            if (size < 0) {
692
3
               ogs_error("ogs_nas_5gs_decode_pdu_session_reactivation_result_error_cause() failed");
693
3
               return size;
694
3
            }
695
696
200
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_ERROR_CAUSE_PRESENT;
697
200
            decoded += size;
698
200
            break;
699
204
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_LADN_INFORMATION_TYPE:
700
204
            size = ogs_nas_5gs_decode_ladn_information(&registration_accept->ladn_information, pkbuf);
701
204
            if (size < 0) {
702
5
               ogs_error("ogs_nas_5gs_decode_ladn_information() failed");
703
5
               return size;
704
5
            }
705
706
199
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_LADN_INFORMATION_PRESENT;
707
199
            decoded += size;
708
199
            break;
709
402
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_MICO_INDICATION_TYPE:
710
402
            decoded--;
711
402
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
712
402
            size = ogs_nas_5gs_decode_mico_indication(&registration_accept->mico_indication, pkbuf);
713
402
            if (size < 0) {
714
0
               ogs_error("ogs_nas_5gs_decode_mico_indication() failed");
715
0
               return size;
716
0
            }
717
718
402
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_MICO_INDICATION_PRESENT;
719
402
            decoded += size;
720
402
            break;
721
644
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_NETWORK_SLICING_INDICATION_TYPE:
722
644
            decoded--;
723
644
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
724
644
            size = ogs_nas_5gs_decode_network_slicing_indication(&registration_accept->network_slicing_indication, pkbuf);
725
644
            if (size < 0) {
726
0
               ogs_error("ogs_nas_5gs_decode_network_slicing_indication() failed");
727
0
               return size;
728
0
            }
729
730
644
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_NETWORK_SLICING_INDICATION_PRESENT;
731
644
            decoded += size;
732
644
            break;
733
207
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_SERVICE_AREA_LIST_TYPE:
734
207
            size = ogs_nas_5gs_decode_service_area_list(&registration_accept->service_area_list, pkbuf);
735
207
            if (size < 0) {
736
1
               ogs_error("ogs_nas_5gs_decode_service_area_list() failed");
737
1
               return size;
738
1
            }
739
740
206
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_SERVICE_AREA_LIST_PRESENT;
741
206
            decoded += size;
742
206
            break;
743
204
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_T3512_VALUE_TYPE:
744
204
            size = ogs_nas_5gs_decode_gprs_timer_3(&registration_accept->t3512_value, pkbuf);
745
204
            if (size < 0) {
746
2
               ogs_error("ogs_nas_5gs_decode_gprs_timer_3() failed");
747
2
               return size;
748
2
            }
749
750
202
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_T3512_VALUE_PRESENT;
751
202
            decoded += size;
752
202
            break;
753
196
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_NON_3GPP_DE_REGISTRATION_TIMER_VALUE_TYPE:
754
196
            size = ogs_nas_5gs_decode_gprs_timer_2(&registration_accept->non_3gpp_de_registration_timer_value, pkbuf);
755
196
            if (size < 0) {
756
2
               ogs_error("ogs_nas_5gs_decode_gprs_timer_2() failed");
757
2
               return size;
758
2
            }
759
760
194
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_NON_3GPP_DE_REGISTRATION_TIMER_VALUE_PRESENT;
761
194
            decoded += size;
762
194
            break;
763
201
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_T3502_VALUE_TYPE:
764
201
            size = ogs_nas_5gs_decode_gprs_timer_2(&registration_accept->t3502_value, pkbuf);
765
201
            if (size < 0) {
766
1
               ogs_error("ogs_nas_5gs_decode_gprs_timer_2() failed");
767
1
               return size;
768
1
            }
769
770
200
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_T3502_VALUE_PRESENT;
771
200
            decoded += size;
772
200
            break;
773
212
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_EMERGENCY_NUMBER_LIST_TYPE:
774
212
            size = ogs_nas_5gs_decode_emergency_number_list(&registration_accept->emergency_number_list, pkbuf);
775
212
            if (size < 0) {
776
6
               ogs_error("ogs_nas_5gs_decode_emergency_number_list() failed");
777
6
               return size;
778
6
            }
779
780
206
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_EMERGENCY_NUMBER_LIST_PRESENT;
781
206
            decoded += size;
782
206
            break;
783
276
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_EXTENDED_EMERGENCY_NUMBER_LIST_TYPE:
784
276
            size = ogs_nas_5gs_decode_extended_emergency_number_list(&registration_accept->extended_emergency_number_list, pkbuf);
785
276
            if (size < 0) {
786
27
               ogs_error("ogs_nas_5gs_decode_extended_emergency_number_list() failed");
787
27
               return size;
788
27
            }
789
790
249
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_EXTENDED_EMERGENCY_NUMBER_LIST_PRESENT;
791
249
            decoded += size;
792
249
            break;
793
221
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_SOR_TRANSPARENT_CONTAINER_TYPE:
794
221
            size = ogs_nas_5gs_decode_sor_transparent_container(&registration_accept->sor_transparent_container, pkbuf);
795
221
            if (size < 0) {
796
10
               ogs_error("ogs_nas_5gs_decode_sor_transparent_container() failed");
797
10
               return size;
798
10
            }
799
800
211
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_SOR_TRANSPARENT_CONTAINER_PRESENT;
801
211
            decoded += size;
802
211
            break;
803
200
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_EAP_MESSAGE_TYPE:
804
200
            size = ogs_nas_5gs_decode_eap_message(&registration_accept->eap_message, pkbuf);
805
200
            if (size < 0) {
806
1
               ogs_error("ogs_nas_5gs_decode_eap_message() failed");
807
1
               return size;
808
1
            }
809
810
199
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_EAP_MESSAGE_PRESENT;
811
199
            decoded += size;
812
199
            break;
813
482
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_NSSAI_INCLUSION_MODE_TYPE:
814
482
            decoded--;
815
482
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
816
482
            size = ogs_nas_5gs_decode_nssai_inclusion_mode(&registration_accept->nssai_inclusion_mode, pkbuf);
817
482
            if (size < 0) {
818
0
               ogs_error("ogs_nas_5gs_decode_nssai_inclusion_mode() failed");
819
0
               return size;
820
0
            }
821
822
482
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_NSSAI_INCLUSION_MODE_PRESENT;
823
482
            decoded += size;
824
482
            break;
825
218
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_OPERATOR_DEFINED_ACCESS_CATEGORY_DEFINITIONS_TYPE:
826
218
            size = ogs_nas_5gs_decode_operator_defined_access_category_definitions(&registration_accept->operator_defined_access_category_definitions, pkbuf);
827
218
            if (size < 0) {
828
6
               ogs_error("ogs_nas_5gs_decode_operator_defined_access_category_definitions() failed");
829
6
               return size;
830
6
            }
831
832
212
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_OPERATOR_DEFINED_ACCESS_CATEGORY_DEFINITIONS_PRESENT;
833
212
            decoded += size;
834
212
            break;
835
215
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_NEGOTIATED_DRX_PARAMETERS_TYPE:
836
215
            size = ogs_nas_5gs_decode_5gs_drx_parameters(&registration_accept->negotiated_drx_parameters, pkbuf);
837
215
            if (size < 0) {
838
7
               ogs_error("ogs_nas_5gs_decode_5gs_drx_parameters() failed");
839
7
               return size;
840
7
            }
841
842
208
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_NEGOTIATED_DRX_PARAMETERS_PRESENT;
843
208
            decoded += size;
844
208
            break;
845
346
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_NON_3GPP_NW_POLICIES_TYPE:
846
346
            decoded--;
847
346
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
848
346
            size = ogs_nas_5gs_decode_non_3gpp_nw_provided_policies(&registration_accept->non_3gpp_nw_policies, pkbuf);
849
346
            if (size < 0) {
850
6
               ogs_error("ogs_nas_5gs_decode_non_3gpp_nw_provided_policies() failed");
851
6
               return size;
852
6
            }
853
854
340
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_NON_3GPP_NW_POLICIES_PRESENT;
855
340
            decoded += size;
856
340
            break;
857
252
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_EPS_BEARER_CONTEXT_STATUS_TYPE:
858
252
            size = ogs_nas_5gs_decode_eps_bearer_context_status(&registration_accept->eps_bearer_context_status, pkbuf);
859
252
            if (size < 0) {
860
8
               ogs_error("ogs_nas_5gs_decode_eps_bearer_context_status() failed");
861
8
               return size;
862
8
            }
863
864
244
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_EPS_BEARER_CONTEXT_STATUS_PRESENT;
865
244
            decoded += size;
866
244
            break;
867
214
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_NEGOTIATED_EXTENDED_DRX_PARAMETERS_TYPE:
868
214
            size = ogs_nas_5gs_decode_extended_drx_parameters(&registration_accept->negotiated_extended_drx_parameters, pkbuf);
869
214
            if (size < 0) {
870
5
               ogs_error("ogs_nas_5gs_decode_extended_drx_parameters() failed");
871
5
               return size;
872
5
            }
873
874
209
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_NEGOTIATED_EXTENDED_DRX_PARAMETERS_PRESENT;
875
209
            decoded += size;
876
209
            break;
877
203
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_T3447_VALUE_TYPE:
878
203
            size = ogs_nas_5gs_decode_gprs_timer_3(&registration_accept->t3447_value, pkbuf);
879
203
            if (size < 0) {
880
1
               ogs_error("ogs_nas_5gs_decode_gprs_timer_3() failed");
881
1
               return size;
882
1
            }
883
884
202
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_T3447_VALUE_PRESENT;
885
202
            decoded += size;
886
202
            break;
887
201
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_T3448_VALUE_TYPE:
888
201
            size = ogs_nas_5gs_decode_gprs_timer_2(&registration_accept->t3448_value, pkbuf);
889
201
            if (size < 0) {
890
1
               ogs_error("ogs_nas_5gs_decode_gprs_timer_2() failed");
891
1
               return size;
892
1
            }
893
894
200
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_T3448_VALUE_PRESENT;
895
200
            decoded += size;
896
200
            break;
897
199
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_T3324_VALUE_TYPE:
898
199
            size = ogs_nas_5gs_decode_gprs_timer_3(&registration_accept->t3324_value, pkbuf);
899
199
            if (size < 0) {
900
2
               ogs_error("ogs_nas_5gs_decode_gprs_timer_3() failed");
901
2
               return size;
902
2
            }
903
904
197
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_T3324_VALUE_PRESENT;
905
197
            decoded += size;
906
197
            break;
907
210
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_UE_RADIO_CAPABILITY_ID_TYPE:
908
210
            size = ogs_nas_5gs_decode_ue_radio_capability_id(&registration_accept->ue_radio_capability_id, pkbuf);
909
210
            if (size < 0) {
910
1
               ogs_error("ogs_nas_5gs_decode_ue_radio_capability_id() failed");
911
1
               return size;
912
1
            }
913
914
209
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_UE_RADIO_CAPABILITY_ID_PRESENT;
915
209
            decoded += size;
916
209
            break;
917
733
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_TYPE:
918
733
            decoded--;
919
733
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
920
733
            size = ogs_nas_5gs_decode_ue_radio_capability_id_deletion_indication(&registration_accept->ue_radio_capability_id_deletion_indication, pkbuf);
921
733
            if (size < 0) {
922
0
               ogs_error("ogs_nas_5gs_decode_ue_radio_capability_id_deletion_indication() failed");
923
0
               return size;
924
0
            }
925
926
733
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_PRESENT;
927
733
            decoded += size;
928
733
            break;
929
211
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_PENDING_NSSAI_TYPE:
930
211
            size = ogs_nas_5gs_decode_nssai(&registration_accept->pending_nssai, pkbuf);
931
211
            if (size < 0) {
932
1
               ogs_error("ogs_nas_5gs_decode_nssai() failed");
933
1
               return size;
934
1
            }
935
936
210
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_PENDING_NSSAI_PRESENT;
937
210
            decoded += size;
938
210
            break;
939
289
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_CIPHERING_KEY_DATA_TYPE:
940
289
            size = ogs_nas_5gs_decode_ciphering_key_data(&registration_accept->ciphering_key_data, pkbuf);
941
289
            if (size < 0) {
942
29
               ogs_error("ogs_nas_5gs_decode_ciphering_key_data() failed");
943
29
               return size;
944
29
            }
945
946
260
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_CIPHERING_KEY_DATA_PRESENT;
947
260
            decoded += size;
948
260
            break;
949
228
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_CAG_INFORMATION_LIST_TYPE:
950
228
            size = ogs_nas_5gs_decode_cag_information_list(&registration_accept->cag_information_list, pkbuf);
951
228
            if (size < 0) {
952
7
               ogs_error("ogs_nas_5gs_decode_cag_information_list() failed");
953
7
               return size;
954
7
            }
955
956
221
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_CAG_INFORMATION_LIST_PRESENT;
957
221
            decoded += size;
958
221
            break;
959
202
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_TRUNCATED_5G_S_TMSI_CONFIGURATION_TYPE:
960
202
            size = ogs_nas_5gs_decode_truncated_5g_s_tmsi_configuration(&registration_accept->truncated_s_tmsi_configuration, pkbuf);
961
202
            if (size < 0) {
962
2
               ogs_error("ogs_nas_5gs_decode_truncated_5g_s_tmsi_configuration() failed");
963
2
               return size;
964
2
            }
965
966
200
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_TRUNCATED_5G_S_TMSI_CONFIGURATION_PRESENT;
967
200
            decoded += size;
968
200
            break;
969
216
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_NEGOTIATED_WUS_ASSISTANCE_INFORMATION_TYPE:
970
216
            size = ogs_nas_5gs_decode_wus_assistance_information(&registration_accept->negotiated_wus_assistance_information, pkbuf);
971
216
            if (size < 0) {
972
5
               ogs_error("ogs_nas_5gs_decode_wus_assistance_information() failed");
973
5
               return size;
974
5
            }
975
976
211
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_NEGOTIATED_WUS_ASSISTANCE_INFORMATION_PRESENT;
977
211
            decoded += size;
978
211
            break;
979
210
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_NEGOTIATED_NB_N1_MODE_DRX_PARAMETERS_TYPE:
980
210
            size = ogs_nas_5gs_decode_nb_n1_mode_drx_parameters(&registration_accept->negotiated_nb_n1_mode_drx_parameters, pkbuf);
981
210
            if (size < 0) {
982
8
               ogs_error("ogs_nas_5gs_decode_nb_n1_mode_drx_parameters() failed");
983
8
               return size;
984
8
            }
985
986
202
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_NEGOTIATED_NB_N1_MODE_DRX_PARAMETERS_PRESENT;
987
202
            decoded += size;
988
202
            break;
989
212
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_EXTENDED_REJECTED_NSSAI_TYPE:
990
212
            size = ogs_nas_5gs_decode_extended_rejected_nssai(&registration_accept->extended_rejected_nssai, pkbuf);
991
212
            if (size < 0) {
992
1
               ogs_error("ogs_nas_5gs_decode_extended_rejected_nssai() failed");
993
1
               return size;
994
1
            }
995
996
211
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_EXTENDED_REJECTED_NSSAI_PRESENT;
997
211
            decoded += size;
998
211
            break;
999
215
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_SERVICE_LEVEL_AA_CONTAINER_TYPE:
1000
215
            size = ogs_nas_5gs_decode_service_level_aa_container(&registration_accept->service_level_aa_container, pkbuf);
1001
215
            if (size < 0) {
1002
1
               ogs_error("ogs_nas_5gs_decode_service_level_aa_container() failed");
1003
1
               return size;
1004
1
            }
1005
1006
214
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_SERVICE_LEVEL_AA_CONTAINER_PRESENT;
1007
214
            decoded += size;
1008
214
            break;
1009
218
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_NEGOTIATED_PEIPS_ASSISTANCE_INFORMATION_TYPE:
1010
218
            size = ogs_nas_5gs_decode_peips_assistance_information(&registration_accept->negotiated_peips_assistance_information, pkbuf);
1011
218
            if (size < 0) {
1012
1
               ogs_error("ogs_nas_5gs_decode_peips_assistance_information() failed");
1013
1
               return size;
1014
1
            }
1015
1016
217
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_NEGOTIATED_PEIPS_ASSISTANCE_INFORMATION_PRESENT;
1017
217
            decoded += size;
1018
217
            break;
1019
203
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_5GS_ADDITIONAL_REQUEST_RESULT_TYPE:
1020
203
            size = ogs_nas_5gs_decode_5gs_additional_request_result(&registration_accept->additional_request_result, pkbuf);
1021
203
            if (size < 0) {
1022
2
               ogs_error("ogs_nas_5gs_decode_5gs_additional_request_result() failed");
1023
2
               return size;
1024
2
            }
1025
1026
201
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_5GS_ADDITIONAL_REQUEST_RESULT_PRESENT;
1027
201
            decoded += size;
1028
201
            break;
1029
290
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_NSSRG_INFORMATION_TYPE:
1030
290
            size = ogs_nas_5gs_decode_nssrg_information(&registration_accept->nssrg_information, pkbuf);
1031
290
            if (size < 0) {
1032
2
               ogs_error("ogs_nas_5gs_decode_nssrg_information() failed");
1033
2
               return size;
1034
2
            }
1035
1036
288
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_NSSRG_INFORMATION_PRESENT;
1037
288
            decoded += size;
1038
288
            break;
1039
201
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_DISASTER_ROAMING_WAIT_RANGE_TYPE:
1040
201
            size = ogs_nas_5gs_decode_registration_wait_range(&registration_accept->disaster_roaming_wait_range, pkbuf);
1041
201
            if (size < 0) {
1042
2
               ogs_error("ogs_nas_5gs_decode_registration_wait_range() failed");
1043
2
               return size;
1044
2
            }
1045
1046
199
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_DISASTER_ROAMING_WAIT_RANGE_PRESENT;
1047
199
            decoded += size;
1048
199
            break;
1049
231
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_DISASTER_RETURN_WAIT_RANGE_TYPE:
1050
231
            size = ogs_nas_5gs_decode_registration_wait_range(&registration_accept->disaster_return_wait_range, pkbuf);
1051
231
            if (size < 0) {
1052
1
               ogs_error("ogs_nas_5gs_decode_registration_wait_range() failed");
1053
1
               return size;
1054
1
            }
1055
1056
230
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_DISASTER_RETURN_WAIT_RANGE_PRESENT;
1057
230
            decoded += size;
1058
230
            break;
1059
198
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_LIST_OF_PLMNS_TO_BE_USED_IN_DISASTER_CONDITION_TYPE:
1060
198
            size = ogs_nas_5gs_decode_list_of_plmns_to_be_used_in_disaster_condition(&registration_accept->list_of_plmns_to_be_used_in_disaster_condition, pkbuf);
1061
198
            if (size < 0) {
1062
2
               ogs_error("ogs_nas_5gs_decode_list_of_plmns_to_be_used_in_disaster_condition() failed");
1063
2
               return size;
1064
2
            }
1065
1066
196
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_LIST_OF_PLMNS_TO_BE_USED_IN_DISASTER_CONDITION_PRESENT;
1067
196
            decoded += size;
1068
196
            break;
1069
199
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_FORBIDDEN_TAI_FOR_THE_LIST_OF_5GS_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_TYPE:
1070
199
            size = ogs_nas_5gs_decode_5gs_tracking_area_identity_list(&registration_accept->forbidden_tai_for_the_list_of_forbidden_tracking_areas_for_roaming, pkbuf);
1071
199
            if (size < 0) {
1072
1
               ogs_error("ogs_nas_5gs_decode_5gs_tracking_area_identity_list() failed");
1073
1
               return size;
1074
1
            }
1075
1076
198
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_FORBIDDEN_TAI_FOR_THE_LIST_OF_5GS_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_PRESENT;
1077
198
            decoded += size;
1078
198
            break;
1079
200
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_FORBIDDEN_TAI_FOR_THE_LIST_OF_5GS_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_TYPE:
1080
200
            size = ogs_nas_5gs_decode_5gs_tracking_area_identity_list(&registration_accept->forbidden_tai_for_the_list_of_forbidden_tracking_areas_forregional_provision_of_service, pkbuf);
1081
200
            if (size < 0) {
1082
1
               ogs_error("ogs_nas_5gs_decode_5gs_tracking_area_identity_list() failed");
1083
1
               return size;
1084
1
            }
1085
1086
199
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_FORBIDDEN_TAI_FOR_THE_LIST_OF_5GS_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_PRESENT;
1087
199
            decoded += size;
1088
199
            break;
1089
233
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_EXTENDED_CAG_INFORMATION_LIST_TYPE:
1090
233
            size = ogs_nas_5gs_decode_extended_cag_information_list(&registration_accept->extended_cag_information_list, pkbuf);
1091
233
            if (size < 0) {
1092
1
               ogs_error("ogs_nas_5gs_decode_extended_cag_information_list() failed");
1093
1
               return size;
1094
1
            }
1095
1096
232
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_EXTENDED_CAG_INFORMATION_LIST_PRESENT;
1097
232
            decoded += size;
1098
232
            break;
1099
205
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_NSAG_INFORMATION_TYPE:
1100
205
            size = ogs_nas_5gs_decode_nsag_information(&registration_accept->nsag_information, pkbuf);
1101
205
            if (size < 0) {
1102
9
               ogs_error("ogs_nas_5gs_decode_nsag_information() failed");
1103
9
               return size;
1104
9
            }
1105
1106
196
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_NSAG_INFORMATION_PRESENT;
1107
196
            decoded += size;
1108
196
            break;
1109
216
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_EQUIVALENT_SNPNS_TYPE:
1110
216
            size = ogs_nas_5gs_decode_snpn_list(&registration_accept->equivalent_snpns, pkbuf);
1111
216
            if (size < 0) {
1112
6
               ogs_error("ogs_nas_5gs_decode_snpn_list() failed");
1113
6
               return size;
1114
6
            }
1115
1116
210
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_EQUIVALENT_SNPNS_PRESENT;
1117
210
            decoded += size;
1118
210
            break;
1119
221
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_NID_TYPE:
1120
221
            size = ogs_nas_5gs_decode_nid(&registration_accept->nid, pkbuf);
1121
221
            if (size < 0) {
1122
7
               ogs_error("ogs_nas_5gs_decode_nid() failed");
1123
7
               return size;
1124
7
            }
1125
1126
214
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_NID_PRESENT;
1127
214
            decoded += size;
1128
214
            break;
1129
281
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_REGISTRATION_ACCEPT_TYPE_6_IE_CONTAINER_TYPE:
1130
281
            size = ogs_nas_5gs_decode_type_6_ie_container(&registration_accept->registration_accept_type_6_ie_container, pkbuf);
1131
281
            if (size < 0) {
1132
27
               ogs_error("ogs_nas_5gs_decode_type_6_ie_container() failed");
1133
27
               return size;
1134
27
            }
1135
1136
254
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_REGISTRATION_ACCEPT_TYPE_6_IE_CONTAINER_PRESENT;
1137
254
            decoded += size;
1138
254
            break;
1139
200
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_RAN_TIMING_SYNCHRONIZATION_TYPE:
1140
200
            size = ogs_nas_5gs_decode_ran_timing_synchronization(&registration_accept->ran_timing_synchronization, pkbuf);
1141
200
            if (size < 0) {
1142
2
               ogs_error("ogs_nas_5gs_decode_ran_timing_synchronization() failed");
1143
2
               return size;
1144
2
            }
1145
1146
198
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_RAN_TIMING_SYNCHRONIZATION_PRESENT;
1147
198
            decoded += size;
1148
198
            break;
1149
197
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_ALTERNATIVE_NSSAI_TYPE:
1150
197
            size = ogs_nas_5gs_decode_alternative_nssai(&registration_accept->alternative_nssai, pkbuf);
1151
197
            if (size < 0) {
1152
1
               ogs_error("ogs_nas_5gs_decode_alternative_nssai() failed");
1153
1
               return size;
1154
1
            }
1155
1156
196
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_ALTERNATIVE_NSSAI_PRESENT;
1157
196
            decoded += size;
1158
196
            break;
1159
195
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_DISCONTINUOUS_COVERAGE_MAXIMUM_TIME_OFFSET_TYPE:
1160
195
            size = ogs_nas_5gs_decode_gprs_timer_3(&registration_accept->discontinuous_coverage_maximum_time_offset, pkbuf);
1161
195
            if (size < 0) {
1162
1
               ogs_error("ogs_nas_5gs_decode_gprs_timer_3() failed");
1163
1
               return size;
1164
1
            }
1165
1166
194
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_DISCONTINUOUS_COVERAGE_MAXIMUM_TIME_OFFSET_PRESENT;
1167
194
            decoded += size;
1168
194
            break;
1169
207
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_S_NSSAI_TIME_VALIDITY_INFORMATION_TYPE:
1170
207
            size = ogs_nas_5gs_decode_s_nssai_time_validity_information(&registration_accept->s_nssai_time_validity_information, pkbuf);
1171
207
            if (size < 0) {
1172
2
               ogs_error("ogs_nas_5gs_decode_s_nssai_time_validity_information() failed");
1173
2
               return size;
1174
2
            }
1175
1176
205
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_S_NSSAI_TIME_VALIDITY_INFORMATION_PRESENT;
1177
205
            decoded += size;
1178
205
            break;
1179
219
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_UNAVAILABILITY_CONFIGURATION_TYPE:
1180
219
            size = ogs_nas_5gs_decode_unavailability_configuration(&registration_accept->unavailability_configuration, pkbuf);
1181
219
            if (size < 0) {
1182
7
               ogs_error("ogs_nas_5gs_decode_unavailability_configuration() failed");
1183
7
               return size;
1184
7
            }
1185
1186
212
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_UNAVAILABILITY_CONFIGURATION_PRESENT;
1187
212
            decoded += size;
1188
212
            break;
1189
202
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_FEATURE_AUTHORIZATION_INDICATION_TYPE:
1190
202
            size = ogs_nas_5gs_decode_feature_authorization_indication(&registration_accept->feature_authorization_indication, pkbuf);
1191
202
            if (size < 0) {
1192
1
               ogs_error("ogs_nas_5gs_decode_feature_authorization_indication() failed");
1193
1
               return size;
1194
1
            }
1195
1196
201
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_FEATURE_AUTHORIZATION_INDICATION_PRESENT;
1197
201
            decoded += size;
1198
201
            break;
1199
199
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_ON_DEMAND_NSSAI_TYPE:
1200
199
            size = ogs_nas_5gs_decode_on_demand_nssai(&registration_accept->on_demand_nssai, pkbuf);
1201
199
            if (size < 0) {
1202
2
               ogs_error("ogs_nas_5gs_decode_on_demand_nssai() failed");
1203
2
               return size;
1204
2
            }
1205
1206
197
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_ON_DEMAND_NSSAI_PRESENT;
1207
197
            decoded += size;
1208
197
            break;
1209
195
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_ACCESS_TECHNOLOGY_UTILIZATION_CONTROL_TYPE:
1210
195
            size = ogs_nas_5gs_decode_access_technology_utilization_control(&registration_accept->access_technology_utilization_control, pkbuf);
1211
195
            if (size < 0) {
1212
1
               ogs_error("ogs_nas_5gs_decode_access_technology_utilization_control() failed");
1213
1
               return size;
1214
1
            }
1215
1216
194
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_ACCESS_TECHNOLOGY_UTILIZATION_CONTROL_PRESENT;
1217
194
            decoded += size;
1218
194
            break;
1219
197
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_NEGOTIATED_LP_WUSPS_ASSISTANCE_INFORMATION_TYPE:
1220
197
            size = ogs_nas_5gs_decode_lp_wusps_assistance_information(&registration_accept->negotiated_lp_wusps_assistance_information, pkbuf);
1221
197
            if (size < 0) {
1222
1
               ogs_error("ogs_nas_5gs_decode_lp_wusps_assistance_information() failed");
1223
1
               return size;
1224
1
            }
1225
1226
196
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_NEGOTIATED_LP_WUSPS_ASSISTANCE_INFORMATION_PRESENT;
1227
196
            decoded += size;
1228
196
            break;
1229
591
        case OGS_NAS_5GS_REGISTRATION_ACCEPT_LP_WUS_STATUS_TYPE:
1230
591
            decoded--;
1231
591
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
1232
591
            size = ogs_nas_5gs_decode_lp_wus_status(&registration_accept->lp_wus_status, pkbuf);
1233
591
            if (size < 0) {
1234
0
               ogs_error("ogs_nas_5gs_decode_lp_wus_status() failed");
1235
0
               return size;
1236
0
            }
1237
1238
591
            registration_accept->presencemask |= OGS_NAS_5GS_REGISTRATION_ACCEPT_LP_WUS_STATUS_PRESENT;
1239
591
            decoded += size;
1240
591
            break;
1241
3.45k
        default:
1242
3.45k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
1243
3.45k
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
1244
3.45k
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
1245
3.45k
            if (size < 0) {
1246
22
               ogs_error("ogs_nas_skip_unknown_ie() failed");
1247
22
               return size;
1248
22
            }
1249
1250
3.43k
            decoded += size;
1251
3.43k
            break;
1252
18.9k
        }
1253
18.9k
    }
1254
1255
696
    return decoded;
1256
972
}
1257
1258
int ogs_nas_5gs_decode_registration_complete(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
1259
60
{
1260
60
    ogs_nas_5gs_registration_complete_t *registration_complete = &message->gmm.registration_complete;
1261
60
    int decoded = 0;
1262
60
    int size = 0;
1263
1264
60
    ogs_trace("[NAS] Decode REGISTRATION_COMPLETE\n");
1265
1266
992
    while (pkbuf->len > 0) {
1267
962
        uint8_t *buffer = pkbuf->data;
1268
962
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
1269
1270
962
        size = sizeof(uint8_t);
1271
962
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
1272
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
1273
0
           return OGS_ERROR;
1274
0
        }
1275
962
        decoded += size;
1276
1277
962
        switch(type) {
1278
215
        case OGS_NAS_5GS_REGISTRATION_COMPLETE_SOR_TRANSPARENT_CONTAINER_TYPE:
1279
215
            size = ogs_nas_5gs_decode_sor_transparent_container(&registration_complete->sor_transparent_container, pkbuf);
1280
215
            if (size < 0) {
1281
17
               ogs_error("ogs_nas_5gs_decode_sor_transparent_container() failed");
1282
17
               return size;
1283
17
            }
1284
1285
198
            registration_complete->presencemask |= OGS_NAS_5GS_REGISTRATION_COMPLETE_SOR_TRANSPARENT_CONTAINER_PRESENT;
1286
198
            decoded += size;
1287
198
            break;
1288
747
        default:
1289
747
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
1290
747
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
1291
747
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
1292
747
            if (size < 0) {
1293
13
               ogs_error("ogs_nas_skip_unknown_ie() failed");
1294
13
               return size;
1295
13
            }
1296
1297
734
            decoded += size;
1298
734
            break;
1299
962
        }
1300
962
    }
1301
1302
30
    return decoded;
1303
60
}
1304
1305
int ogs_nas_5gs_decode_registration_reject(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
1306
216
{
1307
216
    ogs_nas_5gs_registration_reject_t *registration_reject = &message->gmm.registration_reject;
1308
216
    int decoded = 0;
1309
216
    int size = 0;
1310
1311
216
    ogs_trace("[NAS] Decode REGISTRATION_REJECT\n");
1312
1313
216
    size = ogs_nas_5gs_decode_5gmm_cause(&registration_reject->gmm_cause, pkbuf);
1314
216
    if (size < 0) {
1315
0
        ogs_error("ogs_nas_5gs_decode_5gmm_cause() failed");
1316
0
        return size;
1317
0
    }
1318
1319
216
    decoded += size;
1320
1321
3.96k
    while (pkbuf->len > 0) {
1322
3.79k
        uint8_t *buffer = pkbuf->data;
1323
3.79k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
1324
1325
3.79k
        size = sizeof(uint8_t);
1326
3.79k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
1327
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
1328
0
           return OGS_ERROR;
1329
0
        }
1330
3.79k
        decoded += size;
1331
1332
3.79k
        switch(type) {
1333
195
        case OGS_NAS_5GS_REGISTRATION_REJECT_T3346_VALUE_TYPE:
1334
195
            size = ogs_nas_5gs_decode_gprs_timer_2(&registration_reject->t3346_value, pkbuf);
1335
195
            if (size < 0) {
1336
1
               ogs_error("ogs_nas_5gs_decode_gprs_timer_2() failed");
1337
1
               return size;
1338
1
            }
1339
1340
194
            registration_reject->presencemask |= OGS_NAS_5GS_REGISTRATION_REJECT_T3346_VALUE_PRESENT;
1341
194
            decoded += size;
1342
194
            break;
1343
197
        case OGS_NAS_5GS_REGISTRATION_REJECT_T3502_VALUE_TYPE:
1344
197
            size = ogs_nas_5gs_decode_gprs_timer_2(&registration_reject->t3502_value, pkbuf);
1345
197
            if (size < 0) {
1346
1
               ogs_error("ogs_nas_5gs_decode_gprs_timer_2() failed");
1347
1
               return size;
1348
1
            }
1349
1350
196
            registration_reject->presencemask |= OGS_NAS_5GS_REGISTRATION_REJECT_T3502_VALUE_PRESENT;
1351
196
            decoded += size;
1352
196
            break;
1353
198
        case OGS_NAS_5GS_REGISTRATION_REJECT_EAP_MESSAGE_TYPE:
1354
198
            size = ogs_nas_5gs_decode_eap_message(&registration_reject->eap_message, pkbuf);
1355
198
            if (size < 0) {
1356
1
               ogs_error("ogs_nas_5gs_decode_eap_message() failed");
1357
1
               return size;
1358
1
            }
1359
1360
197
            registration_reject->presencemask |= OGS_NAS_5GS_REGISTRATION_REJECT_EAP_MESSAGE_PRESENT;
1361
197
            decoded += size;
1362
197
            break;
1363
231
        case OGS_NAS_5GS_REGISTRATION_REJECT_REJECTED_NSSAI_TYPE:
1364
231
            size = ogs_nas_5gs_decode_rejected_nssai(&registration_reject->rejected_nssai, pkbuf);
1365
231
            if (size < 0) {
1366
2
               ogs_error("ogs_nas_5gs_decode_rejected_nssai() failed");
1367
2
               return size;
1368
2
            }
1369
1370
229
            registration_reject->presencemask |= OGS_NAS_5GS_REGISTRATION_REJECT_REJECTED_NSSAI_PRESENT;
1371
229
            decoded += size;
1372
229
            break;
1373
204
        case OGS_NAS_5GS_REGISTRATION_REJECT_CAG_INFORMATION_LIST_TYPE:
1374
204
            size = ogs_nas_5gs_decode_cag_information_list(&registration_reject->cag_information_list, pkbuf);
1375
204
            if (size < 0) {
1376
5
               ogs_error("ogs_nas_5gs_decode_cag_information_list() failed");
1377
5
               return size;
1378
5
            }
1379
1380
199
            registration_reject->presencemask |= OGS_NAS_5GS_REGISTRATION_REJECT_CAG_INFORMATION_LIST_PRESENT;
1381
199
            decoded += size;
1382
199
            break;
1383
202
        case OGS_NAS_5GS_REGISTRATION_REJECT_EXTENDED_REJECTED_NSSAI_TYPE:
1384
202
            size = ogs_nas_5gs_decode_extended_rejected_nssai(&registration_reject->extended_rejected_nssai, pkbuf);
1385
202
            if (size < 0) {
1386
2
               ogs_error("ogs_nas_5gs_decode_extended_rejected_nssai() failed");
1387
2
               return size;
1388
2
            }
1389
1390
200
            registration_reject->presencemask |= OGS_NAS_5GS_REGISTRATION_REJECT_EXTENDED_REJECTED_NSSAI_PRESENT;
1391
200
            decoded += size;
1392
200
            break;
1393
198
        case OGS_NAS_5GS_REGISTRATION_REJECT_DISASTER_RETURN_WAIT_RANGE_TYPE:
1394
198
            size = ogs_nas_5gs_decode_registration_wait_range(&registration_reject->disaster_return_wait_range, pkbuf);
1395
198
            if (size < 0) {
1396
1
               ogs_error("ogs_nas_5gs_decode_registration_wait_range() failed");
1397
1
               return size;
1398
1
            }
1399
1400
197
            registration_reject->presencemask |= OGS_NAS_5GS_REGISTRATION_REJECT_DISASTER_RETURN_WAIT_RANGE_PRESENT;
1401
197
            decoded += size;
1402
197
            break;
1403
207
        case OGS_NAS_5GS_REGISTRATION_REJECT_EXTENDED_CAG_INFORMATION_LIST_TYPE:
1404
207
            size = ogs_nas_5gs_decode_extended_cag_information_list(&registration_reject->extended_cag_information_list, pkbuf);
1405
207
            if (size < 0) {
1406
5
               ogs_error("ogs_nas_5gs_decode_extended_cag_information_list() failed");
1407
5
               return size;
1408
5
            }
1409
1410
202
            registration_reject->presencemask |= OGS_NAS_5GS_REGISTRATION_REJECT_EXTENDED_CAG_INFORMATION_LIST_PRESENT;
1411
202
            decoded += size;
1412
202
            break;
1413
198
        case OGS_NAS_5GS_REGISTRATION_REJECT_LOWER_BOUND_TIMER_VALUE_TYPE:
1414
198
            size = ogs_nas_5gs_decode_gprs_timer_3(&registration_reject->lower_bound_timer_value, pkbuf);
1415
198
            if (size < 0) {
1416
1
               ogs_error("ogs_nas_5gs_decode_gprs_timer_3() failed");
1417
1
               return size;
1418
1
            }
1419
1420
197
            registration_reject->presencemask |= OGS_NAS_5GS_REGISTRATION_REJECT_LOWER_BOUND_TIMER_VALUE_PRESENT;
1421
197
            decoded += size;
1422
197
            break;
1423
486
        case OGS_NAS_5GS_REGISTRATION_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_5GS_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_TYPE:
1424
486
            size = ogs_nas_5gs_decode_5gs_tracking_area_identity_list(&registration_reject->forbidden_tai_for_the_list_of_forbidden_tracking_areas_for_roaming, pkbuf);
1425
486
            if (size < 0) {
1426
1
               ogs_error("ogs_nas_5gs_decode_5gs_tracking_area_identity_list() failed");
1427
1
               return size;
1428
1
            }
1429
1430
485
            registration_reject->presencemask |= OGS_NAS_5GS_REGISTRATION_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_5GS_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_PRESENT;
1431
485
            decoded += size;
1432
485
            break;
1433
197
        case OGS_NAS_5GS_REGISTRATION_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_5GS_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_TYPE:
1434
197
            size = ogs_nas_5gs_decode_5gs_tracking_area_identity_list(&registration_reject->forbidden_tai_for_the_list_of_forbidden_tracking_areas_forregional_provision_of_service, pkbuf);
1435
197
            if (size < 0) {
1436
1
               ogs_error("ogs_nas_5gs_decode_5gs_tracking_area_identity_list() failed");
1437
1
               return size;
1438
1
            }
1439
1440
196
            registration_reject->presencemask |= OGS_NAS_5GS_REGISTRATION_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_5GS_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_PRESENT;
1441
196
            decoded += size;
1442
196
            break;
1443
234
        case OGS_NAS_5GS_REGISTRATION_REJECT_N3IWF_IDENTIFIER_TYPE:
1444
234
            size = ogs_nas_5gs_decode_n3iwf_identifier(&registration_reject->n3iwf_identifier, pkbuf);
1445
234
            if (size < 0) {
1446
6
               ogs_error("ogs_nas_5gs_decode_n3iwf_identifier() failed");
1447
6
               return size;
1448
6
            }
1449
1450
228
            registration_reject->presencemask |= OGS_NAS_5GS_REGISTRATION_REJECT_N3IWF_IDENTIFIER_PRESENT;
1451
228
            decoded += size;
1452
228
            break;
1453
331
        case OGS_NAS_5GS_REGISTRATION_REJECT_TNAN_INFORMATION_TYPE:
1454
331
            size = ogs_nas_5gs_decode_tnan_information(&registration_reject->tnan_information, pkbuf);
1455
331
            if (size < 0) {
1456
6
               ogs_error("ogs_nas_5gs_decode_tnan_information() failed");
1457
6
               return size;
1458
6
            }
1459
1460
325
            registration_reject->presencemask |= OGS_NAS_5GS_REGISTRATION_REJECT_TNAN_INFORMATION_PRESENT;
1461
325
            decoded += size;
1462
325
            break;
1463
202
        case OGS_NAS_5GS_REGISTRATION_REJECT_EXTENDED_5GMM_CAUSE_TYPE:
1464
202
            size = ogs_nas_5gs_decode_extended_5gmm_cause(&registration_reject->extended_gmm_cause, pkbuf);
1465
202
            if (size < 0) {
1466
5
               ogs_error("ogs_nas_5gs_decode_extended_5gmm_cause() failed");
1467
5
               return size;
1468
5
            }
1469
1470
197
            registration_reject->presencemask |= OGS_NAS_5GS_REGISTRATION_REJECT_EXTENDED_5GMM_CAUSE_PRESENT;
1471
197
            decoded += size;
1472
197
            break;
1473
199
        case OGS_NAS_5GS_REGISTRATION_REJECT_ACCESS_TECHNOLOGY_UTILIZATION_CONTROL_TYPE:
1474
199
            size = ogs_nas_5gs_decode_access_technology_utilization_control(&registration_reject->access_technology_utilization_control, pkbuf);
1475
199
            if (size < 0) {
1476
1
               ogs_error("ogs_nas_5gs_decode_access_technology_utilization_control() failed");
1477
1
               return size;
1478
1
            }
1479
1480
198
            registration_reject->presencemask |= OGS_NAS_5GS_REGISTRATION_REJECT_ACCESS_TECHNOLOGY_UTILIZATION_CONTROL_PRESENT;
1481
198
            decoded += size;
1482
198
            break;
1483
312
        default:
1484
312
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
1485
312
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
1486
312
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
1487
312
            if (size < 0) {
1488
5
               ogs_error("ogs_nas_skip_unknown_ie() failed");
1489
5
               return size;
1490
5
            }
1491
1492
307
            decoded += size;
1493
307
            break;
1494
3.79k
        }
1495
3.79k
    }
1496
1497
172
    return decoded;
1498
216
}
1499
1500
int ogs_nas_5gs_decode_deregistration_request_from_ue(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
1501
61
{
1502
61
    ogs_nas_5gs_deregistration_request_from_ue_t *deregistration_request_from_ue = &message->gmm.deregistration_request_from_ue;
1503
61
    int decoded = 0;
1504
61
    int size = 0;
1505
1506
61
    ogs_trace("[NAS] Decode DEREGISTRATION_REQUEST_FROM_UE\n");
1507
1508
61
    size = ogs_nas_5gs_decode_de_registration_type(&deregistration_request_from_ue->de_registration_type, pkbuf);
1509
61
    if (size < 0) {
1510
0
        ogs_error("ogs_nas_5gs_decode_de_registration_type() failed");
1511
0
        return size;
1512
0
    }
1513
1514
61
    decoded += size;
1515
1516
61
    size = ogs_nas_5gs_decode_5gs_mobile_identity(&deregistration_request_from_ue->mobile_identity, pkbuf);
1517
61
    if (size < 0) {
1518
1
        ogs_error("ogs_nas_5gs_decode_5gs_mobile_identity() failed");
1519
1
        return size;
1520
1
    }
1521
1522
60
    decoded += size;
1523
1524
1.11k
    while (pkbuf->len > 0) {
1525
1.06k
        uint8_t *buffer = pkbuf->data;
1526
1.06k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
1527
1528
1.06k
        size = sizeof(uint8_t);
1529
1.06k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
1530
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
1531
0
           return OGS_ERROR;
1532
0
        }
1533
1.06k
        decoded += size;
1534
1535
1.06k
        switch(type) {
1536
199
        case OGS_NAS_5GS_DEREGISTRATION_REQUEST_FROM_UE_UNAVAILABILITY_INFORMATION_TYPE:
1537
199
            size = ogs_nas_5gs_decode_unavailability_information(&deregistration_request_from_ue->unavailability_information, pkbuf);
1538
199
            if (size < 0) {
1539
2
               ogs_error("ogs_nas_5gs_decode_unavailability_information() failed");
1540
2
               return size;
1541
2
            }
1542
1543
197
            deregistration_request_from_ue->presencemask |= OGS_NAS_5GS_DEREGISTRATION_REQUEST_FROM_UE_UNAVAILABILITY_INFORMATION_PRESENT;
1544
197
            decoded += size;
1545
197
            break;
1546
197
        case OGS_NAS_5GS_DEREGISTRATION_REQUEST_FROM_UE_NAS_MESSAGE_CONTAINER_TYPE:
1547
197
            size = ogs_nas_5gs_decode_message_container(&deregistration_request_from_ue->nas_message_container, pkbuf);
1548
197
            if (size < 0) {
1549
2
               ogs_error("ogs_nas_5gs_decode_message_container() failed");
1550
2
               return size;
1551
2
            }
1552
1553
195
            deregistration_request_from_ue->presencemask |= OGS_NAS_5GS_DEREGISTRATION_REQUEST_FROM_UE_NAS_MESSAGE_CONTAINER_PRESENT;
1554
195
            decoded += size;
1555
195
            break;
1556
671
        default:
1557
671
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
1558
671
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
1559
671
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
1560
671
            if (size < 0) {
1561
10
               ogs_error("ogs_nas_skip_unknown_ie() failed");
1562
10
               return size;
1563
10
            }
1564
1565
661
            decoded += size;
1566
661
            break;
1567
1.06k
        }
1568
1.06k
    }
1569
1570
46
    return decoded;
1571
60
}
1572
1573
int ogs_nas_5gs_decode_deregistration_request_to_ue(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
1574
181
{
1575
181
    ogs_nas_5gs_deregistration_request_to_ue_t *deregistration_request_to_ue = &message->gmm.deregistration_request_to_ue;
1576
181
    int decoded = 0;
1577
181
    int size = 0;
1578
1579
181
    ogs_trace("[NAS] Decode DEREGISTRATION_REQUEST_TO_UE\n");
1580
1581
181
    size = ogs_nas_5gs_decode_de_registration_type(&deregistration_request_to_ue->de_registration_type, pkbuf);
1582
181
    if (size < 0) {
1583
0
        ogs_error("ogs_nas_5gs_decode_de_registration_type() failed");
1584
0
        return size;
1585
0
    }
1586
1587
181
    decoded += size;
1588
1589
3.18k
    while (pkbuf->len > 0) {
1590
3.03k
        uint8_t *buffer = pkbuf->data;
1591
3.03k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
1592
1593
3.03k
        size = sizeof(uint8_t);
1594
3.03k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
1595
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
1596
0
           return OGS_ERROR;
1597
0
        }
1598
3.03k
        decoded += size;
1599
1600
3.03k
        switch(type) {
1601
228
        case OGS_NAS_5GS_DEREGISTRATION_REQUEST_TO_UE_5GMM_CAUSE_TYPE:
1602
228
            size = ogs_nas_5gs_decode_5gmm_cause(&deregistration_request_to_ue->gmm_cause, pkbuf);
1603
228
            if (size < 0) {
1604
5
               ogs_error("ogs_nas_5gs_decode_5gmm_cause() failed");
1605
5
               return size;
1606
5
            }
1607
1608
223
            deregistration_request_to_ue->presencemask |= OGS_NAS_5GS_DEREGISTRATION_REQUEST_TO_UE_5GMM_CAUSE_PRESENT;
1609
223
            decoded += size;
1610
223
            break;
1611
195
        case OGS_NAS_5GS_DEREGISTRATION_REQUEST_TO_UE_T3346_VALUE_TYPE:
1612
195
            size = ogs_nas_5gs_decode_gprs_timer_2(&deregistration_request_to_ue->t3346_value, pkbuf);
1613
195
            if (size < 0) {
1614
1
               ogs_error("ogs_nas_5gs_decode_gprs_timer_2() failed");
1615
1
               return size;
1616
1
            }
1617
1618
194
            deregistration_request_to_ue->presencemask |= OGS_NAS_5GS_DEREGISTRATION_REQUEST_TO_UE_T3346_VALUE_PRESENT;
1619
194
            decoded += size;
1620
194
            break;
1621
204
        case OGS_NAS_5GS_DEREGISTRATION_REQUEST_TO_UE_REJECTED_NSSAI_TYPE:
1622
204
            size = ogs_nas_5gs_decode_rejected_nssai(&deregistration_request_to_ue->rejected_nssai, pkbuf);
1623
204
            if (size < 0) {
1624
3
               ogs_error("ogs_nas_5gs_decode_rejected_nssai() failed");
1625
3
               return size;
1626
3
            }
1627
1628
201
            deregistration_request_to_ue->presencemask |= OGS_NAS_5GS_DEREGISTRATION_REQUEST_TO_UE_REJECTED_NSSAI_PRESENT;
1629
201
            decoded += size;
1630
201
            break;
1631
205
        case OGS_NAS_5GS_DEREGISTRATION_REQUEST_TO_UE_CAG_INFORMATION_LIST_TYPE:
1632
205
            size = ogs_nas_5gs_decode_cag_information_list(&deregistration_request_to_ue->cag_information_list, pkbuf);
1633
205
            if (size < 0) {
1634
3
               ogs_error("ogs_nas_5gs_decode_cag_information_list() failed");
1635
3
               return size;
1636
3
            }
1637
1638
202
            deregistration_request_to_ue->presencemask |= OGS_NAS_5GS_DEREGISTRATION_REQUEST_TO_UE_CAG_INFORMATION_LIST_PRESENT;
1639
202
            decoded += size;
1640
202
            break;
1641
201
        case OGS_NAS_5GS_DEREGISTRATION_REQUEST_TO_UE_EXTENDED_REJECTED_NSSAI_TYPE:
1642
201
            size = ogs_nas_5gs_decode_extended_rejected_nssai(&deregistration_request_to_ue->extended_rejected_nssai, pkbuf);
1643
201
            if (size < 0) {
1644
1
               ogs_error("ogs_nas_5gs_decode_extended_rejected_nssai() failed");
1645
1
               return size;
1646
1
            }
1647
1648
200
            deregistration_request_to_ue->presencemask |= OGS_NAS_5GS_DEREGISTRATION_REQUEST_TO_UE_EXTENDED_REJECTED_NSSAI_PRESENT;
1649
200
            decoded += size;
1650
200
            break;
1651
197
        case OGS_NAS_5GS_DEREGISTRATION_REQUEST_TO_UE_DISASTER_RETURN_WAIT_RANGE_TYPE:
1652
197
            size = ogs_nas_5gs_decode_registration_wait_range(&deregistration_request_to_ue->disaster_return_wait_range, pkbuf);
1653
197
            if (size < 0) {
1654
2
               ogs_error("ogs_nas_5gs_decode_registration_wait_range() failed");
1655
2
               return size;
1656
2
            }
1657
1658
195
            deregistration_request_to_ue->presencemask |= OGS_NAS_5GS_DEREGISTRATION_REQUEST_TO_UE_DISASTER_RETURN_WAIT_RANGE_PRESENT;
1659
195
            decoded += size;
1660
195
            break;
1661
239
        case OGS_NAS_5GS_DEREGISTRATION_REQUEST_TO_UE_EXTENDED_CAG_INFORMATION_LIST_TYPE:
1662
239
            size = ogs_nas_5gs_decode_extended_cag_information_list(&deregistration_request_to_ue->extended_cag_information_list, pkbuf);
1663
239
            if (size < 0) {
1664
4
               ogs_error("ogs_nas_5gs_decode_extended_cag_information_list() failed");
1665
4
               return size;
1666
4
            }
1667
1668
235
            deregistration_request_to_ue->presencemask |= OGS_NAS_5GS_DEREGISTRATION_REQUEST_TO_UE_EXTENDED_CAG_INFORMATION_LIST_PRESENT;
1669
235
            decoded += size;
1670
235
            break;
1671
196
        case OGS_NAS_5GS_DEREGISTRATION_REQUEST_TO_UE_LOWER_BOUND_TIMER_VALUE_TYPE:
1672
196
            size = ogs_nas_5gs_decode_gprs_timer_3(&deregistration_request_to_ue->lower_bound_timer_value, pkbuf);
1673
196
            if (size < 0) {
1674
2
               ogs_error("ogs_nas_5gs_decode_gprs_timer_3() failed");
1675
2
               return size;
1676
2
            }
1677
1678
194
            deregistration_request_to_ue->presencemask |= OGS_NAS_5GS_DEREGISTRATION_REQUEST_TO_UE_LOWER_BOUND_TIMER_VALUE_PRESENT;
1679
194
            decoded += size;
1680
194
            break;
1681
202
        case OGS_NAS_5GS_DEREGISTRATION_REQUEST_TO_UE_FORBIDDEN_TAI_FOR_THE_LIST_OF_5GS_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_TYPE:
1682
202
            size = ogs_nas_5gs_decode_5gs_tracking_area_identity_list(&deregistration_request_to_ue->forbidden_tai_for_the_list_of_forbidden_tracking_areas_for_roaming, pkbuf);
1683
202
            if (size < 0) {
1684
1
               ogs_error("ogs_nas_5gs_decode_5gs_tracking_area_identity_list() failed");
1685
1
               return size;
1686
1
            }
1687
1688
201
            deregistration_request_to_ue->presencemask |= OGS_NAS_5GS_DEREGISTRATION_REQUEST_TO_UE_FORBIDDEN_TAI_FOR_THE_LIST_OF_5GS_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_PRESENT;
1689
201
            decoded += size;
1690
201
            break;
1691
195
        case OGS_NAS_5GS_DEREGISTRATION_REQUEST_TO_UE_FORBIDDEN_TAI_FOR_THE_LIST_OF_5GS_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_TYPE:
1692
195
            size = ogs_nas_5gs_decode_5gs_tracking_area_identity_list(&deregistration_request_to_ue->forbidden_tai_for_the_list_of_forbidden_tracking_areas_forregional_provision_of_service, pkbuf);
1693
195
            if (size < 0) {
1694
1
               ogs_error("ogs_nas_5gs_decode_5gs_tracking_area_identity_list() failed");
1695
1
               return size;
1696
1
            }
1697
1698
194
            deregistration_request_to_ue->presencemask |= OGS_NAS_5GS_DEREGISTRATION_REQUEST_TO_UE_FORBIDDEN_TAI_FOR_THE_LIST_OF_5GS_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_PRESENT;
1699
194
            decoded += size;
1700
194
            break;
1701
198
        case OGS_NAS_5GS_DEREGISTRATION_REQUEST_TO_UE_ACCESS_TECHNOLOGY_UTILIZATION_CONTROL_TYPE:
1702
198
            size = ogs_nas_5gs_decode_access_technology_utilization_control(&deregistration_request_to_ue->access_technology_utilization_control, pkbuf);
1703
198
            if (size < 0) {
1704
3
               ogs_error("ogs_nas_5gs_decode_access_technology_utilization_control() failed");
1705
3
               return size;
1706
3
            }
1707
1708
195
            deregistration_request_to_ue->presencemask |= OGS_NAS_5GS_DEREGISTRATION_REQUEST_TO_UE_ACCESS_TECHNOLOGY_UTILIZATION_CONTROL_PRESENT;
1709
195
            decoded += size;
1710
195
            break;
1711
771
        default:
1712
771
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
1713
771
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
1714
771
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
1715
771
            if (size < 0) {
1716
3
               ogs_error("ogs_nas_skip_unknown_ie() failed");
1717
3
               return size;
1718
3
            }
1719
1720
768
            decoded += size;
1721
768
            break;
1722
3.03k
        }
1723
3.03k
    }
1724
1725
152
    return decoded;
1726
181
}
1727
1728
int ogs_nas_5gs_decode_service_request(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
1729
120
{
1730
120
    ogs_nas_5gs_service_request_t *service_request = &message->gmm.service_request;
1731
120
    int decoded = 0;
1732
120
    int size = 0;
1733
1734
120
    ogs_trace("[NAS] Decode SERVICE_REQUEST\n");
1735
1736
120
    size = ogs_nas_5gs_decode_key_set_identifier(&service_request->ngksi, pkbuf);
1737
120
    if (size < 0) {
1738
0
        ogs_error("ogs_nas_5gs_decode_key_set_identifier() failed");
1739
0
        return size;
1740
0
    }
1741
1742
120
    decoded += size;
1743
1744
120
    size = ogs_nas_5gs_decode_5gs_mobile_identity(&service_request->s_tmsi, pkbuf);
1745
120
    if (size < 0) {
1746
3
        ogs_error("ogs_nas_5gs_decode_5gs_mobile_identity() failed");
1747
3
        return size;
1748
3
    }
1749
1750
117
    decoded += size;
1751
1752
1.94k
    while (pkbuf->len > 0) {
1753
1.84k
        uint8_t *buffer = pkbuf->data;
1754
1.84k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
1755
1756
1.84k
        size = sizeof(uint8_t);
1757
1.84k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
1758
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
1759
0
           return OGS_ERROR;
1760
0
        }
1761
1.84k
        decoded += size;
1762
1763
1.84k
        switch(type) {
1764
207
        case OGS_NAS_5GS_SERVICE_REQUEST_UPLINK_DATA_STATUS_TYPE:
1765
207
            size = ogs_nas_5gs_decode_uplink_data_status(&service_request->uplink_data_status, pkbuf);
1766
207
            if (size < 0) {
1767
1
               ogs_error("ogs_nas_5gs_decode_uplink_data_status() failed");
1768
1
               return size;
1769
1
            }
1770
1771
206
            service_request->presencemask |= OGS_NAS_5GS_SERVICE_REQUEST_UPLINK_DATA_STATUS_PRESENT;
1772
206
            decoded += size;
1773
206
            break;
1774
198
        case OGS_NAS_5GS_SERVICE_REQUEST_PDU_SESSION_STATUS_TYPE:
1775
198
            size = ogs_nas_5gs_decode_pdu_session_status(&service_request->pdu_session_status, pkbuf);
1776
198
            if (size < 0) {
1777
1
               ogs_error("ogs_nas_5gs_decode_pdu_session_status() failed");
1778
1
               return size;
1779
1
            }
1780
1781
197
            service_request->presencemask |= OGS_NAS_5GS_SERVICE_REQUEST_PDU_SESSION_STATUS_PRESENT;
1782
197
            decoded += size;
1783
197
            break;
1784
206
        case OGS_NAS_5GS_SERVICE_REQUEST_ALLOWED_PDU_SESSION_STATUS_TYPE:
1785
206
            size = ogs_nas_5gs_decode_allowed_pdu_session_status(&service_request->allowed_pdu_session_status, pkbuf);
1786
206
            if (size < 0) {
1787
4
               ogs_error("ogs_nas_5gs_decode_allowed_pdu_session_status() failed");
1788
4
               return size;
1789
4
            }
1790
1791
202
            service_request->presencemask |= OGS_NAS_5GS_SERVICE_REQUEST_ALLOWED_PDU_SESSION_STATUS_PRESENT;
1792
202
            decoded += size;
1793
202
            break;
1794
206
        case OGS_NAS_5GS_SERVICE_REQUEST_NAS_MESSAGE_CONTAINER_TYPE:
1795
206
            size = ogs_nas_5gs_decode_message_container(&service_request->nas_message_container, pkbuf);
1796
206
            if (size < 0) {
1797
1
               ogs_error("ogs_nas_5gs_decode_message_container() failed");
1798
1
               return size;
1799
1
            }
1800
1801
205
            service_request->presencemask |= OGS_NAS_5GS_SERVICE_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT;
1802
205
            decoded += size;
1803
205
            break;
1804
211
        case OGS_NAS_5GS_SERVICE_REQUEST_UE_REQUEST_TYPE_TYPE:
1805
211
            size = ogs_nas_5gs_decode_ue_request_type(&service_request->ue_request_type, pkbuf);
1806
211
            if (size < 0) {
1807
8
               ogs_error("ogs_nas_5gs_decode_ue_request_type() failed");
1808
8
               return size;
1809
8
            }
1810
1811
203
            service_request->presencemask |= OGS_NAS_5GS_SERVICE_REQUEST_UE_REQUEST_TYPE_PRESENT;
1812
203
            decoded += size;
1813
203
            break;
1814
211
        case OGS_NAS_5GS_SERVICE_REQUEST_PAGING_RESTRICTION_TYPE:
1815
211
            size = ogs_nas_5gs_decode_paging_restriction(&service_request->paging_restriction, pkbuf);
1816
211
            if (size < 0) {
1817
3
               ogs_error("ogs_nas_5gs_decode_paging_restriction() failed");
1818
3
               return size;
1819
3
            }
1820
1821
208
            service_request->presencemask |= OGS_NAS_5GS_SERVICE_REQUEST_PAGING_RESTRICTION_PRESENT;
1822
208
            decoded += size;
1823
208
            break;
1824
610
        default:
1825
610
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
1826
610
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
1827
610
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
1828
610
            if (size < 0) {
1829
1
               ogs_error("ogs_nas_skip_unknown_ie() failed");
1830
1
               return size;
1831
1
            }
1832
1833
609
            decoded += size;
1834
609
            break;
1835
1.84k
        }
1836
1.84k
    }
1837
1838
98
    return decoded;
1839
117
}
1840
1841
int ogs_nas_5gs_decode_service_reject(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
1842
157
{
1843
157
    ogs_nas_5gs_service_reject_t *service_reject = &message->gmm.service_reject;
1844
157
    int decoded = 0;
1845
157
    int size = 0;
1846
1847
157
    ogs_trace("[NAS] Decode SERVICE_REJECT\n");
1848
1849
157
    size = ogs_nas_5gs_decode_5gmm_cause(&service_reject->gmm_cause, pkbuf);
1850
157
    if (size < 0) {
1851
0
        ogs_error("ogs_nas_5gs_decode_5gmm_cause() failed");
1852
0
        return size;
1853
0
    }
1854
1855
157
    decoded += size;
1856
1857
3.08k
    while (pkbuf->len > 0) {
1858
2.95k
        uint8_t *buffer = pkbuf->data;
1859
2.95k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
1860
1861
2.95k
        size = sizeof(uint8_t);
1862
2.95k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
1863
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
1864
0
           return OGS_ERROR;
1865
0
        }
1866
2.95k
        decoded += size;
1867
1868
2.95k
        switch(type) {
1869
196
        case OGS_NAS_5GS_SERVICE_REJECT_PDU_SESSION_STATUS_TYPE:
1870
196
            size = ogs_nas_5gs_decode_pdu_session_status(&service_reject->pdu_session_status, pkbuf);
1871
196
            if (size < 0) {
1872
1
               ogs_error("ogs_nas_5gs_decode_pdu_session_status() failed");
1873
1
               return size;
1874
1
            }
1875
1876
195
            service_reject->presencemask |= OGS_NAS_5GS_SERVICE_REJECT_PDU_SESSION_STATUS_PRESENT;
1877
195
            decoded += size;
1878
195
            break;
1879
196
        case OGS_NAS_5GS_SERVICE_REJECT_T3346_VALUE_TYPE:
1880
196
            size = ogs_nas_5gs_decode_gprs_timer_2(&service_reject->t3346_value, pkbuf);
1881
196
            if (size < 0) {
1882
1
               ogs_error("ogs_nas_5gs_decode_gprs_timer_2() failed");
1883
1
               return size;
1884
1
            }
1885
1886
195
            service_reject->presencemask |= OGS_NAS_5GS_SERVICE_REJECT_T3346_VALUE_PRESENT;
1887
195
            decoded += size;
1888
195
            break;
1889
207
        case OGS_NAS_5GS_SERVICE_REJECT_EAP_MESSAGE_TYPE:
1890
207
            size = ogs_nas_5gs_decode_eap_message(&service_reject->eap_message, pkbuf);
1891
207
            if (size < 0) {
1892
2
               ogs_error("ogs_nas_5gs_decode_eap_message() failed");
1893
2
               return size;
1894
2
            }
1895
1896
205
            service_reject->presencemask |= OGS_NAS_5GS_SERVICE_REJECT_EAP_MESSAGE_PRESENT;
1897
205
            decoded += size;
1898
205
            break;
1899
198
        case OGS_NAS_5GS_SERVICE_REJECT_T3448_VALUE_TYPE:
1900
198
            size = ogs_nas_5gs_decode_gprs_timer_2(&service_reject->t3448_value, pkbuf);
1901
198
            if (size < 0) {
1902
1
               ogs_error("ogs_nas_5gs_decode_gprs_timer_2() failed");
1903
1
               return size;
1904
1
            }
1905
1906
197
            service_reject->presencemask |= OGS_NAS_5GS_SERVICE_REJECT_T3448_VALUE_PRESENT;
1907
197
            decoded += size;
1908
197
            break;
1909
220
        case OGS_NAS_5GS_SERVICE_REJECT_CAG_INFORMATION_LIST_TYPE:
1910
220
            size = ogs_nas_5gs_decode_cag_information_list(&service_reject->cag_information_list, pkbuf);
1911
220
            if (size < 0) {
1912
4
               ogs_error("ogs_nas_5gs_decode_cag_information_list() failed");
1913
4
               return size;
1914
4
            }
1915
1916
216
            service_reject->presencemask |= OGS_NAS_5GS_SERVICE_REJECT_CAG_INFORMATION_LIST_PRESENT;
1917
216
            decoded += size;
1918
216
            break;
1919
200
        case OGS_NAS_5GS_SERVICE_REJECT_DISASTER_RETURN_WAIT_RANGE_TYPE:
1920
200
            size = ogs_nas_5gs_decode_registration_wait_range(&service_reject->disaster_return_wait_range, pkbuf);
1921
200
            if (size < 0) {
1922
2
               ogs_error("ogs_nas_5gs_decode_registration_wait_range() failed");
1923
2
               return size;
1924
2
            }
1925
1926
198
            service_reject->presencemask |= OGS_NAS_5GS_SERVICE_REJECT_DISASTER_RETURN_WAIT_RANGE_PRESENT;
1927
198
            decoded += size;
1928
198
            break;
1929
215
        case OGS_NAS_5GS_SERVICE_REJECT_EXTENDED_CAG_INFORMATION_LIST_TYPE:
1930
215
            size = ogs_nas_5gs_decode_extended_cag_information_list(&service_reject->extended_cag_information_list, pkbuf);
1931
215
            if (size < 0) {
1932
5
               ogs_error("ogs_nas_5gs_decode_extended_cag_information_list() failed");
1933
5
               return size;
1934
5
            }
1935
1936
210
            service_reject->presencemask |= OGS_NAS_5GS_SERVICE_REJECT_EXTENDED_CAG_INFORMATION_LIST_PRESENT;
1937
210
            decoded += size;
1938
210
            break;
1939
195
        case OGS_NAS_5GS_SERVICE_REJECT_LOWER_BOUND_TIMER_VALUE_TYPE:
1940
195
            size = ogs_nas_5gs_decode_gprs_timer_3(&service_reject->lower_bound_timer_value, pkbuf);
1941
195
            if (size < 0) {
1942
1
               ogs_error("ogs_nas_5gs_decode_gprs_timer_3() failed");
1943
1
               return size;
1944
1
            }
1945
1946
194
            service_reject->presencemask |= OGS_NAS_5GS_SERVICE_REJECT_LOWER_BOUND_TIMER_VALUE_PRESENT;
1947
194
            decoded += size;
1948
194
            break;
1949
202
        case OGS_NAS_5GS_SERVICE_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_5GS_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_TYPE:
1950
202
            size = ogs_nas_5gs_decode_5gs_tracking_area_identity_list(&service_reject->forbidden_tai_for_the_list_of_forbidden_tracking_areas_for_roaming, pkbuf);
1951
202
            if (size < 0) {
1952
2
               ogs_error("ogs_nas_5gs_decode_5gs_tracking_area_identity_list() failed");
1953
2
               return size;
1954
2
            }
1955
1956
200
            service_reject->presencemask |= OGS_NAS_5GS_SERVICE_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_5GS_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_PRESENT;
1957
200
            decoded += size;
1958
200
            break;
1959
197
        case OGS_NAS_5GS_SERVICE_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_5GS_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_TYPE:
1960
197
            size = ogs_nas_5gs_decode_5gs_tracking_area_identity_list(&service_reject->forbidden_tai_for_the_list_of_forbidden_tracking_areas_forregional_provision_of_service, pkbuf);
1961
197
            if (size < 0) {
1962
1
               ogs_error("ogs_nas_5gs_decode_5gs_tracking_area_identity_list() failed");
1963
1
               return size;
1964
1
            }
1965
1966
196
            service_reject->presencemask |= OGS_NAS_5GS_SERVICE_REJECT_FORBIDDEN_TAI_FOR_THE_LIST_OF_5GS_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_PRESENT;
1967
196
            decoded += size;
1968
196
            break;
1969
196
        case OGS_NAS_5GS_SERVICE_REJECT_ACCESS_TECHNOLOGY_UTILIZATION_CONTROL_TYPE:
1970
196
            size = ogs_nas_5gs_decode_access_technology_utilization_control(&service_reject->access_technology_utilization_control, pkbuf);
1971
196
            if (size < 0) {
1972
1
               ogs_error("ogs_nas_5gs_decode_access_technology_utilization_control() failed");
1973
1
               return size;
1974
1
            }
1975
1976
195
            service_reject->presencemask |= OGS_NAS_5GS_SERVICE_REJECT_ACCESS_TECHNOLOGY_UTILIZATION_CONTROL_PRESENT;
1977
195
            decoded += size;
1978
195
            break;
1979
731
        default:
1980
731
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
1981
731
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
1982
731
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
1983
731
            if (size < 0) {
1984
4
               ogs_error("ogs_nas_skip_unknown_ie() failed");
1985
4
               return size;
1986
4
            }
1987
1988
727
            decoded += size;
1989
727
            break;
1990
2.95k
        }
1991
2.95k
    }
1992
1993
132
    return decoded;
1994
157
}
1995
1996
int ogs_nas_5gs_decode_service_accept(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
1997
198
{
1998
198
    ogs_nas_5gs_service_accept_t *service_accept = &message->gmm.service_accept;
1999
198
    int decoded = 0;
2000
198
    int size = 0;
2001
2002
198
    ogs_trace("[NAS] Decode SERVICE_ACCEPT\n");
2003
2004
3.08k
    while (pkbuf->len > 0) {
2005
2.95k
        uint8_t *buffer = pkbuf->data;
2006
2.95k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2007
2008
2.95k
        size = sizeof(uint8_t);
2009
2.95k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
2010
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
2011
0
           return OGS_ERROR;
2012
0
        }
2013
2.95k
        decoded += size;
2014
2015
2.95k
        switch(type) {
2016
217
        case OGS_NAS_5GS_SERVICE_ACCEPT_PDU_SESSION_STATUS_TYPE:
2017
217
            size = ogs_nas_5gs_decode_pdu_session_status(&service_accept->pdu_session_status, pkbuf);
2018
217
            if (size < 0) {
2019
5
               ogs_error("ogs_nas_5gs_decode_pdu_session_status() failed");
2020
5
               return size;
2021
5
            }
2022
2023
212
            service_accept->presencemask |= OGS_NAS_5GS_SERVICE_ACCEPT_PDU_SESSION_STATUS_PRESENT;
2024
212
            decoded += size;
2025
212
            break;
2026
232
        case OGS_NAS_5GS_SERVICE_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_TYPE:
2027
232
            size = ogs_nas_5gs_decode_pdu_session_reactivation_result(&service_accept->pdu_session_reactivation_result, pkbuf);
2028
232
            if (size < 0) {
2029
12
               ogs_error("ogs_nas_5gs_decode_pdu_session_reactivation_result() failed");
2030
12
               return size;
2031
12
            }
2032
2033
220
            service_accept->presencemask |= OGS_NAS_5GS_SERVICE_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_PRESENT;
2034
220
            decoded += size;
2035
220
            break;
2036
243
        case OGS_NAS_5GS_SERVICE_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_ERROR_CAUSE_TYPE:
2037
243
            size = ogs_nas_5gs_decode_pdu_session_reactivation_result_error_cause(&service_accept->pdu_session_reactivation_result_error_cause, pkbuf);
2038
243
            if (size < 0) {
2039
25
               ogs_error("ogs_nas_5gs_decode_pdu_session_reactivation_result_error_cause() failed");
2040
25
               return size;
2041
25
            }
2042
2043
218
            service_accept->presencemask |= OGS_NAS_5GS_SERVICE_ACCEPT_PDU_SESSION_REACTIVATION_RESULT_ERROR_CAUSE_PRESENT;
2044
218
            decoded += size;
2045
218
            break;
2046
240
        case OGS_NAS_5GS_SERVICE_ACCEPT_EAP_MESSAGE_TYPE:
2047
240
            size = ogs_nas_5gs_decode_eap_message(&service_accept->eap_message, pkbuf);
2048
240
            if (size < 0) {
2049
1
               ogs_error("ogs_nas_5gs_decode_eap_message() failed");
2050
1
               return size;
2051
1
            }
2052
2053
239
            service_accept->presencemask |= OGS_NAS_5GS_SERVICE_ACCEPT_EAP_MESSAGE_PRESENT;
2054
239
            decoded += size;
2055
239
            break;
2056
207
        case OGS_NAS_5GS_SERVICE_ACCEPT_T3448_VALUE_TYPE:
2057
207
            size = ogs_nas_5gs_decode_gprs_timer_2(&service_accept->t3448_value, pkbuf);
2058
207
            if (size < 0) {
2059
6
               ogs_error("ogs_nas_5gs_decode_gprs_timer_2() failed");
2060
6
               return size;
2061
6
            }
2062
2063
201
            service_accept->presencemask |= OGS_NAS_5GS_SERVICE_ACCEPT_T3448_VALUE_PRESENT;
2064
201
            decoded += size;
2065
201
            break;
2066
272
        case OGS_NAS_5GS_SERVICE_ACCEPT_5GS_ADDITIONAL_REQUEST_RESULT_TYPE:
2067
272
            size = ogs_nas_5gs_decode_5gs_additional_request_result(&service_accept->additional_request_result, pkbuf);
2068
272
            if (size < 0) {
2069
7
               ogs_error("ogs_nas_5gs_decode_5gs_additional_request_result() failed");
2070
7
               return size;
2071
7
            }
2072
2073
265
            service_accept->presencemask |= OGS_NAS_5GS_SERVICE_ACCEPT_5GS_ADDITIONAL_REQUEST_RESULT_PRESENT;
2074
265
            decoded += size;
2075
265
            break;
2076
210
        case OGS_NAS_5GS_SERVICE_ACCEPT_FORBIDDEN_TAI_FOR_THE_LIST_OF_5GS_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_TYPE:
2077
210
            size = ogs_nas_5gs_decode_5gs_tracking_area_identity_list(&service_accept->forbidden_tai_for_the_list_of_forbidden_tracking_areas_for_roaming, pkbuf);
2078
210
            if (size < 0) {
2079
5
               ogs_error("ogs_nas_5gs_decode_5gs_tracking_area_identity_list() failed");
2080
5
               return size;
2081
5
            }
2082
2083
205
            service_accept->presencemask |= OGS_NAS_5GS_SERVICE_ACCEPT_FORBIDDEN_TAI_FOR_THE_LIST_OF_5GS_FORBIDDEN_TRACKING_AREAS_FOR_ROAMING_PRESENT;
2084
205
            decoded += size;
2085
205
            break;
2086
203
        case OGS_NAS_5GS_SERVICE_ACCEPT_FORBIDDEN_TAI_FOR_THE_LIST_OF_5GS_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_TYPE:
2087
203
            size = ogs_nas_5gs_decode_5gs_tracking_area_identity_list(&service_accept->forbidden_tai_for_the_list_of_forbidden_tracking_areas_forregional_provision_of_service, pkbuf);
2088
203
            if (size < 0) {
2089
2
               ogs_error("ogs_nas_5gs_decode_5gs_tracking_area_identity_list() failed");
2090
2
               return size;
2091
2
            }
2092
2093
201
            service_accept->presencemask |= OGS_NAS_5GS_SERVICE_ACCEPT_FORBIDDEN_TAI_FOR_THE_LIST_OF_5GS_FORBIDDEN_TRACKING_AREAS_FORREGIONAL_PROVISION_OF_SERVICE_PRESENT;
2094
201
            decoded += size;
2095
201
            break;
2096
1.13k
        default:
2097
1.13k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2098
1.13k
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
2099
1.13k
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
2100
1.13k
            if (size < 0) {
2101
11
               ogs_error("ogs_nas_skip_unknown_ie() failed");
2102
11
               return size;
2103
11
            }
2104
2105
1.12k
            decoded += size;
2106
1.12k
            break;
2107
2.95k
        }
2108
2.95k
    }
2109
2110
124
    return decoded;
2111
198
}
2112
2113
int ogs_nas_5gs_decode_configuration_update_command(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
2114
1.18k
{
2115
1.18k
    ogs_nas_5gs_configuration_update_command_t *configuration_update_command = &message->gmm.configuration_update_command;
2116
1.18k
    int decoded = 0;
2117
1.18k
    int size = 0;
2118
2119
1.18k
    ogs_trace("[NAS] Decode CONFIGURATION_UPDATE_COMMAND\n");
2120
2121
21.5k
    while (pkbuf->len > 0) {
2122
20.8k
        uint8_t *buffer = pkbuf->data;
2123
20.8k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2124
2125
20.8k
        size = sizeof(uint8_t);
2126
20.8k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
2127
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
2128
0
           return OGS_ERROR;
2129
0
        }
2130
20.8k
        decoded += size;
2131
2132
20.8k
        switch(type) {
2133
692
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_CONFIGURATION_UPDATE_INDICATION_TYPE:
2134
692
            decoded--;
2135
692
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
2136
692
            size = ogs_nas_5gs_decode_configuration_update_indication(&configuration_update_command->configuration_update_indication, pkbuf);
2137
692
            if (size < 0) {
2138
0
               ogs_error("ogs_nas_5gs_decode_configuration_update_indication() failed");
2139
0
               return size;
2140
0
            }
2141
2142
692
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_CONFIGURATION_UPDATE_INDICATION_PRESENT;
2143
692
            decoded += size;
2144
692
            break;
2145
221
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_5G_GUTI_TYPE:
2146
221
            size = ogs_nas_5gs_decode_5gs_mobile_identity(&configuration_update_command->guti, pkbuf);
2147
221
            if (size < 0) {
2148
2
               ogs_error("ogs_nas_5gs_decode_5gs_mobile_identity() failed");
2149
2
               return size;
2150
2
            }
2151
2152
219
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_5G_GUTI_PRESENT;
2153
219
            decoded += size;
2154
219
            break;
2155
238
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_TAI_LIST_TYPE:
2156
238
            size = ogs_nas_5gs_decode_5gs_tracking_area_identity_list(&configuration_update_command->tai_list, pkbuf);
2157
238
            if (size < 0) {
2158
7
               ogs_error("ogs_nas_5gs_decode_5gs_tracking_area_identity_list() failed");
2159
7
               return size;
2160
7
            }
2161
2162
231
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_TAI_LIST_PRESENT;
2163
231
            decoded += size;
2164
231
            break;
2165
296
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_ALLOWED_NSSAI_TYPE:
2166
296
            size = ogs_nas_5gs_decode_nssai(&configuration_update_command->allowed_nssai, pkbuf);
2167
296
            if (size < 0) {
2168
6
               ogs_error("ogs_nas_5gs_decode_nssai() failed");
2169
6
               return size;
2170
6
            }
2171
2172
290
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_ALLOWED_NSSAI_PRESENT;
2173
290
            decoded += size;
2174
290
            break;
2175
382
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_SERVICE_AREA_LIST_TYPE:
2176
382
            size = ogs_nas_5gs_decode_service_area_list(&configuration_update_command->service_area_list, pkbuf);
2177
382
            if (size < 0) {
2178
4
               ogs_error("ogs_nas_5gs_decode_service_area_list() failed");
2179
4
               return size;
2180
4
            }
2181
2182
378
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_SERVICE_AREA_LIST_PRESENT;
2183
378
            decoded += size;
2184
378
            break;
2185
223
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_FULL_NAME_FOR_NETWORK_TYPE:
2186
223
            size = ogs_nas_5gs_decode_network_name(&configuration_update_command->full_name_for_network, pkbuf);
2187
223
            if (size < 0) {
2188
4
               ogs_error("ogs_nas_5gs_decode_network_name() failed");
2189
4
               return size;
2190
4
            }
2191
2192
219
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_FULL_NAME_FOR_NETWORK_PRESENT;
2193
219
            decoded += size;
2194
219
            break;
2195
216
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_SHORT_NAME_FOR_NETWORK_TYPE:
2196
216
            size = ogs_nas_5gs_decode_network_name(&configuration_update_command->short_name_for_network, pkbuf);
2197
216
            if (size < 0) {
2198
6
               ogs_error("ogs_nas_5gs_decode_network_name() failed");
2199
6
               return size;
2200
6
            }
2201
2202
210
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_SHORT_NAME_FOR_NETWORK_PRESENT;
2203
210
            decoded += size;
2204
210
            break;
2205
346
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_LOCAL_TIME_ZONE_TYPE:
2206
346
            size = ogs_nas_5gs_decode_time_zone(&configuration_update_command->local_time_zone, pkbuf);
2207
346
            if (size < 0) {
2208
5
               ogs_error("ogs_nas_5gs_decode_time_zone() failed");
2209
5
               return size;
2210
5
            }
2211
2212
341
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_LOCAL_TIME_ZONE_PRESENT;
2213
341
            decoded += size;
2214
341
            break;
2215
162
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_UNIVERSAL_TIME_AND_LOCAL_TIME_ZONE_TYPE:
2216
162
            size = ogs_nas_5gs_decode_time_zone_and_time(&configuration_update_command->universal_time_and_local_time_zone, pkbuf);
2217
162
            if (size < 0) {
2218
11
               ogs_error("ogs_nas_5gs_decode_time_zone_and_time() failed");
2219
11
               return size;
2220
11
            }
2221
2222
151
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_UNIVERSAL_TIME_AND_LOCAL_TIME_ZONE_PRESENT;
2223
151
            decoded += size;
2224
151
            break;
2225
456
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_NETWORK_DAYLIGHT_SAVING_TIME_TYPE:
2226
456
            size = ogs_nas_5gs_decode_daylight_saving_time(&configuration_update_command->network_daylight_saving_time, pkbuf);
2227
456
            if (size < 0) {
2228
16
               ogs_error("ogs_nas_5gs_decode_daylight_saving_time() failed");
2229
16
               return size;
2230
16
            }
2231
2232
440
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_NETWORK_DAYLIGHT_SAVING_TIME_PRESENT;
2233
440
            decoded += size;
2234
440
            break;
2235
338
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_LADN_INFORMATION_TYPE:
2236
338
            size = ogs_nas_5gs_decode_ladn_information(&configuration_update_command->ladn_information, pkbuf);
2237
338
            if (size < 0) {
2238
24
               ogs_error("ogs_nas_5gs_decode_ladn_information() failed");
2239
24
               return size;
2240
24
            }
2241
2242
314
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_LADN_INFORMATION_PRESENT;
2243
314
            decoded += size;
2244
314
            break;
2245
995
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_MICO_INDICATION_TYPE:
2246
995
            decoded--;
2247
995
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
2248
995
            size = ogs_nas_5gs_decode_mico_indication(&configuration_update_command->mico_indication, pkbuf);
2249
995
            if (size < 0) {
2250
0
               ogs_error("ogs_nas_5gs_decode_mico_indication() failed");
2251
0
               return size;
2252
0
            }
2253
2254
995
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_MICO_INDICATION_PRESENT;
2255
995
            decoded += size;
2256
995
            break;
2257
868
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_NETWORK_SLICING_INDICATION_TYPE:
2258
868
            decoded--;
2259
868
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
2260
868
            size = ogs_nas_5gs_decode_network_slicing_indication(&configuration_update_command->network_slicing_indication, pkbuf);
2261
868
            if (size < 0) {
2262
0
               ogs_error("ogs_nas_5gs_decode_network_slicing_indication() failed");
2263
0
               return size;
2264
0
            }
2265
2266
868
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_NETWORK_SLICING_INDICATION_PRESENT;
2267
868
            decoded += size;
2268
868
            break;
2269
217
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_CONFIGURED_NSSAI_TYPE:
2270
217
            size = ogs_nas_5gs_decode_nssai(&configuration_update_command->configured_nssai, pkbuf);
2271
217
            if (size < 0) {
2272
3
               ogs_error("ogs_nas_5gs_decode_nssai() failed");
2273
3
               return size;
2274
3
            }
2275
2276
214
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_CONFIGURED_NSSAI_PRESENT;
2277
214
            decoded += size;
2278
214
            break;
2279
279
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_REJECTED_NSSAI_TYPE:
2280
279
            size = ogs_nas_5gs_decode_rejected_nssai(&configuration_update_command->rejected_nssai, pkbuf);
2281
279
            if (size < 0) {
2282
6
               ogs_error("ogs_nas_5gs_decode_rejected_nssai() failed");
2283
6
               return size;
2284
6
            }
2285
2286
273
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_REJECTED_NSSAI_PRESENT;
2287
273
            decoded += size;
2288
273
            break;
2289
257
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_OPERATOR_DEFINED_ACCESS_CATEGORY_DEFINITIONS_TYPE:
2290
257
            size = ogs_nas_5gs_decode_operator_defined_access_category_definitions(&configuration_update_command->operator_defined_access_category_definitions, pkbuf);
2291
257
            if (size < 0) {
2292
23
               ogs_error("ogs_nas_5gs_decode_operator_defined_access_category_definitions() failed");
2293
23
               return size;
2294
23
            }
2295
2296
234
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_OPERATOR_DEFINED_ACCESS_CATEGORY_DEFINITIONS_PRESENT;
2297
234
            decoded += size;
2298
234
            break;
2299
2.65k
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_SMS_INDICATION_TYPE:
2300
2.65k
            decoded--;
2301
2.65k
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
2302
2.65k
            size = ogs_nas_5gs_decode_sms_indication(&configuration_update_command->sms_indication, pkbuf);
2303
2.65k
            if (size < 0) {
2304
0
               ogs_error("ogs_nas_5gs_decode_sms_indication() failed");
2305
0
               return size;
2306
0
            }
2307
2308
2.65k
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_SMS_INDICATION_PRESENT;
2309
2.65k
            decoded += size;
2310
2.65k
            break;
2311
207
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_T3447_VALUE_TYPE:
2312
207
            size = ogs_nas_5gs_decode_gprs_timer_3(&configuration_update_command->t3447_value, pkbuf);
2313
207
            if (size < 0) {
2314
6
               ogs_error("ogs_nas_5gs_decode_gprs_timer_3() failed");
2315
6
               return size;
2316
6
            }
2317
2318
201
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_T3447_VALUE_PRESENT;
2319
201
            decoded += size;
2320
201
            break;
2321
252
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_CAG_INFORMATION_LIST_TYPE:
2322
252
            size = ogs_nas_5gs_decode_cag_information_list(&configuration_update_command->cag_information_list, pkbuf);
2323
252
            if (size < 0) {
2324
14
               ogs_error("ogs_nas_5gs_decode_cag_information_list() failed");
2325
14
               return size;
2326
14
            }
2327
2328
238
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_CAG_INFORMATION_LIST_PRESENT;
2329
238
            decoded += size;
2330
238
            break;
2331
265
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_UE_RADIO_CAPABILITY_ID_TYPE:
2332
265
            size = ogs_nas_5gs_decode_ue_radio_capability_id(&configuration_update_command->ue_radio_capability_id, pkbuf);
2333
265
            if (size < 0) {
2334
6
               ogs_error("ogs_nas_5gs_decode_ue_radio_capability_id() failed");
2335
6
               return size;
2336
6
            }
2337
2338
259
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_UE_RADIO_CAPABILITY_ID_PRESENT;
2339
259
            decoded += size;
2340
259
            break;
2341
909
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_TYPE:
2342
909
            decoded--;
2343
909
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
2344
909
            size = ogs_nas_5gs_decode_ue_radio_capability_id_deletion_indication(&configuration_update_command->ue_radio_capability_id_deletion_indication, pkbuf);
2345
909
            if (size < 0) {
2346
0
               ogs_error("ogs_nas_5gs_decode_ue_radio_capability_id_deletion_indication() failed");
2347
0
               return size;
2348
0
            }
2349
2350
909
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_UE_RADIO_CAPABILITY_ID_DELETION_INDICATION_PRESENT;
2351
909
            decoded += size;
2352
909
            break;
2353
197
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_5GS_REGISTRATION_RESULT_TYPE:
2354
197
            size = ogs_nas_5gs_decode_5gs_registration_result(&configuration_update_command->registration_result, pkbuf);
2355
197
            if (size < 0) {
2356
1
               ogs_error("ogs_nas_5gs_decode_5gs_registration_result() failed");
2357
1
               return size;
2358
1
            }
2359
2360
196
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_5GS_REGISTRATION_RESULT_PRESENT;
2361
196
            decoded += size;
2362
196
            break;
2363
344
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_TRUNCATED_5G_S_TMSI_CONFIGURATION_TYPE:
2364
344
            size = ogs_nas_5gs_decode_truncated_5g_s_tmsi_configuration(&configuration_update_command->truncated_s_tmsi_configuration, pkbuf);
2365
344
            if (size < 0) {
2366
9
               ogs_error("ogs_nas_5gs_decode_truncated_5g_s_tmsi_configuration() failed");
2367
9
               return size;
2368
9
            }
2369
2370
335
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_TRUNCATED_5G_S_TMSI_CONFIGURATION_PRESENT;
2371
335
            decoded += size;
2372
335
            break;
2373
818
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_ADDITIONAL_CONFIGURATION_INDICATION_TYPE:
2374
818
            decoded--;
2375
818
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
2376
818
            size = ogs_nas_5gs_decode_additional_configuration_indication(&configuration_update_command->additional_configuration_indication, pkbuf);
2377
818
            if (size < 0) {
2378
0
               ogs_error("ogs_nas_5gs_decode_additional_configuration_indication() failed");
2379
0
               return size;
2380
0
            }
2381
2382
818
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_ADDITIONAL_CONFIGURATION_INDICATION_PRESENT;
2383
818
            decoded += size;
2384
818
            break;
2385
238
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_EXTENDED_REJECTED_NSSAI_TYPE:
2386
238
            size = ogs_nas_5gs_decode_extended_rejected_nssai(&configuration_update_command->extended_rejected_nssai, pkbuf);
2387
238
            if (size < 0) {
2388
6
               ogs_error("ogs_nas_5gs_decode_extended_rejected_nssai() failed");
2389
6
               return size;
2390
6
            }
2391
2392
232
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_EXTENDED_REJECTED_NSSAI_PRESENT;
2393
232
            decoded += size;
2394
232
            break;
2395
353
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_SERVICE_LEVEL_AA_CONTAINER_TYPE:
2396
353
            size = ogs_nas_5gs_decode_service_level_aa_container(&configuration_update_command->service_level_aa_container, pkbuf);
2397
353
            if (size < 0) {
2398
20
               ogs_error("ogs_nas_5gs_decode_service_level_aa_container() failed");
2399
20
               return size;
2400
20
            }
2401
2402
333
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_SERVICE_LEVEL_AA_CONTAINER_PRESENT;
2403
333
            decoded += size;
2404
333
            break;
2405
236
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_NSSRG_INFORMATION_TYPE:
2406
236
            size = ogs_nas_5gs_decode_nssrg_information(&configuration_update_command->nssrg_information, pkbuf);
2407
236
            if (size < 0) {
2408
9
               ogs_error("ogs_nas_5gs_decode_nssrg_information() failed");
2409
9
               return size;
2410
9
            }
2411
2412
227
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_NSSRG_INFORMATION_PRESENT;
2413
227
            decoded += size;
2414
227
            break;
2415
211
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_DISASTER_ROAMING_WAIT_RANGE_TYPE:
2416
211
            size = ogs_nas_5gs_decode_registration_wait_range(&configuration_update_command->disaster_roaming_wait_range, pkbuf);
2417
211
            if (size < 0) {
2418
2
               ogs_error("ogs_nas_5gs_decode_registration_wait_range() failed");
2419
2
               return size;
2420
2
            }
2421
2422
209
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_DISASTER_ROAMING_WAIT_RANGE_PRESENT;
2423
209
            decoded += size;
2424
209
            break;
2425
209
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_DISASTER_RETURN_WAIT_RANGE_TYPE:
2426
209
            size = ogs_nas_5gs_decode_registration_wait_range(&configuration_update_command->disaster_return_wait_range, pkbuf);
2427
209
            if (size < 0) {
2428
9
               ogs_error("ogs_nas_5gs_decode_registration_wait_range() failed");
2429
9
               return size;
2430
9
            }
2431
2432
200
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_DISASTER_RETURN_WAIT_RANGE_PRESENT;
2433
200
            decoded += size;
2434
200
            break;
2435
215
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_LIST_OF_PLMNS_TO_BE_USED_IN_DISASTER_CONDITION_TYPE:
2436
215
            size = ogs_nas_5gs_decode_list_of_plmns_to_be_used_in_disaster_condition(&configuration_update_command->list_of_plmns_to_be_used_in_disaster_condition, pkbuf);
2437
215
            if (size < 0) {
2438
3
               ogs_error("ogs_nas_5gs_decode_list_of_plmns_to_be_used_in_disaster_condition() failed");
2439
3
               return size;
2440
3
            }
2441
2442
212
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_LIST_OF_PLMNS_TO_BE_USED_IN_DISASTER_CONDITION_PRESENT;
2443
212
            decoded += size;
2444
212
            break;
2445
234
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_EXTENDED_CAG_INFORMATION_LIST_TYPE:
2446
234
            size = ogs_nas_5gs_decode_extended_cag_information_list(&configuration_update_command->extended_cag_information_list, pkbuf);
2447
234
            if (size < 0) {
2448
19
               ogs_error("ogs_nas_5gs_decode_extended_cag_information_list() failed");
2449
19
               return size;
2450
19
            }
2451
2452
215
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_EXTENDED_CAG_INFORMATION_LIST_PRESENT;
2453
215
            decoded += size;
2454
215
            break;
2455
285
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_UPDATED_PEIPS_ASSISTANCE_INFORMATION_TYPE:
2456
285
            size = ogs_nas_5gs_decode_peips_assistance_information(&configuration_update_command->updated_peips_assistance_information, pkbuf);
2457
285
            if (size < 0) {
2458
5
               ogs_error("ogs_nas_5gs_decode_peips_assistance_information() failed");
2459
5
               return size;
2460
5
            }
2461
2462
280
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_UPDATED_PEIPS_ASSISTANCE_INFORMATION_PRESENT;
2463
280
            decoded += size;
2464
280
            break;
2465
254
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_NSAG_INFORMATION_TYPE:
2466
254
            size = ogs_nas_5gs_decode_nsag_information(&configuration_update_command->nsag_information, pkbuf);
2467
254
            if (size < 0) {
2468
22
               ogs_error("ogs_nas_5gs_decode_nsag_information() failed");
2469
22
               return size;
2470
22
            }
2471
2472
232
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_NSAG_INFORMATION_PRESENT;
2473
232
            decoded += size;
2474
232
            break;
2475
683
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_PRIORITY_INDICATOR_TYPE:
2476
683
            decoded--;
2477
683
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
2478
683
            size = ogs_nas_5gs_decode_priority_indicator(&configuration_update_command->priority_indicator, pkbuf);
2479
683
            if (size < 0) {
2480
0
               ogs_error("ogs_nas_5gs_decode_priority_indicator() failed");
2481
0
               return size;
2482
0
            }
2483
2484
683
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_PRIORITY_INDICATOR_PRESENT;
2485
683
            decoded += size;
2486
683
            break;
2487
203
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_RAN_TIMING_SYNCHRONIZATION_TYPE:
2488
203
            size = ogs_nas_5gs_decode_ran_timing_synchronization(&configuration_update_command->ran_timing_synchronization, pkbuf);
2489
203
            if (size < 0) {
2490
5
               ogs_error("ogs_nas_5gs_decode_ran_timing_synchronization() failed");
2491
5
               return size;
2492
5
            }
2493
2494
198
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_RAN_TIMING_SYNCHRONIZATION_PRESENT;
2495
198
            decoded += size;
2496
198
            break;
2497
235
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_EXTENDED_LADN_INFORMATION_TYPE:
2498
235
            size = ogs_nas_5gs_decode_extended_ladn_information(&configuration_update_command->extended_ladn_information, pkbuf);
2499
235
            if (size < 0) {
2500
18
               ogs_error("ogs_nas_5gs_decode_extended_ladn_information() failed");
2501
18
               return size;
2502
18
            }
2503
2504
217
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_EXTENDED_LADN_INFORMATION_PRESENT;
2505
217
            decoded += size;
2506
217
            break;
2507
252
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_ALTERNATIVE_NSSAI_TYPE:
2508
252
            size = ogs_nas_5gs_decode_alternative_nssai(&configuration_update_command->alternative_nssai, pkbuf);
2509
252
            if (size < 0) {
2510
10
               ogs_error("ogs_nas_5gs_decode_alternative_nssai() failed");
2511
10
               return size;
2512
10
            }
2513
2514
242
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_ALTERNATIVE_NSSAI_PRESENT;
2515
242
            decoded += size;
2516
242
            break;
2517
275
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_S_NSSAI_LOCATION_VALIDITY_INFORMATION_TYPE:
2518
275
            size = ogs_nas_5gs_decode_s_nssai_location_validity_information(&configuration_update_command->s_nssai_location_validity_information, pkbuf);
2519
275
            if (size < 0) {
2520
29
               ogs_error("ogs_nas_5gs_decode_s_nssai_location_validity_information() failed");
2521
29
               return size;
2522
29
            }
2523
2524
246
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_S_NSSAI_LOCATION_VALIDITY_INFORMATION_PRESENT;
2525
246
            decoded += size;
2526
246
            break;
2527
216
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_S_NSSAI_TIME_VALIDITY_INFORMATION_TYPE:
2528
216
            size = ogs_nas_5gs_decode_s_nssai_time_validity_information(&configuration_update_command->s_nssai_time_validity_information, pkbuf);
2529
216
            if (size < 0) {
2530
7
               ogs_error("ogs_nas_5gs_decode_s_nssai_time_validity_information() failed");
2531
7
               return size;
2532
7
            }
2533
2534
209
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_S_NSSAI_TIME_VALIDITY_INFORMATION_PRESENT;
2535
209
            decoded += size;
2536
209
            break;
2537
226
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_DISCONTINUOUS_COVERAGE_MAXIMUM_TIME_OFFSET_TYPE:
2538
226
            size = ogs_nas_5gs_decode_gprs_timer_3(&configuration_update_command->discontinuous_coverage_maximum_time_offset, pkbuf);
2539
226
            if (size < 0) {
2540
5
               ogs_error("ogs_nas_5gs_decode_gprs_timer_3() failed");
2541
5
               return size;
2542
5
            }
2543
2544
221
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_DISCONTINUOUS_COVERAGE_MAXIMUM_TIME_OFFSET_PRESENT;
2545
221
            decoded += size;
2546
221
            break;
2547
290
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_PARTIALLY_ALLOWED_NSSAI_TYPE:
2548
290
            size = ogs_nas_5gs_decode_partial_nssai(&configuration_update_command->partially_allowed_nssai, pkbuf);
2549
290
            if (size < 0) {
2550
13
               ogs_error("ogs_nas_5gs_decode_partial_nssai() failed");
2551
13
               return size;
2552
13
            }
2553
2554
277
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_PARTIALLY_ALLOWED_NSSAI_PRESENT;
2555
277
            decoded += size;
2556
277
            break;
2557
264
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_PARTIALLY_REJECTED_NSSAI_TYPE:
2558
264
            size = ogs_nas_5gs_decode_partial_nssai(&configuration_update_command->partially_rejected_nssai, pkbuf);
2559
264
            if (size < 0) {
2560
15
               ogs_error("ogs_nas_5gs_decode_partial_nssai() failed");
2561
15
               return size;
2562
15
            }
2563
2564
249
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_PARTIALLY_REJECTED_NSSAI_PRESENT;
2565
249
            decoded += size;
2566
249
            break;
2567
279
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_FEATURE_AUTHORIZATION_INDICATION_TYPE:
2568
279
            size = ogs_nas_5gs_decode_feature_authorization_indication(&configuration_update_command->feature_authorization_indication, pkbuf);
2569
279
            if (size < 0) {
2570
14
               ogs_error("ogs_nas_5gs_decode_feature_authorization_indication() failed");
2571
14
               return size;
2572
14
            }
2573
2574
265
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_FEATURE_AUTHORIZATION_INDICATION_PRESENT;
2575
265
            decoded += size;
2576
265
            break;
2577
383
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_ON_DEMAND_NSSAI_TYPE:
2578
383
            size = ogs_nas_5gs_decode_on_demand_nssai(&configuration_update_command->on_demand_nssai, pkbuf);
2579
383
            if (size < 0) {
2580
15
               ogs_error("ogs_nas_5gs_decode_on_demand_nssai() failed");
2581
15
               return size;
2582
15
            }
2583
2584
368
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_ON_DEMAND_NSSAI_PRESENT;
2585
368
            decoded += size;
2586
368
            break;
2587
222
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_ACCESS_TECHNOLOGY_UTILIZATION_CONTROL_TYPE:
2588
222
            size = ogs_nas_5gs_decode_access_technology_utilization_control(&configuration_update_command->access_technology_utilization_control, pkbuf);
2589
222
            if (size < 0) {
2590
9
               ogs_error("ogs_nas_5gs_decode_access_technology_utilization_control() failed");
2591
9
               return size;
2592
9
            }
2593
2594
213
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_ACCESS_TECHNOLOGY_UTILIZATION_CONTROL_PRESENT;
2595
213
            decoded += size;
2596
213
            break;
2597
294
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_UPDATED_LP_WUSPS_ASSISTANCE_INFORMATION_TYPE:
2598
294
            size = ogs_nas_5gs_decode_lp_wusps_assistance_information(&configuration_update_command->updated_lp_wusps_assistance_information, pkbuf);
2599
294
            if (size < 0) {
2600
9
               ogs_error("ogs_nas_5gs_decode_lp_wusps_assistance_information() failed");
2601
9
               return size;
2602
9
            }
2603
2604
285
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_UPDATED_LP_WUSPS_ASSISTANCE_INFORMATION_PRESENT;
2605
285
            decoded += size;
2606
285
            break;
2607
857
        case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_LP_WUS_STATUS_TYPE:
2608
857
            decoded--;
2609
857
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
2610
857
            size = ogs_nas_5gs_decode_lp_wus_status(&configuration_update_command->lp_wus_status, pkbuf);
2611
857
            if (size < 0) {
2612
0
               ogs_error("ogs_nas_5gs_decode_lp_wus_status() failed");
2613
0
               return size;
2614
0
            }
2615
2616
857
            configuration_update_command->presencemask |= OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND_LP_WUS_STATUS_PRESENT;
2617
857
            decoded += size;
2618
857
            break;
2619
2.10k
        default:
2620
2.10k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2621
2.10k
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
2622
2.10k
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
2623
2.10k
            if (size < 0) {
2624
85
               ogs_error("ogs_nas_skip_unknown_ie() failed");
2625
85
               return size;
2626
85
            }
2627
2628
2.02k
            decoded += size;
2629
2.02k
            break;
2630
20.8k
        }
2631
20.8k
    }
2632
2633
707
    return decoded;
2634
1.18k
}
2635
2636
int ogs_nas_5gs_decode_authentication_request(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
2637
84
{
2638
84
    ogs_nas_5gs_authentication_request_t *authentication_request = &message->gmm.authentication_request;
2639
84
    int decoded = 0;
2640
84
    int size = 0;
2641
2642
84
    ogs_trace("[NAS] Decode AUTHENTICATION_REQUEST\n");
2643
2644
84
    size = ogs_nas_5gs_decode_key_set_identifier(&authentication_request->ngksi, pkbuf);
2645
84
    if (size < 0) {
2646
0
        ogs_error("ogs_nas_5gs_decode_key_set_identifier() failed");
2647
0
        return size;
2648
0
    }
2649
2650
84
    decoded += size;
2651
2652
84
    size = ogs_nas_5gs_decode_abba(&authentication_request->abba, pkbuf);
2653
84
    if (size < 0) {
2654
9
        ogs_error("ogs_nas_5gs_decode_abba() failed");
2655
9
        return size;
2656
9
    }
2657
2658
75
    decoded += size;
2659
2660
1.76k
    while (pkbuf->len > 0) {
2661
1.71k
        uint8_t *buffer = pkbuf->data;
2662
1.71k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2663
2664
1.71k
        size = sizeof(uint8_t);
2665
1.71k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
2666
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
2667
0
           return OGS_ERROR;
2668
0
        }
2669
1.71k
        decoded += size;
2670
2671
1.71k
        switch(type) {
2672
196
        case OGS_NAS_5GS_AUTHENTICATION_REQUEST_AUTHENTICATION_PARAMETER_RAND_TYPE:
2673
196
            size = ogs_nas_5gs_decode_authentication_parameter_rand(&authentication_request->authentication_parameter_rand, pkbuf);
2674
196
            if (size < 0) {
2675
13
               ogs_error("ogs_nas_5gs_decode_authentication_parameter_rand() failed");
2676
13
               return size;
2677
13
            }
2678
2679
183
            authentication_request->presencemask |= OGS_NAS_5GS_AUTHENTICATION_REQUEST_AUTHENTICATION_PARAMETER_RAND_PRESENT;
2680
183
            decoded += size;
2681
183
            break;
2682
211
        case OGS_NAS_5GS_AUTHENTICATION_REQUEST_AUTHENTICATION_PARAMETER_AUTN_TYPE:
2683
211
            size = ogs_nas_5gs_decode_authentication_parameter_autn(&authentication_request->authentication_parameter_autn, pkbuf);
2684
211
            if (size < 0) {
2685
7
               ogs_error("ogs_nas_5gs_decode_authentication_parameter_autn() failed");
2686
7
               return size;
2687
7
            }
2688
2689
204
            authentication_request->presencemask |= OGS_NAS_5GS_AUTHENTICATION_REQUEST_AUTHENTICATION_PARAMETER_AUTN_PRESENT;
2690
204
            decoded += size;
2691
204
            break;
2692
195
        case OGS_NAS_5GS_AUTHENTICATION_REQUEST_EAP_MESSAGE_TYPE:
2693
195
            size = ogs_nas_5gs_decode_eap_message(&authentication_request->eap_message, pkbuf);
2694
195
            if (size < 0) {
2695
1
               ogs_error("ogs_nas_5gs_decode_eap_message() failed");
2696
1
               return size;
2697
1
            }
2698
2699
194
            authentication_request->presencemask |= OGS_NAS_5GS_AUTHENTICATION_REQUEST_EAP_MESSAGE_PRESENT;
2700
194
            decoded += size;
2701
194
            break;
2702
1.11k
        default:
2703
1.11k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2704
1.11k
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
2705
1.11k
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
2706
1.11k
            if (size < 0) {
2707
5
               ogs_error("ogs_nas_skip_unknown_ie() failed");
2708
5
               return size;
2709
5
            }
2710
2711
1.10k
            decoded += size;
2712
1.10k
            break;
2713
1.71k
        }
2714
1.71k
    }
2715
2716
49
    return decoded;
2717
75
}
2718
2719
int ogs_nas_5gs_decode_authentication_response(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
2720
68
{
2721
68
    ogs_nas_5gs_authentication_response_t *authentication_response = &message->gmm.authentication_response;
2722
68
    int decoded = 0;
2723
68
    int size = 0;
2724
2725
68
    ogs_trace("[NAS] Decode AUTHENTICATION_RESPONSE\n");
2726
2727
1.07k
    while (pkbuf->len > 0) {
2728
1.02k
        uint8_t *buffer = pkbuf->data;
2729
1.02k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2730
2731
1.02k
        size = sizeof(uint8_t);
2732
1.02k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
2733
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
2734
0
           return OGS_ERROR;
2735
0
        }
2736
1.02k
        decoded += size;
2737
2738
1.02k
        switch(type) {
2739
228
        case OGS_NAS_5GS_AUTHENTICATION_RESPONSE_AUTHENTICATION_RESPONSE_PARAMETER_TYPE:
2740
228
            size = ogs_nas_5gs_decode_authentication_response_parameter(&authentication_response->authentication_response_parameter, pkbuf);
2741
228
            if (size < 0) {
2742
8
               ogs_error("ogs_nas_5gs_decode_authentication_response_parameter() failed");
2743
8
               return size;
2744
8
            }
2745
2746
220
            authentication_response->presencemask |= OGS_NAS_5GS_AUTHENTICATION_RESPONSE_AUTHENTICATION_RESPONSE_PARAMETER_PRESENT;
2747
220
            decoded += size;
2748
220
            break;
2749
223
        case OGS_NAS_5GS_AUTHENTICATION_RESPONSE_EAP_MESSAGE_TYPE:
2750
223
            size = ogs_nas_5gs_decode_eap_message(&authentication_response->eap_message, pkbuf);
2751
223
            if (size < 0) {
2752
2
               ogs_error("ogs_nas_5gs_decode_eap_message() failed");
2753
2
               return size;
2754
2
            }
2755
2756
221
            authentication_response->presencemask |= OGS_NAS_5GS_AUTHENTICATION_RESPONSE_EAP_MESSAGE_PRESENT;
2757
221
            decoded += size;
2758
221
            break;
2759
571
        default:
2760
571
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2761
571
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
2762
571
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
2763
571
            if (size < 0) {
2764
5
               ogs_error("ogs_nas_skip_unknown_ie() failed");
2765
5
               return size;
2766
5
            }
2767
2768
566
            decoded += size;
2769
566
            break;
2770
1.02k
        }
2771
1.02k
    }
2772
2773
53
    return decoded;
2774
68
}
2775
2776
int ogs_nas_5gs_decode_authentication_reject(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
2777
40
{
2778
40
    ogs_nas_5gs_authentication_reject_t *authentication_reject = &message->gmm.authentication_reject;
2779
40
    int decoded = 0;
2780
40
    int size = 0;
2781
2782
40
    ogs_trace("[NAS] Decode AUTHENTICATION_REJECT\n");
2783
2784
674
    while (pkbuf->len > 0) {
2785
646
        uint8_t *buffer = pkbuf->data;
2786
646
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2787
2788
646
        size = sizeof(uint8_t);
2789
646
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
2790
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
2791
0
           return OGS_ERROR;
2792
0
        }
2793
646
        decoded += size;
2794
2795
646
        switch(type) {
2796
213
        case OGS_NAS_5GS_AUTHENTICATION_REJECT_EAP_MESSAGE_TYPE:
2797
213
            size = ogs_nas_5gs_decode_eap_message(&authentication_reject->eap_message, pkbuf);
2798
213
            if (size < 0) {
2799
5
               ogs_error("ogs_nas_5gs_decode_eap_message() failed");
2800
5
               return size;
2801
5
            }
2802
2803
208
            authentication_reject->presencemask |= OGS_NAS_5GS_AUTHENTICATION_REJECT_EAP_MESSAGE_PRESENT;
2804
208
            decoded += size;
2805
208
            break;
2806
433
        default:
2807
433
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2808
433
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
2809
433
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
2810
433
            if (size < 0) {
2811
7
               ogs_error("ogs_nas_skip_unknown_ie() failed");
2812
7
               return size;
2813
7
            }
2814
2815
426
            decoded += size;
2816
426
            break;
2817
646
        }
2818
646
    }
2819
2820
28
    return decoded;
2821
40
}
2822
2823
int ogs_nas_5gs_decode_authentication_failure(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
2824
53
{
2825
53
    ogs_nas_5gs_authentication_failure_t *authentication_failure = &message->gmm.authentication_failure;
2826
53
    int decoded = 0;
2827
53
    int size = 0;
2828
2829
53
    ogs_trace("[NAS] Decode AUTHENTICATION_FAILURE\n");
2830
2831
53
    size = ogs_nas_5gs_decode_5gmm_cause(&authentication_failure->gmm_cause, pkbuf);
2832
53
    if (size < 0) {
2833
0
        ogs_error("ogs_nas_5gs_decode_5gmm_cause() failed");
2834
0
        return size;
2835
0
    }
2836
2837
53
    decoded += size;
2838
2839
1.22k
    while (pkbuf->len > 0) {
2840
1.18k
        uint8_t *buffer = pkbuf->data;
2841
1.18k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2842
2843
1.18k
        size = sizeof(uint8_t);
2844
1.18k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
2845
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
2846
0
           return OGS_ERROR;
2847
0
        }
2848
1.18k
        decoded += size;
2849
2850
1.18k
        switch(type) {
2851
200
        case OGS_NAS_5GS_AUTHENTICATION_FAILURE_AUTHENTICATION_FAILURE_PARAMETER_TYPE:
2852
200
            size = ogs_nas_5gs_decode_authentication_failure_parameter(&authentication_failure->authentication_failure_parameter, pkbuf);
2853
200
            if (size < 0) {
2854
4
               ogs_error("ogs_nas_5gs_decode_authentication_failure_parameter() failed");
2855
4
               return size;
2856
4
            }
2857
2858
196
            authentication_failure->presencemask |= OGS_NAS_5GS_AUTHENTICATION_FAILURE_AUTHENTICATION_FAILURE_PARAMETER_PRESENT;
2859
196
            decoded += size;
2860
196
            break;
2861
983
        default:
2862
983
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2863
983
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
2864
983
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
2865
983
            if (size < 0) {
2866
11
               ogs_error("ogs_nas_skip_unknown_ie() failed");
2867
11
               return size;
2868
11
            }
2869
2870
972
            decoded += size;
2871
972
            break;
2872
1.18k
        }
2873
1.18k
    }
2874
2875
38
    return decoded;
2876
53
}
2877
2878
int ogs_nas_5gs_decode_authentication_result(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
2879
55
{
2880
55
    ogs_nas_5gs_authentication_result_t *authentication_result = &message->gmm.authentication_result;
2881
55
    int decoded = 0;
2882
55
    int size = 0;
2883
2884
55
    ogs_trace("[NAS] Decode AUTHENTICATION_RESULT\n");
2885
2886
55
    size = ogs_nas_5gs_decode_key_set_identifier(&authentication_result->ngksi, pkbuf);
2887
55
    if (size < 0) {
2888
0
        ogs_error("ogs_nas_5gs_decode_key_set_identifier() failed");
2889
0
        return size;
2890
0
    }
2891
2892
55
    decoded += size;
2893
2894
55
    size = ogs_nas_5gs_decode_eap_message(&authentication_result->eap_message, pkbuf);
2895
55
    if (size < 0) {
2896
8
        ogs_error("ogs_nas_5gs_decode_eap_message() failed");
2897
8
        return size;
2898
8
    }
2899
2900
47
    decoded += size;
2901
2902
912
    while (pkbuf->len > 0) {
2903
870
        uint8_t *buffer = pkbuf->data;
2904
870
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
2905
2906
870
        size = sizeof(uint8_t);
2907
870
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
2908
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
2909
0
           return OGS_ERROR;
2910
0
        }
2911
870
        decoded += size;
2912
2913
870
        switch(type) {
2914
198
        case OGS_NAS_5GS_AUTHENTICATION_RESULT_ABBA_TYPE:
2915
198
            size = ogs_nas_5gs_decode_abba(&authentication_result->abba, pkbuf);
2916
198
            if (size < 0) {
2917
1
               ogs_error("ogs_nas_5gs_decode_abba() failed");
2918
1
               return size;
2919
1
            }
2920
2921
197
            authentication_result->presencemask |= OGS_NAS_5GS_AUTHENTICATION_RESULT_ABBA_PRESENT;
2922
197
            decoded += size;
2923
197
            break;
2924
202
        case OGS_NAS_5GS_AUTHENTICATION_RESULT_AUN3_DEVICE_SECURITY_KEY_TYPE:
2925
202
            size = ogs_nas_5gs_decode_aun3_device_security_key(&authentication_result->aun3_device_security_key, pkbuf);
2926
202
            if (size < 0) {
2927
1
               ogs_error("ogs_nas_5gs_decode_aun3_device_security_key() failed");
2928
1
               return size;
2929
1
            }
2930
2931
201
            authentication_result->presencemask |= OGS_NAS_5GS_AUTHENTICATION_RESULT_AUN3_DEVICE_SECURITY_KEY_PRESENT;
2932
201
            decoded += size;
2933
201
            break;
2934
470
        default:
2935
470
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
2936
470
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
2937
470
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
2938
470
            if (size < 0) {
2939
3
               ogs_error("ogs_nas_skip_unknown_ie() failed");
2940
3
               return size;
2941
3
            }
2942
2943
467
            decoded += size;
2944
467
            break;
2945
870
        }
2946
870
    }
2947
2948
42
    return decoded;
2949
47
}
2950
2951
int ogs_nas_5gs_decode_identity_request(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
2952
1
{
2953
1
    ogs_nas_5gs_identity_request_t *identity_request = &message->gmm.identity_request;
2954
1
    int decoded = 0;
2955
1
    int size = 0;
2956
2957
1
    ogs_trace("[NAS] Decode IDENTITY_REQUEST\n");
2958
2959
1
    size = ogs_nas_5gs_decode_5gs_identity_type(&identity_request->identity_type, pkbuf);
2960
1
    if (size < 0) {
2961
0
        ogs_error("ogs_nas_5gs_decode_5gs_identity_type() failed");
2962
0
        return size;
2963
0
    }
2964
2965
1
    decoded += size;
2966
2967
1
    return decoded;
2968
1
}
2969
2970
int ogs_nas_5gs_decode_identity_response(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
2971
25
{
2972
25
    ogs_nas_5gs_identity_response_t *identity_response = &message->gmm.identity_response;
2973
25
    int decoded = 0;
2974
25
    int size = 0;
2975
2976
25
    ogs_trace("[NAS] Decode IDENTITY_RESPONSE\n");
2977
2978
25
    size = ogs_nas_5gs_decode_5gs_mobile_identity(&identity_response->mobile_identity, pkbuf);
2979
25
    if (size < 0) {
2980
15
        ogs_error("ogs_nas_5gs_decode_5gs_mobile_identity() failed");
2981
15
        return size;
2982
15
    }
2983
2984
10
    decoded += size;
2985
2986
10
    return decoded;
2987
25
}
2988
2989
int ogs_nas_5gs_decode_security_mode_command(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
2990
124
{
2991
124
    ogs_nas_5gs_security_mode_command_t *security_mode_command = &message->gmm.security_mode_command;
2992
124
    int decoded = 0;
2993
124
    int size = 0;
2994
2995
124
    ogs_trace("[NAS] Decode SECURITY_MODE_COMMAND\n");
2996
2997
124
    size = ogs_nas_5gs_decode_security_algorithms(&security_mode_command->selected_nas_security_algorithms, pkbuf);
2998
124
    if (size < 0) {
2999
0
        ogs_error("ogs_nas_5gs_decode_security_algorithms() failed");
3000
0
        return size;
3001
0
    }
3002
3003
124
    decoded += size;
3004
3005
124
    size = ogs_nas_5gs_decode_key_set_identifier(&security_mode_command->ngksi, pkbuf);
3006
124
    if (size < 0) {
3007
1
        ogs_error("ogs_nas_5gs_decode_key_set_identifier() failed");
3008
1
        return size;
3009
1
    }
3010
3011
123
    decoded += size;
3012
3013
123
    size = ogs_nas_5gs_decode_ue_security_capability(&security_mode_command->replayed_ue_security_capabilities, pkbuf);
3014
123
    if (size < 0) {
3015
8
        ogs_error("ogs_nas_5gs_decode_ue_security_capability() failed");
3016
8
        return size;
3017
8
    }
3018
3019
115
    decoded += size;
3020
3021
2.62k
    while (pkbuf->len > 0) {
3022
2.54k
        uint8_t *buffer = pkbuf->data;
3023
2.54k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
3024
3025
2.54k
        size = sizeof(uint8_t);
3026
2.54k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
3027
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
3028
0
           return OGS_ERROR;
3029
0
        }
3030
2.54k
        decoded += size;
3031
3032
2.54k
        switch(type) {
3033
226
        case OGS_NAS_5GS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_TYPE:
3034
226
            decoded--;
3035
226
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
3036
226
            size = ogs_nas_5gs_decode_imeisv_request(&security_mode_command->imeisv_request, pkbuf);
3037
226
            if (size < 0) {
3038
0
               ogs_error("ogs_nas_5gs_decode_imeisv_request() failed");
3039
0
               return size;
3040
0
            }
3041
3042
226
            security_mode_command->presencemask |= OGS_NAS_5GS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_PRESENT;
3043
226
            decoded += size;
3044
226
            break;
3045
237
        case OGS_NAS_5GS_SECURITY_MODE_COMMAND_SELECTED_EPS_NAS_SECURITY_ALGORITHMS_TYPE:
3046
237
            size = ogs_nas_5gs_decode_eps_nas_security_algorithms(&security_mode_command->selected_eps_nas_security_algorithms, pkbuf);
3047
237
            if (size < 0) {
3048
3
               ogs_error("ogs_nas_5gs_decode_eps_nas_security_algorithms() failed");
3049
3
               return size;
3050
3
            }
3051
3052
234
            security_mode_command->presencemask |= OGS_NAS_5GS_SECURITY_MODE_COMMAND_SELECTED_EPS_NAS_SECURITY_ALGORITHMS_PRESENT;
3053
234
            decoded += size;
3054
234
            break;
3055
197
        case OGS_NAS_5GS_SECURITY_MODE_COMMAND_ADDITIONAL_5G_SECURITY_INFORMATION_TYPE:
3056
197
            size = ogs_nas_5gs_decode_additional_5g_security_information(&security_mode_command->additional_security_information, pkbuf);
3057
197
            if (size < 0) {
3058
3
               ogs_error("ogs_nas_5gs_decode_additional_5g_security_information() failed");
3059
3
               return size;
3060
3
            }
3061
3062
194
            security_mode_command->presencemask |= OGS_NAS_5GS_SECURITY_MODE_COMMAND_ADDITIONAL_5G_SECURITY_INFORMATION_PRESENT;
3063
194
            decoded += size;
3064
194
            break;
3065
195
        case OGS_NAS_5GS_SECURITY_MODE_COMMAND_EAP_MESSAGE_TYPE:
3066
195
            size = ogs_nas_5gs_decode_eap_message(&security_mode_command->eap_message, pkbuf);
3067
195
            if (size < 0) {
3068
1
               ogs_error("ogs_nas_5gs_decode_eap_message() failed");
3069
1
               return size;
3070
1
            }
3071
3072
194
            security_mode_command->presencemask |= OGS_NAS_5GS_SECURITY_MODE_COMMAND_EAP_MESSAGE_PRESENT;
3073
194
            decoded += size;
3074
194
            break;
3075
328
        case OGS_NAS_5GS_SECURITY_MODE_COMMAND_ABBA_TYPE:
3076
328
            size = ogs_nas_5gs_decode_abba(&security_mode_command->abba, pkbuf);
3077
328
            if (size < 0) {
3078
3
               ogs_error("ogs_nas_5gs_decode_abba() failed");
3079
3
               return size;
3080
3
            }
3081
3082
325
            security_mode_command->presencemask |= OGS_NAS_5GS_SECURITY_MODE_COMMAND_ABBA_PRESENT;
3083
325
            decoded += size;
3084
325
            break;
3085
209
        case OGS_NAS_5GS_SECURITY_MODE_COMMAND_REPLAYED_S1_UE_SECURITY_CAPABILITIES_TYPE:
3086
209
            size = ogs_nas_5gs_decode_s1_ue_security_capability(&security_mode_command->replayed_s1_ue_security_capabilities, pkbuf);
3087
209
            if (size < 0) {
3088
6
               ogs_error("ogs_nas_5gs_decode_s1_ue_security_capability() failed");
3089
6
               return size;
3090
6
            }
3091
3092
203
            security_mode_command->presencemask |= OGS_NAS_5GS_SECURITY_MODE_COMMAND_REPLAYED_S1_UE_SECURITY_CAPABILITIES_PRESENT;
3093
203
            decoded += size;
3094
203
            break;
3095
242
        case OGS_NAS_5GS_SECURITY_MODE_COMMAND_AUN3_DEVICE_SECURITY_KEY_TYPE:
3096
242
            size = ogs_nas_5gs_decode_aun3_device_security_key(&security_mode_command->aun3_device_security_key, pkbuf);
3097
242
            if (size < 0) {
3098
6
               ogs_error("ogs_nas_5gs_decode_aun3_device_security_key() failed");
3099
6
               return size;
3100
6
            }
3101
3102
236
            security_mode_command->presencemask |= OGS_NAS_5GS_SECURITY_MODE_COMMAND_AUN3_DEVICE_SECURITY_KEY_PRESENT;
3103
236
            decoded += size;
3104
236
            break;
3105
906
        default:
3106
906
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
3107
906
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
3108
906
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
3109
906
            if (size < 0) {
3110
5
               ogs_error("ogs_nas_skip_unknown_ie() failed");
3111
5
               return size;
3112
5
            }
3113
3114
901
            decoded += size;
3115
901
            break;
3116
2.54k
        }
3117
2.54k
    }
3118
3119
88
    return decoded;
3120
115
}
3121
3122
int ogs_nas_5gs_decode_security_mode_complete(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
3123
91
{
3124
91
    ogs_nas_5gs_security_mode_complete_t *security_mode_complete = &message->gmm.security_mode_complete;
3125
91
    int decoded = 0;
3126
91
    int size = 0;
3127
3128
91
    ogs_trace("[NAS] Decode SECURITY_MODE_COMPLETE\n");
3129
3130
1.53k
    while (pkbuf->len > 0) {
3131
1.48k
        uint8_t *buffer = pkbuf->data;
3132
1.48k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
3133
3134
1.48k
        size = sizeof(uint8_t);
3135
1.48k
        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
1.48k
        decoded += size;
3140
3141
1.48k
        switch(type) {
3142
216
        case OGS_NAS_5GS_SECURITY_MODE_COMPLETE_IMEISV_TYPE:
3143
216
            size = ogs_nas_5gs_decode_5gs_mobile_identity(&security_mode_complete->imeisv, pkbuf);
3144
216
            if (size < 0) {
3145
4
               ogs_error("ogs_nas_5gs_decode_5gs_mobile_identity() failed");
3146
4
               return size;
3147
4
            }
3148
3149
212
            security_mode_complete->presencemask |= OGS_NAS_5GS_SECURITY_MODE_COMPLETE_IMEISV_PRESENT;
3150
212
            decoded += size;
3151
212
            break;
3152
259
        case OGS_NAS_5GS_SECURITY_MODE_COMPLETE_NAS_MESSAGE_CONTAINER_TYPE:
3153
259
            size = ogs_nas_5gs_decode_message_container(&security_mode_complete->nas_message_container, pkbuf);
3154
259
            if (size < 0) {
3155
23
               ogs_error("ogs_nas_5gs_decode_message_container() failed");
3156
23
               return size;
3157
23
            }
3158
3159
236
            security_mode_complete->presencemask |= OGS_NAS_5GS_SECURITY_MODE_COMPLETE_NAS_MESSAGE_CONTAINER_PRESENT;
3160
236
            decoded += size;
3161
236
            break;
3162
221
        case OGS_NAS_5GS_SECURITY_MODE_COMPLETE_NON_IMEISV_PEI_TYPE:
3163
221
            size = ogs_nas_5gs_decode_5gs_mobile_identity(&security_mode_complete->non_imeisv_pei, pkbuf);
3164
221
            if (size < 0) {
3165
2
               ogs_error("ogs_nas_5gs_decode_5gs_mobile_identity() failed");
3166
2
               return size;
3167
2
            }
3168
3169
219
            security_mode_complete->presencemask |= OGS_NAS_5GS_SECURITY_MODE_COMPLETE_NON_IMEISV_PEI_PRESENT;
3170
219
            decoded += size;
3171
219
            break;
3172
785
        default:
3173
785
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
3174
785
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
3175
785
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
3176
785
            if (size < 0) {
3177
9
               ogs_error("ogs_nas_skip_unknown_ie() failed");
3178
9
               return size;
3179
9
            }
3180
3181
776
            decoded += size;
3182
776
            break;
3183
1.48k
        }
3184
1.48k
    }
3185
3186
53
    return decoded;
3187
91
}
3188
3189
int ogs_nas_5gs_decode_security_mode_reject(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
3190
1
{
3191
1
    ogs_nas_5gs_security_mode_reject_t *security_mode_reject = &message->gmm.security_mode_reject;
3192
1
    int decoded = 0;
3193
1
    int size = 0;
3194
3195
1
    ogs_trace("[NAS] Decode SECURITY_MODE_REJECT\n");
3196
3197
1
    size = ogs_nas_5gs_decode_5gmm_cause(&security_mode_reject->gmm_cause, pkbuf);
3198
1
    if (size < 0) {
3199
0
        ogs_error("ogs_nas_5gs_decode_5gmm_cause() failed");
3200
0
        return size;
3201
0
    }
3202
3203
1
    decoded += size;
3204
3205
1
    return decoded;
3206
1
}
3207
3208
int ogs_nas_5gs_decode_5gmm_status(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
3209
1
{
3210
1
    ogs_nas_5gs_5gmm_status_t *gmm_status = &message->gmm.gmm_status;
3211
1
    int decoded = 0;
3212
1
    int size = 0;
3213
3214
1
    ogs_trace("[NAS] Decode 5GMM_STATUS\n");
3215
3216
1
    size = ogs_nas_5gs_decode_5gmm_cause(&gmm_status->gmm_cause, pkbuf);
3217
1
    if (size < 0) {
3218
0
        ogs_error("ogs_nas_5gs_decode_5gmm_cause() failed");
3219
0
        return size;
3220
0
    }
3221
3222
1
    decoded += size;
3223
3224
1
    return decoded;
3225
1
}
3226
3227
int ogs_nas_5gs_decode_notification(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
3228
5
{
3229
5
    ogs_nas_5gs_notification_t *notification = &message->gmm.notification;
3230
5
    int decoded = 0;
3231
5
    int size = 0;
3232
3233
5
    ogs_trace("[NAS] Decode NOTIFICATION\n");
3234
3235
5
    size = ogs_nas_5gs_decode_access_type(&notification->access_type, pkbuf);
3236
5
    if (size < 0) {
3237
0
        ogs_error("ogs_nas_5gs_decode_access_type() failed");
3238
0
        return size;
3239
0
    }
3240
3241
5
    decoded += size;
3242
3243
5
    return decoded;
3244
5
}
3245
3246
int ogs_nas_5gs_decode_notification_response(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
3247
56
{
3248
56
    ogs_nas_5gs_notification_response_t *notification_response = &message->gmm.notification_response;
3249
56
    int decoded = 0;
3250
56
    int size = 0;
3251
3252
56
    ogs_trace("[NAS] Decode NOTIFICATION_RESPONSE\n");
3253
3254
686
    while (pkbuf->len > 0) {
3255
648
        uint8_t *buffer = pkbuf->data;
3256
648
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
3257
3258
648
        size = sizeof(uint8_t);
3259
648
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
3260
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
3261
0
           return OGS_ERROR;
3262
0
        }
3263
648
        decoded += size;
3264
3265
648
        switch(type) {
3266
207
        case OGS_NAS_5GS_NOTIFICATION_RESPONSE_PDU_SESSION_STATUS_TYPE:
3267
207
            size = ogs_nas_5gs_decode_pdu_session_status(&notification_response->pdu_session_status, pkbuf);
3268
207
            if (size < 0) {
3269
6
               ogs_error("ogs_nas_5gs_decode_pdu_session_status() failed");
3270
6
               return size;
3271
6
            }
3272
3273
201
            notification_response->presencemask |= OGS_NAS_5GS_NOTIFICATION_RESPONSE_PDU_SESSION_STATUS_PRESENT;
3274
201
            decoded += size;
3275
201
            break;
3276
441
        default:
3277
441
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
3278
441
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
3279
441
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
3280
441
            if (size < 0) {
3281
12
               ogs_error("ogs_nas_skip_unknown_ie() failed");
3282
12
               return size;
3283
12
            }
3284
3285
429
            decoded += size;
3286
429
            break;
3287
648
        }
3288
648
    }
3289
3290
38
    return decoded;
3291
56
}
3292
3293
int ogs_nas_5gs_decode_ul_nas_transport(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
3294
280
{
3295
280
    ogs_nas_5gs_ul_nas_transport_t *ul_nas_transport = &message->gmm.ul_nas_transport;
3296
280
    int decoded = 0;
3297
280
    int size = 0;
3298
3299
280
    ogs_trace("[NAS] Decode UL_NAS_TRANSPORT\n");
3300
3301
280
    size = ogs_nas_5gs_decode_payload_container_type(&ul_nas_transport->payload_container_type, pkbuf);
3302
280
    if (size < 0) {
3303
0
        ogs_error("ogs_nas_5gs_decode_payload_container_type() failed");
3304
0
        return size;
3305
0
    }
3306
3307
280
    decoded += size;
3308
3309
280
    size = ogs_nas_5gs_decode_payload_container(&ul_nas_transport->payload_container, pkbuf);
3310
280
    if (size < 0) {
3311
11
        ogs_error("ogs_nas_5gs_decode_payload_container() failed");
3312
11
        return size;
3313
11
    }
3314
3315
269
    decoded += size;
3316
3317
6.35k
    while (pkbuf->len > 0) {
3318
6.12k
        uint8_t *buffer = pkbuf->data;
3319
6.12k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
3320
3321
6.12k
        size = sizeof(uint8_t);
3322
6.12k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
3323
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
3324
0
           return OGS_ERROR;
3325
0
        }
3326
6.12k
        decoded += size;
3327
3328
6.12k
        switch(type) {
3329
201
        case OGS_NAS_5GS_UL_NAS_TRANSPORT_PDU_SESSION_ID_TYPE:
3330
201
            size = ogs_nas_5gs_decode_pdu_session_identity_2(&ul_nas_transport->pdu_session_id, pkbuf);
3331
201
            if (size < 0) {
3332
2
               ogs_error("ogs_nas_5gs_decode_pdu_session_identity_2() failed");
3333
2
               return size;
3334
2
            }
3335
3336
199
            ul_nas_transport->presencemask |= OGS_NAS_5GS_UL_NAS_TRANSPORT_PDU_SESSION_ID_PRESENT;
3337
199
            decoded += size;
3338
199
            break;
3339
285
        case OGS_NAS_5GS_UL_NAS_TRANSPORT_OLD_PDU_SESSION_ID_TYPE:
3340
285
            size = ogs_nas_5gs_decode_pdu_session_identity_2(&ul_nas_transport->old_pdu_session_id, pkbuf);
3341
285
            if (size < 0) {
3342
3
               ogs_error("ogs_nas_5gs_decode_pdu_session_identity_2() failed");
3343
3
               return size;
3344
3
            }
3345
3346
282
            ul_nas_transport->presencemask |= OGS_NAS_5GS_UL_NAS_TRANSPORT_OLD_PDU_SESSION_ID_PRESENT;
3347
282
            decoded += size;
3348
282
            break;
3349
339
        case OGS_NAS_5GS_UL_NAS_TRANSPORT_REQUEST_TYPE_TYPE:
3350
339
            decoded--;
3351
339
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
3352
339
            size = ogs_nas_5gs_decode_request_type(&ul_nas_transport->request_type, pkbuf);
3353
339
            if (size < 0) {
3354
0
               ogs_error("ogs_nas_5gs_decode_request_type() failed");
3355
0
               return size;
3356
0
            }
3357
3358
339
            ul_nas_transport->presencemask |= OGS_NAS_5GS_UL_NAS_TRANSPORT_REQUEST_TYPE_PRESENT;
3359
339
            decoded += size;
3360
339
            break;
3361
204
        case OGS_NAS_5GS_UL_NAS_TRANSPORT_S_NSSAI_TYPE:
3362
204
            size = ogs_nas_5gs_decode_s_nssai(&ul_nas_transport->s_nssai, pkbuf);
3363
204
            if (size < 0) {
3364
1
               ogs_error("ogs_nas_5gs_decode_s_nssai() failed");
3365
1
               return size;
3366
1
            }
3367
3368
203
            ul_nas_transport->presencemask |= OGS_NAS_5GS_UL_NAS_TRANSPORT_S_NSSAI_PRESENT;
3369
203
            decoded += size;
3370
203
            break;
3371
1.24k
        case OGS_NAS_5GS_UL_NAS_TRANSPORT_DNN_TYPE:
3372
1.24k
            size = ogs_nas_5gs_decode_dnn(&ul_nas_transport->dnn, pkbuf);
3373
1.24k
            if (size < 0) {
3374
14
               ogs_error("ogs_nas_5gs_decode_dnn() failed");
3375
14
               return size;
3376
14
            }
3377
3378
1.22k
            ul_nas_transport->presencemask |= OGS_NAS_5GS_UL_NAS_TRANSPORT_DNN_PRESENT;
3379
1.22k
            decoded += size;
3380
1.22k
            break;
3381
205
        case OGS_NAS_5GS_UL_NAS_TRANSPORT_ADDITIONAL_INFORMATION_TYPE:
3382
205
            size = ogs_nas_5gs_decode_additional_information(&ul_nas_transport->additional_information, pkbuf);
3383
205
            if (size < 0) {
3384
2
               ogs_error("ogs_nas_5gs_decode_additional_information() failed");
3385
2
               return size;
3386
2
            }
3387
3388
203
            ul_nas_transport->presencemask |= OGS_NAS_5GS_UL_NAS_TRANSPORT_ADDITIONAL_INFORMATION_PRESENT;
3389
203
            decoded += size;
3390
203
            break;
3391
666
        case OGS_NAS_5GS_UL_NAS_TRANSPORT_MA_PDU_SESSION_INFORMATION_TYPE:
3392
666
            decoded--;
3393
666
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
3394
666
            size = ogs_nas_5gs_decode_ma_pdu_session_information(&ul_nas_transport->ma_pdu_session_information, pkbuf);
3395
666
            if (size < 0) {
3396
0
               ogs_error("ogs_nas_5gs_decode_ma_pdu_session_information() failed");
3397
0
               return size;
3398
0
            }
3399
3400
666
            ul_nas_transport->presencemask |= OGS_NAS_5GS_UL_NAS_TRANSPORT_MA_PDU_SESSION_INFORMATION_PRESENT;
3401
666
            decoded += size;
3402
666
            break;
3403
1.14k
        case OGS_NAS_5GS_UL_NAS_TRANSPORT_RELEASE_ASSISTANCE_INDICATION_TYPE:
3404
1.14k
            decoded--;
3405
1.14k
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
3406
1.14k
            size = ogs_nas_5gs_decode_release_assistance_indication(&ul_nas_transport->release_assistance_indication, pkbuf);
3407
1.14k
            if (size < 0) {
3408
0
               ogs_error("ogs_nas_5gs_decode_release_assistance_indication() failed");
3409
0
               return size;
3410
0
            }
3411
3412
1.14k
            ul_nas_transport->presencemask |= OGS_NAS_5GS_UL_NAS_TRANSPORT_RELEASE_ASSISTANCE_INDICATION_PRESENT;
3413
1.14k
            decoded += size;
3414
1.14k
            break;
3415
202
        case OGS_NAS_5GS_UL_NAS_TRANSPORT_NON_3GPP_ACCESS_PATH_SWITCHING_INDICATION_TYPE:
3416
202
            size = ogs_nas_5gs_decode_non_3gpp_access_path_switching_indication(&ul_nas_transport->non_3gpp_access_path_switching_indication, pkbuf);
3417
202
            if (size < 0) {
3418
4
               ogs_error("ogs_nas_5gs_decode_non_3gpp_access_path_switching_indication() failed");
3419
4
               return size;
3420
4
            }
3421
3422
198
            ul_nas_transport->presencemask |= OGS_NAS_5GS_UL_NAS_TRANSPORT_NON_3GPP_ACCESS_PATH_SWITCHING_INDICATION_PRESENT;
3423
198
            decoded += size;
3424
198
            break;
3425
198
        case OGS_NAS_5GS_UL_NAS_TRANSPORT_ALTERNATIVE_S_NSSAI_TYPE:
3426
198
            size = ogs_nas_5gs_decode_s_nssai(&ul_nas_transport->alternative_s_nssai, pkbuf);
3427
198
            if (size < 0) {
3428
2
               ogs_error("ogs_nas_5gs_decode_s_nssai() failed");
3429
2
               return size;
3430
2
            }
3431
3432
196
            ul_nas_transport->presencemask |= OGS_NAS_5GS_UL_NAS_TRANSPORT_ALTERNATIVE_S_NSSAI_PRESENT;
3433
196
            decoded += size;
3434
196
            break;
3435
548
        case OGS_NAS_5GS_UL_NAS_TRANSPORT_PAYLOAD_CONTAINER_INFORMATION_TYPE:
3436
548
            decoded--;
3437
548
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
3438
548
            size = ogs_nas_5gs_decode_payload_container_information(&ul_nas_transport->payload_container_information, pkbuf);
3439
548
            if (size < 0) {
3440
0
               ogs_error("ogs_nas_5gs_decode_payload_container_information() failed");
3441
0
               return size;
3442
0
            }
3443
3444
548
            ul_nas_transport->presencemask |= OGS_NAS_5GS_UL_NAS_TRANSPORT_PAYLOAD_CONTAINER_INFORMATION_PRESENT;
3445
548
            decoded += size;
3446
548
            break;
3447
885
        default:
3448
885
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
3449
885
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
3450
885
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
3451
885
            if (size < 0) {
3452
10
               ogs_error("ogs_nas_skip_unknown_ie() failed");
3453
10
               return size;
3454
10
            }
3455
3456
875
            decoded += size;
3457
875
            break;
3458
6.12k
        }
3459
6.12k
    }
3460
3461
231
    return decoded;
3462
269
}
3463
3464
int ogs_nas_5gs_decode_dl_nas_transport(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
3465
101
{
3466
101
    ogs_nas_5gs_dl_nas_transport_t *dl_nas_transport = &message->gmm.dl_nas_transport;
3467
101
    int decoded = 0;
3468
101
    int size = 0;
3469
3470
101
    ogs_trace("[NAS] Decode DL_NAS_TRANSPORT\n");
3471
3472
101
    size = ogs_nas_5gs_decode_payload_container_type(&dl_nas_transport->payload_container_type, pkbuf);
3473
101
    if (size < 0) {
3474
0
        ogs_error("ogs_nas_5gs_decode_payload_container_type() failed");
3475
0
        return size;
3476
0
    }
3477
3478
101
    decoded += size;
3479
3480
101
    size = ogs_nas_5gs_decode_payload_container(&dl_nas_transport->payload_container, pkbuf);
3481
101
    if (size < 0) {
3482
16
        ogs_error("ogs_nas_5gs_decode_payload_container() failed");
3483
16
        return size;
3484
16
    }
3485
3486
85
    decoded += size;
3487
3488
1.76k
    while (pkbuf->len > 0) {
3489
1.69k
        uint8_t *buffer = pkbuf->data;
3490
1.69k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
3491
3492
1.69k
        size = sizeof(uint8_t);
3493
1.69k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
3494
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
3495
0
           return OGS_ERROR;
3496
0
        }
3497
1.69k
        decoded += size;
3498
3499
1.69k
        switch(type) {
3500
212
        case OGS_NAS_5GS_DL_NAS_TRANSPORT_PDU_SESSION_ID_TYPE:
3501
212
            size = ogs_nas_5gs_decode_pdu_session_identity_2(&dl_nas_transport->pdu_session_id, pkbuf);
3502
212
            if (size < 0) {
3503
4
               ogs_error("ogs_nas_5gs_decode_pdu_session_identity_2() failed");
3504
4
               return size;
3505
4
            }
3506
3507
208
            dl_nas_transport->presencemask |= OGS_NAS_5GS_DL_NAS_TRANSPORT_PDU_SESSION_ID_PRESENT;
3508
208
            decoded += size;
3509
208
            break;
3510
211
        case OGS_NAS_5GS_DL_NAS_TRANSPORT_ADDITIONAL_INFORMATION_TYPE:
3511
211
            size = ogs_nas_5gs_decode_additional_information(&dl_nas_transport->additional_information, pkbuf);
3512
211
            if (size < 0) {
3513
3
               ogs_error("ogs_nas_5gs_decode_additional_information() failed");
3514
3
               return size;
3515
3
            }
3516
3517
208
            dl_nas_transport->presencemask |= OGS_NAS_5GS_DL_NAS_TRANSPORT_ADDITIONAL_INFORMATION_PRESENT;
3518
208
            decoded += size;
3519
208
            break;
3520
304
        case OGS_NAS_5GS_DL_NAS_TRANSPORT_5GMM_CAUSE_TYPE:
3521
304
            size = ogs_nas_5gs_decode_5gmm_cause(&dl_nas_transport->gmm_cause, pkbuf);
3522
304
            if (size < 0) {
3523
1
               ogs_error("ogs_nas_5gs_decode_5gmm_cause() failed");
3524
1
               return size;
3525
1
            }
3526
3527
303
            dl_nas_transport->presencemask |= OGS_NAS_5GS_DL_NAS_TRANSPORT_5GMM_CAUSE_PRESENT;
3528
303
            decoded += size;
3529
303
            break;
3530
195
        case OGS_NAS_5GS_DL_NAS_TRANSPORT_BACK_OFF_TIMER_VALUE_TYPE:
3531
195
            size = ogs_nas_5gs_decode_gprs_timer_3(&dl_nas_transport->back_off_timer_value, pkbuf);
3532
195
            if (size < 0) {
3533
1
               ogs_error("ogs_nas_5gs_decode_gprs_timer_3() failed");
3534
1
               return size;
3535
1
            }
3536
3537
194
            dl_nas_transport->presencemask |= OGS_NAS_5GS_DL_NAS_TRANSPORT_BACK_OFF_TIMER_VALUE_PRESENT;
3538
194
            decoded += size;
3539
194
            break;
3540
195
        case OGS_NAS_5GS_DL_NAS_TRANSPORT_LOWER_BOUND_TIMER_VALUE_TYPE:
3541
195
            size = ogs_nas_5gs_decode_gprs_timer_3(&dl_nas_transport->lower_bound_timer_value, pkbuf);
3542
195
            if (size < 0) {
3543
1
               ogs_error("ogs_nas_5gs_decode_gprs_timer_3() failed");
3544
1
               return size;
3545
1
            }
3546
3547
194
            dl_nas_transport->presencemask |= OGS_NAS_5GS_DL_NAS_TRANSPORT_LOWER_BOUND_TIMER_VALUE_PRESENT;
3548
194
            decoded += size;
3549
194
            break;
3550
578
        default:
3551
578
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
3552
578
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
3553
578
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
3554
578
            if (size < 0) {
3555
2
               ogs_error("ogs_nas_skip_unknown_ie() failed");
3556
2
               return size;
3557
2
            }
3558
3559
576
            decoded += size;
3560
576
            break;
3561
1.69k
        }
3562
1.69k
    }
3563
3564
73
    return decoded;
3565
85
}
3566
3567
int ogs_nas_5gs_decode_pdu_session_establishment_request(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
3568
257
{
3569
257
    ogs_nas_5gs_pdu_session_establishment_request_t *pdu_session_establishment_request = &message->gsm.pdu_session_establishment_request;
3570
257
    int decoded = 0;
3571
257
    int size = 0;
3572
3573
257
    ogs_trace("[NAS] Decode PDU_SESSION_ESTABLISHMENT_REQUEST\n");
3574
3575
257
    size = ogs_nas_5gs_decode_integrity_protection_maximum_data_rate(&pdu_session_establishment_request->integrity_protection_maximum_data_rate, pkbuf);
3576
257
    if (size < 0) {
3577
2
        ogs_error("ogs_nas_5gs_decode_integrity_protection_maximum_data_rate() failed");
3578
2
        return size;
3579
2
    }
3580
3581
255
    decoded += size;
3582
3583
7.30k
    while (pkbuf->len > 0) {
3584
7.10k
        uint8_t *buffer = pkbuf->data;
3585
7.10k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
3586
3587
7.10k
        size = sizeof(uint8_t);
3588
7.10k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
3589
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
3590
0
           return OGS_ERROR;
3591
0
        }
3592
7.10k
        decoded += size;
3593
3594
7.10k
        switch(type) {
3595
1.11k
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_PDU_SESSION_TYPE_TYPE:
3596
1.11k
            decoded--;
3597
1.11k
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
3598
1.11k
            size = ogs_nas_5gs_decode_pdu_session_type(&pdu_session_establishment_request->pdu_session_type, pkbuf);
3599
1.11k
            if (size < 0) {
3600
0
               ogs_error("ogs_nas_5gs_decode_pdu_session_type() failed");
3601
0
               return size;
3602
0
            }
3603
3604
1.11k
            pdu_session_establishment_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_PDU_SESSION_TYPE_PRESENT;
3605
1.11k
            decoded += size;
3606
1.11k
            break;
3607
556
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_SSC_MODE_TYPE:
3608
556
            decoded--;
3609
556
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
3610
556
            size = ogs_nas_5gs_decode_ssc_mode(&pdu_session_establishment_request->ssc_mode, pkbuf);
3611
556
            if (size < 0) {
3612
0
               ogs_error("ogs_nas_5gs_decode_ssc_mode() failed");
3613
0
               return size;
3614
0
            }
3615
3616
556
            pdu_session_establishment_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_SSC_MODE_PRESENT;
3617
556
            decoded += size;
3618
556
            break;
3619
196
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_5GSM_CAPABILITY_TYPE:
3620
196
            size = ogs_nas_5gs_decode_5gsm_capability(&pdu_session_establishment_request->gsm_capability, pkbuf);
3621
196
            if (size < 0) {
3622
1
               ogs_error("ogs_nas_5gs_decode_5gsm_capability() failed");
3623
1
               return size;
3624
1
            }
3625
3626
195
            pdu_session_establishment_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_5GSM_CAPABILITY_PRESENT;
3627
195
            decoded += size;
3628
195
            break;
3629
207
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_MAXIMUM_NUMBER_OF_SUPPORTED_PACKET_FILTERS_TYPE:
3630
207
            size = ogs_nas_5gs_decode_maximum_number_of_supported_packet_filters(&pdu_session_establishment_request->maximum_number_of_supported_packet_filters, pkbuf);
3631
207
            if (size < 0) {
3632
2
               ogs_error("ogs_nas_5gs_decode_maximum_number_of_supported_packet_filters() failed");
3633
2
               return size;
3634
2
            }
3635
3636
205
            pdu_session_establishment_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_MAXIMUM_NUMBER_OF_SUPPORTED_PACKET_FILTERS_PRESENT;
3637
205
            decoded += size;
3638
205
            break;
3639
606
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_ALWAYS_ON_PDU_SESSION_REQUESTED_TYPE:
3640
606
            decoded--;
3641
606
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
3642
606
            size = ogs_nas_5gs_decode_always_on_pdu_session_requested(&pdu_session_establishment_request->always_on_pdu_session_requested, pkbuf);
3643
606
            if (size < 0) {
3644
0
               ogs_error("ogs_nas_5gs_decode_always_on_pdu_session_requested() failed");
3645
0
               return size;
3646
0
            }
3647
3648
606
            pdu_session_establishment_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_ALWAYS_ON_PDU_SESSION_REQUESTED_PRESENT;
3649
606
            decoded += size;
3650
606
            break;
3651
210
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_SM_PDU_DN_REQUEST_CONTAINER_TYPE:
3652
210
            size = ogs_nas_5gs_decode_sm_pdu_dn_request_container(&pdu_session_establishment_request->sm_pdu_dn_request_container, pkbuf);
3653
210
            if (size < 0) {
3654
5
               ogs_error("ogs_nas_5gs_decode_sm_pdu_dn_request_container() failed");
3655
5
               return size;
3656
5
            }
3657
3658
205
            pdu_session_establishment_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_SM_PDU_DN_REQUEST_CONTAINER_PRESENT;
3659
205
            decoded += size;
3660
205
            break;
3661
205
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
3662
205
            size = ogs_nas_5gs_decode_extended_protocol_configuration_options(&pdu_session_establishment_request->extended_protocol_configuration_options, pkbuf);
3663
205
            if (size < 0) {
3664
1
               ogs_error("ogs_nas_5gs_decode_extended_protocol_configuration_options() failed");
3665
1
               return size;
3666
1
            }
3667
3668
204
            pdu_session_establishment_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
3669
204
            decoded += size;
3670
204
            break;
3671
199
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_IP_HEADER_COMPRESSION_CONFIGURATION_TYPE:
3672
199
            size = ogs_nas_5gs_decode_ip_header_compression_configuration(&pdu_session_establishment_request->ip_header_compression_configuration, pkbuf);
3673
199
            if (size < 0) {
3674
1
               ogs_error("ogs_nas_5gs_decode_ip_header_compression_configuration() failed");
3675
1
               return size;
3676
1
            }
3677
3678
198
            pdu_session_establishment_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_IP_HEADER_COMPRESSION_CONFIGURATION_PRESENT;
3679
198
            decoded += size;
3680
198
            break;
3681
205
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_DS_TT_ETHERNET_PORT_MAC_ADDRESS_TYPE:
3682
205
            size = ogs_nas_5gs_decode_ds_tt_ethernet_port_mac_address(&pdu_session_establishment_request->ds_tt_ethernet_port_mac_address, pkbuf);
3683
205
            if (size < 0) {
3684
3
               ogs_error("ogs_nas_5gs_decode_ds_tt_ethernet_port_mac_address() failed");
3685
3
               return size;
3686
3
            }
3687
3688
202
            pdu_session_establishment_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_DS_TT_ETHERNET_PORT_MAC_ADDRESS_PRESENT;
3689
202
            decoded += size;
3690
202
            break;
3691
230
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_UE_DS_TT_RESIDENCE_TIME_TYPE:
3692
230
            size = ogs_nas_5gs_decode_ue_ds_tt_residence_time(&pdu_session_establishment_request->ue_ds_tt_residence_time, pkbuf);
3693
230
            if (size < 0) {
3694
9
               ogs_error("ogs_nas_5gs_decode_ue_ds_tt_residence_time() failed");
3695
9
               return size;
3696
9
            }
3697
3698
221
            pdu_session_establishment_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_UE_DS_TT_RESIDENCE_TIME_PRESENT;
3699
221
            decoded += size;
3700
221
            break;
3701
215
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_PORT_MANAGEMENT_INFORMATION_CONTAINER_TYPE:
3702
215
            size = ogs_nas_5gs_decode_port_management_information_container(&pdu_session_establishment_request->port_management_information_container, pkbuf);
3703
215
            if (size < 0) {
3704
2
               ogs_error("ogs_nas_5gs_decode_port_management_information_container() failed");
3705
2
               return size;
3706
2
            }
3707
3708
213
            pdu_session_establishment_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_PORT_MANAGEMENT_INFORMATION_CONTAINER_PRESENT;
3709
213
            decoded += size;
3710
213
            break;
3711
195
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_ETHERNET_HEADER_COMPRESSION_CONFIGURATION_TYPE:
3712
195
            size = ogs_nas_5gs_decode_ethernet_header_compression_configuration(&pdu_session_establishment_request->ethernet_header_compression_configuration, pkbuf);
3713
195
            if (size < 0) {
3714
1
               ogs_error("ogs_nas_5gs_decode_ethernet_header_compression_configuration() failed");
3715
1
               return size;
3716
1
            }
3717
3718
194
            pdu_session_establishment_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_ETHERNET_HEADER_COMPRESSION_CONFIGURATION_PRESENT;
3719
194
            decoded += size;
3720
194
            break;
3721
211
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_SUGGESTED_INTERFACE_IDENTIFIER_TYPE:
3722
211
            size = ogs_nas_5gs_decode_pdu_address(&pdu_session_establishment_request->suggested_interface_identifier, pkbuf);
3723
211
            if (size < 0) {
3724
7
               ogs_error("ogs_nas_5gs_decode_pdu_address() failed");
3725
7
               return size;
3726
7
            }
3727
3728
204
            pdu_session_establishment_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_SUGGESTED_INTERFACE_IDENTIFIER_PRESENT;
3729
204
            decoded += size;
3730
204
            break;
3731
201
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_SERVICE_LEVEL_AA_CONTAINER_TYPE:
3732
201
            size = ogs_nas_5gs_decode_service_level_aa_container(&pdu_session_establishment_request->service_level_aa_container, pkbuf);
3733
201
            if (size < 0) {
3734
1
               ogs_error("ogs_nas_5gs_decode_service_level_aa_container() failed");
3735
1
               return size;
3736
1
            }
3737
3738
200
            pdu_session_establishment_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_SERVICE_LEVEL_AA_CONTAINER_PRESENT;
3739
200
            decoded += size;
3740
200
            break;
3741
201
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_REQUESTED_MBS_CONTAINER_TYPE:
3742
201
            size = ogs_nas_5gs_decode_requested_mbs_container(&pdu_session_establishment_request->requested_mbs_container, pkbuf);
3743
201
            if (size < 0) {
3744
5
               ogs_error("ogs_nas_5gs_decode_requested_mbs_container() failed");
3745
5
               return size;
3746
5
            }
3747
3748
196
            pdu_session_establishment_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_REQUESTED_MBS_CONTAINER_PRESENT;
3749
196
            decoded += size;
3750
196
            break;
3751
198
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_PDU_SESSION_PAIR_ID_TYPE:
3752
198
            size = ogs_nas_5gs_decode_pdu_session_pair_id(&pdu_session_establishment_request->pdu_session_pair_id, pkbuf);
3753
198
            if (size < 0) {
3754
3
               ogs_error("ogs_nas_5gs_decode_pdu_session_pair_id() failed");
3755
3
               return size;
3756
3
            }
3757
3758
195
            pdu_session_establishment_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_PDU_SESSION_PAIR_ID_PRESENT;
3759
195
            decoded += size;
3760
195
            break;
3761
199
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_RSN_TYPE:
3762
199
            size = ogs_nas_5gs_decode_rsn(&pdu_session_establishment_request->rsn, pkbuf);
3763
199
            if (size < 0) {
3764
4
               ogs_error("ogs_nas_5gs_decode_rsn() failed");
3765
4
               return size;
3766
4
            }
3767
3768
195
            pdu_session_establishment_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_RSN_PRESENT;
3769
195
            decoded += size;
3770
195
            break;
3771
198
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_URSP_RULE_ENFORCEMENT_REPORTS_TYPE:
3772
198
            size = ogs_nas_5gs_decode_ursp_rule_enforcement_reports(&pdu_session_establishment_request->ursp_rule_enforcement_reports, pkbuf);
3773
198
            if (size < 0) {
3774
1
               ogs_error("ogs_nas_5gs_decode_ursp_rule_enforcement_reports() failed");
3775
1
               return size;
3776
1
            }
3777
3778
197
            pdu_session_establishment_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST_URSP_RULE_ENFORCEMENT_REPORTS_PRESENT;
3779
197
            decoded += size;
3780
197
            break;
3781
1.76k
        default:
3782
1.76k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
3783
1.76k
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
3784
1.76k
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
3785
1.76k
            if (size < 0) {
3786
9
               ogs_error("ogs_nas_skip_unknown_ie() failed");
3787
9
               return size;
3788
9
            }
3789
3790
1.75k
            decoded += size;
3791
1.75k
            break;
3792
7.10k
        }
3793
7.10k
    }
3794
3795
200
    return decoded;
3796
255
}
3797
3798
int ogs_nas_5gs_decode_pdu_session_establishment_accept(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
3799
312
{
3800
312
    ogs_nas_5gs_pdu_session_establishment_accept_t *pdu_session_establishment_accept = &message->gsm.pdu_session_establishment_accept;
3801
312
    int decoded = 0;
3802
312
    int size = 0;
3803
3804
312
    ogs_trace("[NAS] Decode PDU_SESSION_ESTABLISHMENT_ACCEPT\n");
3805
3806
312
    size = ogs_nas_5gs_decode_pdu_session_type(&pdu_session_establishment_accept->selected_pdu_session_type, pkbuf);
3807
312
    if (size < 0) {
3808
1
        ogs_error("ogs_nas_5gs_decode_pdu_session_type() failed");
3809
1
        return size;
3810
1
    }
3811
3812
311
    decoded += size;
3813
3814
311
    size = ogs_nas_5gs_decode_qos_rules(&pdu_session_establishment_accept->authorized_qos_rules, pkbuf);
3815
311
    if (size < 0) {
3816
18
        ogs_error("ogs_nas_5gs_decode_qos_rules() failed");
3817
18
        return size;
3818
18
    }
3819
3820
293
    decoded += size;
3821
3822
293
    size = ogs_nas_5gs_decode_session_ambr(&pdu_session_establishment_accept->session_ambr, pkbuf);
3823
293
    if (size < 0) {
3824
9
        ogs_error("ogs_nas_5gs_decode_session_ambr() failed");
3825
9
        return size;
3826
9
    }
3827
3828
284
    decoded += size;
3829
3830
5.72k
    while (pkbuf->len > 0) {
3831
5.47k
        uint8_t *buffer = pkbuf->data;
3832
5.47k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
3833
3834
5.47k
        size = sizeof(uint8_t);
3835
5.47k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
3836
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
3837
0
           return OGS_ERROR;
3838
0
        }
3839
5.47k
        decoded += size;
3840
3841
5.47k
        switch(type) {
3842
232
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_5GSM_CAUSE_TYPE:
3843
232
            size = ogs_nas_5gs_decode_5gsm_cause(&pdu_session_establishment_accept->gsm_cause, pkbuf);
3844
232
            if (size < 0) {
3845
1
               ogs_error("ogs_nas_5gs_decode_5gsm_cause() failed");
3846
1
               return size;
3847
1
            }
3848
3849
231
            pdu_session_establishment_accept->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_5GSM_CAUSE_PRESENT;
3850
231
            decoded += size;
3851
231
            break;
3852
197
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_PDU_ADDRESS_TYPE:
3853
197
            size = ogs_nas_5gs_decode_pdu_address(&pdu_session_establishment_accept->pdu_address, pkbuf);
3854
197
            if (size < 0) {
3855
1
               ogs_error("ogs_nas_5gs_decode_pdu_address() failed");
3856
1
               return size;
3857
1
            }
3858
3859
196
            pdu_session_establishment_accept->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_PDU_ADDRESS_PRESENT;
3860
196
            decoded += size;
3861
196
            break;
3862
218
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_RQ_TIMER_VALUE_TYPE:
3863
218
            size = ogs_nas_5gs_decode_gprs_timer(&pdu_session_establishment_accept->rq_timer_value, pkbuf);
3864
218
            if (size < 0) {
3865
1
               ogs_error("ogs_nas_5gs_decode_gprs_timer() failed");
3866
1
               return size;
3867
1
            }
3868
3869
217
            pdu_session_establishment_accept->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_RQ_TIMER_VALUE_PRESENT;
3870
217
            decoded += size;
3871
217
            break;
3872
196
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_S_NSSAI_TYPE:
3873
196
            size = ogs_nas_5gs_decode_s_nssai(&pdu_session_establishment_accept->s_nssai, pkbuf);
3874
196
            if (size < 0) {
3875
1
               ogs_error("ogs_nas_5gs_decode_s_nssai() failed");
3876
1
               return size;
3877
1
            }
3878
3879
195
            pdu_session_establishment_accept->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_S_NSSAI_PRESENT;
3880
195
            decoded += size;
3881
195
            break;
3882
350
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_ALWAYS_ON_PDU_SESSION_INDICATION_TYPE:
3883
350
            decoded--;
3884
350
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
3885
350
            size = ogs_nas_5gs_decode_always_on_pdu_session_indication(&pdu_session_establishment_accept->always_on_pdu_session_indication, pkbuf);
3886
350
            if (size < 0) {
3887
0
               ogs_error("ogs_nas_5gs_decode_always_on_pdu_session_indication() failed");
3888
0
               return size;
3889
0
            }
3890
3891
350
            pdu_session_establishment_accept->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_ALWAYS_ON_PDU_SESSION_INDICATION_PRESENT;
3892
350
            decoded += size;
3893
350
            break;
3894
197
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_MAPPED_EPS_BEARER_CONTEXTS_TYPE:
3895
197
            size = ogs_nas_5gs_decode_mapped_eps_bearer_contexts(&pdu_session_establishment_accept->mapped_eps_bearer_contexts, pkbuf);
3896
197
            if (size < 0) {
3897
2
               ogs_error("ogs_nas_5gs_decode_mapped_eps_bearer_contexts() failed");
3898
2
               return size;
3899
2
            }
3900
3901
195
            pdu_session_establishment_accept->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_MAPPED_EPS_BEARER_CONTEXTS_PRESENT;
3902
195
            decoded += size;
3903
195
            break;
3904
205
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_EAP_MESSAGE_TYPE:
3905
205
            size = ogs_nas_5gs_decode_eap_message(&pdu_session_establishment_accept->eap_message, pkbuf);
3906
205
            if (size < 0) {
3907
1
               ogs_error("ogs_nas_5gs_decode_eap_message() failed");
3908
1
               return size;
3909
1
            }
3910
3911
204
            pdu_session_establishment_accept->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_EAP_MESSAGE_PRESENT;
3912
204
            decoded += size;
3913
204
            break;
3914
203
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_AUTHORIZED_QOS_FLOW_DESCRIPTIONS_TYPE:
3915
203
            size = ogs_nas_5gs_decode_qos_flow_descriptions(&pdu_session_establishment_accept->authorized_qos_flow_descriptions, pkbuf);
3916
203
            if (size < 0) {
3917
1
               ogs_error("ogs_nas_5gs_decode_qos_flow_descriptions() failed");
3918
1
               return size;
3919
1
            }
3920
3921
202
            pdu_session_establishment_accept->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_AUTHORIZED_QOS_FLOW_DESCRIPTIONS_PRESENT;
3922
202
            decoded += size;
3923
202
            break;
3924
208
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
3925
208
            size = ogs_nas_5gs_decode_extended_protocol_configuration_options(&pdu_session_establishment_accept->extended_protocol_configuration_options, pkbuf);
3926
208
            if (size < 0) {
3927
1
               ogs_error("ogs_nas_5gs_decode_extended_protocol_configuration_options() failed");
3928
1
               return size;
3929
1
            }
3930
3931
207
            pdu_session_establishment_accept->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
3932
207
            decoded += size;
3933
207
            break;
3934
215
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_DNN_TYPE:
3935
215
            size = ogs_nas_5gs_decode_dnn(&pdu_session_establishment_accept->dnn, pkbuf);
3936
215
            if (size < 0) {
3937
2
               ogs_error("ogs_nas_5gs_decode_dnn() failed");
3938
2
               return size;
3939
2
            }
3940
3941
213
            pdu_session_establishment_accept->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_DNN_PRESENT;
3942
213
            decoded += size;
3943
213
            break;
3944
205
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_5GSM_NETWORK_FEATURE_SUPPORT_TYPE:
3945
205
            size = ogs_nas_5gs_decode_5gsm_network_feature_support(&pdu_session_establishment_accept->gsm_network_feature_support, pkbuf);
3946
205
            if (size < 0) {
3947
5
               ogs_error("ogs_nas_5gs_decode_5gsm_network_feature_support() failed");
3948
5
               return size;
3949
5
            }
3950
3951
200
            pdu_session_establishment_accept->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_5GSM_NETWORK_FEATURE_SUPPORT_PRESENT;
3952
200
            decoded += size;
3953
200
            break;
3954
196
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_SERVING_PLMN_RATE_CONTROL_TYPE:
3955
196
            size = ogs_nas_5gs_decode_serving_plmn_rate_control(&pdu_session_establishment_accept->serving_plmn_rate_control, pkbuf);
3956
196
            if (size < 0) {
3957
1
               ogs_error("ogs_nas_5gs_decode_serving_plmn_rate_control() failed");
3958
1
               return size;
3959
1
            }
3960
3961
195
            pdu_session_establishment_accept->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_SERVING_PLMN_RATE_CONTROL_PRESENT;
3962
195
            decoded += size;
3963
195
            break;
3964
203
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_ATSSS_CONTAINER_TYPE:
3965
203
            size = ogs_nas_5gs_decode_atsss_container(&pdu_session_establishment_accept->atsss_container, pkbuf);
3966
203
            if (size < 0) {
3967
1
               ogs_error("ogs_nas_5gs_decode_atsss_container() failed");
3968
1
               return size;
3969
1
            }
3970
3971
202
            pdu_session_establishment_accept->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_ATSSS_CONTAINER_PRESENT;
3972
202
            decoded += size;
3973
202
            break;
3974
303
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_CONTROL_PLANE_ONLY_INDICATION_TYPE:
3975
303
            decoded--;
3976
303
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
3977
303
            size = ogs_nas_5gs_decode_control_plane_only_indication(&pdu_session_establishment_accept->control_plane_only_indication, pkbuf);
3978
303
            if (size < 0) {
3979
0
               ogs_error("ogs_nas_5gs_decode_control_plane_only_indication() failed");
3980
0
               return size;
3981
0
            }
3982
3983
303
            pdu_session_establishment_accept->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_CONTROL_PLANE_ONLY_INDICATION_PRESENT;
3984
303
            decoded += size;
3985
303
            break;
3986
199
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_IP_HEADER_COMPRESSION_CONFIGURATION_TYPE:
3987
199
            size = ogs_nas_5gs_decode_ip_header_compression_configuration(&pdu_session_establishment_accept->ip_header_compression_configuration, pkbuf);
3988
199
            if (size < 0) {
3989
1
               ogs_error("ogs_nas_5gs_decode_ip_header_compression_configuration() failed");
3990
1
               return size;
3991
1
            }
3992
3993
198
            pdu_session_establishment_accept->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_IP_HEADER_COMPRESSION_CONFIGURATION_PRESENT;
3994
198
            decoded += size;
3995
198
            break;
3996
196
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_ETHERNET_HEADER_COMPRESSION_CONFIGURATION_TYPE:
3997
196
            size = ogs_nas_5gs_decode_ethernet_header_compression_configuration(&pdu_session_establishment_accept->ethernet_header_compression_configuration, pkbuf);
3998
196
            if (size < 0) {
3999
1
               ogs_error("ogs_nas_5gs_decode_ethernet_header_compression_configuration() failed");
4000
1
               return size;
4001
1
            }
4002
4003
195
            pdu_session_establishment_accept->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_ETHERNET_HEADER_COMPRESSION_CONFIGURATION_PRESENT;
4004
195
            decoded += size;
4005
195
            break;
4006
204
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_SERVICE_LEVEL_AA_CONTAINER_TYPE:
4007
204
            size = ogs_nas_5gs_decode_service_level_aa_container(&pdu_session_establishment_accept->service_level_aa_container, pkbuf);
4008
204
            if (size < 0) {
4009
2
               ogs_error("ogs_nas_5gs_decode_service_level_aa_container() failed");
4010
2
               return size;
4011
2
            }
4012
4013
202
            pdu_session_establishment_accept->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_SERVICE_LEVEL_AA_CONTAINER_PRESENT;
4014
202
            decoded += size;
4015
202
            break;
4016
205
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_RECEIVED_MBS_CONTAINER_TYPE:
4017
205
            size = ogs_nas_5gs_decode_received_mbs_container(&pdu_session_establishment_accept->received_mbs_container, pkbuf);
4018
205
            if (size < 0) {
4019
2
               ogs_error("ogs_nas_5gs_decode_received_mbs_container() failed");
4020
2
               return size;
4021
2
            }
4022
4023
203
            pdu_session_establishment_accept->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_RECEIVED_MBS_CONTAINER_PRESENT;
4024
203
            decoded += size;
4025
203
            break;
4026
201
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_N3QAI_TYPE:
4027
201
            size = ogs_nas_5gs_decode_n3qai(&pdu_session_establishment_accept->n3qai, pkbuf);
4028
201
            if (size < 0) {
4029
1
               ogs_error("ogs_nas_5gs_decode_n3qai() failed");
4030
1
               return size;
4031
1
            }
4032
4033
200
            pdu_session_establishment_accept->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_N3QAI_PRESENT;
4034
200
            decoded += size;
4035
200
            break;
4036
201
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_PROTOCOL_DESCRIPTION_TYPE:
4037
201
            size = ogs_nas_5gs_decode_protocol_description(&pdu_session_establishment_accept->protocol_description, pkbuf);
4038
201
            if (size < 0) {
4039
2
               ogs_error("ogs_nas_5gs_decode_protocol_description() failed");
4040
2
               return size;
4041
2
            }
4042
4043
199
            pdu_session_establishment_accept->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_PROTOCOL_DESCRIPTION_PRESENT;
4044
199
            decoded += size;
4045
199
            break;
4046
196
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_ECN_MARKING_FOR_L4S_INDICATION_TYPE:
4047
196
            size = ogs_nas_5gs_decode_ecn_marking_for_l4s_indication(&pdu_session_establishment_accept->ecn_marking_for_l4s_indication, pkbuf);
4048
196
            if (size < 0) {
4049
1
               ogs_error("ogs_nas_5gs_decode_ecn_marking_for_l4s_indication() failed");
4050
1
               return size;
4051
1
            }
4052
4053
195
            pdu_session_establishment_accept->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT_ECN_MARKING_FOR_L4S_INDICATION_PRESENT;
4054
195
            decoded += size;
4055
195
            break;
4056
942
        default:
4057
942
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
4058
942
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
4059
942
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
4060
942
            if (size < 0) {
4061
1
               ogs_error("ogs_nas_skip_unknown_ie() failed");
4062
1
               return size;
4063
1
            }
4064
4065
941
            decoded += size;
4066
941
            break;
4067
5.47k
        }
4068
5.47k
    }
4069
4070
255
    return decoded;
4071
284
}
4072
4073
int ogs_nas_5gs_decode_pdu_session_establishment_reject(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
4074
127
{
4075
127
    ogs_nas_5gs_pdu_session_establishment_reject_t *pdu_session_establishment_reject = &message->gsm.pdu_session_establishment_reject;
4076
127
    int decoded = 0;
4077
127
    int size = 0;
4078
4079
127
    ogs_trace("[NAS] Decode PDU_SESSION_ESTABLISHMENT_REJECT\n");
4080
4081
127
    size = ogs_nas_5gs_decode_5gsm_cause(&pdu_session_establishment_reject->gsm_cause, pkbuf);
4082
127
    if (size < 0) {
4083
1
        ogs_error("ogs_nas_5gs_decode_5gsm_cause() failed");
4084
1
        return size;
4085
1
    }
4086
4087
126
    decoded += size;
4088
4089
2.67k
    while (pkbuf->len > 0) {
4090
2.57k
        uint8_t *buffer = pkbuf->data;
4091
2.57k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
4092
4093
2.57k
        size = sizeof(uint8_t);
4094
2.57k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
4095
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
4096
0
           return OGS_ERROR;
4097
0
        }
4098
2.57k
        decoded += size;
4099
4100
2.57k
        switch(type) {
4101
206
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REJECT_BACK_OFF_TIMER_VALUE_TYPE:
4102
206
            size = ogs_nas_5gs_decode_gprs_timer_3(&pdu_session_establishment_reject->back_off_timer_value, pkbuf);
4103
206
            if (size < 0) {
4104
1
               ogs_error("ogs_nas_5gs_decode_gprs_timer_3() failed");
4105
1
               return size;
4106
1
            }
4107
4108
205
            pdu_session_establishment_reject->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REJECT_BACK_OFF_TIMER_VALUE_PRESENT;
4109
205
            decoded += size;
4110
205
            break;
4111
369
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REJECT_ALLOWED_SSC_MODE_TYPE:
4112
369
            decoded--;
4113
369
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
4114
369
            size = ogs_nas_5gs_decode_allowed_ssc_mode(&pdu_session_establishment_reject->allowed_ssc_mode, pkbuf);
4115
369
            if (size < 0) {
4116
0
               ogs_error("ogs_nas_5gs_decode_allowed_ssc_mode() failed");
4117
0
               return size;
4118
0
            }
4119
4120
369
            pdu_session_establishment_reject->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REJECT_ALLOWED_SSC_MODE_PRESENT;
4121
369
            decoded += size;
4122
369
            break;
4123
222
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REJECT_EAP_MESSAGE_TYPE:
4124
222
            size = ogs_nas_5gs_decode_eap_message(&pdu_session_establishment_reject->eap_message, pkbuf);
4125
222
            if (size < 0) {
4126
1
               ogs_error("ogs_nas_5gs_decode_eap_message() failed");
4127
1
               return size;
4128
1
            }
4129
4130
221
            pdu_session_establishment_reject->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REJECT_EAP_MESSAGE_PRESENT;
4131
221
            decoded += size;
4132
221
            break;
4133
200
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REJECT_5GSM_CONGESTION_RE_ATTEMPT_INDICATOR_TYPE:
4134
200
            size = ogs_nas_5gs_decode_5gsm_congestion_re_attempt_indicator(&pdu_session_establishment_reject->gsm_congestion_re_attempt_indicator, pkbuf);
4135
200
            if (size < 0) {
4136
3
               ogs_error("ogs_nas_5gs_decode_5gsm_congestion_re_attempt_indicator() failed");
4137
3
               return size;
4138
3
            }
4139
4140
197
            pdu_session_establishment_reject->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REJECT_5GSM_CONGESTION_RE_ATTEMPT_INDICATOR_PRESENT;
4141
197
            decoded += size;
4142
197
            break;
4143
212
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4144
212
            size = ogs_nas_5gs_decode_extended_protocol_configuration_options(&pdu_session_establishment_reject->extended_protocol_configuration_options, pkbuf);
4145
212
            if (size < 0) {
4146
1
               ogs_error("ogs_nas_5gs_decode_extended_protocol_configuration_options() failed");
4147
1
               return size;
4148
1
            }
4149
4150
211
            pdu_session_establishment_reject->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4151
211
            decoded += size;
4152
211
            break;
4153
236
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REJECT_RE_ATTEMPT_INDICATOR_TYPE:
4154
236
            size = ogs_nas_5gs_decode_re_attempt_indicator(&pdu_session_establishment_reject->re_attempt_indicator, pkbuf);
4155
236
            if (size < 0) {
4156
7
               ogs_error("ogs_nas_5gs_decode_re_attempt_indicator() failed");
4157
7
               return size;
4158
7
            }
4159
4160
229
            pdu_session_establishment_reject->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REJECT_RE_ATTEMPT_INDICATOR_PRESENT;
4161
229
            decoded += size;
4162
229
            break;
4163
195
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REJECT_SERVICE_LEVEL_AA_CONTAINER_TYPE:
4164
195
            size = ogs_nas_5gs_decode_service_level_aa_container(&pdu_session_establishment_reject->service_level_aa_container, pkbuf);
4165
195
            if (size < 0) {
4166
1
               ogs_error("ogs_nas_5gs_decode_service_level_aa_container() failed");
4167
1
               return size;
4168
1
            }
4169
4170
194
            pdu_session_establishment_reject->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REJECT_SERVICE_LEVEL_AA_CONTAINER_PRESENT;
4171
194
            decoded += size;
4172
194
            break;
4173
304
        case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REJECT_ATSSS_CONTAINER_TYPE:
4174
304
            size = ogs_nas_5gs_decode_atsss_container(&pdu_session_establishment_reject->atsss_container, pkbuf);
4175
304
            if (size < 0) {
4176
7
               ogs_error("ogs_nas_5gs_decode_atsss_container() failed");
4177
7
               return size;
4178
7
            }
4179
4180
297
            pdu_session_establishment_reject->presencemask |= OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REJECT_ATSSS_CONTAINER_PRESENT;
4181
297
            decoded += size;
4182
297
            break;
4183
628
        default:
4184
628
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
4185
628
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
4186
628
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
4187
628
            if (size < 0) {
4188
2
               ogs_error("ogs_nas_skip_unknown_ie() failed");
4189
2
               return size;
4190
2
            }
4191
4192
626
            decoded += size;
4193
626
            break;
4194
2.57k
        }
4195
2.57k
    }
4196
4197
103
    return decoded;
4198
126
}
4199
4200
int ogs_nas_5gs_decode_pdu_session_authentication_command(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
4201
62
{
4202
62
    ogs_nas_5gs_pdu_session_authentication_command_t *pdu_session_authentication_command = &message->gsm.pdu_session_authentication_command;
4203
62
    int decoded = 0;
4204
62
    int size = 0;
4205
4206
62
    ogs_trace("[NAS] Decode PDU_SESSION_AUTHENTICATION_COMMAND\n");
4207
4208
62
    size = ogs_nas_5gs_decode_eap_message(&pdu_session_authentication_command->eap_message, pkbuf);
4209
62
    if (size < 0) {
4210
7
        ogs_error("ogs_nas_5gs_decode_eap_message() failed");
4211
7
        return size;
4212
7
    }
4213
4214
55
    decoded += size;
4215
4216
1.55k
    while (pkbuf->len > 0) {
4217
1.50k
        uint8_t *buffer = pkbuf->data;
4218
1.50k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
4219
4220
1.50k
        size = sizeof(uint8_t);
4221
1.50k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
4222
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
4223
0
           return OGS_ERROR;
4224
0
        }
4225
1.50k
        decoded += size;
4226
4227
1.50k
        switch(type) {
4228
200
        case OGS_NAS_5GS_PDU_SESSION_AUTHENTICATION_COMMAND_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4229
200
            size = ogs_nas_5gs_decode_extended_protocol_configuration_options(&pdu_session_authentication_command->extended_protocol_configuration_options, pkbuf);
4230
200
            if (size < 0) {
4231
1
               ogs_error("ogs_nas_5gs_decode_extended_protocol_configuration_options() failed");
4232
1
               return size;
4233
1
            }
4234
4235
199
            pdu_session_authentication_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_AUTHENTICATION_COMMAND_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4236
199
            decoded += size;
4237
199
            break;
4238
1.30k
        default:
4239
1.30k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
4240
1.30k
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
4241
1.30k
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
4242
1.30k
            if (size < 0) {
4243
8
               ogs_error("ogs_nas_skip_unknown_ie() failed");
4244
8
               return size;
4245
8
            }
4246
4247
1.29k
            decoded += size;
4248
1.29k
            break;
4249
1.50k
        }
4250
1.50k
    }
4251
4252
46
    return decoded;
4253
55
}
4254
4255
int ogs_nas_5gs_decode_pdu_session_authentication_complete(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
4256
70
{
4257
70
    ogs_nas_5gs_pdu_session_authentication_complete_t *pdu_session_authentication_complete = &message->gsm.pdu_session_authentication_complete;
4258
70
    int decoded = 0;
4259
70
    int size = 0;
4260
4261
70
    ogs_trace("[NAS] Decode PDU_SESSION_AUTHENTICATION_COMPLETE\n");
4262
4263
70
    size = ogs_nas_5gs_decode_eap_message(&pdu_session_authentication_complete->eap_message, pkbuf);
4264
70
    if (size < 0) {
4265
6
        ogs_error("ogs_nas_5gs_decode_eap_message() failed");
4266
6
        return size;
4267
6
    }
4268
4269
64
    decoded += size;
4270
4271
1.01k
    while (pkbuf->len > 0) {
4272
966
        uint8_t *buffer = pkbuf->data;
4273
966
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
4274
4275
966
        size = sizeof(uint8_t);
4276
966
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
4277
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
4278
0
           return OGS_ERROR;
4279
0
        }
4280
966
        decoded += size;
4281
4282
966
        switch(type) {
4283
323
        case OGS_NAS_5GS_PDU_SESSION_AUTHENTICATION_COMPLETE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4284
323
            size = ogs_nas_5gs_decode_extended_protocol_configuration_options(&pdu_session_authentication_complete->extended_protocol_configuration_options, pkbuf);
4285
323
            if (size < 0) {
4286
1
               ogs_error("ogs_nas_5gs_decode_extended_protocol_configuration_options() failed");
4287
1
               return size;
4288
1
            }
4289
4290
322
            pdu_session_authentication_complete->presencemask |= OGS_NAS_5GS_PDU_SESSION_AUTHENTICATION_COMPLETE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4291
322
            decoded += size;
4292
322
            break;
4293
643
        default:
4294
643
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
4295
643
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
4296
643
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
4297
643
            if (size < 0) {
4298
12
               ogs_error("ogs_nas_skip_unknown_ie() failed");
4299
12
               return size;
4300
12
            }
4301
4302
631
            decoded += size;
4303
631
            break;
4304
966
        }
4305
966
    }
4306
4307
51
    return decoded;
4308
64
}
4309
4310
int ogs_nas_5gs_decode_pdu_session_authentication_result(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
4311
57
{
4312
57
    ogs_nas_5gs_pdu_session_authentication_result_t *pdu_session_authentication_result = &message->gsm.pdu_session_authentication_result;
4313
57
    int decoded = 0;
4314
57
    int size = 0;
4315
4316
57
    ogs_trace("[NAS] Decode PDU_SESSION_AUTHENTICATION_RESULT\n");
4317
4318
1.52k
    while (pkbuf->len > 0) {
4319
1.48k
        uint8_t *buffer = pkbuf->data;
4320
1.48k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
4321
4322
1.48k
        size = sizeof(uint8_t);
4323
1.48k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
4324
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
4325
0
           return OGS_ERROR;
4326
0
        }
4327
1.48k
        decoded += size;
4328
4329
1.48k
        switch(type) {
4330
203
        case OGS_NAS_5GS_PDU_SESSION_AUTHENTICATION_RESULT_EAP_MESSAGE_TYPE:
4331
203
            size = ogs_nas_5gs_decode_eap_message(&pdu_session_authentication_result->eap_message, pkbuf);
4332
203
            if (size < 0) {
4333
1
               ogs_error("ogs_nas_5gs_decode_eap_message() failed");
4334
1
               return size;
4335
1
            }
4336
4337
202
            pdu_session_authentication_result->presencemask |= OGS_NAS_5GS_PDU_SESSION_AUTHENTICATION_RESULT_EAP_MESSAGE_PRESENT;
4338
202
            decoded += size;
4339
202
            break;
4340
212
        case OGS_NAS_5GS_PDU_SESSION_AUTHENTICATION_RESULT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4341
212
            size = ogs_nas_5gs_decode_extended_protocol_configuration_options(&pdu_session_authentication_result->extended_protocol_configuration_options, pkbuf);
4342
212
            if (size < 0) {
4343
4
               ogs_error("ogs_nas_5gs_decode_extended_protocol_configuration_options() failed");
4344
4
               return size;
4345
4
            }
4346
4347
208
            pdu_session_authentication_result->presencemask |= OGS_NAS_5GS_PDU_SESSION_AUTHENTICATION_RESULT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4348
208
            decoded += size;
4349
208
            break;
4350
1.06k
        default:
4351
1.06k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
4352
1.06k
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
4353
1.06k
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
4354
1.06k
            if (size < 0) {
4355
6
               ogs_error("ogs_nas_skip_unknown_ie() failed");
4356
6
               return size;
4357
6
            }
4358
4359
1.06k
            decoded += size;
4360
1.06k
            break;
4361
1.48k
        }
4362
1.48k
    }
4363
4364
46
    return decoded;
4365
57
}
4366
4367
int ogs_nas_5gs_decode_pdu_session_modification_request(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
4368
702
{
4369
702
    ogs_nas_5gs_pdu_session_modification_request_t *pdu_session_modification_request = &message->gsm.pdu_session_modification_request;
4370
702
    int decoded = 0;
4371
702
    int size = 0;
4372
4373
702
    ogs_trace("[NAS] Decode PDU_SESSION_MODIFICATION_REQUEST\n");
4374
4375
6.82k
    while (pkbuf->len > 0) {
4376
6.33k
        uint8_t *buffer = pkbuf->data;
4377
6.33k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
4378
4379
6.33k
        size = sizeof(uint8_t);
4380
6.33k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
4381
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
4382
0
           return OGS_ERROR;
4383
0
        }
4384
6.33k
        decoded += size;
4385
4386
6.33k
        switch(type) {
4387
206
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_5GSM_CAPABILITY_TYPE:
4388
206
            size = ogs_nas_5gs_decode_5gsm_capability(&pdu_session_modification_request->gsm_capability, pkbuf);
4389
206
            if (size < 0) {
4390
6
               ogs_error("ogs_nas_5gs_decode_5gsm_capability() failed");
4391
6
               return size;
4392
6
            }
4393
4394
200
            pdu_session_modification_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_5GSM_CAPABILITY_PRESENT;
4395
200
            decoded += size;
4396
200
            break;
4397
235
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_5GSM_CAUSE_TYPE:
4398
235
            size = ogs_nas_5gs_decode_5gsm_cause(&pdu_session_modification_request->gsm_cause, pkbuf);
4399
235
            if (size < 0) {
4400
5
               ogs_error("ogs_nas_5gs_decode_5gsm_cause() failed");
4401
5
               return size;
4402
5
            }
4403
4404
230
            pdu_session_modification_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_5GSM_CAUSE_PRESENT;
4405
230
            decoded += size;
4406
230
            break;
4407
238
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_MAXIMUM_NUMBER_OF_SUPPORTED_PACKET_FILTERS_TYPE:
4408
238
            size = ogs_nas_5gs_decode_maximum_number_of_supported_packet_filters(&pdu_session_modification_request->maximum_number_of_supported_packet_filters, pkbuf);
4409
238
            if (size < 0) {
4410
6
               ogs_error("ogs_nas_5gs_decode_maximum_number_of_supported_packet_filters() failed");
4411
6
               return size;
4412
6
            }
4413
4414
232
            pdu_session_modification_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_MAXIMUM_NUMBER_OF_SUPPORTED_PACKET_FILTERS_PRESENT;
4415
232
            decoded += size;
4416
232
            break;
4417
636
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_ALWAYS_ON_PDU_SESSION_REQUESTED_TYPE:
4418
636
            decoded--;
4419
636
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
4420
636
            size = ogs_nas_5gs_decode_always_on_pdu_session_requested(&pdu_session_modification_request->always_on_pdu_session_requested, pkbuf);
4421
636
            if (size < 0) {
4422
0
               ogs_error("ogs_nas_5gs_decode_always_on_pdu_session_requested() failed");
4423
0
               return size;
4424
0
            }
4425
4426
636
            pdu_session_modification_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_ALWAYS_ON_PDU_SESSION_REQUESTED_PRESENT;
4427
636
            decoded += size;
4428
636
            break;
4429
228
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_INTEGRITY_PROTECTION_MAXIMUM_DATA_RATE_TYPE:
4430
228
            size = ogs_nas_5gs_decode_integrity_protection_maximum_data_rate(&pdu_session_modification_request->integrity_protection_maximum_data_rate, pkbuf);
4431
228
            if (size < 0) {
4432
6
               ogs_error("ogs_nas_5gs_decode_integrity_protection_maximum_data_rate() failed");
4433
6
               return size;
4434
6
            }
4435
4436
222
            pdu_session_modification_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_INTEGRITY_PROTECTION_MAXIMUM_DATA_RATE_PRESENT;
4437
222
            decoded += size;
4438
222
            break;
4439
434
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_REQUESTED_QOS_RULES_TYPE:
4440
434
            size = ogs_nas_5gs_decode_qos_rules(&pdu_session_modification_request->requested_qos_rules, pkbuf);
4441
434
            if (size < 0) {
4442
7
               ogs_error("ogs_nas_5gs_decode_qos_rules() failed");
4443
7
               return size;
4444
7
            }
4445
4446
427
            pdu_session_modification_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_REQUESTED_QOS_RULES_PRESENT;
4447
427
            decoded += size;
4448
427
            break;
4449
279
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_REQUESTED_QOS_FLOW_DESCRIPTIONS_TYPE:
4450
279
            size = ogs_nas_5gs_decode_qos_flow_descriptions(&pdu_session_modification_request->requested_qos_flow_descriptions, pkbuf);
4451
279
            if (size < 0) {
4452
14
               ogs_error("ogs_nas_5gs_decode_qos_flow_descriptions() failed");
4453
14
               return size;
4454
14
            }
4455
4456
265
            pdu_session_modification_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_REQUESTED_QOS_FLOW_DESCRIPTIONS_PRESENT;
4457
265
            decoded += size;
4458
265
            break;
4459
306
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_MAPPED_EPS_BEARER_CONTEXTS_TYPE:
4460
306
            size = ogs_nas_5gs_decode_mapped_eps_bearer_contexts(&pdu_session_modification_request->mapped_eps_bearer_contexts, pkbuf);
4461
306
            if (size < 0) {
4462
11
               ogs_error("ogs_nas_5gs_decode_mapped_eps_bearer_contexts() failed");
4463
11
               return size;
4464
11
            }
4465
4466
295
            pdu_session_modification_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_MAPPED_EPS_BEARER_CONTEXTS_PRESENT;
4467
295
            decoded += size;
4468
295
            break;
4469
232
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4470
232
            size = ogs_nas_5gs_decode_extended_protocol_configuration_options(&pdu_session_modification_request->extended_protocol_configuration_options, pkbuf);
4471
232
            if (size < 0) {
4472
5
               ogs_error("ogs_nas_5gs_decode_extended_protocol_configuration_options() failed");
4473
5
               return size;
4474
5
            }
4475
4476
227
            pdu_session_modification_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4477
227
            decoded += size;
4478
227
            break;
4479
216
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_PORT_MANAGEMENT_INFORMATION_CONTAINER_TYPE:
4480
216
            size = ogs_nas_5gs_decode_port_management_information_container(&pdu_session_modification_request->port_management_information_container, pkbuf);
4481
216
            if (size < 0) {
4482
12
               ogs_error("ogs_nas_5gs_decode_port_management_information_container() failed");
4483
12
               return size;
4484
12
            }
4485
4486
204
            pdu_session_modification_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_PORT_MANAGEMENT_INFORMATION_CONTAINER_PRESENT;
4487
204
            decoded += size;
4488
204
            break;
4489
304
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_IP_HEADER_COMPRESSION_CONFIGURATION_TYPE:
4490
304
            size = ogs_nas_5gs_decode_header_compression_configuration(&pdu_session_modification_request->ip_header_compression_configuration, pkbuf);
4491
304
            if (size < 0) {
4492
12
               ogs_error("ogs_nas_5gs_decode_header_compression_configuration() failed");
4493
12
               return size;
4494
12
            }
4495
4496
292
            pdu_session_modification_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_IP_HEADER_COMPRESSION_CONFIGURATION_PRESENT;
4497
292
            decoded += size;
4498
292
            break;
4499
210
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_ETHERNET_HEADER_COMPRESSION_CONFIGURATION_TYPE:
4500
210
            size = ogs_nas_5gs_decode_ethernet_header_compression_configuration(&pdu_session_modification_request->ethernet_header_compression_configuration, pkbuf);
4501
210
            if (size < 0) {
4502
4
               ogs_error("ogs_nas_5gs_decode_ethernet_header_compression_configuration() failed");
4503
4
               return size;
4504
4
            }
4505
4506
206
            pdu_session_modification_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_ETHERNET_HEADER_COMPRESSION_CONFIGURATION_PRESENT;
4507
206
            decoded += size;
4508
206
            break;
4509
263
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_REQUESTED_MBS_CONTAINER_TYPE:
4510
263
            size = ogs_nas_5gs_decode_requested_mbs_container(&pdu_session_modification_request->requested_mbs_container, pkbuf);
4511
263
            if (size < 0) {
4512
26
               ogs_error("ogs_nas_5gs_decode_requested_mbs_container() failed");
4513
26
               return size;
4514
26
            }
4515
4516
237
            pdu_session_modification_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_REQUESTED_MBS_CONTAINER_PRESENT;
4517
237
            decoded += size;
4518
237
            break;
4519
210
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_SERVICE_LEVEL_AA_CONTAINER_TYPE:
4520
210
            size = ogs_nas_5gs_decode_service_level_aa_container(&pdu_session_modification_request->service_level_aa_container, pkbuf);
4521
210
            if (size < 0) {
4522
6
               ogs_error("ogs_nas_5gs_decode_service_level_aa_container() failed");
4523
6
               return size;
4524
6
            }
4525
4526
204
            pdu_session_modification_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_SERVICE_LEVEL_AA_CONTAINER_PRESENT;
4527
204
            decoded += size;
4528
204
            break;
4529
245
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_NON_3GPP_DELAY_BUDGET_TYPE:
4530
245
            size = ogs_nas_5gs_decode_non_3gpp_delay_budget(&pdu_session_modification_request->non_3gpp_delay_budget, pkbuf);
4531
245
            if (size < 0) {
4532
26
               ogs_error("ogs_nas_5gs_decode_non_3gpp_delay_budget() failed");
4533
26
               return size;
4534
26
            }
4535
4536
219
            pdu_session_modification_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_NON_3GPP_DELAY_BUDGET_PRESENT;
4537
219
            decoded += size;
4538
219
            break;
4539
206
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_URSP_RULE_ENFORCEMENT_REPORTS_TYPE:
4540
206
            size = ogs_nas_5gs_decode_ursp_rule_enforcement_reports(&pdu_session_modification_request->ursp_rule_enforcement_reports, pkbuf);
4541
206
            if (size < 0) {
4542
5
               ogs_error("ogs_nas_5gs_decode_ursp_rule_enforcement_reports() failed");
4543
5
               return size;
4544
5
            }
4545
4546
201
            pdu_session_modification_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_URSP_RULE_ENFORCEMENT_REPORTS_PRESENT;
4547
201
            decoded += size;
4548
201
            break;
4549
264
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_NON_3GPP_DEVICE_INFORMATION_TYPE:
4550
264
            size = ogs_nas_5gs_decode_non_3gpp_device_information(&pdu_session_modification_request->non_3gpp_device_information, pkbuf);
4551
264
            if (size < 0) {
4552
31
               ogs_error("ogs_nas_5gs_decode_non_3gpp_device_information() failed");
4553
31
               return size;
4554
31
            }
4555
4556
233
            pdu_session_modification_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST_NON_3GPP_DEVICE_INFORMATION_PRESENT;
4557
233
            decoded += size;
4558
233
            break;
4559
1.62k
        default:
4560
1.62k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
4561
1.62k
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
4562
1.62k
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
4563
1.62k
            if (size < 0) {
4564
25
               ogs_error("ogs_nas_skip_unknown_ie() failed");
4565
25
               return size;
4566
25
            }
4567
4568
1.59k
            decoded += size;
4569
1.59k
            break;
4570
6.33k
        }
4571
6.33k
    }
4572
4573
495
    return decoded;
4574
702
}
4575
4576
int ogs_nas_5gs_decode_pdu_session_modification_reject(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
4577
69
{
4578
69
    ogs_nas_5gs_pdu_session_modification_reject_t *pdu_session_modification_reject = &message->gsm.pdu_session_modification_reject;
4579
69
    int decoded = 0;
4580
69
    int size = 0;
4581
4582
69
    ogs_trace("[NAS] Decode PDU_SESSION_MODIFICATION_REJECT\n");
4583
4584
69
    size = ogs_nas_5gs_decode_5gsm_cause(&pdu_session_modification_reject->gsm_cause, pkbuf);
4585
69
    if (size < 0) {
4586
1
        ogs_error("ogs_nas_5gs_decode_5gsm_cause() failed");
4587
1
        return size;
4588
1
    }
4589
4590
68
    decoded += size;
4591
4592
1.70k
    while (pkbuf->len > 0) {
4593
1.65k
        uint8_t *buffer = pkbuf->data;
4594
1.65k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
4595
4596
1.65k
        size = sizeof(uint8_t);
4597
1.65k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
4598
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
4599
0
           return OGS_ERROR;
4600
0
        }
4601
1.65k
        decoded += size;
4602
4603
1.65k
        switch(type) {
4604
252
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REJECT_BACK_OFF_TIMER_VALUE_TYPE:
4605
252
            size = ogs_nas_5gs_decode_gprs_timer_3(&pdu_session_modification_reject->back_off_timer_value, pkbuf);
4606
252
            if (size < 0) {
4607
1
               ogs_error("ogs_nas_5gs_decode_gprs_timer_3() failed");
4608
1
               return size;
4609
1
            }
4610
4611
251
            pdu_session_modification_reject->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REJECT_BACK_OFF_TIMER_VALUE_PRESENT;
4612
251
            decoded += size;
4613
251
            break;
4614
201
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REJECT_5GSM_CONGESTION_RE_ATTEMPT_INDICATOR_TYPE:
4615
201
            size = ogs_nas_5gs_decode_5gsm_congestion_re_attempt_indicator(&pdu_session_modification_reject->gsm_congestion_re_attempt_indicator, pkbuf);
4616
201
            if (size < 0) {
4617
4
               ogs_error("ogs_nas_5gs_decode_5gsm_congestion_re_attempt_indicator() failed");
4618
4
               return size;
4619
4
            }
4620
4621
197
            pdu_session_modification_reject->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REJECT_5GSM_CONGESTION_RE_ATTEMPT_INDICATOR_PRESENT;
4622
197
            decoded += size;
4623
197
            break;
4624
228
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4625
228
            size = ogs_nas_5gs_decode_extended_protocol_configuration_options(&pdu_session_modification_reject->extended_protocol_configuration_options, pkbuf);
4626
228
            if (size < 0) {
4627
1
               ogs_error("ogs_nas_5gs_decode_extended_protocol_configuration_options() failed");
4628
1
               return size;
4629
1
            }
4630
4631
227
            pdu_session_modification_reject->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4632
227
            decoded += size;
4633
227
            break;
4634
206
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REJECT_RE_ATTEMPT_INDICATOR_TYPE:
4635
206
            size = ogs_nas_5gs_decode_re_attempt_indicator(&pdu_session_modification_reject->re_attempt_indicator, pkbuf);
4636
206
            if (size < 0) {
4637
4
               ogs_error("ogs_nas_5gs_decode_re_attempt_indicator() failed");
4638
4
               return size;
4639
4
            }
4640
4641
202
            pdu_session_modification_reject->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REJECT_RE_ATTEMPT_INDICATOR_PRESENT;
4642
202
            decoded += size;
4643
202
            break;
4644
766
        default:
4645
766
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
4646
766
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
4647
766
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
4648
766
            if (size < 0) {
4649
3
               ogs_error("ogs_nas_skip_unknown_ie() failed");
4650
3
               return size;
4651
3
            }
4652
4653
763
            decoded += size;
4654
763
            break;
4655
1.65k
        }
4656
1.65k
    }
4657
4658
55
    return decoded;
4659
68
}
4660
4661
int ogs_nas_5gs_decode_pdu_session_modification_command(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
4662
611
{
4663
611
    ogs_nas_5gs_pdu_session_modification_command_t *pdu_session_modification_command = &message->gsm.pdu_session_modification_command;
4664
611
    int decoded = 0;
4665
611
    int size = 0;
4666
4667
611
    ogs_trace("[NAS] Decode PDU_SESSION_MODIFICATION_COMMAND\n");
4668
4669
6.35k
    while (pkbuf->len > 0) {
4670
5.93k
        uint8_t *buffer = pkbuf->data;
4671
5.93k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
4672
4673
5.93k
        size = sizeof(uint8_t);
4674
5.93k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
4675
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
4676
0
           return OGS_ERROR;
4677
0
        }
4678
5.93k
        decoded += size;
4679
4680
5.93k
        switch(type) {
4681
244
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_5GSM_CAUSE_TYPE:
4682
244
            size = ogs_nas_5gs_decode_5gsm_cause(&pdu_session_modification_command->gsm_cause, pkbuf);
4683
244
            if (size < 0) {
4684
2
               ogs_error("ogs_nas_5gs_decode_5gsm_cause() failed");
4685
2
               return size;
4686
2
            }
4687
4688
242
            pdu_session_modification_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_5GSM_CAUSE_PRESENT;
4689
242
            decoded += size;
4690
242
            break;
4691
97
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_SESSION_AMBR_TYPE:
4692
97
            size = ogs_nas_5gs_decode_session_ambr(&pdu_session_modification_command->session_ambr, pkbuf);
4693
97
            if (size < 0) {
4694
15
               ogs_error("ogs_nas_5gs_decode_session_ambr() failed");
4695
15
               return size;
4696
15
            }
4697
4698
82
            pdu_session_modification_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_SESSION_AMBR_PRESENT;
4699
82
            decoded += size;
4700
82
            break;
4701
229
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_RQ_TIMER_VALUE_TYPE:
4702
229
            size = ogs_nas_5gs_decode_gprs_timer(&pdu_session_modification_command->rq_timer_value, pkbuf);
4703
229
            if (size < 0) {
4704
6
               ogs_error("ogs_nas_5gs_decode_gprs_timer() failed");
4705
6
               return size;
4706
6
            }
4707
4708
223
            pdu_session_modification_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_RQ_TIMER_VALUE_PRESENT;
4709
223
            decoded += size;
4710
223
            break;
4711
358
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_ALWAYS_ON_PDU_SESSION_INDICATION_TYPE:
4712
358
            decoded--;
4713
358
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
4714
358
            size = ogs_nas_5gs_decode_always_on_pdu_session_indication(&pdu_session_modification_command->always_on_pdu_session_indication, pkbuf);
4715
358
            if (size < 0) {
4716
0
               ogs_error("ogs_nas_5gs_decode_always_on_pdu_session_indication() failed");
4717
0
               return size;
4718
0
            }
4719
4720
358
            pdu_session_modification_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_ALWAYS_ON_PDU_SESSION_INDICATION_PRESENT;
4721
358
            decoded += size;
4722
358
            break;
4723
349
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_AUTHORIZED_QOS_RULES_TYPE:
4724
349
            size = ogs_nas_5gs_decode_qos_rules(&pdu_session_modification_command->authorized_qos_rules, pkbuf);
4725
349
            if (size < 0) {
4726
7
               ogs_error("ogs_nas_5gs_decode_qos_rules() failed");
4727
7
               return size;
4728
7
            }
4729
4730
342
            pdu_session_modification_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_AUTHORIZED_QOS_RULES_PRESENT;
4731
342
            decoded += size;
4732
342
            break;
4733
237
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_MAPPED_EPS_BEARER_CONTEXTS_TYPE:
4734
237
            size = ogs_nas_5gs_decode_mapped_eps_bearer_contexts(&pdu_session_modification_command->mapped_eps_bearer_contexts, pkbuf);
4735
237
            if (size < 0) {
4736
16
               ogs_error("ogs_nas_5gs_decode_mapped_eps_bearer_contexts() failed");
4737
16
               return size;
4738
16
            }
4739
4740
221
            pdu_session_modification_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_MAPPED_EPS_BEARER_CONTEXTS_PRESENT;
4741
221
            decoded += size;
4742
221
            break;
4743
400
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_AUTHORIZED_QOS_FLOW_DESCRIPTIONS_TYPE:
4744
400
            size = ogs_nas_5gs_decode_qos_flow_descriptions(&pdu_session_modification_command->authorized_qos_flow_descriptions, pkbuf);
4745
400
            if (size < 0) {
4746
11
               ogs_error("ogs_nas_5gs_decode_qos_flow_descriptions() failed");
4747
11
               return size;
4748
11
            }
4749
4750
389
            pdu_session_modification_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_AUTHORIZED_QOS_FLOW_DESCRIPTIONS_PRESENT;
4751
389
            decoded += size;
4752
389
            break;
4753
239
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4754
239
            size = ogs_nas_5gs_decode_extended_protocol_configuration_options(&pdu_session_modification_command->extended_protocol_configuration_options, pkbuf);
4755
239
            if (size < 0) {
4756
5
               ogs_error("ogs_nas_5gs_decode_extended_protocol_configuration_options() failed");
4757
5
               return size;
4758
5
            }
4759
4760
234
            pdu_session_modification_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4761
234
            decoded += size;
4762
234
            break;
4763
278
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_ATSSS_CONTAINER_TYPE:
4764
278
            size = ogs_nas_5gs_decode_atsss_container(&pdu_session_modification_command->atsss_container, pkbuf);
4765
278
            if (size < 0) {
4766
19
               ogs_error("ogs_nas_5gs_decode_atsss_container() failed");
4767
19
               return size;
4768
19
            }
4769
4770
259
            pdu_session_modification_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_ATSSS_CONTAINER_PRESENT;
4771
259
            decoded += size;
4772
259
            break;
4773
208
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_IP_HEADER_COMPRESSION_CONFIGURATION_TYPE:
4774
208
            size = ogs_nas_5gs_decode_ip_header_compression_configuration(&pdu_session_modification_command->ip_header_compression_configuration, pkbuf);
4775
208
            if (size < 0) {
4776
5
               ogs_error("ogs_nas_5gs_decode_ip_header_compression_configuration() failed");
4777
5
               return size;
4778
5
            }
4779
4780
203
            pdu_session_modification_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_IP_HEADER_COMPRESSION_CONFIGURATION_PRESENT;
4781
203
            decoded += size;
4782
203
            break;
4783
238
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_PORT_MANAGEMENT_INFORMATION_CONTAINER_TYPE:
4784
238
            size = ogs_nas_5gs_decode_port_management_information_container(&pdu_session_modification_command->port_management_information_container, pkbuf);
4785
238
            if (size < 0) {
4786
7
               ogs_error("ogs_nas_5gs_decode_port_management_information_container() failed");
4787
7
               return size;
4788
7
            }
4789
4790
231
            pdu_session_modification_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_PORT_MANAGEMENT_INFORMATION_CONTAINER_PRESENT;
4791
231
            decoded += size;
4792
231
            break;
4793
207
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_SERVING_PLMN_RATE_CONTROL_TYPE:
4794
207
            size = ogs_nas_5gs_decode_serving_plmn_rate_control(&pdu_session_modification_command->serving_plmn_rate_control, pkbuf);
4795
207
            if (size < 0) {
4796
7
               ogs_error("ogs_nas_5gs_decode_serving_plmn_rate_control() failed");
4797
7
               return size;
4798
7
            }
4799
4800
200
            pdu_session_modification_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_SERVING_PLMN_RATE_CONTROL_PRESENT;
4801
200
            decoded += size;
4802
200
            break;
4803
204
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_ETHERNET_HEADER_COMPRESSION_CONFIGURATION_TYPE:
4804
204
            size = ogs_nas_5gs_decode_ethernet_header_compression_configuration(&pdu_session_modification_command->ethernet_header_compression_configuration, pkbuf);
4805
204
            if (size < 0) {
4806
6
               ogs_error("ogs_nas_5gs_decode_ethernet_header_compression_configuration() failed");
4807
6
               return size;
4808
6
            }
4809
4810
198
            pdu_session_modification_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_ETHERNET_HEADER_COMPRESSION_CONFIGURATION_PRESENT;
4811
198
            decoded += size;
4812
198
            break;
4813
236
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_RECEIVED_MBS_CONTAINER_TYPE:
4814
236
            size = ogs_nas_5gs_decode_received_mbs_container(&pdu_session_modification_command->received_mbs_container, pkbuf);
4815
236
            if (size < 0) {
4816
8
               ogs_error("ogs_nas_5gs_decode_received_mbs_container() failed");
4817
8
               return size;
4818
8
            }
4819
4820
228
            pdu_session_modification_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_RECEIVED_MBS_CONTAINER_PRESENT;
4821
228
            decoded += size;
4822
228
            break;
4823
205
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_SERVICE_LEVEL_AA_CONTAINER_TYPE:
4824
205
            size = ogs_nas_5gs_decode_service_level_aa_container(&pdu_session_modification_command->service_level_aa_container, pkbuf);
4825
205
            if (size < 0) {
4826
3
               ogs_error("ogs_nas_5gs_decode_service_level_aa_container() failed");
4827
3
               return size;
4828
3
            }
4829
4830
202
            pdu_session_modification_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_SERVICE_LEVEL_AA_CONTAINER_PRESENT;
4831
202
            decoded += size;
4832
202
            break;
4833
332
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_ALTERNATIVE_S_NSSAI_TYPE:
4834
332
            size = ogs_nas_5gs_decode_s_nssai(&pdu_session_modification_command->alternative_s_nssai, pkbuf);
4835
332
            if (size < 0) {
4836
5
               ogs_error("ogs_nas_5gs_decode_s_nssai() failed");
4837
5
               return size;
4838
5
            }
4839
4840
327
            pdu_session_modification_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_ALTERNATIVE_S_NSSAI_PRESENT;
4841
327
            decoded += size;
4842
327
            break;
4843
244
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_N3QAI_TYPE:
4844
244
            size = ogs_nas_5gs_decode_n3qai(&pdu_session_modification_command->n3qai, pkbuf);
4845
244
            if (size < 0) {
4846
24
               ogs_error("ogs_nas_5gs_decode_n3qai() failed");
4847
24
               return size;
4848
24
            }
4849
4850
220
            pdu_session_modification_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_N3QAI_PRESENT;
4851
220
            decoded += size;
4852
220
            break;
4853
236
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_PROTOCOL_DESCRIPTION_TYPE:
4854
236
            size = ogs_nas_5gs_decode_protocol_description(&pdu_session_modification_command->protocol_description, pkbuf);
4855
236
            if (size < 0) {
4856
27
               ogs_error("ogs_nas_5gs_decode_protocol_description() failed");
4857
27
               return size;
4858
27
            }
4859
4860
209
            pdu_session_modification_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_PROTOCOL_DESCRIPTION_PRESENT;
4861
209
            decoded += size;
4862
209
            break;
4863
203
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_ECN_MARKING_FOR_L4S_INDICATION_TYPE:
4864
203
            size = ogs_nas_5gs_decode_ecn_marking_for_l4s_indication(&pdu_session_modification_command->ecn_marking_for_l4s_indication, pkbuf);
4865
203
            if (size < 0) {
4866
4
               ogs_error("ogs_nas_5gs_decode_ecn_marking_for_l4s_indication() failed");
4867
4
               return size;
4868
4
            }
4869
4870
199
            pdu_session_modification_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_ECN_MARKING_FOR_L4S_INDICATION_PRESENT;
4871
199
            decoded += size;
4872
199
            break;
4873
1.18k
        default:
4874
1.18k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
4875
1.18k
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
4876
1.18k
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
4877
1.18k
            if (size < 0) {
4878
10
               ogs_error("ogs_nas_skip_unknown_ie() failed");
4879
10
               return size;
4880
10
            }
4881
4882
1.17k
            decoded += size;
4883
1.17k
            break;
4884
5.93k
        }
4885
5.93k
    }
4886
4887
424
    return decoded;
4888
611
}
4889
4890
int ogs_nas_5gs_decode_pdu_session_modification_complete(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
4891
84
{
4892
84
    ogs_nas_5gs_pdu_session_modification_complete_t *pdu_session_modification_complete = &message->gsm.pdu_session_modification_complete;
4893
84
    int decoded = 0;
4894
84
    int size = 0;
4895
4896
84
    ogs_trace("[NAS] Decode PDU_SESSION_MODIFICATION_COMPLETE\n");
4897
4898
1.16k
    while (pkbuf->len > 0) {
4899
1.11k
        uint8_t *buffer = pkbuf->data;
4900
1.11k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
4901
4902
1.11k
        size = sizeof(uint8_t);
4903
1.11k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
4904
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
4905
0
           return OGS_ERROR;
4906
0
        }
4907
1.11k
        decoded += size;
4908
4909
1.11k
        switch(type) {
4910
210
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMPLETE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4911
210
            size = ogs_nas_5gs_decode_extended_protocol_configuration_options(&pdu_session_modification_complete->extended_protocol_configuration_options, pkbuf);
4912
210
            if (size < 0) {
4913
13
               ogs_error("ogs_nas_5gs_decode_extended_protocol_configuration_options() failed");
4914
13
               return size;
4915
13
            }
4916
4917
197
            pdu_session_modification_complete->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMPLETE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4918
197
            decoded += size;
4919
197
            break;
4920
256
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMPLETE_PORT_MANAGEMENT_INFORMATION_CONTAINER_TYPE:
4921
256
            size = ogs_nas_5gs_decode_port_management_information_container(&pdu_session_modification_complete->port_management_information_container, pkbuf);
4922
256
            if (size < 0) {
4923
12
               ogs_error("ogs_nas_5gs_decode_port_management_information_container() failed");
4924
12
               return size;
4925
12
            }
4926
4927
244
            pdu_session_modification_complete->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMPLETE_PORT_MANAGEMENT_INFORMATION_CONTAINER_PRESENT;
4928
244
            decoded += size;
4929
244
            break;
4930
649
        default:
4931
649
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
4932
649
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
4933
649
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
4934
649
            if (size < 0) {
4935
6
               ogs_error("ogs_nas_skip_unknown_ie() failed");
4936
6
               return size;
4937
6
            }
4938
4939
643
            decoded += size;
4940
643
            break;
4941
1.11k
        }
4942
1.11k
    }
4943
4944
53
    return decoded;
4945
84
}
4946
4947
int ogs_nas_5gs_decode_pdu_session_modification_command_reject(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
4948
40
{
4949
40
    ogs_nas_5gs_pdu_session_modification_command_reject_t *pdu_session_modification_command_reject = &message->gsm.pdu_session_modification_command_reject;
4950
40
    int decoded = 0;
4951
40
    int size = 0;
4952
4953
40
    ogs_trace("[NAS] Decode PDU_SESSION_MODIFICATION_COMMAND_REJECT\n");
4954
4955
40
    size = ogs_nas_5gs_decode_5gsm_cause(&pdu_session_modification_command_reject->gsm_cause, pkbuf);
4956
40
    if (size < 0) {
4957
1
        ogs_error("ogs_nas_5gs_decode_5gsm_cause() failed");
4958
1
        return size;
4959
1
    }
4960
4961
39
    decoded += size;
4962
4963
743
    while (pkbuf->len > 0) {
4964
713
        uint8_t *buffer = pkbuf->data;
4965
713
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
4966
4967
713
        size = sizeof(uint8_t);
4968
713
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
4969
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
4970
0
           return OGS_ERROR;
4971
0
        }
4972
713
        decoded += size;
4973
4974
713
        switch(type) {
4975
196
        case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
4976
196
            size = ogs_nas_5gs_decode_extended_protocol_configuration_options(&pdu_session_modification_command_reject->extended_protocol_configuration_options, pkbuf);
4977
196
            if (size < 0) {
4978
1
               ogs_error("ogs_nas_5gs_decode_extended_protocol_configuration_options() failed");
4979
1
               return size;
4980
1
            }
4981
4982
195
            pdu_session_modification_command_reject->presencemask |= OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
4983
195
            decoded += size;
4984
195
            break;
4985
517
        default:
4986
517
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
4987
517
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
4988
517
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
4989
517
            if (size < 0) {
4990
8
               ogs_error("ogs_nas_skip_unknown_ie() failed");
4991
8
               return size;
4992
8
            }
4993
4994
509
            decoded += size;
4995
509
            break;
4996
713
        }
4997
713
    }
4998
4999
30
    return decoded;
5000
39
}
5001
5002
int ogs_nas_5gs_decode_pdu_session_release_request(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
5003
54
{
5004
54
    ogs_nas_5gs_pdu_session_release_request_t *pdu_session_release_request = &message->gsm.pdu_session_release_request;
5005
54
    int decoded = 0;
5006
54
    int size = 0;
5007
5008
54
    ogs_trace("[NAS] Decode PDU_SESSION_RELEASE_REQUEST\n");
5009
5010
956
    while (pkbuf->len > 0) {
5011
910
        uint8_t *buffer = pkbuf->data;
5012
910
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
5013
5014
910
        size = sizeof(uint8_t);
5015
910
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
5016
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
5017
0
           return OGS_ERROR;
5018
0
        }
5019
910
        decoded += size;
5020
5021
910
        switch(type) {
5022
201
        case OGS_NAS_5GS_PDU_SESSION_RELEASE_REQUEST_5GSM_CAUSE_TYPE:
5023
201
            size = ogs_nas_5gs_decode_5gsm_cause(&pdu_session_release_request->gsm_cause, pkbuf);
5024
201
            if (size < 0) {
5025
2
               ogs_error("ogs_nas_5gs_decode_5gsm_cause() failed");
5026
2
               return size;
5027
2
            }
5028
5029
199
            pdu_session_release_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_RELEASE_REQUEST_5GSM_CAUSE_PRESENT;
5030
199
            decoded += size;
5031
199
            break;
5032
224
        case OGS_NAS_5GS_PDU_SESSION_RELEASE_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
5033
224
            size = ogs_nas_5gs_decode_extended_protocol_configuration_options(&pdu_session_release_request->extended_protocol_configuration_options, pkbuf);
5034
224
            if (size < 0) {
5035
3
               ogs_error("ogs_nas_5gs_decode_extended_protocol_configuration_options() failed");
5036
3
               return size;
5037
3
            }
5038
5039
221
            pdu_session_release_request->presencemask |= OGS_NAS_5GS_PDU_SESSION_RELEASE_REQUEST_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
5040
221
            decoded += size;
5041
221
            break;
5042
485
        default:
5043
485
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
5044
485
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
5045
485
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
5046
485
            if (size < 0) {
5047
3
               ogs_error("ogs_nas_skip_unknown_ie() failed");
5048
3
               return size;
5049
3
            }
5050
5051
482
            decoded += size;
5052
482
            break;
5053
910
        }
5054
910
    }
5055
5056
46
    return decoded;
5057
54
}
5058
5059
int ogs_nas_5gs_decode_pdu_session_release_reject(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
5060
49
{
5061
49
    ogs_nas_5gs_pdu_session_release_reject_t *pdu_session_release_reject = &message->gsm.pdu_session_release_reject;
5062
49
    int decoded = 0;
5063
49
    int size = 0;
5064
5065
49
    ogs_trace("[NAS] Decode PDU_SESSION_RELEASE_REJECT\n");
5066
5067
49
    size = ogs_nas_5gs_decode_5gsm_cause(&pdu_session_release_reject->gsm_cause, pkbuf);
5068
49
    if (size < 0) {
5069
1
        ogs_error("ogs_nas_5gs_decode_5gsm_cause() failed");
5070
1
        return size;
5071
1
    }
5072
5073
48
    decoded += size;
5074
5075
968
    while (pkbuf->len > 0) {
5076
929
        uint8_t *buffer = pkbuf->data;
5077
929
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
5078
5079
929
        size = sizeof(uint8_t);
5080
929
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
5081
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
5082
0
           return OGS_ERROR;
5083
0
        }
5084
929
        decoded += size;
5085
5086
929
        switch(type) {
5087
207
        case OGS_NAS_5GS_PDU_SESSION_RELEASE_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
5088
207
            size = ogs_nas_5gs_decode_extended_protocol_configuration_options(&pdu_session_release_reject->extended_protocol_configuration_options, pkbuf);
5089
207
            if (size < 0) {
5090
1
               ogs_error("ogs_nas_5gs_decode_extended_protocol_configuration_options() failed");
5091
1
               return size;
5092
1
            }
5093
5094
206
            pdu_session_release_reject->presencemask |= OGS_NAS_5GS_PDU_SESSION_RELEASE_REJECT_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
5095
206
            decoded += size;
5096
206
            break;
5097
722
        default:
5098
722
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
5099
722
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
5100
722
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
5101
722
            if (size < 0) {
5102
8
               ogs_error("ogs_nas_skip_unknown_ie() failed");
5103
8
               return size;
5104
8
            }
5105
5106
714
            decoded += size;
5107
714
            break;
5108
929
        }
5109
929
    }
5110
5111
39
    return decoded;
5112
48
}
5113
5114
int ogs_nas_5gs_decode_pdu_session_release_command(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
5115
112
{
5116
112
    ogs_nas_5gs_pdu_session_release_command_t *pdu_session_release_command = &message->gsm.pdu_session_release_command;
5117
112
    int decoded = 0;
5118
112
    int size = 0;
5119
5120
112
    ogs_trace("[NAS] Decode PDU_SESSION_RELEASE_COMMAND\n");
5121
5122
112
    size = ogs_nas_5gs_decode_5gsm_cause(&pdu_session_release_command->gsm_cause, pkbuf);
5123
112
    if (size < 0) {
5124
1
        ogs_error("ogs_nas_5gs_decode_5gsm_cause() failed");
5125
1
        return size;
5126
1
    }
5127
5128
111
    decoded += size;
5129
5130
2.58k
    while (pkbuf->len > 0) {
5131
2.48k
        uint8_t *buffer = pkbuf->data;
5132
2.48k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
5133
5134
2.48k
        size = sizeof(uint8_t);
5135
2.48k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
5136
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
5137
0
           return OGS_ERROR;
5138
0
        }
5139
2.48k
        decoded += size;
5140
5141
2.48k
        switch(type) {
5142
212
        case OGS_NAS_5GS_PDU_SESSION_RELEASE_COMMAND_BACK_OFF_TIMER_VALUE_TYPE:
5143
212
            size = ogs_nas_5gs_decode_gprs_timer_3(&pdu_session_release_command->back_off_timer_value, pkbuf);
5144
212
            if (size < 0) {
5145
1
               ogs_error("ogs_nas_5gs_decode_gprs_timer_3() failed");
5146
1
               return size;
5147
1
            }
5148
5149
211
            pdu_session_release_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_RELEASE_COMMAND_BACK_OFF_TIMER_VALUE_PRESENT;
5150
211
            decoded += size;
5151
211
            break;
5152
195
        case OGS_NAS_5GS_PDU_SESSION_RELEASE_COMMAND_EAP_MESSAGE_TYPE:
5153
195
            size = ogs_nas_5gs_decode_eap_message(&pdu_session_release_command->eap_message, pkbuf);
5154
195
            if (size < 0) {
5155
1
               ogs_error("ogs_nas_5gs_decode_eap_message() failed");
5156
1
               return size;
5157
1
            }
5158
5159
194
            pdu_session_release_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_RELEASE_COMMAND_EAP_MESSAGE_PRESENT;
5160
194
            decoded += size;
5161
194
            break;
5162
201
        case OGS_NAS_5GS_PDU_SESSION_RELEASE_COMMAND_5GSM_CONGESTION_RE_ATTEMPT_INDICATOR_TYPE:
5163
201
            size = ogs_nas_5gs_decode_5gsm_congestion_re_attempt_indicator(&pdu_session_release_command->gsm_congestion_re_attempt_indicator, pkbuf);
5164
201
            if (size < 0) {
5165
2
               ogs_error("ogs_nas_5gs_decode_5gsm_congestion_re_attempt_indicator() failed");
5166
2
               return size;
5167
2
            }
5168
5169
199
            pdu_session_release_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_RELEASE_COMMAND_5GSM_CONGESTION_RE_ATTEMPT_INDICATOR_PRESENT;
5170
199
            decoded += size;
5171
199
            break;
5172
224
        case OGS_NAS_5GS_PDU_SESSION_RELEASE_COMMAND_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
5173
224
            size = ogs_nas_5gs_decode_extended_protocol_configuration_options(&pdu_session_release_command->extended_protocol_configuration_options, pkbuf);
5174
224
            if (size < 0) {
5175
2
               ogs_error("ogs_nas_5gs_decode_extended_protocol_configuration_options() failed");
5176
2
               return size;
5177
2
            }
5178
5179
222
            pdu_session_release_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_RELEASE_COMMAND_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
5180
222
            decoded += size;
5181
222
            break;
5182
232
        case OGS_NAS_5GS_PDU_SESSION_RELEASE_COMMAND_ACCESS_TYPE_TYPE:
5183
232
            decoded--;
5184
232
            ogs_assert(ogs_pkbuf_push(pkbuf, 1));
5185
232
            size = ogs_nas_5gs_decode_access_type(&pdu_session_release_command->access_type, pkbuf);
5186
232
            if (size < 0) {
5187
0
               ogs_error("ogs_nas_5gs_decode_access_type() failed");
5188
0
               return size;
5189
0
            }
5190
5191
232
            pdu_session_release_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_RELEASE_COMMAND_ACCESS_TYPE_PRESENT;
5192
232
            decoded += size;
5193
232
            break;
5194
199
        case OGS_NAS_5GS_PDU_SESSION_RELEASE_COMMAND_SERVICE_LEVEL_AA_CONTAINER_TYPE:
5195
199
            size = ogs_nas_5gs_decode_service_level_aa_container(&pdu_session_release_command->service_level_aa_container, pkbuf);
5196
199
            if (size < 0) {
5197
1
               ogs_error("ogs_nas_5gs_decode_service_level_aa_container() failed");
5198
1
               return size;
5199
1
            }
5200
5201
198
            pdu_session_release_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_RELEASE_COMMAND_SERVICE_LEVEL_AA_CONTAINER_PRESENT;
5202
198
            decoded += size;
5203
198
            break;
5204
198
        case OGS_NAS_5GS_PDU_SESSION_RELEASE_COMMAND_ALTERNATIVE_S_NSSAI_TYPE:
5205
198
            size = ogs_nas_5gs_decode_s_nssai(&pdu_session_release_command->alternative_s_nssai, pkbuf);
5206
198
            if (size < 0) {
5207
2
               ogs_error("ogs_nas_5gs_decode_s_nssai() failed");
5208
2
               return size;
5209
2
            }
5210
5211
196
            pdu_session_release_command->presencemask |= OGS_NAS_5GS_PDU_SESSION_RELEASE_COMMAND_ALTERNATIVE_S_NSSAI_PRESENT;
5212
196
            decoded += size;
5213
196
            break;
5214
1.02k
        default:
5215
1.02k
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
5216
1.02k
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
5217
1.02k
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
5218
1.02k
            if (size < 0) {
5219
5
               ogs_error("ogs_nas_skip_unknown_ie() failed");
5220
5
               return size;
5221
5
            }
5222
5223
1.01k
            decoded += size;
5224
1.01k
            break;
5225
2.48k
        }
5226
2.48k
    }
5227
5228
97
    return decoded;
5229
111
}
5230
5231
int ogs_nas_5gs_decode_pdu_session_release_complete(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
5232
56
{
5233
56
    ogs_nas_5gs_pdu_session_release_complete_t *pdu_session_release_complete = &message->gsm.pdu_session_release_complete;
5234
56
    int decoded = 0;
5235
56
    int size = 0;
5236
5237
56
    ogs_trace("[NAS] Decode PDU_SESSION_RELEASE_COMPLETE\n");
5238
5239
1.18k
    while (pkbuf->len > 0) {
5240
1.13k
        uint8_t *buffer = pkbuf->data;
5241
1.13k
        uint8_t type = (*buffer) >= 0x80 ? ((*buffer) & 0xf0) : (*buffer);
5242
5243
1.13k
        size = sizeof(uint8_t);
5244
1.13k
        if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
5245
0
           ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
5246
0
           return OGS_ERROR;
5247
0
        }
5248
1.13k
        decoded += size;
5249
5250
1.13k
        switch(type) {
5251
218
        case OGS_NAS_5GS_PDU_SESSION_RELEASE_COMPLETE_5GSM_CAUSE_TYPE:
5252
218
            size = ogs_nas_5gs_decode_5gsm_cause(&pdu_session_release_complete->gsm_cause, pkbuf);
5253
218
            if (size < 0) {
5254
3
               ogs_error("ogs_nas_5gs_decode_5gsm_cause() failed");
5255
3
               return size;
5256
3
            }
5257
5258
215
            pdu_session_release_complete->presencemask |= OGS_NAS_5GS_PDU_SESSION_RELEASE_COMPLETE_5GSM_CAUSE_PRESENT;
5259
215
            decoded += size;
5260
215
            break;
5261
202
        case OGS_NAS_5GS_PDU_SESSION_RELEASE_COMPLETE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_TYPE:
5262
202
            size = ogs_nas_5gs_decode_extended_protocol_configuration_options(&pdu_session_release_complete->extended_protocol_configuration_options, pkbuf);
5263
202
            if (size < 0) {
5264
3
               ogs_error("ogs_nas_5gs_decode_extended_protocol_configuration_options() failed");
5265
3
               return size;
5266
3
            }
5267
5268
199
            pdu_session_release_complete->presencemask |= OGS_NAS_5GS_PDU_SESSION_RELEASE_COMPLETE_EXTENDED_PROTOCOL_CONFIGURATION_OPTIONS_PRESENT;
5269
199
            decoded += size;
5270
199
            break;
5271
713
        default:
5272
713
            ogs_warn("Unknown type(0x%x) or not implemented\n", type);
5273
713
            size = ogs_nas_skip_unknown_ie(type, pkbuf,
5274
713
                    OGS_NAS_5GS_TLV_E_IEI_MIN);
5275
713
            if (size < 0) {
5276
3
               ogs_error("ogs_nas_skip_unknown_ie() failed");
5277
3
               return size;
5278
3
            }
5279
5280
710
            decoded += size;
5281
710
            break;
5282
1.13k
        }
5283
1.13k
    }
5284
5285
47
    return decoded;
5286
56
}
5287
5288
int ogs_nas_5gs_decode_5gsm_status(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
5289
2
{
5290
2
    ogs_nas_5gs_5gsm_status_t *gsm_status = &message->gsm.gsm_status;
5291
2
    int decoded = 0;
5292
2
    int size = 0;
5293
5294
2
    ogs_trace("[NAS] Decode 5GSM_STATUS\n");
5295
5296
2
    size = ogs_nas_5gs_decode_5gsm_cause(&gsm_status->gsm_cause, pkbuf);
5297
2
    if (size < 0) {
5298
1
        ogs_error("ogs_nas_5gs_decode_5gsm_cause() failed");
5299
1
        return size;
5300
1
    }
5301
5302
1
    decoded += size;
5303
5304
1
    return decoded;
5305
2
}
5306
5307
int ogs_nas_5gmm_decode(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
5308
4.80k
{
5309
4.80k
    int size = 0;
5310
4.80k
    int decoded = 0;
5311
5312
4.80k
    ogs_assert(pkbuf);
5313
4.80k
    ogs_assert(pkbuf->data);
5314
5315
4.80k
    size = sizeof(ogs_nas_5gmm_header_t);
5316
4.80k
    if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
5317
0
       ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
5318
0
       return OGS_ERROR;
5319
0
    }
5320
5321
4.80k
    memset(message, 0, sizeof(ogs_nas_5gs_message_t));
5322
4.80k
    memcpy(&message->gmm.h, pkbuf->data - size, size);
5323
4.80k
    decoded += size;
5324
5325
4.80k
    switch(message->gmm.h.message_type) {
5326
655
    case OGS_NAS_5GS_REGISTRATION_REQUEST:
5327
655
        size = ogs_nas_5gs_decode_registration_request(message, pkbuf);
5328
655
        if (size < 0) {
5329
187
           ogs_error("ogs_nas_5gs_decode_registration_request() failed");
5330
187
           return OGS_ERROR;
5331
187
        }
5332
5333
468
        decoded += size;
5334
468
        break;
5335
981
    case OGS_NAS_5GS_REGISTRATION_ACCEPT:
5336
981
        size = ogs_nas_5gs_decode_registration_accept(message, pkbuf);
5337
981
        if (size < 0) {
5338
285
           ogs_error("ogs_nas_5gs_decode_registration_accept() failed");
5339
285
           return OGS_ERROR;
5340
285
        }
5341
5342
696
        decoded += size;
5343
696
        break;
5344
60
    case OGS_NAS_5GS_REGISTRATION_COMPLETE:
5345
60
        size = ogs_nas_5gs_decode_registration_complete(message, pkbuf);
5346
60
        if (size < 0) {
5347
30
           ogs_error("ogs_nas_5gs_decode_registration_complete() failed");
5348
30
           return OGS_ERROR;
5349
30
        }
5350
5351
30
        decoded += size;
5352
30
        break;
5353
216
    case OGS_NAS_5GS_REGISTRATION_REJECT:
5354
216
        size = ogs_nas_5gs_decode_registration_reject(message, pkbuf);
5355
216
        if (size < 0) {
5356
44
           ogs_error("ogs_nas_5gs_decode_registration_reject() failed");
5357
44
           return OGS_ERROR;
5358
44
        }
5359
5360
172
        decoded += size;
5361
172
        break;
5362
61
    case OGS_NAS_5GS_DEREGISTRATION_REQUEST_FROM_UE:
5363
61
        size = ogs_nas_5gs_decode_deregistration_request_from_ue(message, pkbuf);
5364
61
        if (size < 0) {
5365
15
           ogs_error("ogs_nas_5gs_decode_deregistration_request_from_ue() failed");
5366
15
           return OGS_ERROR;
5367
15
        }
5368
5369
46
        decoded += size;
5370
46
        break;
5371
1
    case OGS_NAS_5GS_DEREGISTRATION_ACCEPT_FROM_UE:
5372
1
        break;
5373
181
    case OGS_NAS_5GS_DEREGISTRATION_REQUEST_TO_UE:
5374
181
        size = ogs_nas_5gs_decode_deregistration_request_to_ue(message, pkbuf);
5375
181
        if (size < 0) {
5376
29
           ogs_error("ogs_nas_5gs_decode_deregistration_request_to_ue() failed");
5377
29
           return OGS_ERROR;
5378
29
        }
5379
5380
152
        decoded += size;
5381
152
        break;
5382
1
    case OGS_NAS_5GS_DEREGISTRATION_ACCEPT_TO_UE:
5383
1
        break;
5384
120
    case OGS_NAS_5GS_SERVICE_REQUEST:
5385
120
        size = ogs_nas_5gs_decode_service_request(message, pkbuf);
5386
120
        if (size < 0) {
5387
22
           ogs_error("ogs_nas_5gs_decode_service_request() failed");
5388
22
           return OGS_ERROR;
5389
22
        }
5390
5391
98
        decoded += size;
5392
98
        break;
5393
157
    case OGS_NAS_5GS_SERVICE_REJECT:
5394
157
        size = ogs_nas_5gs_decode_service_reject(message, pkbuf);
5395
157
        if (size < 0) {
5396
25
           ogs_error("ogs_nas_5gs_decode_service_reject() failed");
5397
25
           return OGS_ERROR;
5398
25
        }
5399
5400
132
        decoded += size;
5401
132
        break;
5402
198
    case OGS_NAS_5GS_SERVICE_ACCEPT:
5403
198
        size = ogs_nas_5gs_decode_service_accept(message, pkbuf);
5404
198
        if (size < 0) {
5405
74
           ogs_error("ogs_nas_5gs_decode_service_accept() failed");
5406
74
           return OGS_ERROR;
5407
74
        }
5408
5409
124
        decoded += size;
5410
124
        break;
5411
1.18k
    case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMMAND:
5412
1.18k
        size = ogs_nas_5gs_decode_configuration_update_command(message, pkbuf);
5413
1.18k
        if (size < 0) {
5414
482
           ogs_error("ogs_nas_5gs_decode_configuration_update_command() failed");
5415
482
           return OGS_ERROR;
5416
482
        }
5417
5418
707
        decoded += size;
5419
707
        break;
5420
1
    case OGS_NAS_5GS_CONFIGURATION_UPDATE_COMPLETE:
5421
1
        break;
5422
84
    case OGS_NAS_5GS_AUTHENTICATION_REQUEST:
5423
84
        size = ogs_nas_5gs_decode_authentication_request(message, pkbuf);
5424
84
        if (size < 0) {
5425
35
           ogs_error("ogs_nas_5gs_decode_authentication_request() failed");
5426
35
           return OGS_ERROR;
5427
35
        }
5428
5429
49
        decoded += size;
5430
49
        break;
5431
68
    case OGS_NAS_5GS_AUTHENTICATION_RESPONSE:
5432
68
        size = ogs_nas_5gs_decode_authentication_response(message, pkbuf);
5433
68
        if (size < 0) {
5434
15
           ogs_error("ogs_nas_5gs_decode_authentication_response() failed");
5435
15
           return OGS_ERROR;
5436
15
        }
5437
5438
53
        decoded += size;
5439
53
        break;
5440
40
    case OGS_NAS_5GS_AUTHENTICATION_REJECT:
5441
40
        size = ogs_nas_5gs_decode_authentication_reject(message, pkbuf);
5442
40
        if (size < 0) {
5443
12
           ogs_error("ogs_nas_5gs_decode_authentication_reject() failed");
5444
12
           return OGS_ERROR;
5445
12
        }
5446
5447
28
        decoded += size;
5448
28
        break;
5449
53
    case OGS_NAS_5GS_AUTHENTICATION_FAILURE:
5450
53
        size = ogs_nas_5gs_decode_authentication_failure(message, pkbuf);
5451
53
        if (size < 0) {
5452
15
           ogs_error("ogs_nas_5gs_decode_authentication_failure() failed");
5453
15
           return OGS_ERROR;
5454
15
        }
5455
5456
38
        decoded += size;
5457
38
        break;
5458
55
    case OGS_NAS_5GS_AUTHENTICATION_RESULT:
5459
55
        size = ogs_nas_5gs_decode_authentication_result(message, pkbuf);
5460
55
        if (size < 0) {
5461
13
           ogs_error("ogs_nas_5gs_decode_authentication_result() failed");
5462
13
           return OGS_ERROR;
5463
13
        }
5464
5465
42
        decoded += size;
5466
42
        break;
5467
1
    case OGS_NAS_5GS_IDENTITY_REQUEST:
5468
1
        size = ogs_nas_5gs_decode_identity_request(message, pkbuf);
5469
1
        if (size < 0) {
5470
0
           ogs_error("ogs_nas_5gs_decode_identity_request() failed");
5471
0
           return OGS_ERROR;
5472
0
        }
5473
5474
1
        decoded += size;
5475
1
        break;
5476
25
    case OGS_NAS_5GS_IDENTITY_RESPONSE:
5477
25
        size = ogs_nas_5gs_decode_identity_response(message, pkbuf);
5478
25
        if (size < 0) {
5479
15
           ogs_error("ogs_nas_5gs_decode_identity_response() failed");
5480
15
           return OGS_ERROR;
5481
15
        }
5482
5483
10
        decoded += size;
5484
10
        break;
5485
124
    case OGS_NAS_5GS_SECURITY_MODE_COMMAND:
5486
124
        size = ogs_nas_5gs_decode_security_mode_command(message, pkbuf);
5487
124
        if (size < 0) {
5488
36
           ogs_error("ogs_nas_5gs_decode_security_mode_command() failed");
5489
36
           return OGS_ERROR;
5490
36
        }
5491
5492
88
        decoded += size;
5493
88
        break;
5494
91
    case OGS_NAS_5GS_SECURITY_MODE_COMPLETE:
5495
91
        size = ogs_nas_5gs_decode_security_mode_complete(message, pkbuf);
5496
91
        if (size < 0) {
5497
38
           ogs_error("ogs_nas_5gs_decode_security_mode_complete() failed");
5498
38
           return OGS_ERROR;
5499
38
        }
5500
5501
53
        decoded += size;
5502
53
        break;
5503
1
    case OGS_NAS_5GS_SECURITY_MODE_REJECT:
5504
1
        size = ogs_nas_5gs_decode_security_mode_reject(message, pkbuf);
5505
1
        if (size < 0) {
5506
0
           ogs_error("ogs_nas_5gs_decode_security_mode_reject() failed");
5507
0
           return OGS_ERROR;
5508
0
        }
5509
5510
1
        decoded += size;
5511
1
        break;
5512
1
    case OGS_NAS_5GS_5GMM_STATUS:
5513
1
        size = ogs_nas_5gs_decode_5gmm_status(message, pkbuf);
5514
1
        if (size < 0) {
5515
0
           ogs_error("ogs_nas_5gs_decode_5gmm_status() failed");
5516
0
           return OGS_ERROR;
5517
0
        }
5518
5519
1
        decoded += size;
5520
1
        break;
5521
5
    case OGS_NAS_5GS_NOTIFICATION:
5522
5
        size = ogs_nas_5gs_decode_notification(message, pkbuf);
5523
5
        if (size < 0) {
5524
0
           ogs_error("ogs_nas_5gs_decode_notification() failed");
5525
0
           return OGS_ERROR;
5526
0
        }
5527
5528
5
        decoded += size;
5529
5
        break;
5530
56
    case OGS_NAS_5GS_NOTIFICATION_RESPONSE:
5531
56
        size = ogs_nas_5gs_decode_notification_response(message, pkbuf);
5532
56
        if (size < 0) {
5533
18
           ogs_error("ogs_nas_5gs_decode_notification_response() failed");
5534
18
           return OGS_ERROR;
5535
18
        }
5536
5537
38
        decoded += size;
5538
38
        break;
5539
280
    case OGS_NAS_5GS_UL_NAS_TRANSPORT:
5540
280
        size = ogs_nas_5gs_decode_ul_nas_transport(message, pkbuf);
5541
280
        if (size < 0) {
5542
49
           ogs_error("ogs_nas_5gs_decode_ul_nas_transport() failed");
5543
49
           return OGS_ERROR;
5544
49
        }
5545
5546
231
        decoded += size;
5547
231
        break;
5548
101
    case OGS_NAS_5GS_DL_NAS_TRANSPORT:
5549
101
        size = ogs_nas_5gs_decode_dl_nas_transport(message, pkbuf);
5550
101
        if (size < 0) {
5551
28
           ogs_error("ogs_nas_5gs_decode_dl_nas_transport() failed");
5552
28
           return OGS_ERROR;
5553
28
        }
5554
5555
73
        decoded += size;
5556
73
        break;
5557
1
    default:
5558
1
        ogs_error("Unknown message type (0x%x) or not implemented",
5559
1
                message->gmm.h.message_type);
5560
1
        break;
5561
4.80k
    }
5562
5563
3.34k
    ogs_assert(ogs_pkbuf_push(pkbuf, decoded));
5564
5565
3.34k
    return OGS_OK;
5566
3.34k
}
5567
int ogs_nas_5gsm_decode(ogs_nas_5gs_message_t *message, ogs_pkbuf_t *pkbuf)
5568
2.66k
{
5569
2.66k
    int size = 0;
5570
2.66k
    int decoded = 0;
5571
5572
2.66k
    ogs_assert(pkbuf);
5573
2.66k
    ogs_assert(pkbuf->data);
5574
5575
2.66k
    size = sizeof(ogs_nas_5gsm_header_t);
5576
2.66k
    if (ogs_pkbuf_pull(pkbuf, size) == NULL) {
5577
0
       ogs_error("ogs_pkbuf_pull() failed [size:%d]", (int)size);
5578
0
       return OGS_ERROR;
5579
0
    }
5580
5581
2.66k
    memset(message, 0, sizeof(ogs_nas_5gs_message_t));
5582
2.66k
    memcpy(&message->gsm.h, pkbuf->data - size, size);
5583
2.66k
    decoded += size;
5584
5585
2.66k
    switch(message->gsm.h.message_type) {
5586
257
    case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REQUEST:
5587
257
        size = ogs_nas_5gs_decode_pdu_session_establishment_request(message, pkbuf);
5588
257
        if (size < 0) {
5589
57
           ogs_error("ogs_nas_5gs_decode_pdu_session_establishment_request() failed");
5590
57
           return OGS_ERROR;
5591
57
        }
5592
5593
200
        decoded += size;
5594
200
        break;
5595
312
    case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_ACCEPT:
5596
312
        size = ogs_nas_5gs_decode_pdu_session_establishment_accept(message, pkbuf);
5597
312
        if (size < 0) {
5598
57
           ogs_error("ogs_nas_5gs_decode_pdu_session_establishment_accept() failed");
5599
57
           return OGS_ERROR;
5600
57
        }
5601
5602
255
        decoded += size;
5603
255
        break;
5604
127
    case OGS_NAS_5GS_PDU_SESSION_ESTABLISHMENT_REJECT:
5605
127
        size = ogs_nas_5gs_decode_pdu_session_establishment_reject(message, pkbuf);
5606
127
        if (size < 0) {
5607
24
           ogs_error("ogs_nas_5gs_decode_pdu_session_establishment_reject() failed");
5608
24
           return OGS_ERROR;
5609
24
        }
5610
5611
103
        decoded += size;
5612
103
        break;
5613
62
    case OGS_NAS_5GS_PDU_SESSION_AUTHENTICATION_COMMAND:
5614
62
        size = ogs_nas_5gs_decode_pdu_session_authentication_command(message, pkbuf);
5615
62
        if (size < 0) {
5616
16
           ogs_error("ogs_nas_5gs_decode_pdu_session_authentication_command() failed");
5617
16
           return OGS_ERROR;
5618
16
        }
5619
5620
46
        decoded += size;
5621
46
        break;
5622
70
    case OGS_NAS_5GS_PDU_SESSION_AUTHENTICATION_COMPLETE:
5623
70
        size = ogs_nas_5gs_decode_pdu_session_authentication_complete(message, pkbuf);
5624
70
        if (size < 0) {
5625
19
           ogs_error("ogs_nas_5gs_decode_pdu_session_authentication_complete() failed");
5626
19
           return OGS_ERROR;
5627
19
        }
5628
5629
51
        decoded += size;
5630
51
        break;
5631
57
    case OGS_NAS_5GS_PDU_SESSION_AUTHENTICATION_RESULT:
5632
57
        size = ogs_nas_5gs_decode_pdu_session_authentication_result(message, pkbuf);
5633
57
        if (size < 0) {
5634
11
           ogs_error("ogs_nas_5gs_decode_pdu_session_authentication_result() failed");
5635
11
           return OGS_ERROR;
5636
11
        }
5637
5638
46
        decoded += size;
5639
46
        break;
5640
702
    case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REQUEST:
5641
702
        size = ogs_nas_5gs_decode_pdu_session_modification_request(message, pkbuf);
5642
702
        if (size < 0) {
5643
207
           ogs_error("ogs_nas_5gs_decode_pdu_session_modification_request() failed");
5644
207
           return OGS_ERROR;
5645
207
        }
5646
5647
495
        decoded += size;
5648
495
        break;
5649
69
    case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_REJECT:
5650
69
        size = ogs_nas_5gs_decode_pdu_session_modification_reject(message, pkbuf);
5651
69
        if (size < 0) {
5652
14
           ogs_error("ogs_nas_5gs_decode_pdu_session_modification_reject() failed");
5653
14
           return OGS_ERROR;
5654
14
        }
5655
5656
55
        decoded += size;
5657
55
        break;
5658
611
    case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND:
5659
611
        size = ogs_nas_5gs_decode_pdu_session_modification_command(message, pkbuf);
5660
611
        if (size < 0) {
5661
187
           ogs_error("ogs_nas_5gs_decode_pdu_session_modification_command() failed");
5662
187
           return OGS_ERROR;
5663
187
        }
5664
5665
424
        decoded += size;
5666
424
        break;
5667
84
    case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMPLETE:
5668
84
        size = ogs_nas_5gs_decode_pdu_session_modification_complete(message, pkbuf);
5669
84
        if (size < 0) {
5670
31
           ogs_error("ogs_nas_5gs_decode_pdu_session_modification_complete() failed");
5671
31
           return OGS_ERROR;
5672
31
        }
5673
5674
53
        decoded += size;
5675
53
        break;
5676
40
    case OGS_NAS_5GS_PDU_SESSION_MODIFICATION_COMMAND_REJECT:
5677
40
        size = ogs_nas_5gs_decode_pdu_session_modification_command_reject(message, pkbuf);
5678
40
        if (size < 0) {
5679
10
           ogs_error("ogs_nas_5gs_decode_pdu_session_modification_command_reject() failed");
5680
10
           return OGS_ERROR;
5681
10
        }
5682
5683
30
        decoded += size;
5684
30
        break;
5685
54
    case OGS_NAS_5GS_PDU_SESSION_RELEASE_REQUEST:
5686
54
        size = ogs_nas_5gs_decode_pdu_session_release_request(message, pkbuf);
5687
54
        if (size < 0) {
5688
8
           ogs_error("ogs_nas_5gs_decode_pdu_session_release_request() failed");
5689
8
           return OGS_ERROR;
5690
8
        }
5691
5692
46
        decoded += size;
5693
46
        break;
5694
49
    case OGS_NAS_5GS_PDU_SESSION_RELEASE_REJECT:
5695
49
        size = ogs_nas_5gs_decode_pdu_session_release_reject(message, pkbuf);
5696
49
        if (size < 0) {
5697
10
           ogs_error("ogs_nas_5gs_decode_pdu_session_release_reject() failed");
5698
10
           return OGS_ERROR;
5699
10
        }
5700
5701
39
        decoded += size;
5702
39
        break;
5703
112
    case OGS_NAS_5GS_PDU_SESSION_RELEASE_COMMAND:
5704
112
        size = ogs_nas_5gs_decode_pdu_session_release_command(message, pkbuf);
5705
112
        if (size < 0) {
5706
15
           ogs_error("ogs_nas_5gs_decode_pdu_session_release_command() failed");
5707
15
           return OGS_ERROR;
5708
15
        }
5709
5710
97
        decoded += size;
5711
97
        break;
5712
56
    case OGS_NAS_5GS_PDU_SESSION_RELEASE_COMPLETE:
5713
56
        size = ogs_nas_5gs_decode_pdu_session_release_complete(message, pkbuf);
5714
56
        if (size < 0) {
5715
9
           ogs_error("ogs_nas_5gs_decode_pdu_session_release_complete() failed");
5716
9
           return OGS_ERROR;
5717
9
        }
5718
5719
47
        decoded += size;
5720
47
        break;
5721
2
    case OGS_NAS_5GS_5GSM_STATUS:
5722
2
        size = ogs_nas_5gs_decode_5gsm_status(message, pkbuf);
5723
2
        if (size < 0) {
5724
1
           ogs_error("ogs_nas_5gs_decode_5gsm_status() failed");
5725
1
           return OGS_ERROR;
5726
1
        }
5727
5728
1
        decoded += size;
5729
1
        break;
5730
2
    default:
5731
2
        ogs_error("Unknown message type (0x%x) or not implemented",
5732
2
                message->gsm.h.message_type);
5733
2
        break;
5734
2.66k
    }
5735
5736
1.99k
    ogs_assert(ogs_pkbuf_push(pkbuf, decoded));
5737
5738
1.99k
    return OGS_OK;
5739
1.99k
}
5740