Coverage Report

Created: 2026-08-14 06:04

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