blob: 06123c17ed492e34dbef2f659ec1dda55f99d126 [file] [log] [blame]
Harald Welte3cfa4502015-12-25 15:33:41 +01001/* RANAP interface for a core-network node */
2
3/* (C) 2015 by Harald Welte <laforge@gnumonks.org>
4 * All Rights Reserved
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU Affero General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Affero General Public License for more details.
15 *
16 * You should have received a copy of the GNU Affero General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 *
19 */
20
21#include <unistd.h>
22#include <errno.h>
23#include <string.h>
24
25#include <osmocom/core/utils.h>
26#include <osmocom/core/logging.h>
27
Neels Hofmeyr96979af2016-01-05 15:19:44 +010028#include <osmocom/ranap/ranap_common.h>
Harald Welte5c6bd512016-01-05 15:05:03 +010029#include <osmocom/ranap/ranap_common_cn.h>
Neels Hofmeyr96979af2016-01-05 15:19:44 +010030#include <osmocom/ranap/ranap_ies_defs.h>
Harald Welte3cfa4502015-12-25 15:33:41 +010031
Harald Weltecee5a282015-12-26 08:43:31 +010032#include "hnbgw.h"
Harald Welte3cfa4502015-12-25 15:33:41 +010033
34static int cn_ranap_rx_initiating_msg_co(void *ctx, RANAP_InitiatingMessage_t *imsg,
35 ranap_message *message)
36{
37 int rc = 0;
38
39 message->procedureCode = imsg->procedureCode;
40 message->criticality = imsg->criticality;
41
42 DEBUGP(DRANAP, "Rx CO IM (%s)\n",
43 get_value_string(ranap_procedure_code_vals, imsg->procedureCode));
44
45 switch (imsg->procedureCode) {
46 case RANAP_ProcedureCode_id_InitialUE_Message:
47 rc = ranap_decode_initialue_messageies(&message->msg.initialUE_MessageIEs, &imsg->value);
48 break;
49 case RANAP_ProcedureCode_id_DirectTransfer:
50 rc = ranap_decode_directtransferies(&message->msg.directTransferIEs, &imsg->value);
51 break;
52 case RANAP_ProcedureCode_id_RAB_ReleaseRequest:
53 /* RNC requests the release of RAB */
54 rc = ranap_decode_rab_releaserequesties(&message->msg.raB_ReleaseRequestIEs, &imsg->value);
55 break;
56 case RANAP_ProcedureCode_id_Iu_ReleaseRequest:
57 /* RNC requests the release of Iu */
58 rc = ranap_decode_iu_releaserequesties(&message->msg.iu_ReleaseRequestIEs, &imsg->value);
59 break;
60 case RANAP_ProcedureCode_id_ErrorIndication:
61 rc = ranap_decode_errorindicationies(&message->msg.errorIndicationIEs, &imsg->value);
62 break;
63 case RANAP_ProcedureCode_id_RAB_ModifyRequest:
64 rc = ranap_decode_rab_modifyrequesties(&message->msg.raB_ModifyRequestIEs, &imsg->value);
65 break;
Neels Hofmeyr68b7a472016-04-19 00:13:11 +020066 case RANAP_ProcedureCode_id_SecurityModeControl:
67 /* Only an RNC will receive a Security Mode Control as
68 * Initiating Message, in other words: only hnb-test. */
69 rc = ranap_decode_securitymodecommandies(&message->msg.securityModeCommandIEs, &imsg->value);
70 break;
Harald Welte3cfa4502015-12-25 15:33:41 +010071 default:
72 LOGP(DRANAP, LOGL_NOTICE, "Received suspicious RANAP "
73 "Procedure %s (CO, IM) from RNC, ignoring\n",
74 get_value_string(ranap_procedure_code_vals, imsg->procedureCode));
75 rc = -1;
76 break;
77 }
78
79 return rc;
80}
81
Daniel Willmannc858fe92016-01-07 14:28:06 +010082static void cn_ranap_free_initiating_msg_co(ranap_message *message)
83{
84 switch (message->procedureCode) {
85 case RANAP_ProcedureCode_id_InitialUE_Message:
86 ranap_free_initialue_messageies(&message->msg.initialUE_MessageIEs);
87 break;
88 case RANAP_ProcedureCode_id_DirectTransfer:
89 ranap_free_directtransferies(&message->msg.directTransferIEs);
90 break;
91 case RANAP_ProcedureCode_id_RAB_ReleaseRequest:
92 /* RNC requests the release of RAB */
93 ranap_free_rab_releaserequesties(&message->msg.raB_ReleaseRequestIEs);
94 break;
95 case RANAP_ProcedureCode_id_Iu_ReleaseRequest:
96 /* RNC requests the release of Iu */
97 ranap_free_iu_releaserequesties(&message->msg.iu_ReleaseRequestIEs);
98 break;
99 case RANAP_ProcedureCode_id_ErrorIndication:
100 ranap_free_errorindicationies(&message->msg.errorIndicationIEs);
101 break;
102 case RANAP_ProcedureCode_id_RAB_ModifyRequest:
103 ranap_free_rab_modifyrequesties(&message->msg.raB_ModifyRequestIEs);
104 break;
Neels Hofmeyr68b7a472016-04-19 00:13:11 +0200105 case RANAP_ProcedureCode_id_SecurityModeControl:
106 /* Only an RNC will receive a Security Mode Control as
107 * Initiating Message, in other words: only hnb-test. */
108 ranap_free_securitymodecommandies(&message->msg.securityModeCommandIEs);
109 break;
Daniel Willmannc858fe92016-01-07 14:28:06 +0100110 default:
111 LOGP(DRANAP, LOGL_NOTICE, "Not freeing suspicious RANAP "
112 "Procedure %s (CO, IM) from RNC\n",
113 get_value_string(ranap_procedure_code_vals, message->procedureCode));
114 break;
115 }
116}
117
Harald Welte3cfa4502015-12-25 15:33:41 +0100118static int cn_ranap_rx_successful_msg_co(void *ctx, RANAP_SuccessfulOutcome_t *imsg,
119 ranap_message *message)
120{
121 int rc = 0;
122
123 message->procedureCode = imsg->procedureCode;
124 message->criticality = imsg->criticality;
125
Harald Weltea31e63a2015-12-28 13:19:35 +0100126 DEBUGP(DRANAP, "Rx CO SO (%s)\n",
Harald Welte3cfa4502015-12-25 15:33:41 +0100127 get_value_string(ranap_procedure_code_vals, imsg->procedureCode));
128
129 switch (imsg->procedureCode) {
130 case RANAP_ProcedureCode_id_RAB_Assignment:
131 /* RAB assignment response */
132 rc = ranap_decode_rab_assignmentresponseies(&message->msg.raB_AssignmentResponseIEs, &imsg->value);
133 break;
134 case RANAP_ProcedureCode_id_SecurityModeControl:
135 /* Security Mode Complete */
136 rc = ranap_decode_securitymodecompleteies(&message->msg.securityModeCompleteIEs, &imsg->value);
137 break;
138 case RANAP_ProcedureCode_id_Iu_Release:
139 /* Iu release Complete; confirmation of CN-initiated release */
140 rc = ranap_decode_iu_releasecompleteies(&message->msg.iu_ReleaseCompleteIEs, &imsg->value);
141 break;
142 default:
143 LOGP(DRANAP, LOGL_NOTICE, "Received suspicious RANAP "
144 "Procedure %s (SO) from RNC, ignoring\n",
145 get_value_string(ranap_procedure_code_vals, imsg->procedureCode));
146 rc = -1;
147 break;
148 }
149
150 return rc;
151}
152
Daniel Willmannc858fe92016-01-07 14:28:06 +0100153static void cn_ranap_free_successful_msg_co(ranap_message *message)
154{
155 switch (message->procedureCode) {
156 case RANAP_ProcedureCode_id_RAB_Assignment:
157 /* RAB assignment response */
158 ranap_free_rab_assignmentresponseies(&message->msg.raB_AssignmentResponseIEs);
159 break;
160 case RANAP_ProcedureCode_id_SecurityModeControl:
161 /* Security Mode Complete */
162 ranap_free_securitymodecompleteies(&message->msg.securityModeCompleteIEs);
163 break;
164 case RANAP_ProcedureCode_id_Iu_Release:
165 /* Iu release Complete; confirmation of CN-initiated release */
166 ranap_free_iu_releasecompleteies(&message->msg.iu_ReleaseCompleteIEs);
167 break;
168 default:
169 LOGP(DRANAP, LOGL_NOTICE, "Not freeing suspicious RANAP "
170 "Procedure %s (SO) from RNC\n",
171 get_value_string(ranap_procedure_code_vals, message->procedureCode));
172 break;
173 }
174}
175
Harald Welte7bccc982015-12-28 14:44:49 +0100176static int cn_ranap_rx_outcome_msg_co(void *ctx, RANAP_Outcome_t *imsg,
177 ranap_message *message)
178{
179 int rc = 0;
180
181 message->procedureCode = imsg->procedureCode;
182 message->criticality = imsg->criticality;
183
184 DEBUGP(DRANAP, "Rx CO O (%s)\n",
185 get_value_string(ranap_procedure_code_vals, imsg->procedureCode));
186
187 switch (imsg->procedureCode) {
188 case RANAP_ProcedureCode_id_RAB_Assignment:
189 /* RAB assignment response */
190 rc = ranap_decode_rab_assignmentresponseies(&message->msg.raB_AssignmentResponseIEs, &imsg->value);
191 break;
192 default:
193 LOGP(DRANAP, LOGL_NOTICE, "Received suspicious RANAP "
194 "Procedure %s (O) from RNC, ignoring\n",
195 get_value_string(ranap_procedure_code_vals, imsg->procedureCode));
196 rc = -1;
197 break;
198 }
199
200 return rc;
201}
202
Daniel Willmannc858fe92016-01-07 14:28:06 +0100203static void cn_ranap_free_outcome_msg_co(ranap_message *message)
204{
205 switch (message->procedureCode) {
206 case RANAP_ProcedureCode_id_RAB_Assignment:
207 /* RAB assignment response */
208 ranap_free_rab_assignmentresponseies(&message->msg.raB_AssignmentResponseIEs);
209 break;
210 default:
211 LOGP(DRANAP, LOGL_NOTICE, "Not freeing suspicious RANAP "
212 "Procedure %s (O) from RNC\n",
213 get_value_string(ranap_procedure_code_vals, message->procedureCode));
214 break;
215 }
216}
217
Harald Welte3cfa4502015-12-25 15:33:41 +0100218static int _cn_ranap_rx_co(void *ctx, RANAP_RANAP_PDU_t *pdu, ranap_message *message)
219{
220 int rc = 0;
221
222 switch (pdu->present) {
223 case RANAP_RANAP_PDU_PR_initiatingMessage:
224 rc = cn_ranap_rx_initiating_msg_co(ctx, &pdu->choice.initiatingMessage, message);
225 break;
226 case RANAP_RANAP_PDU_PR_successfulOutcome:
227 rc = cn_ranap_rx_successful_msg_co(ctx, &pdu->choice.successfulOutcome, message);
228 break;
229 case RANAP_RANAP_PDU_PR_unsuccessfulOutcome:
230 LOGP(DRANAP, LOGL_NOTICE, "Received unsupported RANAP "
231 "unsuccessful outcome procedure %s (CO) from RNC, ignoring\n",
232 get_value_string(ranap_procedure_code_vals,
233 pdu->choice.unsuccessfulOutcome.procedureCode));
234 rc = -1;
235 break;
Harald Welte7bccc982015-12-28 14:44:49 +0100236 case RANAP_RANAP_PDU_PR_outcome:
Daniel Willmann366dcf22016-01-07 14:12:07 +0100237 rc = cn_ranap_rx_outcome_msg_co(ctx, &pdu->choice.outcome, message);
Harald Welte7bccc982015-12-28 14:44:49 +0100238 break;
Harald Welte3cfa4502015-12-25 15:33:41 +0100239 default:
240 LOGP(DRANAP, LOGL_NOTICE, "Received suspicious RANAP "
241 "presence %s (CO) from RNC, ignoring\n",
242 get_value_string(ranap_presence_vals, pdu->present));
243 rc = -1;
244 break;
245 }
246
247 return rc;
248}
249
Daniel Willmannc858fe92016-01-07 14:28:06 +0100250static void _cn_ranap_free_co(ranap_message *message)
251{
252 switch (message->direction) {
253 case RANAP_RANAP_PDU_PR_initiatingMessage:
254 cn_ranap_free_initiating_msg_co(message);
255 break;
256 case RANAP_RANAP_PDU_PR_successfulOutcome:
257 cn_ranap_free_successful_msg_co(message);
258 break;
259 case RANAP_RANAP_PDU_PR_unsuccessfulOutcome:
260 LOGP(DRANAP, LOGL_NOTICE, "Not freeing unsupported RANAP "
261 "unsuccessful outcome procedure (CO) from RNC\n");
262 break;
263 case RANAP_RANAP_PDU_PR_outcome:
264 cn_ranap_free_outcome_msg_co(message);
265 break;
266 default:
267 LOGP(DRANAP, LOGL_NOTICE, "Received suspicious RANAP "
268 "presence %s (CO) from RNC, ignoring\n",
269 get_value_string(ranap_presence_vals, message->direction));
270 break;
271 }
272}
273
Harald Welte3cfa4502015-12-25 15:33:41 +0100274/* receive a connection-oriented RANAP message and call
275 * cn_ranap_handle_co() with the resulting ranap_message struct */
Harald Welte8fa5d552016-01-05 15:01:53 +0100276int ranap_cn_rx_co(ranap_handle_cb cb, void *ctx, uint8_t *data, size_t len)
Harald Welte3cfa4502015-12-25 15:33:41 +0100277{
278 RANAP_RANAP_PDU_t *pdu = NULL;
279 ranap_message message;
280 asn_dec_rval_t dec_ret;
281 int rc;
282
283 memset(&message, 0, sizeof(message));
284
Harald Welte3cfa4502015-12-25 15:33:41 +0100285 dec_ret = aper_decode(NULL,&asn_DEF_RANAP_RANAP_PDU, (void **) &pdu,
286 data, len, 0, 0);
287 if (dec_ret.code != RC_OK) {
288 LOGP(DRANAP, LOGL_ERROR, "Error in RANAP ASN.1 decode\n");
289 return rc;
290 }
291
292 message.direction = pdu->present;
293
294 rc = _cn_ranap_rx_co(ctx, pdu, &message);
295
296 if (rc == 0)
Harald Welte8fa5d552016-01-05 15:01:53 +0100297 (*cb)(ctx, &message);
Harald Welte49287972015-12-29 19:00:35 +0100298 else
299 LOGP(DRANAP, LOGL_ERROR, "Not calling cn_ranap_handle_co() due to rc=%d\n", rc);
Harald Welte3cfa4502015-12-25 15:33:41 +0100300
Daniel Willmannc858fe92016-01-07 14:28:06 +0100301 /* Free the asn1 structs in message */
302 _cn_ranap_free_co(&message);
303
Harald Welte3cfa4502015-12-25 15:33:41 +0100304 ASN_STRUCT_FREE(asn_DEF_RANAP_RANAP_PDU, pdu);
305
306 return rc;
307}
308
309static int cn_ranap_rx_initiating_msg_cl(void *ctx, RANAP_InitiatingMessage_t *imsg,
310 ranap_message *message)
311{
312 int rc;
313
314 message->procedureCode = imsg->procedureCode;
315 message->criticality = imsg->criticality;
316
317 DEBUGP(DRANAP, "Rx CL IM (%s)\n",
318 get_value_string(ranap_procedure_code_vals, imsg->procedureCode));
319
320 switch (imsg->procedureCode) {
321 case RANAP_ProcedureCode_id_Reset:
322 /* Reset request */
323 rc = ranap_decode_reseties(&message->msg.resetIEs, &imsg->value);
324 break;
325 case RANAP_ProcedureCode_id_OverloadControl: /* Overload ind */
326 rc = ranap_decode_overloadies(&message->msg.overloadIEs, &imsg->value);
327 break;
328 case RANAP_ProcedureCode_id_ErrorIndication: /* Error ind */
329 rc = ranap_decode_errorindicationies(&message->msg.errorIndicationIEs, &imsg->value);
330 break;
331 case RANAP_ProcedureCode_id_ResetResource: /* request */
332 rc = ranap_decode_resetresourceies(&message->msg.resetResourceIEs, &imsg->value);
333 break;
334 case RANAP_ProcedureCode_id_InformationTransfer:
335 rc = ranap_decode_informationtransferindicationies(&message->msg.informationTransferIndicationIEs, &imsg->value);
336 break;
337 case RANAP_ProcedureCode_id_DirectInformationTransfer:
338 rc = ranap_decode_directinformationtransferies(&message->msg.directInformationTransferIEs, &imsg->value);
339 break;
340 case RANAP_ProcedureCode_id_UplinkInformationExchange:
341 rc = ranap_decode_uplinkinformationexchangerequesties(&message->msg.uplinkInformationExchangeRequestIEs, &imsg->value);
342 break;
343 default:
344 LOGP(DRANAP, LOGL_NOTICE, "Received suspicious RANAP "
345 "Procedure %s (CL, IM) from RNC, ignoring\n",
346 get_value_string(ranap_procedure_code_vals, imsg->procedureCode));
347 break;
348 }
349}
350
Daniel Willmannc35b2982016-01-07 14:13:49 +0100351static void cn_ranap_free_initiating_msg_cl(ranap_message *message)
352{
353
354 switch (message->procedureCode) {
355 case RANAP_ProcedureCode_id_Reset:
356 /* Reset request */
357 ranap_free_reseties(&message->msg.resetIEs);
358 break;
359 case RANAP_ProcedureCode_id_OverloadControl: /* Overload ind */
360 ranap_free_overloadies(&message->msg.overloadIEs);
361 break;
362 case RANAP_ProcedureCode_id_ErrorIndication: /* Error ind */
363 ranap_free_errorindicationies(&message->msg.errorIndicationIEs);
364 break;
365 case RANAP_ProcedureCode_id_ResetResource: /* request */
366 ranap_free_resetresourceies(&message->msg.resetResourceIEs);
367 break;
368 case RANAP_ProcedureCode_id_InformationTransfer:
369 ranap_free_informationtransferindicationies(&message->msg.informationTransferIndicationIEs);
370 break;
371 case RANAP_ProcedureCode_id_DirectInformationTransfer:
372 ranap_free_directinformationtransferies(&message->msg.directInformationTransferIEs);
373 break;
374 case RANAP_ProcedureCode_id_UplinkInformationExchange:
375 ranap_free_uplinkinformationexchangerequesties(&message->msg.uplinkInformationExchangeRequestIEs);
376 break;
377 default:
378 LOGP(DRANAP, LOGL_NOTICE, "Not freeing suspicious RANAP "
379 "Procedure %s (CL, IM)\n",
380 get_value_string(ranap_procedure_code_vals, message->procedureCode));
381 break;
382 }
383}
384
Harald Welte3cfa4502015-12-25 15:33:41 +0100385static int cn_ranap_rx_successful_msg_cl(void *ctx, RANAP_SuccessfulOutcome_t *imsg,
386 ranap_message *message)
387{
388 int rc;
389
390 message->procedureCode = imsg->procedureCode;
391 message->criticality = imsg->criticality;
392
393 DEBUGP(DRANAP, "Rx CL SO (%s)\n",
394 get_value_string(ranap_procedure_code_vals, imsg->procedureCode));
395
396 switch (imsg->procedureCode) {
397 case RANAP_ProcedureCode_id_Reset: /* Reset acknowledge */
398 rc = ranap_decode_resetacknowledgeies(&message->msg.resetAcknowledgeIEs, &imsg->value);
399 break;
400 case RANAP_ProcedureCode_id_ResetResource: /* response */
401 rc = ranap_decode_resetresourceacknowledgeies(&message->msg.resetResourceAcknowledgeIEs, &imsg->value);
Daniel Willmann618f0f52016-01-07 14:11:01 +0100402 break;
Harald Welte3cfa4502015-12-25 15:33:41 +0100403 case RANAP_ProcedureCode_id_InformationTransfer:
404 rc = ranap_decode_resetresourceacknowledgeies(&message->msg.resetResourceAcknowledgeIEs, &imsg->value);
405 break;
406 case RANAP_ProcedureCode_id_DirectInformationTransfer:
407 rc = ranap_decode_informationtransferconfirmationies(&message->msg.informationTransferConfirmationIEs, &imsg->value);
408 break;
409 case RANAP_ProcedureCode_id_UplinkInformationExchange:
410 rc = ranap_decode_uplinkinformationexchangeresponseies(&message->msg.uplinkInformationExchangeResponseIEs, &imsg->value);
411 break;
412 default:
413 LOGP(DRANAP, LOGL_NOTICE, "Received suspicious RANAP "
414 "Procedure %s (CL, SO) from RNC, ignoring\n",
415 get_value_string(ranap_procedure_code_vals, imsg->procedureCode));
416 break;
417 }
418}
419
Daniel Willmannc35b2982016-01-07 14:13:49 +0100420static void cn_ranap_free_successful_msg_cl(ranap_message *message)
421{
422 switch (message->procedureCode) {
423 case RANAP_ProcedureCode_id_Reset: /* Reset acknowledge */
424 ranap_free_resetacknowledgeies(&message->msg.resetAcknowledgeIEs);
425 break;
426 case RANAP_ProcedureCode_id_ResetResource: /* response */
427 ranap_free_resetresourceacknowledgeies(&message->msg.resetResourceAcknowledgeIEs);
428 break;
429 case RANAP_ProcedureCode_id_InformationTransfer:
430 ranap_free_resetresourceacknowledgeies(&message->msg.resetResourceAcknowledgeIEs);
431 break;
432 case RANAP_ProcedureCode_id_DirectInformationTransfer:
433 ranap_free_informationtransferconfirmationies(&message->msg.informationTransferConfirmationIEs);
434 break;
435 case RANAP_ProcedureCode_id_UplinkInformationExchange:
436 ranap_free_uplinkinformationexchangeresponseies(&message->msg.uplinkInformationExchangeResponseIEs);
437 break;
438 default:
439 LOGP(DRANAP, LOGL_NOTICE, "Not freeing suspicious RANAP "
440 "Procedure %s (CL, SO)\n",
441 get_value_string(ranap_procedure_code_vals, message->procedureCode));
442 break;
443 }
444}
445
Harald Welte3cfa4502015-12-25 15:33:41 +0100446static int _cn_ranap_rx_cl(void *ctx, RANAP_RANAP_PDU_t *pdu, ranap_message *message)
447{
448 int rc;
449
Daniel Willmannc35b2982016-01-07 14:13:49 +0100450 /* Extend _cn_ranap_free_cl as well when extending this function */
451
Harald Welte3cfa4502015-12-25 15:33:41 +0100452 switch (pdu->present) {
453 case RANAP_RANAP_PDU_PR_initiatingMessage:
454 rc = cn_ranap_rx_initiating_msg_cl(ctx, &pdu->choice.initiatingMessage,
455 message);
456 break;
457 case RANAP_RANAP_PDU_PR_successfulOutcome:
458 rc = cn_ranap_rx_successful_msg_cl(ctx, &pdu->choice.successfulOutcome,
459 message);
460 break;
461 case RANAP_RANAP_PDU_PR_unsuccessfulOutcome:
462 LOGP(DRANAP, LOGL_NOTICE, "Received unsupported RANAP "
463 "unsuccessful outcome procedure %s (CL) from RNC, ignoring\n",
464 get_value_string(ranap_procedure_code_vals,
465 pdu->choice.unsuccessfulOutcome.procedureCode));
466 break;
467 default:
468 LOGP(DRANAP, LOGL_NOTICE, "Received suspicious RANAP "
469 "presence %s (CL) from RNC, ignoring\n",
470 get_value_string(ranap_presence_vals, pdu->present));
471 break;
472 }
473}
474
Daniel Willmannc35b2982016-01-07 14:13:49 +0100475static void _cn_ranap_free_cl(ranap_message *message)
476{
477 switch (message->direction) {
478 case RANAP_RANAP_PDU_PR_initiatingMessage:
479 cn_ranap_free_initiating_msg_cl(message);
480 break;
481 case RANAP_RANAP_PDU_PR_successfulOutcome:
482 cn_ranap_free_successful_msg_cl(message);
483 break;
484 case RANAP_RANAP_PDU_PR_unsuccessfulOutcome:
485 LOGP(DRANAP, LOGL_NOTICE, "Not freeing unsupported RANAP "
486 "unsuccessful outcome procedure from RNC\n");
487 break;
488 default:
489 LOGP(DRANAP, LOGL_NOTICE, "Suspicious RANAP "
490 "presence %s (CL) from RNC, ignoring\n", message->direction);
491 break;
492 }
493}
494
495/* receive a connection-less RANAP message and call
Harald Welte3cfa4502015-12-25 15:33:41 +0100496 * cn_ranap_handle_co() with the resulting ranap_message struct */
Harald Welte8fa5d552016-01-05 15:01:53 +0100497int ranap_cn_rx_cl(ranap_handle_cb cb, void *ctx, uint8_t *data, size_t len)
Harald Welte3cfa4502015-12-25 15:33:41 +0100498{
499 RANAP_RANAP_PDU_t *pdu = NULL;
500 ranap_message message;
501 asn_dec_rval_t dec_ret;
502 int rc;
503
504 memset(&message, 0, sizeof(message));
505
Harald Welte3cfa4502015-12-25 15:33:41 +0100506 dec_ret = aper_decode(NULL,&asn_DEF_RANAP_RANAP_PDU, (void **) &pdu,
507 data, len, 0, 0);
508 if (dec_ret.code != RC_OK) {
509 LOGP(DRANAP, LOGL_ERROR, "Error in RANAP ASN.1 decode\n");
510 return rc;
511 }
512
513 message.direction = pdu->present;
514
515 rc = _cn_ranap_rx_cl(ctx, pdu, &message);
516
517 if (rc == 0)
Harald Welte8fa5d552016-01-05 15:01:53 +0100518 (*cb)(ctx, &message);
Harald Welte49287972015-12-29 19:00:35 +0100519 else
520 LOGP(DRANAP, LOGL_ERROR, "Not calling cn_ranap_handle_cl() due to rc=%d\n", rc);
Harald Welte3cfa4502015-12-25 15:33:41 +0100521
Daniel Willmannc35b2982016-01-07 14:13:49 +0100522 /* Free the asn1 structs in message */
523 _cn_ranap_free_cl(&message);
524
Harald Welte3cfa4502015-12-25 15:33:41 +0100525 ASN_STRUCT_FREE(asn_DEF_RANAP_RANAP_PDU, pdu);
526
527 return rc;
528}