4 size_t encode_E2AP_PDU(E2AP_PDU_t* pdu, void* buffer, size_t buf_size)
6 asn_enc_rval_t encode_result;
7 encode_result = aper_encode_to_buffer(&asn_DEF_E2AP_PDU, NULL, pdu, buffer, buf_size);
8 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu);
9 if(encode_result.encoded == -1) {
10 fprintf(stderr, "Cannot encode %s: %s\n", encode_result.failed_type->name, strerror(errno));
13 return encode_result.encoded;
17 E2AP_PDU_t* decode_E2AP_PDU(const void* buffer, size_t buf_size)
19 asn_dec_rval_t decode_result;
21 decode_result = aper_decode_complete(NULL, &asn_DEF_E2AP_PDU, (void **)&pdu, buffer, buf_size);
22 if(decode_result.code == RC_OK) {
25 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu);
30 /* RICsubscriptionRequest */
31 long e2ap_get_ric_subscription_request_sequence_number(void *buffer, size_t buf_size)
33 E2AP_PDU_t *pdu = decode_E2AP_PDU(buffer, buf_size);
34 if ( pdu != NULL && pdu->present == E2AP_PDU_PR_initiatingMessage)
36 InitiatingMessage_t* initiatingMessage = pdu->choice.initiatingMessage;
37 if ( initiatingMessage->procedureCode == ProcedureCode_id_RICsubscription
38 && initiatingMessage->value.present == InitiatingMessage__value_PR_RICsubscriptionRequest)
40 RICsubscriptionRequest_t *ric_subscription_request = &(initiatingMessage->value.choice.RICsubscriptionRequest);
41 for (int i = 0; i < ric_subscription_request->protocolIEs.list.count; ++i )
43 if ( ric_subscription_request->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICrequestID )
45 long sequenceNumber = ric_subscription_request->protocolIEs.list.array[i]->value.choice.RICrequestID.ricInstanceID;
46 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu);
47 return sequenceNumber;
54 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu);
58 ssize_t e2ap_set_ric_subscription_request_sequence_number(void *buffer, size_t buf_size, long sequence_number)
60 E2AP_PDU_t *pdu = decode_E2AP_PDU(buffer, buf_size);
61 if ( pdu != NULL && pdu->present == E2AP_PDU_PR_initiatingMessage)
63 InitiatingMessage_t* initiatingMessage = pdu->choice.initiatingMessage;
64 if ( initiatingMessage->procedureCode == ProcedureCode_id_RICsubscription
65 && initiatingMessage->value.present == InitiatingMessage__value_PR_RICsubscriptionRequest)
67 RICsubscriptionRequest_t *ricSubscriptionRequest = &initiatingMessage->value.choice.RICsubscriptionRequest;
68 for (int i = 0; i < ricSubscriptionRequest->protocolIEs.list.count; ++i )
70 if ( ricSubscriptionRequest->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICrequestID )
72 ricSubscriptionRequest->protocolIEs.list.array[i]->value.choice.RICrequestID.ricInstanceID = sequence_number;
73 return encode_E2AP_PDU(pdu, buffer, buf_size);
80 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu);
84 ssize_t e2ap_encode_ric_subscription_request_message(void *buffer, size_t buf_size, long ricRequestorID, long ricRequestSequenceNumber, long ranFunctionID, void *eventTriggerDefinition, size_t eventTriggerDefinitionSize, int actionCount, long *actionIds, long* actionTypes, RICactionDefinition *actionDefinitions, RICSubsequentAction *subsequentActionTypes)
86 E2AP_PDU_t *init = (E2AP_PDU_t *)calloc(1, sizeof(E2AP_PDU_t));
88 fprintf(stderr, "alloc E2AP_PDU failed\n");
92 InitiatingMessage_t *initiatingMsg = (InitiatingMessage_t *)calloc(1, sizeof(InitiatingMessage_t));
94 fprintf(stderr, "alloc InitiatingMessage failed\n");
95 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, init);
99 init->choice.initiatingMessage = initiatingMsg;
100 init->present = E2AP_PDU_PR_initiatingMessage;
102 initiatingMsg->procedureCode = ProcedureCode_id_RICsubscription;
103 initiatingMsg->criticality = Criticality_reject;
104 initiatingMsg->value.present = InitiatingMessage__value_PR_RICsubscriptionRequest;
106 RICsubscriptionRequest_t *subscription_request = &initiatingMsg->value.choice.RICsubscriptionRequest;
108 // request contains 5 IEs
111 RICsubscriptionRequest_IEs_t *ies_reqID = (RICsubscriptionRequest_IEs_t *)calloc(1, sizeof(RICsubscriptionRequest_IEs_t));
113 fprintf(stderr, "alloc RICrequestID failed\n");
114 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, init);
118 ies_reqID->criticality = Criticality_reject;
119 ies_reqID->id = ProtocolIE_ID_id_RICrequestID;
120 ies_reqID->value.present = RICsubscriptionRequest_IEs__value_PR_RICrequestID;
121 RICrequestID_t *ricrequest_ie = &ies_reqID->value.choice.RICrequestID;
122 ricrequest_ie->ricRequestorID = ricRequestorID;
123 ricrequest_ie->ricInstanceID = ricRequestSequenceNumber;
124 ASN_SEQUENCE_ADD(&subscription_request->protocolIEs.list, ies_reqID);
127 RICsubscriptionRequest_IEs_t *ies_ranfunc = (RICsubscriptionRequest_IEs_t *)calloc(1, sizeof(RICsubscriptionRequest_IEs_t));
129 fprintf(stderr, "alloc RICfunctionID failed\n");
130 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, init);
134 ies_ranfunc->criticality = Criticality_reject;
135 ies_ranfunc->id = ProtocolIE_ID_id_RANfunctionID;
136 ies_ranfunc->value.present = RICsubscriptionRequest_IEs__value_PR_RANfunctionID;
137 RANfunctionID_t *ranfunction_ie = &ies_ranfunc->value.choice.RANfunctionID;
138 *ranfunction_ie = ranFunctionID;
139 ASN_SEQUENCE_ADD(&subscription_request->protocolIEs.list, ies_ranfunc);
142 RICsubscriptionRequest_IEs_t *ies_subscription = (RICsubscriptionRequest_IEs_t *)calloc(1, sizeof(RICsubscriptionRequest_IEs_t));
143 if(!ies_subscription) {
144 fprintf(stderr, "alloc RICsubscription failed\n");
145 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, init);
149 ies_subscription->criticality = Criticality_reject;
150 ies_subscription->id = ProtocolIE_ID_id_RICsubscriptionDetails;
151 ies_subscription->value.present = RICsubscriptionRequest_IEs__value_PR_RICsubscriptionDetails;
152 RICsubscriptionDetails_t *ricsubscription_ie = &ies_subscription->value.choice.RICsubscriptionDetails;
154 // RICeventTriggerDefinition
155 RICeventTriggerDefinition_t *eventTrigger = &ricsubscription_ie->ricEventTriggerDefinition;
156 eventTrigger->buf = (uint8_t *)calloc(1, eventTriggerDefinitionSize);
157 if(!eventTrigger->buf) {
158 fprintf(stderr, "alloc eventTrigger failed\n");
159 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, init);
163 memcpy(eventTrigger->buf, eventTriggerDefinition, eventTriggerDefinitionSize);
164 eventTrigger->size = eventTriggerDefinitionSize;
166 // RICactions-ToBeSetup-List
167 RICactions_ToBeSetup_List_t *ricActions = &ricsubscription_ie->ricAction_ToBeSetup_List;
169 while (index < actionCount) {
170 RICaction_ToBeSetup_ItemIEs_t *ies_action = (RICaction_ToBeSetup_ItemIEs_t *)calloc(1, sizeof(RICaction_ToBeSetup_ItemIEs_t));
172 fprintf(stderr, "alloc RICaction failed\n");
173 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, init);
177 ies_action->criticality = Criticality_reject;
178 ies_action->id = ProtocolIE_ID_id_RICaction_ToBeSetup_Item;
179 ies_action->value.present = RICaction_ToBeSetup_ItemIEs__value_PR_RICaction_ToBeSetup_Item;
180 RICaction_ToBeSetup_Item_t *ricaction_ie = &ies_action->value.choice.RICaction_ToBeSetup_Item;
181 ricaction_ie->ricActionID = actionIds[index];
182 ricaction_ie->ricActionType = actionTypes[index];
184 int actionDefinitionSize = actionDefinitions[index].size;
185 if(actionDefinitionSize != 0) {
186 RICactionDefinition_t *actionDefinition = ricaction_ie->ricActionDefinition;
188 actionDefinition->buf = (uint8_t *)calloc(1, actionDefinitionSize);
189 if(!actionDefinition->buf) {
190 fprintf(stderr, "alloc actionDefinition[%d] failed\n", index);
191 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, init);
195 memcpy(actionDefinition->buf, actionDefinitions[index].actionDefinition, actionDefinitionSize);
196 actionDefinition->size = actionDefinitionSize;
199 if(subsequentActionTypes[index].isValid != 0) {
200 RICsubsequentAction_t *subsequentAction = ricaction_ie->ricSubsequentAction;
201 subsequentAction->ricSubsequentActionType = subsequentActionTypes[index].subsequentActionType;
202 subsequentAction->ricTimeToWait = subsequentActionTypes[index].timeToWait;
205 ASN_SEQUENCE_ADD(&ricActions->list, ies_action);
208 ASN_SEQUENCE_ADD(&subscription_request->protocolIEs.list, ies_subscription);
210 return encode_E2AP_PDU(init, buffer, buf_size);
213 /* RICsubscriptionResponse */
214 long e2ap_get_ric_subscription_response_sequence_number(void *buffer, size_t buf_size)
216 E2AP_PDU_t *pdu = decode_E2AP_PDU(buffer, buf_size);
217 if ( pdu != NULL && pdu->present == E2AP_PDU_PR_successfulOutcome )
219 SuccessfulOutcome_t* successfulOutcome = pdu->choice.successfulOutcome;
220 if ( successfulOutcome->procedureCode == ProcedureCode_id_RICsubscription
221 && successfulOutcome->value.present == SuccessfulOutcome__value_PR_RICsubscriptionResponse)
223 RICsubscriptionResponse_t *ricSubscriptionResponse = &successfulOutcome->value.choice.RICsubscriptionResponse;
224 for (int i = 0; i < ricSubscriptionResponse->protocolIEs.list.count; ++i )
226 if ( ricSubscriptionResponse->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICrequestID )
228 long sequenceNumber = ricSubscriptionResponse->protocolIEs.list.array[i]->value.choice.RICrequestID.ricInstanceID;
229 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu);
230 return sequenceNumber;
237 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu);
241 ssize_t e2ap_set_ric_subscription_response_sequence_number(void *buffer, size_t buf_size, long sequence_number)
243 E2AP_PDU_t *pdu = decode_E2AP_PDU(buffer, buf_size);
244 if ( pdu != NULL && pdu->present == E2AP_PDU_PR_successfulOutcome )
246 SuccessfulOutcome_t* successfulOutcome = pdu->choice.successfulOutcome;
247 if ( successfulOutcome->procedureCode == ProcedureCode_id_RICsubscription
248 && successfulOutcome->value.present == SuccessfulOutcome__value_PR_RICsubscriptionResponse)
250 RICsubscriptionResponse_t *ricSubscriptionResponse = &successfulOutcome->value.choice.RICsubscriptionResponse;
251 for (int i = 0; i < ricSubscriptionResponse->protocolIEs.list.count; ++i )
253 if ( ricSubscriptionResponse->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICrequestID )
255 ricSubscriptionResponse->protocolIEs.list.array[i]->value.choice.RICrequestID.ricInstanceID = sequence_number;
256 return encode_E2AP_PDU(pdu, buffer, buf_size);
263 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu);
267 RICsubscriptionResponseMsg* e2ap_decode_ric_subscription_response_message(void *buffer, size_t buf_size)
269 E2AP_PDU_t *pdu = decode_E2AP_PDU(buffer, buf_size);
270 if ( pdu != NULL && pdu->present == E2AP_PDU_PR_successfulOutcome)
272 SuccessfulOutcome_t* successfulOutcome = pdu->choice.successfulOutcome;
273 if ( successfulOutcome->procedureCode == ProcedureCode_id_RICsubscription
274 && successfulOutcome->value.present == SuccessfulOutcome__value_PR_RICsubscriptionResponse)
276 RICsubscriptionResponse_t *subscriptionResponse = &(successfulOutcome->value.choice.RICsubscriptionResponse);
277 RICsubscriptionResponseMsg *msg = (RICsubscriptionResponseMsg *)calloc(1, sizeof(RICsubscriptionResponseMsg));
278 for (int i = 0; i < subscriptionResponse->protocolIEs.list.count; ++i )
280 if (subscriptionResponse->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICrequestID) {
281 msg->requestorID = subscriptionResponse->protocolIEs.list.array[i]->value.choice.RICrequestID.ricRequestorID;
282 msg->requestSequenceNumber = subscriptionResponse->protocolIEs.list.array[i]->value.choice.RICrequestID.ricInstanceID;
284 else if (subscriptionResponse->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RANfunctionID) {
285 msg->ranfunctionID = subscriptionResponse->protocolIEs.list.array[i]->value.choice.RANfunctionID;
287 else if (subscriptionResponse->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICactions_Admitted) {
288 RICaction_Admitted_List_t *ricActionAdmittedList = &(subscriptionResponse->protocolIEs.list.array[i]->value.choice.RICaction_Admitted_List);
290 while (index < ricActionAdmittedList->list.count) {
291 RICaction_Admitted_ItemIEs_t *ricActionAdmittedItem = (RICaction_Admitted_ItemIEs_t *)ricActionAdmittedList->list.array[index];
292 if (ricActionAdmittedItem->id == ProtocolIE_ID_id_RICaction_Admitted_Item) {
293 msg->ricActionAdmittedList.ricActionID[index] = ricActionAdmittedItem->value.choice.RICaction_Admitted_Item.ricActionID;
297 msg->ricActionAdmittedList.count = index;
299 else if (subscriptionResponse->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICactions_NotAdmitted) {
300 RICaction_NotAdmitted_List_t *ricActionNotAdmittedList = &(subscriptionResponse->protocolIEs.list.array[i]->value.choice.RICaction_NotAdmitted_List);
302 while (index < ricActionNotAdmittedList->list.count) {
303 RICaction_NotAdmitted_ItemIEs_t *ricActionNotAdmittedItem = (RICaction_NotAdmitted_ItemIEs_t *)ricActionNotAdmittedList->list.array[index];
304 if (ricActionNotAdmittedItem->id == ProtocolIE_ID_id_RICaction_NotAdmitted_Item) {
305 msg->ricActionNotAdmittedList.ricActionID[index] = ricActionNotAdmittedItem->value.choice.RICaction_NotAdmitted_Item.ricActionID;
306 int RICcauseType = ricActionNotAdmittedItem->value.choice.RICaction_NotAdmitted_Item.cause.present;
307 switch(RICcauseType) {
308 case Cause_PR_ricRequest:
309 msg->ricActionNotAdmittedList.ricCause[index].ricCauseType = Cause_PR_ricRequest;
310 msg->ricActionNotAdmittedList.ricCause[index].ricCauseID = ricActionNotAdmittedItem->value.choice.RICaction_NotAdmitted_Item.cause.choice.ricRequest;
312 case Cause_PR_ricService:
313 msg->ricActionNotAdmittedList.ricCause[index].ricCauseType = Cause_PR_ricService;
314 msg->ricActionNotAdmittedList.ricCause[index].ricCauseID = ricActionNotAdmittedItem->value.choice.RICaction_NotAdmitted_Item.cause.choice.ricService;
316 case Cause_PR_transport:
317 msg->ricActionNotAdmittedList.ricCause[index].ricCauseType = Cause_PR_transport;
318 msg->ricActionNotAdmittedList.ricCause[index].ricCauseID = ricActionNotAdmittedItem->value.choice.RICaction_NotAdmitted_Item.cause.choice.transport;
320 case Cause_PR_protocol:
321 msg->ricActionNotAdmittedList.ricCause[index].ricCauseType = Cause_PR_protocol;
322 msg->ricActionNotAdmittedList.ricCause[index].ricCauseID = ricActionNotAdmittedItem->value.choice.RICaction_NotAdmitted_Item.cause.choice.protocol;
325 msg->ricActionNotAdmittedList.ricCause[index].ricCauseType = Cause_PR_misc;
326 msg->ricActionNotAdmittedList.ricCause[index].ricCauseID = ricActionNotAdmittedItem->value.choice.RICaction_NotAdmitted_Item.cause.choice.misc;
332 msg->ricActionNotAdmittedList.count = index;
341 /* RICsubscriptionFailure */
342 long e2ap_get_ric_subscription_failure_sequence_number(void *buffer, size_t buf_size)
344 E2AP_PDU_t *pdu = decode_E2AP_PDU(buffer, buf_size);
345 if ( pdu != NULL && pdu->present == E2AP_PDU_PR_unsuccessfulOutcome )
347 UnsuccessfulOutcome_t* unsuccessfulOutcome = pdu->choice.unsuccessfulOutcome;
348 if ( unsuccessfulOutcome->procedureCode == ProcedureCode_id_RICsubscription
349 && unsuccessfulOutcome->value.present == UnsuccessfulOutcome__value_PR_RICsubscriptionFailure)
351 RICsubscriptionFailure_t *ricSubscriptionFailure = &unsuccessfulOutcome->value.choice.RICsubscriptionFailure;
352 for (int i = 0; i < ricSubscriptionFailure->protocolIEs.list.count; ++i )
354 if ( ricSubscriptionFailure->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICrequestID )
356 long sequenceNumber = ricSubscriptionFailure->protocolIEs.list.array[i]->value.choice.RICrequestID.ricInstanceID;
357 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu);
358 return sequenceNumber;
365 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu);
369 /* RICsubscriptionDeleteRequest */
370 long e2ap_get_ric_subscription_delete_request_sequence_number(void *buffer, size_t buf_size)
372 E2AP_PDU_t *pdu = decode_E2AP_PDU(buffer, buf_size);
373 if ( pdu != NULL && pdu->present == E2AP_PDU_PR_initiatingMessage )
375 InitiatingMessage_t* initiatingMessage = pdu->choice.initiatingMessage;
376 if ( initiatingMessage->procedureCode == ProcedureCode_id_RICsubscriptionDelete
377 && initiatingMessage->value.present == InitiatingMessage__value_PR_RICsubscriptionDeleteRequest )
379 RICsubscriptionDeleteRequest_t *subscriptionDeleteRequest = &initiatingMessage->value.choice.RICsubscriptionDeleteRequest;
380 for (int i = 0; i < subscriptionDeleteRequest->protocolIEs.list.count; ++i )
382 if ( subscriptionDeleteRequest->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICrequestID )
384 long sequenceNumber = subscriptionDeleteRequest->protocolIEs.list.array[i]->value.choice.RICrequestID.ricInstanceID;
385 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu);
386 return sequenceNumber;
393 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu);
397 ssize_t e2ap_set_ric_subscription_delete_request_sequence_number(void *buffer, size_t buf_size, long sequence_number)
399 E2AP_PDU_t *pdu = decode_E2AP_PDU(buffer, buf_size);
400 if ( pdu != NULL && pdu->present == E2AP_PDU_PR_initiatingMessage )
402 InitiatingMessage_t* initiatingMessage = pdu->choice.initiatingMessage;
403 if ( initiatingMessage->procedureCode == ProcedureCode_id_RICsubscriptionDelete
404 && initiatingMessage->value.present == InitiatingMessage__value_PR_RICsubscriptionDeleteRequest )
406 RICsubscriptionDeleteRequest_t* subscriptionDeleteRequest = &initiatingMessage->value.choice.RICsubscriptionDeleteRequest;
407 for (int i = 0; i < subscriptionDeleteRequest->protocolIEs.list.count; ++i )
409 if ( subscriptionDeleteRequest->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICrequestID )
411 subscriptionDeleteRequest->protocolIEs.list.array[i]->value.choice.RICrequestID.ricInstanceID = sequence_number;
412 return encode_E2AP_PDU(pdu, buffer, buf_size);
419 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu);
423 ssize_t e2ap_encode_ric_subscription_delete_request_message(void *buffer, size_t buf_size, long ricRequestorID, long ricRequestSequenceNumber, long ranFunctionID)
425 E2AP_PDU_t *init = (E2AP_PDU_t *)calloc(1, sizeof(E2AP_PDU_t));
427 fprintf(stderr, "alloc E2AP_PDU failed\n");
431 InitiatingMessage_t *initiatingMsg = (InitiatingMessage_t *)calloc(1, sizeof(InitiatingMessage_t));
433 fprintf(stderr, "alloc InitiatingMessage failed\n");
434 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, init);
438 init->choice.initiatingMessage = initiatingMsg;
439 init->present = E2AP_PDU_PR_initiatingMessage;
441 initiatingMsg->procedureCode = ProcedureCode_id_RICsubscriptionDelete;
442 initiatingMsg->criticality = Criticality_reject;
443 initiatingMsg->value.present = InitiatingMessage__value_PR_RICsubscriptionDeleteRequest;
445 RICsubscriptionDeleteRequest_t *subscription_delete_request = &initiatingMsg->value.choice.RICsubscriptionDeleteRequest;
447 // request contains 2 IEs
450 RICsubscriptionDeleteRequest_IEs_t *ies_reqID = (RICsubscriptionDeleteRequest_IEs_t *)calloc(1, sizeof(RICsubscriptionDeleteRequest_IEs_t));
452 fprintf(stderr, "alloc RICrequestID failed\n");
453 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, init);
457 ies_reqID->criticality = Criticality_reject;
458 ies_reqID->id = ProtocolIE_ID_id_RICrequestID;
459 ies_reqID->value.present = RICsubscriptionDeleteRequest_IEs__value_PR_RICrequestID;
460 RICrequestID_t *ricrequest_ie = &ies_reqID->value.choice.RICrequestID;
461 ricrequest_ie->ricRequestorID = ricRequestorID;
462 ricrequest_ie->ricInstanceID = ricRequestSequenceNumber;
463 ASN_SEQUENCE_ADD(&subscription_delete_request->protocolIEs.list, ies_reqID);
466 RICsubscriptionDeleteRequest_IEs_t *ies_ranfunc = (RICsubscriptionDeleteRequest_IEs_t *)calloc(1, sizeof(RICsubscriptionDeleteRequest_IEs_t));
468 fprintf(stderr, "alloc RICfunctionID failed\n");
469 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, init);
473 ies_ranfunc->criticality = Criticality_reject;
474 ies_ranfunc->id = ProtocolIE_ID_id_RANfunctionID;
475 ies_ranfunc->value.present = RICsubscriptionDeleteRequest_IEs__value_PR_RANfunctionID;
476 RANfunctionID_t *ranfunction_ie = &ies_ranfunc->value.choice.RANfunctionID;
477 *ranfunction_ie = ranFunctionID;
478 ASN_SEQUENCE_ADD(&subscription_delete_request->protocolIEs.list, ies_ranfunc);
480 return encode_E2AP_PDU(init, buffer, buf_size);
483 /* RICsubscriptionDeleteResponse */
484 long e2ap_get_ric_subscription_delete_response_sequence_number(void *buffer, size_t buf_size)
486 E2AP_PDU_t *pdu = decode_E2AP_PDU(buffer, buf_size);
487 if ( pdu != NULL && pdu->present == E2AP_PDU_PR_successfulOutcome )
489 SuccessfulOutcome_t* successfulOutcome = pdu->choice.successfulOutcome;
490 if ( successfulOutcome->procedureCode == ProcedureCode_id_RICsubscriptionDelete
491 && successfulOutcome->value.present == SuccessfulOutcome__value_PR_RICsubscriptionDeleteResponse )
493 RICsubscriptionDeleteResponse_t* subscriptionDeleteResponse = &successfulOutcome->value.choice.RICsubscriptionDeleteResponse;
494 for (int i = 0; i < subscriptionDeleteResponse->protocolIEs.list.count; ++i )
496 if ( subscriptionDeleteResponse->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICrequestID )
498 long sequenceNumber = subscriptionDeleteResponse->protocolIEs.list.array[i]->value.choice.RICrequestID.ricInstanceID;
499 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu);
500 return sequenceNumber;
507 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu);
511 ssize_t e2ap_set_ric_subscription_delete_response_sequence_number(void *buffer, size_t buf_size, long sequence_number)
513 E2AP_PDU_t *pdu = decode_E2AP_PDU(buffer, buf_size);
514 if ( pdu != NULL && pdu->present == E2AP_PDU_PR_successfulOutcome )
516 SuccessfulOutcome_t* successfulOutcome = pdu->choice.successfulOutcome;
517 if ( successfulOutcome->procedureCode == ProcedureCode_id_RICsubscriptionDelete
518 && successfulOutcome->value.present == SuccessfulOutcome__value_PR_RICsubscriptionDeleteResponse )
520 RICsubscriptionDeleteResponse_t* subscriptionDeleteResponse = &successfulOutcome->value.choice.RICsubscriptionDeleteResponse;
521 for (int i = 0; i < subscriptionDeleteResponse->protocolIEs.list.count; ++i )
523 if ( subscriptionDeleteResponse->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICrequestID )
525 subscriptionDeleteResponse->protocolIEs.list.array[i]->value.choice.RICrequestID.ricInstanceID = sequence_number;
526 return encode_E2AP_PDU(pdu, buffer, buf_size);
533 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu);
537 /* RICsubscriptionDeleteFailure */
538 long e2ap_get_ric_subscription_delete_failure_sequence_number(void *buffer, size_t buf_size)
540 E2AP_PDU_t *pdu = decode_E2AP_PDU(buffer, buf_size);
541 if ( pdu != NULL && pdu->present == E2AP_PDU_PR_unsuccessfulOutcome )
543 UnsuccessfulOutcome_t* unsuccessfulOutcome = pdu->choice.unsuccessfulOutcome;
544 if ( unsuccessfulOutcome->procedureCode == ProcedureCode_id_RICsubscriptionDelete
545 && unsuccessfulOutcome->value.present == UnsuccessfulOutcome__value_PR_RICsubscriptionDeleteFailure)
547 RICsubscriptionDeleteFailure_t *ricSubscriptionDeleteFailure = &unsuccessfulOutcome->value.choice.RICsubscriptionDeleteFailure;
548 for (int i = 0; i < ricSubscriptionDeleteFailure->protocolIEs.list.count; ++i )
550 if ( ricSubscriptionDeleteFailure->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICrequestID )
552 long sequenceNumber = ricSubscriptionDeleteFailure->protocolIEs.list.array[i]->value.choice.RICrequestID.ricInstanceID;
553 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu);
554 return sequenceNumber;
561 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu);
567 RICindicationMsg* e2ap_decode_ric_indication_message(void *buffer, size_t buf_size)
569 E2AP_PDU_t *pdu = decode_E2AP_PDU(buffer, buf_size);
570 if ( pdu != NULL && pdu->present == E2AP_PDU_PR_initiatingMessage)
572 InitiatingMessage_t* initiatingMessage = pdu->choice.initiatingMessage;
573 if ( initiatingMessage->procedureCode == ProcedureCode_id_RICindication
574 && initiatingMessage->value.present == InitiatingMessage__value_PR_RICindication)
576 RICindication_t *indication = &(initiatingMessage->value.choice.RICindication);
577 RICindicationMsg *msg = (RICindicationMsg *)calloc(1, sizeof(RICindicationMsg));
578 for (int i = 0; i < indication->protocolIEs.list.count; ++i )
580 if (indication->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICrequestID) {
581 msg->requestorID = indication->protocolIEs.list.array[i]->value.choice.RICrequestID.ricRequestorID;
582 msg->requestSequenceNumber = indication->protocolIEs.list.array[i]->value.choice.RICrequestID.ricInstanceID;
584 else if (indication->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RANfunctionID) {
585 msg->ranfunctionID = indication->protocolIEs.list.array[i]->value.choice.RANfunctionID;
587 else if (indication->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICactionID) {
588 msg->actionID = indication->protocolIEs.list.array[i]->value.choice.RICactionID;
590 else if(indication->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICindicationSN) {
591 msg->indicationSN = indication->protocolIEs.list.array[i]->value.choice.RICindicationSN;
593 else if(indication->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICindicationType) {
594 msg->indicationType = indication->protocolIEs.list.array[i]->value.choice.RICindicationType;
596 else if(indication->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICindicationHeader) {
597 size_t headerSize = indication->protocolIEs.list.array[i]->value.choice.RICindicationHeader.size;
598 msg->indicationHeader = calloc(1, headerSize);
599 if (!msg->indicationHeader) {
600 fprintf(stderr, "alloc RICindicationHeader failed\n");
601 e2ap_free_decoded_ric_indication_message(msg);
602 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu);
606 memcpy(msg->indicationHeader, indication->protocolIEs.list.array[i]->value.choice.RICindicationHeader.buf, headerSize);
607 msg->indicationHeaderSize = headerSize;
609 else if(indication->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICindicationMessage) {
610 size_t messsageSize = indication->protocolIEs.list.array[i]->value.choice.RICindicationMessage.size;
611 msg->indicationMessage = calloc(1, messsageSize);
612 if (!msg->indicationMessage) {
613 fprintf(stderr, "alloc RICindicationMessage failed\n");
614 e2ap_free_decoded_ric_indication_message(msg);
615 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu);
619 memcpy(msg->indicationMessage, indication->protocolIEs.list.array[i]->value.choice.RICindicationMessage.buf, messsageSize);
620 msg->indicationMessageSize = messsageSize;
622 else if(indication->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICcallProcessID) {
623 size_t callProcessIDSize = indication->protocolIEs.list.array[i]->value.choice.RICcallProcessID.size;
624 msg->callProcessID = calloc(1, callProcessIDSize);
625 if (!msg->callProcessID) {
626 fprintf(stderr, "alloc RICcallProcessID failed\n");
627 e2ap_free_decoded_ric_indication_message(msg);
628 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu);
632 memcpy(msg->callProcessID, indication->protocolIEs.list.array[i]->value.choice.RICcallProcessID.buf, callProcessIDSize);
633 msg->callProcessIDSize = callProcessIDSize;
641 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu);
645 void e2ap_free_decoded_ric_indication_message(RICindicationMsg* msg) {
650 if(msg->indicationHeader != NULL) {
651 free(msg->indicationHeader);
652 msg->indicationHeader = NULL;
654 if(msg->indicationMessage != NULL) {
655 free(msg->indicationMessage);
656 msg->indicationMessage = NULL;
658 if(msg->callProcessID != NULL) {
659 free(msg->callProcessID);
660 msg->callProcessID = NULL;