2 ==================================================================================
3 Copyright (c) 2019 AT&T Intellectual Property.
4 Copyright (c) 2019 Nokia
6 Licensed under the Apache License, Version 2.0 (the "License");
7 you may not use this file except in compliance with the License.
8 You may obtain a copy of the License at
10 http://www.apache.org/licenses/LICENSE-2.0
12 Unless required by applicable law or agreed to in writing, software
13 distributed under the License is distributed on an "AS IS" BASIS,
14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 See the License for the specific language governing permissions and
16 limitations under the License.
17 ==================================================================================
24 #include "ProtocolIE-Field.h"
25 #include "RICsubsequentAction.h"
27 #include "asn_constant.h"
30 static bool debugPrints = false;
32 // Value of checkIEOrder defines if strict order to be followed while
33 // packing/unpacking of E2AP messages.
34 // Value 1 defines strict order and value 0 defines lenient order
35 static uint8_t checkIEOrder = 1;
37 const int64_t cMaxNrOfErrors = 256;
38 const uint64_t cMaxSizeOfOctetString = 1024;
40 const size_t cMacroENBIDP_20Bits = 20;
41 const size_t cHomeENBID_28Bits = 28;
42 const size_t cShortMacroENBID_18Bits = 18;
43 const size_t clongMacroENBIDP_21Bits = 21;
45 const int cCauseRICRequest = 1;
46 const int cCauseRICService = 2;
47 const int cCauseTransport = 3;
48 const int cCauseProtocol = 4;
49 const int cCauseMisc = 5;
51 //////////////////////////////////////////////////////////////////////
54 // Below constant values are same as in E2AP, E2SM and X2AP specs
55 const uint64_t cE2InitiatingMessage = 1;
56 const uint64_t cE2SuccessfulOutcome = 2;
57 const uint64_t cE2UnsuccessfulOutcome = 3;
61 const uint64_t cRICSubscriptionRequest = 1;
62 const uint64_t cRICSubscriptionDeleteRequest = 2;
63 const uint64_t cRICSubscriptionDeleteRequired = 3;
66 const uint64_t cRICSubscriptionResponse = 1;
67 const uint64_t cRICsubscriptionDeleteResponse = 2;
69 // Unsuccessful outcome
70 const uint64_t cRICSubscriptionFailure = 1;
71 const uint64_t cRICsubscriptionDeleteFailure = 2;
78 //////////////////////////////////////////////////////////////////////
79 void allowASN1DebugPrints(bool allowASN1DebugPrints) {
80 debugPrints = allowASN1DebugPrints;
83 //////////////////////////////////////////////////////////////////////
84 void allowOutOfOrderIEMsg(uint8_t e2IEOrderCheckEnabled) {
85 checkIEOrder = e2IEOrderCheckEnabled;
88 //////////////////////////////////////////////////////////////////////
89 const char* getE2ErrorString(uint64_t errorCode) {
91 return E2ErrorStrings[errorCode];
94 /////////////////////////////////////////////////////////////////////
95 bool E2encode(E2AP_PDU_t* pE2AP_PDU, size_t* dataBufferSize, byte* dataBuffer, char* pLogBuffer) {
98 asn_fprint(stdout, &asn_DEF_E2AP_PDU, pE2AP_PDU);
101 rval = asn_encode_to_buffer(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, pE2AP_PDU, dataBuffer, *dataBufferSize);
102 if (rval.encoded == -1) {
103 sprintf(pLogBuffer,"Serialization of %s failed", asn_DEF_E2AP_PDU.name);
104 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
107 else if (rval.encoded > *dataBufferSize) {
108 sprintf(pLogBuffer,"Buffer of size %zu is too small for %s, need %zu",*dataBufferSize, asn_DEF_E2AP_PDU.name, rval.encoded);
109 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
114 sprintf(pLogBuffer,"Successfully encoded %s. Buffer size %zu, encoded size %zu",asn_DEF_E2AP_PDU.name, *dataBufferSize, rval.encoded);
116 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
117 *dataBufferSize = rval.encoded;
122 //////////////////////////////////////////////////////////////////////
123 uint64_t packRICSubscriptionRequest(size_t* pdataBufferSize, byte* pDataBuffer, char* pLogBuffer, RICSubscriptionRequest_t* pRICSubscriptionRequest) {
125 E2AP_PDU_t* pE2AP_PDU = calloc(1, sizeof(E2AP_PDU_t));
128 pE2AP_PDU->present = E2AP_PDU_PR_initiatingMessage;
129 pE2AP_PDU->choice.initiatingMessage.procedureCode = ProcedureCode_id_RICsubscription;
130 pE2AP_PDU->choice.initiatingMessage.criticality = Criticality_ignore;
131 pE2AP_PDU->choice.initiatingMessage.value.present = InitiatingMessage__value_PR_RICsubscriptionRequest;
134 RICsubscriptionRequest_IEs_t* pRICsubscriptionRequest_IEs = calloc(1, sizeof(RICsubscriptionRequest_IEs_t));
135 if (pRICsubscriptionRequest_IEs) {
136 pRICsubscriptionRequest_IEs->id = ProtocolIE_ID_id_RICrequestID;
137 pRICsubscriptionRequest_IEs->criticality = Criticality_reject;
138 pRICsubscriptionRequest_IEs->value.present = RICsubscriptionRequest_IEs__value_PR_RICrequestID;
139 pRICsubscriptionRequest_IEs->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionRequest->ricRequestID.ricRequestorID;
140 pRICsubscriptionRequest_IEs->value.choice.RICrequestID.ricInstanceID = pRICSubscriptionRequest->ricRequestID.ricInstanceID;
141 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionRequest.protocolIEs.list, pRICsubscriptionRequest_IEs);
144 return e2err_RICSubscriptionRequestAllocRICrequestIDFail;
147 pRICsubscriptionRequest_IEs = calloc(1, sizeof(RICsubscriptionRequest_IEs_t));
148 if (pRICsubscriptionRequest_IEs) {
149 pRICsubscriptionRequest_IEs->id = ProtocolIE_ID_id_RANfunctionID;
150 pRICsubscriptionRequest_IEs->criticality = Criticality_reject;
151 pRICsubscriptionRequest_IEs->value.present = RICsubscriptionRequest_IEs__value_PR_RANfunctionID;
152 pRICsubscriptionRequest_IEs->value.choice.RANfunctionID = pRICSubscriptionRequest->ranFunctionID;
153 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionRequest.protocolIEs.list, pRICsubscriptionRequest_IEs);
156 return e2err_RICSubscriptionRequestAllocRANfunctionIDFail;
158 // RICsubscriptionDetails
159 pRICsubscriptionRequest_IEs = calloc(1, sizeof(RICsubscriptionRequest_IEs_t));
160 if (pRICsubscriptionRequest_IEs) {
161 pRICsubscriptionRequest_IEs->id = ProtocolIE_ID_id_RICsubscriptionDetails;
162 pRICsubscriptionRequest_IEs->criticality = Criticality_reject;
163 pRICsubscriptionRequest_IEs->value.present = RICsubscriptionRequest_IEs__value_PR_RICsubscriptionDetails;
165 // RICeventTriggerDefinition
166 pRICsubscriptionRequest_IEs->value.choice.RICsubscriptionDetails.ricEventTriggerDefinition.buf =
167 calloc(1, pRICSubscriptionRequest->ricSubscriptionDetails.ricEventTriggerDefinition.octetString.contentLength);
168 if (pRICsubscriptionRequest_IEs->value.choice.RICsubscriptionDetails.ricEventTriggerDefinition.buf) {
169 pRICsubscriptionRequest_IEs->value.choice.RICsubscriptionDetails.ricEventTriggerDefinition.size =
170 pRICSubscriptionRequest->ricSubscriptionDetails.ricEventTriggerDefinition.octetString.contentLength;
171 memcpy(pRICsubscriptionRequest_IEs->value.choice.RICsubscriptionDetails.ricEventTriggerDefinition.buf,
172 pRICSubscriptionRequest->ricSubscriptionDetails.ricEventTriggerDefinition.octetString.data,
173 pRICSubscriptionRequest->ricSubscriptionDetails.ricEventTriggerDefinition.octetString.contentLength);
176 return e2err_RICSubscriptionRequestAllocRICeventTriggerDefinitionBufFail;
178 // RICactions-ToBeSetup-List
180 while (index < pRICSubscriptionRequest->ricSubscriptionDetails.ricActionToBeSetupItemIEs.contentLength && index < maxofRICactionID) {
181 RICaction_ToBeSetup_ItemIEs_t* pRICaction_ToBeSetup_ItemIEs = calloc(1, sizeof(RICaction_ToBeSetup_ItemIEs_t));
182 if (pRICaction_ToBeSetup_ItemIEs) {
183 pRICaction_ToBeSetup_ItemIEs->id = ProtocolIE_ID_id_RICaction_ToBeSetup_Item;
184 pRICaction_ToBeSetup_ItemIEs->criticality = Criticality_ignore;
185 pRICaction_ToBeSetup_ItemIEs->value.present = RICaction_ToBeSetup_ItemIEs__value_PR_RICaction_ToBeSetup_Item;
188 pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricActionID =
189 pRICSubscriptionRequest->ricSubscriptionDetails.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionID;
192 pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricActionType =
193 pRICSubscriptionRequest->ricSubscriptionDetails.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionType;
195 // RICactionDefinition, OPTIONAL
196 if (pRICSubscriptionRequest->ricSubscriptionDetails.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionDefinitionPresent) {
197 pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition = calloc(1, sizeof (RICactionDefinition_t));
198 if (pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition) {
199 pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition->buf =
200 calloc(1, pRICSubscriptionRequest->ricSubscriptionDetails.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionDefinitionChoice.octetString.contentLength);
201 if (pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition->buf) {
202 pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition->size =
203 pRICSubscriptionRequest->ricSubscriptionDetails.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionDefinitionChoice.octetString.contentLength;
204 memcpy(pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition->buf,
205 pRICSubscriptionRequest->ricSubscriptionDetails.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionDefinitionChoice.octetString.data,
206 pRICSubscriptionRequest->ricSubscriptionDetails.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionDefinitionChoice.octetString.contentLength);
209 return e2err_RICSubscriptionRequestAllocRICactionDefinitionBufFail;
212 return e2err_RICSubscriptionRequestAllocRICactionDefinitionFail;
215 // RICsubsequentAction, OPTIONAL
216 if (pRICSubscriptionRequest->ricSubscriptionDetails.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricSubsequentActionPresent) {
217 RICsubsequentAction_t* pRICsubsequentAction = calloc(1, sizeof(RICsubsequentAction_t));
218 if (pRICsubsequentAction) {
219 pRICsubsequentAction->ricSubsequentActionType =
220 pRICSubscriptionRequest->ricSubscriptionDetails.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricSubsequentAction.ricSubsequentActionType;
221 pRICsubsequentAction->ricTimeToWait =
222 pRICSubscriptionRequest->ricSubscriptionDetails.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricSubsequentAction.ricTimeToWait;
223 pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricSubsequentAction = pRICsubsequentAction;
226 return e2err_RICSubscriptionRequestAllocRICsubsequentActionFail;
230 return e2err_RICSubscriptionRequestAllocRICaction_ToBeSetup_ItemIEsFail;
232 ASN_SEQUENCE_ADD(&pRICsubscriptionRequest_IEs->value.choice.RICsubscriptionDetails.ricAction_ToBeSetup_List.list, pRICaction_ToBeSetup_ItemIEs);
235 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionRequest.protocolIEs.list, pRICsubscriptionRequest_IEs);
238 return e2err_RICSubscriptionRequestAllocRICsubscriptionRequest_IEsFail;
239 if (E2encode(pE2AP_PDU, pdataBufferSize, pDataBuffer, pLogBuffer))
242 return e2err_RICSubscriptionRequestEncodeFail;
244 return e2err_RICSubscriptionRequestAllocE2AP_PDUFail;
248 //////////////////////////////////////////////////////////////////////
249 uint64_t packRICSubscriptionResponse(size_t* pDataBufferSize, byte* pDataBuffer, char* pLogBuffer, RICSubscriptionResponse_t* pRICSubscriptionResponse) {
251 E2AP_PDU_t* pE2AP_PDU = calloc(1, sizeof(E2AP_PDU_t));
254 pE2AP_PDU->present = E2AP_PDU_PR_successfulOutcome;
255 pE2AP_PDU->choice.initiatingMessage.procedureCode = ProcedureCode_id_RICsubscription;
256 pE2AP_PDU->choice.initiatingMessage.criticality = Criticality_ignore;
257 pE2AP_PDU->choice.initiatingMessage.value.present = SuccessfulOutcome__value_PR_RICsubscriptionResponse;
260 RICsubscriptionResponse_IEs_t* pRICsubscriptionResponse_IEs_RicRequestID = calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
261 if (pRICsubscriptionResponse_IEs_RicRequestID) {
262 pRICsubscriptionResponse_IEs_RicRequestID->id = ProtocolIE_ID_id_RICrequestID;
263 pRICsubscriptionResponse_IEs_RicRequestID->criticality = Criticality_reject;
264 pRICsubscriptionResponse_IEs_RicRequestID->value.present = RICsubscriptionResponse_IEs__value_PR_RICrequestID;
265 pRICsubscriptionResponse_IEs_RicRequestID->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionResponse->ricRequestID.ricRequestorID;
266 pRICsubscriptionResponse_IEs_RicRequestID->value.choice.RICrequestID.ricInstanceID = pRICSubscriptionResponse->ricRequestID.ricInstanceID;
269 return e2err_RICSubscriptionResponseAllocRICrequestIDFail;
272 RICsubscriptionResponse_IEs_t* pRICsubscriptionResponse_IEs_RANFunctionID = calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
273 if (pRICsubscriptionResponse_IEs_RANFunctionID) {
274 pRICsubscriptionResponse_IEs_RANFunctionID->id = ProtocolIE_ID_id_RANfunctionID;
275 pRICsubscriptionResponse_IEs_RANFunctionID->criticality = Criticality_reject;
276 pRICsubscriptionResponse_IEs_RANFunctionID->value.present = RICsubscriptionResponse_IEs__value_PR_RANfunctionID;
277 pRICsubscriptionResponse_IEs_RANFunctionID->value.choice.RANfunctionID = pRICSubscriptionResponse->ranFunctionID;
280 return e2err_RICSubscriptionResponseAllocRANfunctionIDFail;
282 // Check if Out of order IE messages to be packed, add RANFunctionID IE before RICRequestID
284 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionResponse.protocolIEs.list, pRICsubscriptionResponse_IEs_RicRequestID);
285 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionResponse.protocolIEs.list, pRICsubscriptionResponse_IEs_RANFunctionID);
287 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionResponse.protocolIEs.list, pRICsubscriptionResponse_IEs_RANFunctionID);
288 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionResponse.protocolIEs.list, pRICsubscriptionResponse_IEs_RicRequestID);
291 // RICaction-Admitted list
292 RICsubscriptionResponse_IEs_t* pRICsubscriptionResponse_IEs = calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
293 if (pRICsubscriptionResponse_IEs) {
294 pRICsubscriptionResponse_IEs->id = ProtocolIE_ID_id_RICactions_Admitted;
295 pRICsubscriptionResponse_IEs->criticality = Criticality_reject;
296 pRICsubscriptionResponse_IEs->value.present = RICsubscriptionResponse_IEs__value_PR_RICaction_Admitted_List;
299 while (index < pRICSubscriptionResponse->ricActionAdmittedList.contentLength && index < maxofRICactionID) {
301 RICaction_Admitted_ItemIEs_t* pRICaction_Admitted_ItemIEs = calloc(1, sizeof (RICaction_Admitted_ItemIEs_t));
302 if (pRICaction_Admitted_ItemIEs)
304 pRICaction_Admitted_ItemIEs->id = ProtocolIE_ID_id_RICaction_Admitted_Item;
305 pRICaction_Admitted_ItemIEs->criticality = Criticality_reject;
306 pRICaction_Admitted_ItemIEs->value.present = RICaction_Admitted_ItemIEs__value_PR_RICaction_Admitted_Item;
309 pRICaction_Admitted_ItemIEs->value.choice.RICaction_Admitted_Item.ricActionID = pRICSubscriptionResponse->ricActionAdmittedList.ricActionID[index];
310 ASN_SEQUENCE_ADD(&pRICsubscriptionResponse_IEs->value.choice.RICaction_Admitted_List.list, pRICaction_Admitted_ItemIEs);
313 return e2err_RICSubscriptionResponseAllocRICaction_Admitted_ItemIEsFail;
318 return e2err_RICSubscriptionResponseAllocRICActionAdmittedListFail;
320 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionResponse.protocolIEs.list, pRICsubscriptionResponse_IEs);
322 // RICaction-NotAdmitted list, OPTIONAL
323 if (pRICSubscriptionResponse->ricActionNotAdmittedListPresent) {
324 pRICsubscriptionResponse_IEs = calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
325 if (pRICsubscriptionResponse_IEs) {
326 pRICsubscriptionResponse_IEs->id = ProtocolIE_ID_id_RICactions_NotAdmitted;
327 pRICsubscriptionResponse_IEs->criticality = Criticality_reject;
328 pRICsubscriptionResponse_IEs->value.present = RICsubscriptionResponse_IEs__value_PR_RICaction_NotAdmitted_List;
331 while (index < pRICSubscriptionResponse->ricActionNotAdmittedList.contentLength && index < maxofRICactionID) {
333 RICaction_NotAdmitted_ItemIEs_t* pRICaction_NotAdmitted_ItemIEs = calloc(1, sizeof (RICaction_NotAdmitted_ItemIEs_t));
334 if (pRICaction_NotAdmitted_ItemIEs)
336 pRICaction_NotAdmitted_ItemIEs->id = ProtocolIE_ID_id_RICaction_NotAdmitted_Item;
337 pRICaction_NotAdmitted_ItemIEs->criticality = Criticality_reject;
338 pRICaction_NotAdmitted_ItemIEs->value.present = RICaction_NotAdmitted_ItemIEs__value_PR_RICaction_NotAdmitted_Item;
341 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricActionID =
342 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricActionID;
345 if (pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content == Cause_PR_ricRequest) {
346 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present = Cause_PR_ricRequest;
347 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.ricRequest =
348 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal;
350 else if (pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content == Cause_PR_ricService) {
351 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present = Cause_PR_ricService;
352 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.ricService =
353 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal;
355 else if (pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content == Cause_PR_e2Node) {
356 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present = Cause_PR_e2Node;
357 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.e2Node =
358 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal;
360 else if (pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content == Cause_PR_transport) {
361 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present = Cause_PR_transport;
362 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.transport =
363 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal;
365 else if (pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content == Cause_PR_protocol) {
366 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present = Cause_PR_protocol;
367 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.protocol =
368 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal;
370 else if (pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content == Cause_PR_misc) {
371 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present = Cause_PR_misc;
372 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.misc =
373 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal;
375 ASN_SEQUENCE_ADD(&pRICsubscriptionResponse_IEs->value.choice.RICaction_NotAdmitted_List.list, pRICaction_NotAdmitted_ItemIEs);
378 return e2err_RICSubscriptionResponseAllocRICaction_NotAdmitted_ItemIEsFail;
382 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionResponse.protocolIEs.list, pRICsubscriptionResponse_IEs);
385 if (E2encode(pE2AP_PDU, pDataBufferSize, pDataBuffer, pLogBuffer))
388 return e2err_RICSubscriptionResponseEncodeFail;
390 return e2err_RICSubscriptionResponseAllocE2AP_PDUFail;
393 //////////////////////////////////////////////////////////////////////
394 uint64_t packRICSubscriptionFailure(size_t* pDataBufferSize, byte* pDataBuffer, char* pLogBuffer, RICSubscriptionFailure_t* pRICSubscriptionFailure) {
396 E2AP_PDU_t* pE2AP_PDU = calloc(1, sizeof(E2AP_PDU_t));
399 pE2AP_PDU->present = E2AP_PDU_PR_unsuccessfulOutcome;
400 pE2AP_PDU->choice.unsuccessfulOutcome.procedureCode = ProcedureCode_id_RICsubscription;
401 pE2AP_PDU->choice.unsuccessfulOutcome.criticality = Criticality_ignore;
402 pE2AP_PDU->choice.unsuccessfulOutcome.value.present = UnsuccessfulOutcome__value_PR_RICsubscriptionFailure;
405 RICsubscriptionFailure_IEs_t* pRICsubscriptionFailure_IEs = calloc(1, sizeof(RICsubscriptionFailure_IEs_t));
406 if (pRICsubscriptionFailure_IEs) {
407 pRICsubscriptionFailure_IEs->id = ProtocolIE_ID_id_RICrequestID;
408 pRICsubscriptionFailure_IEs->criticality = Criticality_reject;
409 pRICsubscriptionFailure_IEs->value.present = RICsubscriptionFailure_IEs__value_PR_RICrequestID;
410 pRICsubscriptionFailure_IEs->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionFailure->ricRequestID.ricRequestorID;
411 pRICsubscriptionFailure_IEs->value.choice.RICrequestID.ricInstanceID = pRICSubscriptionFailure->ricRequestID.ricInstanceID;
412 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionFailure.protocolIEs.list, pRICsubscriptionFailure_IEs);
415 return e2err_RICSubscriptionFailureAllocRICrequestIDFail;
418 pRICsubscriptionFailure_IEs = calloc(1, sizeof(RICsubscriptionFailure_IEs_t));
419 if (pRICsubscriptionFailure_IEs) {
420 pRICsubscriptionFailure_IEs->id = ProtocolIE_ID_id_RANfunctionID;
421 pRICsubscriptionFailure_IEs->criticality = Criticality_reject;
422 pRICsubscriptionFailure_IEs->value.present = RICsubscriptionFailure_IEs__value_PR_RANfunctionID;
423 pRICsubscriptionFailure_IEs->value.choice.RANfunctionID = pRICSubscriptionFailure->ranFunctionID;
424 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionFailure.protocolIEs.list, pRICsubscriptionFailure_IEs);
427 return e2err_RICSubscriptionFailureAllocRANfunctionIDFail;
430 pRICsubscriptionFailure_IEs = calloc(1, sizeof(RICsubscriptionFailure_IEs_t));
431 if (pRICsubscriptionFailure_IEs) {
432 pRICsubscriptionFailure_IEs->id = ProtocolIE_ID_id_Cause;
433 pRICsubscriptionFailure_IEs->criticality = Criticality_reject;
434 pRICsubscriptionFailure_IEs->value.present = RICsubscriptionFailure_IEs__value_PR_Cause;
435 if (pRICSubscriptionFailure->cause.content == Cause_PR_ricRequest) {
436 pRICsubscriptionFailure_IEs->value.choice.Cause.present = Cause_PR_ricRequest;
437 pRICsubscriptionFailure_IEs->value.choice.Cause.choice.ricRequest =
438 pRICSubscriptionFailure->cause.causeVal;
440 else if (pRICSubscriptionFailure->cause.content == Cause_PR_ricService) {
441 pRICsubscriptionFailure_IEs->value.choice.Cause.present = Cause_PR_ricService;
442 pRICsubscriptionFailure_IEs->value.choice.Cause.choice.ricService =
443 pRICSubscriptionFailure->cause.causeVal;
445 else if (pRICSubscriptionFailure->cause.content == Cause_PR_e2Node) {
446 pRICsubscriptionFailure_IEs->value.choice.Cause.present = Cause_PR_e2Node;
447 pRICsubscriptionFailure_IEs->value.choice.Cause.choice.e2Node =
448 pRICSubscriptionFailure->cause.causeVal;
450 else if (pRICSubscriptionFailure->cause.content == Cause_PR_transport) {
451 pRICsubscriptionFailure_IEs->value.choice.Cause.present = Cause_PR_transport;
452 pRICsubscriptionFailure_IEs->value.choice.Cause.choice.transport =
453 pRICSubscriptionFailure->cause.causeVal;
455 else if (pRICSubscriptionFailure->cause.content == Cause_PR_protocol) {
456 pRICsubscriptionFailure_IEs->value.choice.Cause.present = Cause_PR_protocol;
457 pRICsubscriptionFailure_IEs->value.choice.Cause.choice.protocol =
458 pRICSubscriptionFailure->cause.causeVal;
460 else if (pRICSubscriptionFailure->cause.content == Cause_PR_misc) {
461 pRICsubscriptionFailure_IEs->value.choice.Cause.present = Cause_PR_misc;
462 pRICsubscriptionFailure_IEs->value.choice.Cause.choice.misc =
463 pRICSubscriptionFailure->cause.causeVal;
465 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionFailure.protocolIEs.list, pRICsubscriptionFailure_IEs);
468 return e2err_RICSubscriptionFailureAllocCauseFail;
470 // CriticalityDiagnostics, OPTIONAL. Not used in RIC
472 if (E2encode(pE2AP_PDU, pDataBufferSize, pDataBuffer, pLogBuffer))
475 return e2err_RICSubscriptionFailureEncodeFail;
478 return e2err_RICSubscriptionFailureAllocE2AP_PDUFail;
481 //////////////////////////////////////////////////////////////////////
482 uint64_t packRICSubscriptionDeleteRequest(size_t* pDataBufferSize, byte* pDataBuffer, char* pLogBuffer, RICSubscriptionDeleteRequest_t* pRICSubscriptionDeleteRequest) {
484 E2AP_PDU_t* pE2AP_PDU = calloc(1, sizeof(E2AP_PDU_t));
487 pE2AP_PDU->present = E2AP_PDU_PR_initiatingMessage;
488 pE2AP_PDU->choice.initiatingMessage.procedureCode = ProcedureCode_id_RICsubscriptionDelete;
489 pE2AP_PDU->choice.initiatingMessage.criticality = Criticality_ignore;
490 pE2AP_PDU->choice.initiatingMessage.value.present = InitiatingMessage__value_PR_RICsubscriptionDeleteRequest;
493 RICsubscriptionDeleteRequest_IEs_t* pRICsubscriptionDeleteRequest_IEs = calloc(1, sizeof(RICsubscriptionDeleteRequest_IEs_t));
494 if (pRICsubscriptionDeleteRequest_IEs) {
495 pRICsubscriptionDeleteRequest_IEs->id = ProtocolIE_ID_id_RICrequestID;
496 pRICsubscriptionDeleteRequest_IEs->criticality = Criticality_reject;
497 pRICsubscriptionDeleteRequest_IEs->value.present = RICsubscriptionDeleteRequest_IEs__value_PR_RICrequestID;
498 pRICsubscriptionDeleteRequest_IEs->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionDeleteRequest->ricRequestID.ricRequestorID;
499 pRICsubscriptionDeleteRequest_IEs->value.choice.RICrequestID.ricInstanceID = pRICSubscriptionDeleteRequest->ricRequestID.ricInstanceID;
500 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionDeleteRequest.protocolIEs.list, pRICsubscriptionDeleteRequest_IEs);
503 return e2err_RICSubscriptionDeleteRequestAllocRICrequestIDFail;
506 pRICsubscriptionDeleteRequest_IEs = calloc(1, sizeof(RICsubscriptionDeleteRequest_IEs_t));
507 if (pRICsubscriptionDeleteRequest_IEs) {
508 pRICsubscriptionDeleteRequest_IEs->id = ProtocolIE_ID_id_RANfunctionID;
509 pRICsubscriptionDeleteRequest_IEs->criticality = Criticality_reject;
510 pRICsubscriptionDeleteRequest_IEs->value.present = RICsubscriptionDeleteRequest_IEs__value_PR_RANfunctionID;
511 pRICsubscriptionDeleteRequest_IEs->value.choice.RANfunctionID = pRICSubscriptionDeleteRequest->ranFunctionID;
512 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionDeleteRequest.protocolIEs.list, pRICsubscriptionDeleteRequest_IEs);
515 return e2err_RICSubscriptionDeleteRequestAllocRANfunctionIDFail;
517 if (E2encode(pE2AP_PDU, pDataBufferSize, pDataBuffer, pLogBuffer))
520 return e2err_RICSubscriptionDeleteRequestEncodeFail;
523 return e2err_RICSubscriptionDeleteRequestAllocE2AP_PDUFail;
526 //////////////////////////////////////////////////////////////////////
527 uint64_t packRICSubscriptionDeleteResponse(size_t* pDataBufferSize, byte* pDataBuffer, char* pLogBuffer, RICSubscriptionDeleteResponse_t* pRICSubscriptionDeleteResponse) {
529 E2AP_PDU_t* pE2AP_PDU = calloc(1, sizeof(E2AP_PDU_t));
532 pE2AP_PDU->present = E2AP_PDU_PR_successfulOutcome;
533 pE2AP_PDU->choice.successfulOutcome.procedureCode = ProcedureCode_id_RICsubscriptionDelete;
534 pE2AP_PDU->choice.successfulOutcome.criticality = Criticality_ignore;
535 pE2AP_PDU->choice.successfulOutcome.value.present = SuccessfulOutcome__value_PR_RICsubscriptionDeleteResponse;
538 RICsubscriptionDeleteResponse_IEs_t* pRICsubscriptionDeleteResponse_IEs = calloc(1, sizeof(RICsubscriptionDeleteResponse_IEs_t));
539 if (pRICsubscriptionDeleteResponse_IEs) {
540 pRICsubscriptionDeleteResponse_IEs->id = ProtocolIE_ID_id_RICrequestID;
541 pRICsubscriptionDeleteResponse_IEs->criticality = Criticality_reject;
542 pRICsubscriptionDeleteResponse_IEs->value.present = RICsubscriptionDeleteResponse_IEs__value_PR_RICrequestID;
543 pRICsubscriptionDeleteResponse_IEs->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionDeleteResponse->ricRequestID.ricRequestorID;
544 pRICsubscriptionDeleteResponse_IEs->value.choice.RICrequestID.ricInstanceID = pRICSubscriptionDeleteResponse->ricRequestID.ricInstanceID;
545 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionDeleteResponse.protocolIEs.list, pRICsubscriptionDeleteResponse_IEs);
548 return e2err_RICSubscriptionDeleteResponseAllocRICrequestIDFail;
551 pRICsubscriptionDeleteResponse_IEs = calloc(1, sizeof(RICsubscriptionDeleteResponse_IEs_t));
552 if (pRICsubscriptionDeleteResponse_IEs) {
553 pRICsubscriptionDeleteResponse_IEs->id = ProtocolIE_ID_id_RANfunctionID;
554 pRICsubscriptionDeleteResponse_IEs->criticality = Criticality_reject;
555 pRICsubscriptionDeleteResponse_IEs->value.present = RICsubscriptionDeleteResponse_IEs__value_PR_RANfunctionID;
556 pRICsubscriptionDeleteResponse_IEs->value.choice.RANfunctionID = pRICSubscriptionDeleteResponse->ranFunctionID;
557 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionDeleteResponse.protocolIEs.list, pRICsubscriptionDeleteResponse_IEs);
560 return e2err_RICSubscriptionDeleteResponseAllocRANfunctionIDFail;
562 if (E2encode(pE2AP_PDU, pDataBufferSize, pDataBuffer, pLogBuffer))
565 return e2err_RICSubscriptionDeleteResponseEncodeFail;
568 return e2err_RICSubscriptionDeleteResponseAllocE2AP_PDUFail;
571 uint64_t packRICSubscriptionDeleteFailure(size_t* pDataBufferSize, byte* pDataBuffer, char* pLogBuffer, RICSubscriptionDeleteFailure_t* pRICSubscriptionDeleteFailure) {
573 E2AP_PDU_t* pE2AP_PDU = calloc(1, sizeof(E2AP_PDU_t));
576 pE2AP_PDU->present = E2AP_PDU_PR_unsuccessfulOutcome;
577 pE2AP_PDU->choice.unsuccessfulOutcome.procedureCode = ProcedureCode_id_RICsubscriptionDelete;
578 pE2AP_PDU->choice.unsuccessfulOutcome.criticality = Criticality_ignore;
579 pE2AP_PDU->choice.unsuccessfulOutcome.value.present = UnsuccessfulOutcome__value_PR_RICsubscriptionDeleteFailure;
582 RICsubscriptionDeleteFailure_IEs_t* pRICsubscriptionDeleteFailure_IEs = calloc(1, sizeof(RICsubscriptionDeleteFailure_IEs_t));
583 if (pRICsubscriptionDeleteFailure_IEs) {
584 pRICsubscriptionDeleteFailure_IEs->id = ProtocolIE_ID_id_RICrequestID;
585 pRICsubscriptionDeleteFailure_IEs->criticality = Criticality_reject;
586 pRICsubscriptionDeleteFailure_IEs->value.present = RICsubscriptionDeleteFailure_IEs__value_PR_RICrequestID;
587 pRICsubscriptionDeleteFailure_IEs->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionDeleteFailure->ricRequestID.ricRequestorID;
588 pRICsubscriptionDeleteFailure_IEs->value.choice.RICrequestID.ricInstanceID = pRICSubscriptionDeleteFailure->ricRequestID.ricInstanceID;
589 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionDeleteFailure.protocolIEs.list, pRICsubscriptionDeleteFailure_IEs);
592 return e2err_RICSubscriptionDeleteFailureAllocRICrequestIDFail;
595 pRICsubscriptionDeleteFailure_IEs = calloc(1, sizeof(RICsubscriptionDeleteFailure_IEs_t));
596 if (pRICsubscriptionDeleteFailure_IEs) {
597 pRICsubscriptionDeleteFailure_IEs->id = ProtocolIE_ID_id_RANfunctionID;
598 pRICsubscriptionDeleteFailure_IEs->criticality = Criticality_reject;
599 pRICsubscriptionDeleteFailure_IEs->value.present = RICsubscriptionDeleteFailure_IEs__value_PR_RANfunctionID;
600 pRICsubscriptionDeleteFailure_IEs->value.choice.RANfunctionID = pRICSubscriptionDeleteFailure->ranFunctionID;
601 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionDeleteFailure.protocolIEs.list, pRICsubscriptionDeleteFailure_IEs);
604 return e2err_RICSubscriptionDeleteFailureAllocRANfunctionIDFail;
607 pRICsubscriptionDeleteFailure_IEs = calloc(1, sizeof(RICsubscriptionDeleteFailure_IEs_t));
608 if (pRICsubscriptionDeleteFailure_IEs) {
609 pRICsubscriptionDeleteFailure_IEs->id = ProtocolIE_ID_id_Cause;
610 pRICsubscriptionDeleteFailure_IEs->criticality = Criticality_reject;
611 pRICsubscriptionDeleteFailure_IEs->value.present = RICsubscriptionDeleteFailure_IEs__value_PR_Cause;
612 if (pRICSubscriptionDeleteFailure->cause.content == Cause_PR_ricRequest) {
613 pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present = Cause_PR_ricRequest;
614 pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.ricRequest =
615 pRICSubscriptionDeleteFailure->cause.causeVal;
617 else if (pRICSubscriptionDeleteFailure->cause.content == Cause_PR_ricService) {
618 pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present = Cause_PR_ricService;
619 pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.ricService =
620 pRICSubscriptionDeleteFailure->cause.causeVal;
622 else if (pRICSubscriptionDeleteFailure->cause.content == Cause_PR_e2Node) {
623 pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present = Cause_PR_e2Node;
624 pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.e2Node =
625 pRICSubscriptionDeleteFailure->cause.causeVal;
627 else if (pRICSubscriptionDeleteFailure->cause.content == Cause_PR_transport) {
628 pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present = Cause_PR_transport;
629 pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.transport =
630 pRICSubscriptionDeleteFailure->cause.causeVal;
632 else if (pRICSubscriptionDeleteFailure->cause.content == Cause_PR_protocol) {
633 pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present = Cause_PR_protocol;
634 pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.protocol =
635 pRICSubscriptionDeleteFailure->cause.causeVal;
637 else if (pRICSubscriptionDeleteFailure->cause.content == Cause_PR_misc) {
638 pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present = Cause_PR_misc;
639 pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.misc =
640 pRICSubscriptionDeleteFailure->cause.causeVal;
642 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionDeleteFailure.protocolIEs.list, pRICsubscriptionDeleteFailure_IEs);
645 return e2err_RICSubscriptionDeleteFailureAllocRICcauseFail;
647 // CriticalityDiagnostics, OPTIONAL
649 if (E2encode(pE2AP_PDU, pDataBufferSize, pDataBuffer, pLogBuffer))
652 return e2err_RICSubscriptionDeleteFailureEncodeFail;
655 return e2err_RICSubscriptionDeleteFailureAllocE2AP_PDUFail;
658 //////////////////////////////////////////////////////////////////////
659 e2ap_pdu_ptr_t* unpackE2AP_pdu(const size_t dataBufferSize, const byte* dataBuffer, char* pLogBuffer, E2MessageInfo_t* pMessageInfo) {
661 E2AP_PDU_t* pE2AP_PDU = 0;
663 rval = asn_decode(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, (void **)&pE2AP_PDU, dataBuffer, dataBufferSize);
667 sprintf(pLogBuffer,"Successfully decoded E2AP-PDU");
668 asn_fprint(stdout, &asn_DEF_E2AP_PDU, pE2AP_PDU);
671 if (pE2AP_PDU->present == E2AP_PDU_PR_initiatingMessage) {
672 if (pE2AP_PDU->choice.initiatingMessage.procedureCode == ProcedureCode_id_RICsubscription) {
673 if (pE2AP_PDU->choice.initiatingMessage.value.present == InitiatingMessage__value_PR_RICsubscriptionRequest) {
674 pMessageInfo->messageType = cE2InitiatingMessage;
675 pMessageInfo->messageId = cRICSubscriptionRequest;
676 return (e2ap_pdu_ptr_t*)pE2AP_PDU;
679 sprintf(pLogBuffer,"Error. Not supported initiatingMessage MessageId = %u",pE2AP_PDU->choice.initiatingMessage.value.present);
683 else if (pE2AP_PDU->choice.initiatingMessage.procedureCode == ProcedureCode_id_RICsubscriptionDelete) {
684 if (pE2AP_PDU->choice.initiatingMessage.value.present == InitiatingMessage__value_PR_RICsubscriptionDeleteRequest) {
685 pMessageInfo->messageType = cE2InitiatingMessage;
686 pMessageInfo->messageId = cRICSubscriptionDeleteRequest;
687 return (e2ap_pdu_ptr_t*)pE2AP_PDU;
690 sprintf(pLogBuffer,"Error. Not supported initiatingMessage MessageId = %u",pE2AP_PDU->choice.initiatingMessage.value.present);
693 }else if (pE2AP_PDU->choice.initiatingMessage.procedureCode ==
694 ProcedureCode_id_RICsubscriptionDeleteRequired) {
695 if (pE2AP_PDU->choice.initiatingMessage.value.present ==
696 InitiatingMessage__value_PR_RICsubscriptionDeleteRequired) {
697 pMessageInfo->messageType = cE2InitiatingMessage;
698 pMessageInfo->messageId = cRICSubscriptionDeleteRequired;
699 return (e2ap_pdu_ptr_t *) pE2AP_PDU;
701 sprintf(pLogBuffer, "Error. Not supported initiatingMessage MessageId = %u",
702 pE2AP_PDU->choice.initiatingMessage.value.present);
707 sprintf(pLogBuffer,"Error. Procedure not supported. ProcedureCode = %li",pE2AP_PDU->choice.initiatingMessage.procedureCode);
711 else if (pE2AP_PDU->present == E2AP_PDU_PR_successfulOutcome) {
712 if (pE2AP_PDU->choice.successfulOutcome.procedureCode == ProcedureCode_id_RICsubscription) {
713 if (pE2AP_PDU->choice.successfulOutcome.value.present == SuccessfulOutcome__value_PR_RICsubscriptionResponse) {
714 pMessageInfo->messageType = cE2SuccessfulOutcome;
715 pMessageInfo->messageId = cRICSubscriptionResponse;
716 return (e2ap_pdu_ptr_t*)pE2AP_PDU;
719 sprintf(pLogBuffer,"Error. Not supported successfulOutcome MessageId = %u",pE2AP_PDU->choice.successfulOutcome.value.present);
723 else if (pE2AP_PDU->choice.successfulOutcome.procedureCode == ProcedureCode_id_RICsubscriptionDelete) {
724 if (pE2AP_PDU->choice.successfulOutcome.value.present == SuccessfulOutcome__value_PR_RICsubscriptionDeleteResponse) {
725 pMessageInfo->messageType = cE2SuccessfulOutcome;
726 pMessageInfo->messageId = cRICsubscriptionDeleteResponse;
727 return (e2ap_pdu_ptr_t*)pE2AP_PDU;
730 sprintf(pLogBuffer,"Error. Not supported successfulOutcome MessageId = %u",pE2AP_PDU->choice.successfulOutcome.value.present);
735 sprintf(pLogBuffer,"Error. Procedure not supported. ProcedureCode = %li",pE2AP_PDU->choice.successfulOutcome.procedureCode);
739 else if (pE2AP_PDU->present == E2AP_PDU_PR_unsuccessfulOutcome) {
740 if (pE2AP_PDU->choice.unsuccessfulOutcome.procedureCode == ProcedureCode_id_RICsubscription) {
741 if (pE2AP_PDU->choice.unsuccessfulOutcome.value.present == UnsuccessfulOutcome__value_PR_RICsubscriptionFailure) {
742 pMessageInfo->messageType = cE2UnsuccessfulOutcome;
743 pMessageInfo->messageId = cRICSubscriptionFailure;
744 return (e2ap_pdu_ptr_t*)pE2AP_PDU;
747 sprintf(pLogBuffer,"Error. Not supported unsuccessfulOutcome MessageId = %u",pE2AP_PDU->choice.unsuccessfulOutcome.value.present);
751 else if (pE2AP_PDU->choice.unsuccessfulOutcome.procedureCode == ProcedureCode_id_RICsubscriptionDelete) {
752 if (pE2AP_PDU->choice.unsuccessfulOutcome.value.present == UnsuccessfulOutcome__value_PR_RICsubscriptionDeleteFailure) {
753 pMessageInfo->messageType = cE2UnsuccessfulOutcome;
754 pMessageInfo->messageId = cRICsubscriptionDeleteFailure;
755 return (e2ap_pdu_ptr_t*)pE2AP_PDU;
758 sprintf(pLogBuffer,"Error. Not supported unsuccessfulOutcome MessageId = %u",pE2AP_PDU->choice.unsuccessfulOutcome.value.present);
764 sprintf(pLogBuffer,"Decode failed. Invalid message type %u",pE2AP_PDU->present);
765 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
768 sprintf(pLogBuffer,"Decode failed. More data needed. Buffer size %zu, %s, consumed %zu",dataBufferSize, asn_DEF_E2AP_PDU.name, rval.consumed);
771 sprintf(pLogBuffer,"Decode failed. Buffer size %zu, %s, consumed %zu",dataBufferSize, asn_DEF_E2AP_PDU.name, rval.consumed);
778 //////////////////////////////////////////////////////////////////////
779 uint64_t getRICSubscriptionRequestData(e2ap_pdu_ptr_t* pE2AP_PDU_pointer, RICSubscriptionRequest_t* pRICSubscriptionRequest) {
781 E2AP_PDU_t* pE2AP_PDU = (E2AP_PDU_t*)pE2AP_PDU_pointer;
783 RICsubscriptionRequest_t *asnRicSubscriptionRequest = &pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionRequest;
784 RICsubscriptionRequest_IEs_t* pRICsubscriptionRequest_IEs;
787 if (asnRicSubscriptionRequest->protocolIEs.list.count > 0 &&
788 asnRicSubscriptionRequest->protocolIEs.list.array[0]->id == ProtocolIE_ID_id_RICrequestID) {
789 pRICsubscriptionRequest_IEs = asnRicSubscriptionRequest->protocolIEs.list.array[0];
790 pRICSubscriptionRequest->ricRequestID.ricRequestorID = pRICsubscriptionRequest_IEs->value.choice.RICrequestID.ricRequestorID;
791 pRICSubscriptionRequest->ricRequestID.ricInstanceID = pRICsubscriptionRequest_IEs->value.choice.RICrequestID.ricInstanceID;
794 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
795 return e2err_RICsubscriptionRequestRICrequestIDMissing;
799 if (asnRicSubscriptionRequest->protocolIEs.list.count > 1 &&
800 asnRicSubscriptionRequest->protocolIEs.list.array[1]->id == ProtocolIE_ID_id_RANfunctionID) {
801 pRICsubscriptionRequest_IEs = asnRicSubscriptionRequest->protocolIEs.list.array[1];
802 pRICSubscriptionRequest->ranFunctionID = pRICsubscriptionRequest_IEs->value.choice.RANfunctionID;
805 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
806 return e2err_RICsubscriptionRequestRANfunctionIDMissing;
809 // RICsubscriptionDetails
810 if (asnRicSubscriptionRequest->protocolIEs.list.count > 2 &&
811 asnRicSubscriptionRequest->protocolIEs.list.array[2]->id == ProtocolIE_ID_id_RICsubscriptionDetails) {
812 pRICsubscriptionRequest_IEs = asnRicSubscriptionRequest->protocolIEs.list.array[2];
814 // Unpack EventTriggerDefinition
815 RICeventTriggerDefinition_t* pRICeventTriggerDefinition =
816 (RICeventTriggerDefinition_t*)&pRICsubscriptionRequest_IEs->value.choice.RICsubscriptionDetails.ricEventTriggerDefinition;
817 pRICSubscriptionRequest->ricSubscriptionDetails.ricEventTriggerDefinition.octetString.contentLength = pRICeventTriggerDefinition->size;
818 memcpy(pRICSubscriptionRequest->ricSubscriptionDetails.ricEventTriggerDefinition.octetString.data, pRICeventTriggerDefinition->buf, pRICeventTriggerDefinition->size);
820 // RICactions-ToBeSetup-List
821 RICaction_ToBeSetup_ItemIEs_t* pRICaction_ToBeSetup_ItemIEs;
823 while (index < pRICsubscriptionRequest_IEs->value.choice.RICsubscriptionDetails.ricAction_ToBeSetup_List.list.count)
825 pRICaction_ToBeSetup_ItemIEs = (RICaction_ToBeSetup_ItemIEs_t*)pRICsubscriptionRequest_IEs->value.choice.RICsubscriptionDetails.ricAction_ToBeSetup_List.list.array[index];
828 pRICSubscriptionRequest->ricSubscriptionDetails.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionID =
829 pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricActionID;
832 pRICSubscriptionRequest->ricSubscriptionDetails.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionType =
833 pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricActionType;
835 // RICactionDefinition, OPTIONAL
836 if (pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition)
838 pRICSubscriptionRequest->ricSubscriptionDetails.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionDefinitionChoice.octetString.contentLength =
839 pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition->size;
840 memcpy(pRICSubscriptionRequest->ricSubscriptionDetails.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionDefinitionChoice.octetString.data,
841 pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition->buf,
842 pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition->size);
844 pRICSubscriptionRequest->ricSubscriptionDetails.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionDefinitionPresent = true;
847 pRICSubscriptionRequest->ricSubscriptionDetails.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionDefinitionPresent = false;
849 // RICsubsequentAction, OPTIONAL
850 RICsubsequentAction_t* pRICsubsequentAction;
851 if (pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricSubsequentAction)
853 pRICsubsequentAction = pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricSubsequentAction;
854 pRICSubscriptionRequest->ricSubscriptionDetails.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricSubsequentActionPresent = true;
855 pRICSubscriptionRequest->ricSubscriptionDetails.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricSubsequentAction.ricSubsequentActionType =
856 pRICsubsequentAction->ricSubsequentActionType;
857 pRICSubscriptionRequest->ricSubscriptionDetails.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricSubsequentAction.ricTimeToWait =
858 pRICsubsequentAction->ricTimeToWait;
861 pRICSubscriptionRequest->ricSubscriptionDetails.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricSubsequentActionPresent = false;
864 pRICSubscriptionRequest->ricSubscriptionDetails.ricActionToBeSetupItemIEs.contentLength = index;
867 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
868 return e2err_RICsubscriptionRequestICsubscriptionMissing;
871 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
876 //////////////////////////////////////////////////////////////////////
878 uint64_t getRICSubscriptionResponseData(e2ap_pdu_ptr_t* pE2AP_PDU_pointer, RICSubscriptionResponse_t* pRICSubscriptionResponse) {
880 E2AP_PDU_t* pE2AP_PDU = (E2AP_PDU_t*)pE2AP_PDU_pointer;
882 RICsubscriptionResponse_t *asnRicSubscriptionResponse = &pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionResponse;
883 RICsubscriptionResponse_IEs_t* pRICsubscriptionResponse_IEs;
885 bool foundRICrequestID = false;
886 bool foundRANfunctionID = false;
887 bool foundRICactions_Admitted = false;
888 bool foundRICaction_NotAdmitted = false;
890 for (int i = 0; i < asnRicSubscriptionResponse->protocolIEs.list.count; i++) {
891 if (asnRicSubscriptionResponse->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICrequestID) {
892 if (checkIEOrder && i != 0) {
893 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
894 return e2err_RICsubscriptionResponseRICrequestIDWrongOrder;
896 pRICsubscriptionResponse_IEs = asnRicSubscriptionResponse->protocolIEs.list.array[i];
897 pRICSubscriptionResponse->ricRequestID.ricRequestorID = pRICsubscriptionResponse_IEs->value.choice.RICrequestID.ricRequestorID;
898 pRICSubscriptionResponse->ricRequestID.ricInstanceID = pRICsubscriptionResponse_IEs->value.choice.RICrequestID.ricInstanceID;
899 foundRICrequestID = true;
901 else if (asnRicSubscriptionResponse->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RANfunctionID) {
902 if (checkIEOrder && i != 1) {
903 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
904 return e2err_RICsubscriptionResponseRANfunctionIDWrongOrder;
906 pRICsubscriptionResponse_IEs = asnRicSubscriptionResponse->protocolIEs.list.array[i];
907 pRICSubscriptionResponse->ranFunctionID = pRICsubscriptionResponse_IEs->value.choice.RANfunctionID;
908 foundRANfunctionID = true;
910 else if (asnRicSubscriptionResponse->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICactions_Admitted) {
911 if (checkIEOrder && i != 2) {
912 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
913 return e2err_RICsubscriptionResponseRICaction_Admitted_ListWrongOrder;
915 pRICsubscriptionResponse_IEs = asnRicSubscriptionResponse->protocolIEs.list.array[i];
916 pRICSubscriptionResponse->ricActionAdmittedList.contentLength = 0;
918 while ((index < maxofRICactionID) && (index < pRICsubscriptionResponse_IEs->value.choice.RICaction_Admitted_List.list.count)) {
919 RICaction_Admitted_ItemIEs_t* pRICaction_Admitted_ItemIEs =
920 (RICaction_Admitted_ItemIEs_t*)pRICsubscriptionResponse_IEs->value.choice.RICaction_Admitted_List.list.array[index];
923 pRICSubscriptionResponse->ricActionAdmittedList.ricActionID[index] =
924 pRICaction_Admitted_ItemIEs->value.choice.RICaction_Admitted_Item.ricActionID;
927 pRICSubscriptionResponse->ricActionAdmittedList.contentLength = index;
928 foundRICactions_Admitted = true;
930 else if (asnRicSubscriptionResponse->protocolIEs.list.array[i]->id == ProtocolIE_ID_id_RICactions_NotAdmitted) {
931 if (checkIEOrder && i != 3) {
932 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
933 return e2err_RICsubscriptionResponseRICaction_NotAdmitted_ListWrongOrder;
935 pRICsubscriptionResponse_IEs = asnRicSubscriptionResponse->protocolIEs.list.array[i];
936 if (pRICsubscriptionResponse_IEs->value.present == RICsubscriptionResponse_IEs__value_PR_RICaction_NotAdmitted_List) {
937 pRICSubscriptionResponse->ricActionNotAdmittedListPresent = true;
938 pRICSubscriptionResponse->ricActionNotAdmittedList.contentLength = 0;
940 while ((index < maxofRICactionID) && (index < pRICsubscriptionResponse_IEs->value.choice.RICaction_NotAdmitted_List.list.count)) {
941 RICaction_NotAdmitted_ItemIEs_t* pRICaction_NotAdmitted_ItemIEs =
942 (RICaction_NotAdmitted_ItemIEs_t*)pRICsubscriptionResponse_IEs->value.choice.RICaction_NotAdmitted_List.list.array[index];
945 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricActionID =
946 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricActionID;
949 if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present == Cause_PR_ricRequest) {
950 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content = Cause_PR_ricRequest;
951 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal =
952 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.ricRequest;
954 else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present == Cause_PR_ricService) {
955 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content = Cause_PR_ricService;
956 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal =
957 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.ricService;
959 else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present == Cause_PR_e2Node) {
960 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content = Cause_PR_e2Node;
961 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal =
962 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.e2Node;
964 else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present == Cause_PR_transport) {
965 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content = Cause_PR_transport;
966 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal =
967 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.transport;
969 else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present == Cause_PR_protocol) {
970 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content = Cause_PR_protocol;
971 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal =
972 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.protocol;
974 else if(pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.present == Cause_PR_misc) {
975 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.content = Cause_PR_misc;
976 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].cause.causeVal =
977 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.cause.choice.misc;
981 pRICSubscriptionResponse->ricActionNotAdmittedList.contentLength = index;
982 foundRICaction_NotAdmitted = true;
987 if (!foundRICrequestID) {
988 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
989 return e2err_RICsubscriptionResponseRICrequestIDMissing;
991 if (!foundRANfunctionID) {
992 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
993 return e2err_RICsubscriptionResponseRANfunctionIDMissing;
995 if (!foundRICactions_Admitted) {
996 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
997 return e2err_RICsubscriptionResponseRICaction_Admitted_ListMissing;
1000 if (!foundRICaction_NotAdmitted) {
1001 pRICSubscriptionResponse->ricActionNotAdmittedListPresent = false;
1002 pRICSubscriptionResponse->ricActionNotAdmittedList.contentLength = 0;
1004 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1008 //////////////////////////////////////////////////////////////////////
1009 uint64_t getRICSubscriptionFailureData(e2ap_pdu_ptr_t* pE2AP_PDU_pointer, RICSubscriptionFailure_t* pRICSubscriptionFailure) {
1011 E2AP_PDU_t* pE2AP_PDU = (E2AP_PDU_t*)pE2AP_PDU_pointer;
1013 RICsubscriptionFailure_t *asnRicSubscriptionFailure = &pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionFailure;
1014 RICsubscriptionFailure_IEs_t* pRICsubscriptionFailure_IEs;
1017 if (asnRicSubscriptionFailure->protocolIEs.list.count > 0 &&
1018 asnRicSubscriptionFailure->protocolIEs.list.array[0]->id == ProtocolIE_ID_id_RICrequestID) {
1019 pRICsubscriptionFailure_IEs = asnRicSubscriptionFailure->protocolIEs.list.array[0];
1020 pRICSubscriptionFailure->ricRequestID.ricRequestorID = pRICsubscriptionFailure_IEs->value.choice.RICrequestID.ricRequestorID;
1021 pRICSubscriptionFailure->ricRequestID.ricInstanceID = pRICsubscriptionFailure_IEs->value.choice.RICrequestID.ricInstanceID;
1024 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1025 return e2err_RICsubscriptionFailureRICrequestIDMissing;
1029 if (asnRicSubscriptionFailure->protocolIEs.list.count > 1 &&
1030 asnRicSubscriptionFailure->protocolIEs.list.array[1]->id == ProtocolIE_ID_id_RANfunctionID) {
1031 pRICsubscriptionFailure_IEs = asnRicSubscriptionFailure->protocolIEs.list.array[1];
1032 pRICSubscriptionFailure->ranFunctionID = pRICsubscriptionFailure_IEs->value.choice.RANfunctionID;
1035 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1036 return e2err_RICsubscriptionFailureRANfunctionIDMissing;
1040 if (asnRicSubscriptionFailure->protocolIEs.list.count > 2 &&
1041 asnRicSubscriptionFailure->protocolIEs.list.array[2]->id == ProtocolIE_ID_id_Cause) {
1042 pRICsubscriptionFailure_IEs = asnRicSubscriptionFailure->protocolIEs.list.array[2];
1043 if (pRICsubscriptionFailure_IEs->value.choice.Cause.present == Cause_PR_ricRequest) {
1044 pRICSubscriptionFailure->cause.content = Cause_PR_ricRequest;
1045 pRICSubscriptionFailure->cause.causeVal =
1046 pRICsubscriptionFailure_IEs->value.choice.Cause.choice.ricRequest;
1048 else if (pRICsubscriptionFailure_IEs->value.choice.Cause.present == Cause_PR_ricService) {
1049 pRICSubscriptionFailure->cause.content = Cause_PR_ricService;
1050 pRICSubscriptionFailure->cause.causeVal =
1051 pRICsubscriptionFailure_IEs->value.choice.Cause.choice.ricService;
1053 else if (pRICsubscriptionFailure_IEs->value.choice.Cause.present == Cause_PR_e2Node) {
1054 pRICSubscriptionFailure->cause.content = Cause_PR_e2Node;
1055 pRICSubscriptionFailure->cause.causeVal =
1056 pRICsubscriptionFailure_IEs->value.choice.Cause.choice.e2Node;
1058 else if (pRICsubscriptionFailure_IEs->value.choice.Cause.present == Cause_PR_transport) {
1059 pRICSubscriptionFailure->cause.content = Cause_PR_transport;
1060 pRICSubscriptionFailure->cause.causeVal =
1061 pRICsubscriptionFailure_IEs->value.choice.Cause.choice.transport;
1063 else if (pRICsubscriptionFailure_IEs->value.choice.Cause.present == Cause_PR_protocol) {
1064 pRICSubscriptionFailure->cause.content = Cause_PR_protocol;
1065 pRICSubscriptionFailure->cause.causeVal =
1066 pRICsubscriptionFailure_IEs->value.choice.Cause.choice.protocol;
1068 else if(pRICsubscriptionFailure_IEs->value.choice.Cause.present == Cause_PR_misc) {
1069 pRICSubscriptionFailure->cause.content = Cause_PR_misc;
1070 pRICSubscriptionFailure->cause.causeVal =
1071 pRICsubscriptionFailure_IEs->value.choice.Cause.choice.misc;
1075 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1076 return e2err_RICsubscriptionFailureCauseMissing;
1079 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1083 //////////////////////////////////////////////////////////////////////
1084 uint64_t getRICSubscriptionDeleteRequestData(e2ap_pdu_ptr_t* pE2AP_PDU_pointer, RICSubscriptionDeleteRequest_t* pRICSubscriptionDeleteRequest) {
1086 E2AP_PDU_t* pE2AP_PDU = (E2AP_PDU_t*)pE2AP_PDU_pointer;
1088 RICsubscriptionDeleteRequest_t *asnRicSubscriptionDeleteRequest = &pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionDeleteRequest;
1089 RICsubscriptionDeleteRequest_IEs_t* pRICsubscriptionDeleteRequest_IEs;
1092 if (asnRicSubscriptionDeleteRequest->protocolIEs.list.count > 0 &&
1093 asnRicSubscriptionDeleteRequest->protocolIEs.list.array[0]->id == ProtocolIE_ID_id_RICrequestID) {
1094 pRICsubscriptionDeleteRequest_IEs = asnRicSubscriptionDeleteRequest->protocolIEs.list.array[0];
1095 pRICSubscriptionDeleteRequest->ricRequestID.ricRequestorID = pRICsubscriptionDeleteRequest_IEs->value.choice.RICrequestID.ricRequestorID;
1096 pRICSubscriptionDeleteRequest->ricRequestID.ricInstanceID = pRICsubscriptionDeleteRequest_IEs->value.choice.RICrequestID.ricInstanceID;
1099 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1100 return e2err_RICsubscriptionDeleteRequestRICrequestIDMissing;
1104 if (asnRicSubscriptionDeleteRequest->protocolIEs.list.count > 1 &&
1105 asnRicSubscriptionDeleteRequest->protocolIEs.list.array[1]->id == ProtocolIE_ID_id_RANfunctionID) {
1106 pRICsubscriptionDeleteRequest_IEs = asnRicSubscriptionDeleteRequest->protocolIEs.list.array[1];
1107 pRICSubscriptionDeleteRequest->ranFunctionID = pRICsubscriptionDeleteRequest_IEs->value.choice.RANfunctionID;
1110 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1111 return e2err_RICsubscriptionDeleteRequestRANfunctionIDMissing;
1113 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1117 //////////////////////////////////////////////////////////////////////
1118 uint64_t getRICSubscriptionDeleteResponseData(e2ap_pdu_ptr_t* pE2AP_PDU_pointer, RICSubscriptionDeleteResponse_t* pRICSubscriptionDeleteResponse) {
1120 E2AP_PDU_t* pE2AP_PDU = (E2AP_PDU_t*)pE2AP_PDU_pointer;
1122 RICsubscriptionDeleteResponse_t *asnRicSubscriptionDeleteResponse = &pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionDeleteResponse;
1123 RICsubscriptionDeleteResponse_IEs_t* pRICsubscriptionDeleteResponse_IEs;
1126 if (asnRicSubscriptionDeleteResponse->protocolIEs.list.count > 0 &&
1127 asnRicSubscriptionDeleteResponse->protocolIEs.list.array[0]->id == ProtocolIE_ID_id_RICrequestID) {
1128 pRICsubscriptionDeleteResponse_IEs = asnRicSubscriptionDeleteResponse->protocolIEs.list.array[0];
1129 pRICSubscriptionDeleteResponse->ricRequestID.ricRequestorID = pRICsubscriptionDeleteResponse_IEs->value.choice.RICrequestID.ricRequestorID;
1130 pRICSubscriptionDeleteResponse->ricRequestID.ricInstanceID = pRICsubscriptionDeleteResponse_IEs->value.choice.RICrequestID.ricInstanceID;
1133 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1134 return e2err_RICsubscriptionDeleteResponseRICrequestIDMissing;
1138 if (asnRicSubscriptionDeleteResponse->protocolIEs.list.count > 1 &&
1139 asnRicSubscriptionDeleteResponse->protocolIEs.list.array[1]->id == ProtocolIE_ID_id_RANfunctionID) {
1140 pRICsubscriptionDeleteResponse_IEs = asnRicSubscriptionDeleteResponse->protocolIEs.list.array[1];
1141 pRICSubscriptionDeleteResponse->ranFunctionID = pRICsubscriptionDeleteResponse_IEs->value.choice.RANfunctionID;
1144 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1145 return e2err_RICsubscriptionDeleteResponseRANfunctionIDMissing;
1147 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1151 //////////////////////////////////////////////////////////////////////
1152 uint64_t getRICSubscriptionDeleteFailureData(e2ap_pdu_ptr_t* pE2AP_PDU_pointer, RICSubscriptionDeleteFailure_t* pRICSubscriptionDeleteFailure) {
1154 E2AP_PDU_t* pE2AP_PDU = (E2AP_PDU_t*)pE2AP_PDU_pointer;
1156 RICsubscriptionDeleteFailure_t *asnRicSubscriptionDeleteFailure = &pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionDeleteFailure;
1157 RICsubscriptionDeleteFailure_IEs_t* pRICsubscriptionDeleteFailure_IEs;
1160 if (asnRicSubscriptionDeleteFailure->protocolIEs.list.count > 0 &&
1161 asnRicSubscriptionDeleteFailure->protocolIEs.list.array[0]->id == ProtocolIE_ID_id_RICrequestID) {
1162 pRICsubscriptionDeleteFailure_IEs = asnRicSubscriptionDeleteFailure->protocolIEs.list.array[0];
1163 pRICSubscriptionDeleteFailure->ricRequestID.ricRequestorID = pRICsubscriptionDeleteFailure_IEs->value.choice.RICrequestID.ricRequestorID;
1164 pRICSubscriptionDeleteFailure->ricRequestID.ricInstanceID = pRICsubscriptionDeleteFailure_IEs->value.choice.RICrequestID.ricInstanceID;
1167 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1168 return e2err_RICsubscriptionDeleteFailureRICrequestIDMissing;
1172 if (asnRicSubscriptionDeleteFailure->protocolIEs.list.count > 1 &&
1173 asnRicSubscriptionDeleteFailure->protocolIEs.list.array[1]->id == ProtocolIE_ID_id_RANfunctionID) {
1174 pRICsubscriptionDeleteFailure_IEs = asnRicSubscriptionDeleteFailure->protocolIEs.list.array[1];
1175 pRICSubscriptionDeleteFailure->ranFunctionID = pRICsubscriptionDeleteFailure_IEs->value.choice.RANfunctionID;
1178 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1179 return e2err_RICsubscriptionDeleteFailureRANfunctionIDMissing;
1183 if (asnRicSubscriptionDeleteFailure->protocolIEs.list.count > 2 &&
1184 asnRicSubscriptionDeleteFailure->protocolIEs.list.array[2]->id == ProtocolIE_ID_id_Cause) {
1185 pRICsubscriptionDeleteFailure_IEs = asnRicSubscriptionDeleteFailure->protocolIEs.list.array[2];
1186 if (pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present == Cause_PR_ricRequest) {
1187 pRICSubscriptionDeleteFailure->cause.content = Cause_PR_ricRequest;
1188 pRICSubscriptionDeleteFailure->cause.causeVal =
1189 pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.ricRequest;
1191 else if (pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present == Cause_PR_ricService) {
1192 pRICSubscriptionDeleteFailure->cause.content = Cause_PR_ricService;
1193 pRICSubscriptionDeleteFailure->cause.causeVal =
1194 pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.ricService;
1196 else if (pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present == Cause_PR_e2Node) {
1197 pRICSubscriptionDeleteFailure->cause.content = Cause_PR_e2Node;
1198 pRICSubscriptionDeleteFailure->cause.causeVal =
1199 pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.e2Node;
1201 else if (pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present == Cause_PR_transport) {
1202 pRICSubscriptionDeleteFailure->cause.content = Cause_PR_transport;
1203 pRICSubscriptionDeleteFailure->cause.causeVal =
1204 pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.transport;
1206 else if (pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present == Cause_PR_protocol) {
1207 pRICSubscriptionDeleteFailure->cause.content = Cause_PR_protocol;
1208 pRICSubscriptionDeleteFailure->cause.causeVal =
1209 pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.protocol;
1211 else if(pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.present == Cause_PR_misc) {
1212 pRICSubscriptionDeleteFailure->cause.content = Cause_PR_misc;
1213 pRICSubscriptionDeleteFailure->cause.causeVal =
1214 pRICsubscriptionDeleteFailure_IEs->value.choice.Cause.choice.misc;
1218 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1219 return e2err_RICsubscriptionDeleteFailureRICcauseMissing;
1221 // CriticalityDiagnostics, OPTIONAL
1223 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1227 //**************************************************************************************************************************
1228 uint64_t packRICSubscriptionDeleteRequired(size_t* pDataBufferSize, byte* pDataBuffer, char* pLogBuffer, RICSubsDeleteRequired_t* pRICSubscriptionDeleteRequired) {
1230 E2AP_PDU_t *pE2AP_PDU = calloc(1, sizeof(E2AP_PDU_t));
1232 pE2AP_PDU->present = E2AP_PDU_PR_initiatingMessage;
1233 pE2AP_PDU->choice.initiatingMessage.procedureCode = ProcedureCode_id_RICsubscriptionDeleteRequired;
1234 pE2AP_PDU->choice.initiatingMessage.criticality = Criticality_ignore;
1235 pE2AP_PDU->choice.initiatingMessage.value.present = InitiatingMessage__value_PR_RICsubscriptionDeleteRequired;
1238 RICsubscriptionDeleteRequired_IEs_t *ricSubsDeleteRequiredIEs = calloc(1,
1239 sizeof(RICsubscriptionDeleteRequired_IEs_t));
1240 ricSubsDeleteRequiredIEs->id = ProtocolIE_ID_id_RICsubscriptionToBeRemoved;
1241 ricSubsDeleteRequiredIEs->criticality = Criticality_ignore;
1242 ricSubsDeleteRequiredIEs->value.present = RICsubscriptionDeleteRequired_IEs__value_PR_RICsubscription_List_withCause;
1244 for (int idx = 0; idx < pRICSubscriptionDeleteRequired->noOfRanSubscriptions; idx++) {
1245 RICsubscription_withCause_ItemIEs_t *ricSubsListWithCauseItem = calloc(1,
1246 sizeof(RICsubscription_withCause_ItemIEs_t));
1247 ricSubsListWithCauseItem->id = ProtocolIE_ID_id_RICsubscription_withCause_Item;
1248 ricSubsListWithCauseItem->criticality = Criticality_ignore;
1249 ricSubsListWithCauseItem->value.present = RICsubscription_withCause_ItemIEs__value_PR_RICsubscription_withCause_Item;
1252 ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.ricRequestID.ricRequestorID =
1253 pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].ricRequestID.ricRequestorID;
1254 ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.ricRequestID.ricInstanceID =
1255 pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].ricRequestID.ricInstanceID;
1258 ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.ranFunctionID =
1259 pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].ranFunctionID;
1262 if (pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.content ==
1263 Cause_PR_ricRequest) {
1264 ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.cause.present = Cause_PR_ricRequest;
1265 ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.cause.choice.ricRequest =
1266 pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.causeVal;
1267 } else if (pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.content ==
1268 Cause_PR_ricService) {
1269 ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.cause.present = Cause_PR_ricService;
1270 ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.cause.choice.ricService =
1271 pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.causeVal;
1272 } else if (pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.content ==
1274 ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.cause.present = Cause_PR_e2Node;
1275 ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.cause.choice.e2Node =
1276 pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.causeVal;
1277 } else if (pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.content ==
1278 Cause_PR_protocol) {
1279 ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.cause.present = Cause_PR_protocol;
1280 ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.cause.choice.protocol =
1281 pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.causeVal;
1282 } else if (pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.content ==
1283 Cause_PR_transport) {
1284 ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.cause.present = Cause_PR_transport;
1285 ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.cause.choice.transport =
1286 pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.causeVal;
1287 } else if (pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.content ==
1289 ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.cause.present = Cause_PR_misc;
1290 ricSubsListWithCauseItem->value.choice.RICsubscription_withCause_Item.cause.choice.misc =
1291 pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.causeVal;
1293 asn_sequence_add(&ricSubsDeleteRequiredIEs->value.choice.RICsubscription_List_withCause.list,
1294 ricSubsListWithCauseItem);
1297 &pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionDeleteRequired.protocolIEs.list,
1298 ricSubsDeleteRequiredIEs);
1300 if (E2encode(pE2AP_PDU, pDataBufferSize, pDataBuffer, pLogBuffer))
1303 return e2err_RICSubscriptionDeleteRequiredEncodeFail;
1307 return e2err_RICSubscriptionDeleteRequiredAllocE2AP_PDUFail;
1310 //**************************************************************************************************************************
1311 uint64_t getRICSubscriptionDeleteRequiredData(e2ap_pdu_ptr_t *pE2AP_PDU_pointer,
1312 RICSubsDeleteRequired_t *pRICSubscriptionDeleteRequired) {
1314 E2AP_PDU_t *pE2AP_PDU = (E2AP_PDU_t *) pE2AP_PDU_pointer;
1316 RICsubscriptionDeleteRequired_t *asnRicSubscriptionDeleteRequired = &pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionDeleteRequired;
1318 if (asnRicSubscriptionDeleteRequired->protocolIEs.list.count > 0 &&
1319 asnRicSubscriptionDeleteRequired->protocolIEs.list.array[0]->id ==
1320 ProtocolIE_ID_id_RICsubscriptionToBeRemoved) {
1321 if (asnRicSubscriptionDeleteRequired->protocolIEs.list.array[0]->value.present ==
1322 RICsubscriptionDeleteRequired_IEs__value_PR_RICsubscription_List_withCause) {
1323 RICsubscription_List_withCause_t riCsubscriptionListWithCause = asnRicSubscriptionDeleteRequired->protocolIEs.list.array[0]->value.choice.RICsubscription_List_withCause;
1324 pRICSubscriptionDeleteRequired->noOfRanSubscriptions = riCsubscriptionListWithCause.list.count;
1325 for (int idx = 0; idx < riCsubscriptionListWithCause.list.count; idx++) {
1326 RICsubscription_withCause_ItemIEs_t *riCsubscriptionWithCauseItemIEs = (RICsubscription_withCause_ItemIEs_t*)riCsubscriptionListWithCause.list.array[idx];
1327 if (riCsubscriptionWithCauseItemIEs->id == ProtocolIE_ID_id_RICsubscription_withCause_Item &&
1328 riCsubscriptionWithCauseItemIEs->value.present ==
1329 RICsubscription_withCause_ItemIEs__value_PR_RICsubscription_withCause_Item) {
1331 pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].ricRequestID.ricRequestorID = riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.ricRequestID.ricRequestorID;
1332 pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].ricRequestID.ricInstanceID = riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.ricRequestID.ricInstanceID;
1335 pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].ranFunctionID = riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.ranFunctionID;
1338 if (riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.cause.present ==
1339 Cause_PR_ricRequest) {
1340 pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.content = Cause_PR_ricRequest;
1341 pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.causeVal =
1342 riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.cause.choice.ricRequest;
1345 else if (riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.cause.present ==
1346 Cause_PR_ricService) {
1347 pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.content = Cause_PR_ricService;
1348 pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.causeVal =
1349 riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.cause.choice.ricService;
1351 riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.cause.present ==
1352 Cause_PR_transport) {
1353 pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.content = Cause_PR_transport;
1354 pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.causeVal =
1355 riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.cause.choice.transport;
1357 riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.cause.present ==
1358 Cause_PR_protocol) {
1359 pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.content = Cause_PR_protocol;
1360 pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.causeVal =
1361 riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.cause.choice.protocol;
1363 riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.cause.present ==
1365 pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.content = Cause_PR_misc;
1366 pRICSubscriptionDeleteRequired->ranSubscriptionsDelRequired[idx].cause.causeVal =
1367 riCsubscriptionWithCauseItemIEs->value.choice.RICsubscription_withCause_Item.cause.choice.misc;
1377 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);