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