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"
26 #include "E2SM-gNB-X2-eventTriggerDefinition.h"
27 #include "E2SM-gNB-X2-indicationHeader.h"
28 #include "E2SM-gNB-X2-indicationMessage.h"
29 #include "asn_constant.h"
33 static const bool debug = true;
35 static const bool debug = false;
39 const int64_t cMaxNrOfErrors = 256;
41 const uint64_t cMaxSizeOfOctetString = 1024;
43 const size_t cMacroENBIDP_20Bits = 20;
44 const size_t cHomeENBID_28Bits = 28;
45 const size_t cShortMacroENBID_18Bits = 18;
46 const size_t clongMacroENBIDP_21Bits = 21;
48 const int cRICCauseRadioNetwork = 1; // this is content of type RICCause_t
49 const int cRICCauseTransport = 2; // this is content of type RICCause_t
50 const int cRICCauseProtocol = 3; // this is content of type RICCause_t
51 const int cRICCauseMisc = 4; // this is content of type RICCause_t
52 const int cRICCauseRic = 5; // this is content of type RICCause_t
54 //////////////////////////////////////////////////////////////////////
57 // Below constant values are same as in E2AP, E2SM and X2AP specs
58 const uint64_t cE2InitiatingMessage = 1;
59 const uint64_t cE2SuccessfulOutcome = 2;
60 const uint64_t cE2UnsuccessfulOutcome = 3;
64 const uint64_t cRICSubscriptionRequest = 1;
65 const uint64_t cRICSubscriptionDeleteRequest = 2;
66 const uint64_t cRICIndication = 11;
69 const uint64_t cRICSubscriptionResponse = 1;
70 const uint64_t cRICsubscriptionDeleteResponse = 2;
72 // Unsuccessful outcome
73 const uint64_t cRICSubscriptionFailure = 1;
74 const uint64_t cRICsubscriptionDeleteFailure = 2;
81 //////////////////////////////////////////////////////////////////////
82 const char* getE2ErrorString(uint64_t errorCode) {
84 return E2ErrorStrings[errorCode];
87 /////////////////////////////////////////////////////////////////////
88 bool E2encode(E2AP_PDU_t* pE2AP_PDU, size_t* dataBufferSize, byte* dataBuffer, char* pLogBuffer) {
92 asn_fprint(stdout, &asn_DEF_E2AP_PDU, pE2AP_PDU);
95 rval = asn_encode_to_buffer(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, pE2AP_PDU, dataBuffer, *dataBufferSize);
96 if (rval.encoded == -1) {
97 sprintf(pLogBuffer,"Serialization of %s failed.", asn_DEF_E2AP_PDU.name);
98 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
101 else if (rval.encoded > *dataBufferSize) {
102 sprintf(pLogBuffer,"Buffer of size %zu is too small for %s, need %zu",*dataBufferSize, asn_DEF_E2AP_PDU.name, rval.encoded);
103 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
108 sprintf(pLogBuffer,"Successfully encoded %s. Buffer size %zu, encoded size %zu",asn_DEF_E2AP_PDU.name, *dataBufferSize, rval.encoded);
110 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
111 *dataBufferSize = rval.encoded;
116 //////////////////////////////////////////////////////////////////////
117 uint64_t packRICSubscriptionRequest(size_t* pdataBufferSize, byte* pDataBuffer, char* pLogBuffer, RICSubscriptionRequest_t* pRICSubscriptionRequest) {
119 E2AP_PDU_t* pE2AP_PDU = calloc(1, sizeof(E2AP_PDU_t));
122 pE2AP_PDU->present = E2AP_PDU_PR_initiatingMessage;
123 pE2AP_PDU->choice.initiatingMessage.procedureCode = ProcedureCode_id_ricSubscription;
124 pE2AP_PDU->choice.initiatingMessage.criticality = Criticality_ignore;
125 pE2AP_PDU->choice.initiatingMessage.value.present = RICInitiatingMessage__value_PR_RICsubscriptionRequest;
128 RICsubscriptionRequest_IEs_t* pRICsubscriptionRequest_IEs = calloc(1, sizeof(RICsubscriptionRequest_IEs_t));
129 if (pRICsubscriptionRequest_IEs) {
130 pRICsubscriptionRequest_IEs->id = ProtocolIE_ID_id_RICrequestID;
131 pRICsubscriptionRequest_IEs->criticality = Criticality_reject;
132 pRICsubscriptionRequest_IEs->value.present = RICsubscriptionRequest_IEs__value_PR_RICrequestID;
133 pRICsubscriptionRequest_IEs->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionRequest->ricRequestID.ricRequestorID;
134 pRICsubscriptionRequest_IEs->value.choice.RICrequestID.ricRequestSequenceNumber = pRICSubscriptionRequest->ricRequestID.ricRequestSequenceNumber;
135 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionRequest.protocolIEs.list, pRICsubscriptionRequest_IEs);
138 return e2err_RICSubscriptionRequestAllocRICrequestIDFail;
141 pRICsubscriptionRequest_IEs = calloc(1, sizeof(RICsubscriptionRequest_IEs_t));
142 if (pRICsubscriptionRequest_IEs) {
143 pRICsubscriptionRequest_IEs->id = ProtocolIE_ID_id_RANfunctionID;
144 pRICsubscriptionRequest_IEs->criticality = Criticality_reject;
145 pRICsubscriptionRequest_IEs->value.present = RICsubscriptionRequest_IEs__value_PR_RANfunctionID;
146 pRICsubscriptionRequest_IEs->value.choice.RANfunctionID = pRICSubscriptionRequest->ranFunctionID;
147 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionRequest.protocolIEs.list, pRICsubscriptionRequest_IEs);
150 return e2err_RICSubscriptionRequestAllocRANfunctionIDFail;
153 pRICsubscriptionRequest_IEs = calloc(1, sizeof(RICsubscriptionRequest_IEs_t));
154 if (pRICsubscriptionRequest_IEs) {
155 pRICsubscriptionRequest_IEs->id = ProtocolIE_ID_id_RICsubscription;
156 pRICsubscriptionRequest_IEs->criticality = Criticality_reject;
157 pRICsubscriptionRequest_IEs->value.present = RICsubscriptionRequest_IEs__value_PR_RICsubscription;
159 // RICeventTriggerDefinition
161 if ((returnCode = packRICEventTriggerDefinition(pLogBuffer, &pRICSubscriptionRequest->ricSubscription.ricEventTriggerDefinition) != e2err_OK))
164 pRICsubscriptionRequest_IEs->value.choice.RICsubscription.ricEventTriggerDefinition.buf =
165 calloc(1, pRICSubscriptionRequest->ricSubscription.ricEventTriggerDefinition.octetString.contentLength);
166 if (pRICsubscriptionRequest_IEs->value.choice.RICsubscription.ricEventTriggerDefinition.buf) {
167 pRICsubscriptionRequest_IEs->value.choice.RICsubscription.ricEventTriggerDefinition.size =
168 pRICSubscriptionRequest->ricSubscription.ricEventTriggerDefinition.octetString.contentLength;
169 memcpy(pRICsubscriptionRequest_IEs->value.choice.RICsubscription.ricEventTriggerDefinition.buf,
170 pRICSubscriptionRequest->ricSubscription.ricEventTriggerDefinition.octetString.data,
171 pRICSubscriptionRequest->ricSubscription.ricEventTriggerDefinition.octetString.contentLength);
174 return e2err_RICSubscriptionRequestAllocRICeventTriggerDefinitionBufFail;
176 // RICactions-ToBeSetup-List
178 while (index < pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.contentLength && index < maxofRICactionID) {
180 RICaction_ToBeSetup_ItemIEs_t* pRICaction_ToBeSetup_ItemIEs = calloc(1, sizeof(RICaction_ToBeSetup_ItemIEs_t));
181 if (pRICaction_ToBeSetup_ItemIEs) {
182 pRICaction_ToBeSetup_ItemIEs->id = ProtocolIE_ID_id_RICaction_ToBeSetup_Item;
183 pRICaction_ToBeSetup_ItemIEs->criticality = Criticality_reject;
184 pRICaction_ToBeSetup_ItemIEs->value.present = RICaction_ToBeSetup_ItemIEs__value_PR_RICaction_ToBeSetup_Item;
186 pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricActionID =
187 pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionID;
189 pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricActionType =
190 pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionType;
193 return e2err_RICSubscriptionRequestAllocRICaction_ToBeSetup_ItemIEsFail;
195 // RICactionDefinition, OPTIONAL
196 // This is not used in RIC
198 // RICsubsequentAction, OPTIONAL
199 RICsubsequentAction_t* pRICsubsequentAction = calloc(1, sizeof(RICsubsequentAction_t));
200 if (pRICsubsequentAction) {
201 pRICsubsequentAction->ricSubsequentActionType =
202 pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricSubsequentAction.ricSubsequentActionType;
203 pRICsubsequentAction->ricTimeToWait =
204 pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricSubsequentAction.ricTimeToWait;
205 pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricSubsequentAction = pRICsubsequentAction;
208 return e2err_RICSubscriptionRequestAllocRICsubsequentActionFail;
210 ASN_SEQUENCE_ADD(&pRICsubscriptionRequest_IEs->value.choice.RICsubscription.ricAction_ToBeSetup_List.list, pRICaction_ToBeSetup_ItemIEs);
213 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionRequest.protocolIEs.list, pRICsubscriptionRequest_IEs);
216 return e2err_RICSubscriptionRequestAllocRICsubscriptionRequest_IEsFail;
218 if (E2encode(pE2AP_PDU, pdataBufferSize, pDataBuffer, pLogBuffer))
221 return e2err_RICSubscriptionRequestEncodeFail;
223 return e2err_RICSubscriptionRequestAllocE2AP_PDUFail;
226 //////////////////////////////////////////////////////////////////////
227 uint64_t packRICEventTriggerDefinition(char* pLogBuffer, RICEventTriggerDefinition_t* pRICEventTriggerDefinition) {
229 E2SM_gNB_X2_eventTriggerDefinition_t* pE2SM_gNB_X2_eventTriggerDefinition = calloc(1, sizeof(E2SM_gNB_X2_eventTriggerDefinition_t));
230 if(pE2SM_gNB_X2_eventTriggerDefinition)
232 // RICeventTriggerDefinition
234 if ((pRICEventTriggerDefinition->interfaceID.globalENBIDPresent == true && pRICEventTriggerDefinition->interfaceID.globalGNBIDPresent == true) ||
235 (pRICEventTriggerDefinition->interfaceID.globalENBIDPresent == false && pRICEventTriggerDefinition->interfaceID.globalGNBIDPresent == false))
236 return e2err_RICEventTriggerDefinitionIEValueFail_1;
238 // GlobalENB-ID or GlobalGNB-ID
239 if (pRICEventTriggerDefinition->interfaceID.globalENBIDPresent)
241 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.present = Interface_ID_PR_global_eNB_ID;
245 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.pLMN_Identity.size =
246 pRICEventTriggerDefinition->interfaceID.globalENBID.pLMNIdentity.contentLength;
247 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.pLMN_Identity.buf = calloc(1,3);
248 if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.pLMN_Identity.buf) {
249 memcpy(pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.pLMN_Identity.buf,
250 pRICEventTriggerDefinition->interfaceID.globalENBID.pLMNIdentity.pLMNIdentityVal,
251 pRICEventTriggerDefinition->interfaceID.globalENBID.pLMNIdentity.contentLength);
254 return e2err_RICIndicationAllocRICEventTriggerDefinitionglobal_eNB_IDpLMN_IdentityBufFail;
257 if (pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.bits == cMacroENBIDP_20Bits){
258 // BIT STRING (SIZE (20)
259 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.present = ENB_ID_PR_macro_eNB_ID;
260 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.macro_eNB_ID.buf = calloc(1,3);
261 if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.macro_eNB_ID.buf) {
262 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.macro_eNB_ID.size = 3; // bytes
263 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.macro_eNB_ID.bits_unused = 4; // trailing unused bits
264 memcpy(pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.macro_eNB_ID.buf,
265 (void*)&pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.nodeID,3);
268 return e2err_RICIndicationAllocRICEventTriggerDefinitionglobal_eNB_IDeNB_IDmacro_eNB_IDBufFail;
270 else if (pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.bits == cHomeENBID_28Bits) {
271 // BIT STRING (SIZE (28)
272 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.present = ENB_ID_PR_home_eNB_ID;
273 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.home_eNB_ID.buf = calloc(1,4);
274 if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.home_eNB_ID.buf) {
275 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.home_eNB_ID.size = 4; // bytes
276 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.home_eNB_ID.bits_unused = 4; // trailing unused bits
277 memcpy(pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.home_eNB_ID.buf,
278 (void*)&pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.nodeID,4);
281 return e2err_RICIndicationAllocRICEventTriggerDefinitionglobal_eNB_IDeNB_IDhome_eNB_IDBufFail;
283 else if (pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.bits == cShortMacroENBID_18Bits) {
284 // BIT STRING (SIZE(18)
285 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.present = ENB_ID_PR_short_Macro_eNB_ID;
286 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.short_Macro_eNB_ID.buf = calloc(1,3);
287 if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.short_Macro_eNB_ID.buf) {
288 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.short_Macro_eNB_ID.size = 3;
289 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.short_Macro_eNB_ID.bits_unused = 6; // trailing unused bits
290 memcpy(pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.short_Macro_eNB_ID.buf,
291 (void*)&pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.nodeID,3);
294 return e2err_RICIndicationAllocRICEventTriggerDefinitionglobal_eNB_IDeNB_IDshort_Macro_eNB_IDBufFail;
296 else if (pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.bits == clongMacroENBIDP_21Bits) {
297 // BIT STRING (SIZE(21)
298 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.present = ENB_ID_PR_long_Macro_eNB_ID;
299 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.long_Macro_eNB_ID.buf = calloc(1,3);
300 if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.long_Macro_eNB_ID.buf) {
301 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.long_Macro_eNB_ID.size = 3; // bytes
302 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.long_Macro_eNB_ID.bits_unused = 3; // trailing unused bits
303 memcpy(pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.long_Macro_eNB_ID.buf,
304 (void*)&pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.nodeID,3);
307 return e2err_RICIndicationAllocRICEventTriggerDefinitionglobal_eNB_IDeNB_IDlong_Macro_eNB_IDBufFail;
310 return e2err_RICEventTriggerDefinitionIEValueFail_2;
313 else if (pRICEventTriggerDefinition->interfaceID.globalGNBIDPresent) {
315 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.present = Interface_ID_PR_global_gNB_ID;
318 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_gNB_ID.pLMN_Identity.size =
319 pRICEventTriggerDefinition->interfaceID.globalGNBID.pLMNIdentity.contentLength;
320 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_gNB_ID.pLMN_Identity.buf =
321 calloc(1,pRICEventTriggerDefinition->interfaceID.globalGNBID.pLMNIdentity.contentLength);
322 if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_gNB_ID.pLMN_Identity.buf) {
323 memcpy(pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_gNB_ID.pLMN_Identity.buf,
324 (void*)&pRICEventTriggerDefinition->interfaceID.globalGNBID.pLMNIdentity.pLMNIdentityVal,
325 pRICEventTriggerDefinition->interfaceID.globalGNBID.pLMNIdentity.contentLength);
328 return e2err_RICIndicationAllocRICEventTriggerDefinitionglobal_gNB_IDpLMN_IdentityBufFail;
330 // GNB-ID, BIT STRING (SIZE (22..32)
331 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_gNB_ID.gNB_ID.choice.gNB_ID.size = 4; //32bits
332 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_gNB_ID.gNB_ID.choice.gNB_ID.buf = calloc(1, 4);
333 if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_gNB_ID.gNB_ID.choice.gNB_ID.buf) {
334 memcpy(pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_gNB_ID.gNB_ID.choice.gNB_ID.buf,
335 (void*)&pRICEventTriggerDefinition->interfaceID.globalGNBID,4); //32bits
338 return e2err_RICIndicationAllocRICEventTriggerDefinitionglobal_gNB_IDgNB_IDBufFail;
341 return e2err_RICEventTriggerDefinitionIEValueFail_3;
343 // InterfaceDirection
344 pE2SM_gNB_X2_eventTriggerDefinition->interfaceDirection = pRICEventTriggerDefinition->interfaceDirection;
346 // InterfaceMessageType
348 pE2SM_gNB_X2_eventTriggerDefinition->interfaceMessageType.procedureCode = pRICEventTriggerDefinition->interfaceMessageType.procedureCode;
351 if(pRICEventTriggerDefinition->interfaceMessageType.typeOfMessage == cE2InitiatingMessage)
352 pE2SM_gNB_X2_eventTriggerDefinition->interfaceMessageType.typeOfMessage = TypeOfMessage_initiating_message;
353 else if(pRICEventTriggerDefinition->interfaceMessageType.typeOfMessage == cE2SuccessfulOutcome)
354 pE2SM_gNB_X2_eventTriggerDefinition->interfaceMessageType.typeOfMessage = TypeOfMessage_successful_outcome;
355 else if(pRICEventTriggerDefinition->interfaceMessageType.typeOfMessage == cE2UnsuccessfulOutcome)
356 pE2SM_gNB_X2_eventTriggerDefinition->interfaceMessageType.typeOfMessage = TypeOfMessage_unsuccessful_outcome;
358 return e2err_RICEventTriggerDefinitionIEValueFail_4;
360 // InterfaceProtocolIE-List, OPTIONAL
364 asn_fprint(stdout, &asn_DEF_E2SM_gNB_X2_eventTriggerDefinition, pE2SM_gNB_X2_eventTriggerDefinition);
367 size_t bufferSize = sizeof(pRICEventTriggerDefinition->octetString.data);
369 rval = asn_encode_to_buffer(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2SM_gNB_X2_eventTriggerDefinition, pE2SM_gNB_X2_eventTriggerDefinition,
370 pRICEventTriggerDefinition->octetString.data, bufferSize);
371 if(rval.encoded == -1)
373 sprintf(pLogBuffer,"Serialization of %s failed.", asn_DEF_E2SM_gNB_X2_eventTriggerDefinition.name);
374 return e2err_RICEventTriggerDefinitionPackFail_1;
376 else if(rval.encoded > bufferSize)
378 sprintf(pLogBuffer,"Buffer of size %zu is too small for %s, need %zu",bufferSize, asn_DEF_E2SM_gNB_X2_eventTriggerDefinition.name, rval.encoded);
379 return e2err_RICEventTriggerDefinitionPackFail_2;
383 sprintf(pLogBuffer,"Successfully encoded %s. Buffer size %zu, encoded size %zu",asn_DEF_E2SM_gNB_X2_eventTriggerDefinition.name, bufferSize, rval.encoded);
385 ASN_STRUCT_FREE(asn_DEF_E2SM_gNB_X2_eventTriggerDefinition, pE2SM_gNB_X2_eventTriggerDefinition);
387 pRICEventTriggerDefinition->octetString.contentLength = rval.encoded;
390 return e2err_RICEventTriggerDefinitionAllocE2SM_gNB_X2_eventTriggerDefinitionFail;
393 //////////////////////////////////////////////////////////////////////
394 uint64_t packRICSubscriptionResponse(size_t* pDataBufferSize, byte* pDataBuffer, char* pLogBuffer, RICSubscriptionResponse_t* pRICSubscriptionResponse) {
396 E2AP_PDU_t* pE2AP_PDU = calloc(1, sizeof(E2AP_PDU_t));
399 pE2AP_PDU->present = E2AP_PDU_PR_successfulOutcome;
400 pE2AP_PDU->choice.initiatingMessage.procedureCode = ProcedureCode_id_ricSubscription;
401 pE2AP_PDU->choice.initiatingMessage.criticality = Criticality_ignore;
402 pE2AP_PDU->choice.initiatingMessage.value.present = RICSuccessfulOutcome__value_PR_RICsubscriptionResponse;
405 RICsubscriptionResponse_IEs_t* pRICsubscriptionResponse_IEs = calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
406 if (pRICsubscriptionResponse_IEs) {
407 pRICsubscriptionResponse_IEs->id = ProtocolIE_ID_id_RICrequestID;
408 pRICsubscriptionResponse_IEs->criticality = Criticality_reject;
409 pRICsubscriptionResponse_IEs->value.present = RICsubscriptionResponse_IEs__value_PR_RICrequestID;
410 pRICsubscriptionResponse_IEs->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionResponse->ricRequestID.ricRequestorID;
411 pRICsubscriptionResponse_IEs->value.choice.RICrequestID.ricRequestSequenceNumber = pRICSubscriptionResponse->ricRequestID.ricRequestSequenceNumber;
412 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionResponse.protocolIEs.list, pRICsubscriptionResponse_IEs);
415 return e2err_RICSubscriptionResponseAllocRICrequestIDFail;
418 pRICsubscriptionResponse_IEs = calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
419 if (pRICsubscriptionResponse_IEs) {
420 pRICsubscriptionResponse_IEs->id = ProtocolIE_ID_id_RANfunctionID;
421 pRICsubscriptionResponse_IEs->criticality = Criticality_reject;
422 pRICsubscriptionResponse_IEs->value.present = RICsubscriptionResponse_IEs__value_PR_RANfunctionID;
423 pRICsubscriptionResponse_IEs->value.choice.RANfunctionID = pRICSubscriptionResponse->ranFunctionID;
424 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionResponse.protocolIEs.list, pRICsubscriptionResponse_IEs);
427 return e2err_RICSubscriptionResponseAllocRANfunctionIDFail;
429 // RICaction-Admitted list
430 pRICsubscriptionResponse_IEs = calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
431 if (pRICsubscriptionResponse_IEs) {
432 pRICsubscriptionResponse_IEs->id = ProtocolIE_ID_id_RICactions_Admitted;
433 pRICsubscriptionResponse_IEs->criticality = Criticality_reject;
434 pRICsubscriptionResponse_IEs->value.present = RICsubscriptionResponse_IEs__value_PR_RICaction_Admitted_List;
437 while (index < pRICSubscriptionResponse->ricActionAdmittedList.contentLength && index < maxofRICactionID) {
439 RICaction_Admitted_ItemIEs_t* pRICaction_Admitted_ItemIEs = calloc(1, sizeof (RICaction_Admitted_ItemIEs_t));
440 if (pRICaction_Admitted_ItemIEs)
442 pRICaction_Admitted_ItemIEs->id = ProtocolIE_ID_id_RICaction_Admitted_Item;
443 pRICaction_Admitted_ItemIEs->criticality = Criticality_reject;
444 pRICaction_Admitted_ItemIEs->value.present = RICaction_Admitted_ItemIEs__value_PR_RICaction_Admitted_Item;
447 pRICaction_Admitted_ItemIEs->value.choice.RICaction_Admitted_Item.ricActionID = pRICSubscriptionResponse->ricActionAdmittedList.ricActionID[index];
448 ASN_SEQUENCE_ADD(&pRICsubscriptionResponse_IEs->value.choice.RICaction_Admitted_List.list, pRICaction_Admitted_ItemIEs);
451 return e2err_RICSubscriptionResponseAllocRICaction_Admitted_ItemIEsFail;
456 return e2err_RICSubscriptionResponseAllocRICActionAdmittedListFail;
458 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionResponse.protocolIEs.list, pRICsubscriptionResponse_IEs);
460 // RICaction-NotAdmitted list
461 if (pRICSubscriptionResponse->ricActionNotAdmittedListPresent) {
462 pRICsubscriptionResponse_IEs = calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
463 if (pRICsubscriptionResponse_IEs) {
464 pRICsubscriptionResponse_IEs->id = ProtocolIE_ID_id_RICactions_NotAdmitted;
465 pRICsubscriptionResponse_IEs->criticality = Criticality_reject;
466 pRICsubscriptionResponse_IEs->value.present = RICsubscriptionResponse_IEs__value_PR_RICaction_NotAdmitted_List;
469 while (index < pRICSubscriptionResponse->ricActionNotAdmittedList.contentLength && index < maxofRICactionID) {
471 RICaction_NotAdmitted_ItemIEs_t* pRICaction_NotAdmitted_ItemIEs = calloc(1, sizeof (RICaction_NotAdmitted_ItemIEs_t));
472 if (pRICaction_NotAdmitted_ItemIEs)
474 pRICaction_NotAdmitted_ItemIEs->id = ProtocolIE_ID_id_RICaction_NotAdmitted_Item;
475 pRICaction_NotAdmitted_ItemIEs->criticality = Criticality_reject;
476 pRICaction_NotAdmitted_ItemIEs->value.present = RICaction_NotAdmitted_ItemIEs__value_PR_RICaction_NotAdmitted_Item;
479 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricActionID =
480 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricActionID;
483 if (pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content == RICcause_PR_radioNetwork) {
484 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present = RICcause_PR_radioNetwork;
485 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.radioNetwork =
486 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause;
488 else if (pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content == RICcause_PR_transport) {
489 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present = RICcause_PR_transport;
490 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.transport =
491 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause;
493 else if (pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content == RICcause_PR_protocol) {
494 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present = RICcause_PR_protocol;
495 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.protocol =
496 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause;
498 else if (pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content == RICcause_PR_misc) {
499 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present = RICcause_PR_misc;
500 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.misc =
501 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause;
503 else if (pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content == RICcause_PR_ric) {
504 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present = RICcause_PR_ric;
505 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.ric =
506 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause;
508 ASN_SEQUENCE_ADD(&pRICsubscriptionResponse_IEs->value.choice.RICaction_NotAdmitted_List.list, pRICaction_NotAdmitted_ItemIEs);
511 return e2err_RICSubscriptionResponseAllocRICaction_NotAdmitted_ItemIEsFail;
515 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionResponse.protocolIEs.list, pRICsubscriptionResponse_IEs);
518 return e2err_RICSubscriptionResponseAllocRICActionNotAdmittedListFail;
520 if (E2encode(pE2AP_PDU, pDataBufferSize, pDataBuffer, pLogBuffer))
523 return e2err_RICSubscriptionResponseEncodeFail;
525 return e2err_RICSubscriptionResponseAllocE2AP_PDUFail;
528 //////////////////////////////////////////////////////////////////////
529 uint64_t packRICSubscriptionFailure(size_t* pDataBufferSize, byte* pDataBuffer, char* pLogBuffer, RICSubscriptionFailure_t* pRICSubscriptionFailure) {
531 E2AP_PDU_t* pE2AP_PDU = calloc(1, sizeof(E2AP_PDU_t));
534 pE2AP_PDU->present = E2AP_PDU_PR_unsuccessfulOutcome;
535 pE2AP_PDU->choice.unsuccessfulOutcome.procedureCode = ProcedureCode_id_ricSubscription;
536 pE2AP_PDU->choice.unsuccessfulOutcome.criticality = Criticality_ignore;
537 pE2AP_PDU->choice.unsuccessfulOutcome.value.present = RICUnsuccessfulOutcome__value_PR_RICsubscriptionFailure;
540 RICsubscriptionFailure_IEs_t* pRICsubscriptionFailure_IEs = calloc(1, sizeof(RICsubscriptionFailure_IEs_t));
541 if (pRICsubscriptionFailure_IEs) {
542 pRICsubscriptionFailure_IEs->id = ProtocolIE_ID_id_RICrequestID;
543 pRICsubscriptionFailure_IEs->criticality = Criticality_reject;
544 pRICsubscriptionFailure_IEs->value.present = RICsubscriptionFailure_IEs__value_PR_RICrequestID;
545 pRICsubscriptionFailure_IEs->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionFailure->ricRequestID.ricRequestorID;
546 pRICsubscriptionFailure_IEs->value.choice.RICrequestID.ricRequestSequenceNumber = pRICSubscriptionFailure->ricRequestID.ricRequestSequenceNumber;
547 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionFailure.protocolIEs.list, pRICsubscriptionFailure_IEs);
550 return e2err_RICSubscriptionFailureAllocRICrequestIDFail;
553 pRICsubscriptionFailure_IEs = calloc(1, sizeof(RICsubscriptionFailure_IEs_t));
554 if (pRICsubscriptionFailure_IEs) {
555 pRICsubscriptionFailure_IEs->id = ProtocolIE_ID_id_RANfunctionID;
556 pRICsubscriptionFailure_IEs->criticality = Criticality_reject;
557 pRICsubscriptionFailure_IEs->value.present = RICsubscriptionFailure_IEs__value_PR_RANfunctionID;
558 pRICsubscriptionFailure_IEs->value.choice.RANfunctionID = pRICSubscriptionFailure->ranFunctionID;
559 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionFailure.protocolIEs.list, pRICsubscriptionFailure_IEs);
562 return e2err_RICSubscriptionFailureAllocRANfunctionIDFail;
564 // RICaction-NotAdmitted list
565 pRICsubscriptionFailure_IEs = calloc(1, sizeof(RICsubscriptionFailure_IEs_t));
566 if (pRICsubscriptionFailure_IEs) {
567 pRICsubscriptionFailure_IEs->id = ProtocolIE_ID_id_RICactions_NotAdmitted;
568 pRICsubscriptionFailure_IEs->criticality = Criticality_reject;
569 pRICsubscriptionFailure_IEs->value.present = RICsubscriptionFailure_IEs__value_PR_RICaction_NotAdmitted_List;
572 while (index < pRICSubscriptionFailure->ricActionNotAdmittedList.contentLength && index < maxofRICactionID) {
574 RICaction_NotAdmitted_ItemIEs_t* pRICaction_NotAdmitted_ItemIEs = calloc(1, sizeof (RICaction_NotAdmitted_ItemIEs_t));
575 if (pRICaction_NotAdmitted_ItemIEs)
577 pRICaction_NotAdmitted_ItemIEs->id = ProtocolIE_ID_id_RICaction_NotAdmitted_Item;
578 pRICaction_NotAdmitted_ItemIEs->criticality = Criticality_reject;
579 pRICaction_NotAdmitted_ItemIEs->value.present = RICaction_NotAdmitted_ItemIEs__value_PR_RICaction_NotAdmitted_Item;
582 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricActionID =
583 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricActionID;
586 if (pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content == RICcause_PR_radioNetwork) {
587 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present = RICcause_PR_radioNetwork;
588 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.radioNetwork =
589 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause;
591 else if (pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content == RICcause_PR_transport) {
592 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present = RICcause_PR_transport;
593 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.transport =
594 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause;
596 else if (pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content == RICcause_PR_protocol) {
597 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present = RICcause_PR_protocol;
598 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.protocol =
599 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause;
601 else if (pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content == RICcause_PR_misc) {
602 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present = RICcause_PR_misc;
603 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.misc =
604 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause;
606 else if (pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content == RICcause_PR_ric) {
607 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present = RICcause_PR_ric;
608 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.ric =
609 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause;
611 ASN_SEQUENCE_ADD(&pRICsubscriptionFailure_IEs->value.choice.RICaction_NotAdmitted_List.list, pRICaction_NotAdmitted_ItemIEs);
614 return e2err_RICSubscriptionFailureAllocRICaction_NotAdmitted_ItemIEsFail;
617 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionFailure.protocolIEs.list, pRICsubscriptionFailure_IEs);
620 return e2err_RICSubscriptionFailureAllocRICActionAdmittedListFail;
622 // CriticalityDiagnostics, OPTIONAL. Not used in RIC
624 if (E2encode(pE2AP_PDU, pDataBufferSize, pDataBuffer, pLogBuffer))
627 return e2err_RICSubscriptionFailureEncodeFail;
630 return e2err_RICSubscriptionFailureAllocE2AP_PDUFail;
633 //////////////////////////////////////////////////////////////////////
634 uint64_t packRICIndication(size_t* pDataBufferSize, byte* pDataBuffer, char* pLogBuffer, RICIndication_t* pRICIndication) {
636 E2AP_PDU_t* pE2AP_PDU = calloc(1, sizeof(E2AP_PDU_t));
639 pE2AP_PDU->present = E2AP_PDU_PR_initiatingMessage;
640 pE2AP_PDU->choice.initiatingMessage.procedureCode = ProcedureCode_id_ricIndication;
641 pE2AP_PDU->choice.initiatingMessage.criticality = Criticality_ignore;
642 pE2AP_PDU->choice.initiatingMessage.value.present = RICInitiatingMessage__value_PR_RICindication;
645 RICindication_IEs_t* pRICindication_IEs = calloc(1, sizeof(RICindication_IEs_t));
646 if (pRICindication_IEs) {
647 pRICindication_IEs->id = ProtocolIE_ID_id_RICrequestID;
648 pRICindication_IEs->criticality = Criticality_reject;
649 pRICindication_IEs->value.present = RICindication_IEs__value_PR_RICrequestID;
650 pRICindication_IEs->value.choice.RICrequestID.ricRequestorID = pRICIndication->ricRequestID.ricRequestorID;
651 pRICindication_IEs->value.choice.RICrequestID.ricRequestSequenceNumber = pRICIndication->ricRequestID.ricRequestSequenceNumber;
652 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.initiatingMessage.value.choice.RICindication.protocolIEs.list, pRICindication_IEs);
655 return e2err_RICIndicationRICrequestIDFail;
658 pRICindication_IEs = calloc(1, sizeof(RICindication_IEs_t));
659 if (pRICindication_IEs) {
660 pRICindication_IEs->id = ProtocolIE_ID_id_RANfunctionID;
661 pRICindication_IEs->criticality = Criticality_reject;
662 pRICindication_IEs->value.present = RICindication_IEs__value_PR_RANfunctionID;
663 pRICindication_IEs->value.choice.RANfunctionID = pRICIndication->ranFunctionID;
664 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.initiatingMessage.value.choice.RICindication.protocolIEs.list, pRICindication_IEs);
667 return e2err_RICIndicationAllocRANfunctionIDFail;
670 pRICindication_IEs = calloc(1, sizeof(RICindication_IEs_t));
671 if (pRICindication_IEs) {
672 pRICindication_IEs->id = ProtocolIE_ID_id_RICactionID;
673 pRICindication_IEs->criticality = Criticality_reject;
674 pRICindication_IEs->value.present = RICindication_IEs__value_PR_RICactionID;
675 pRICindication_IEs->value.choice.RICactionID = pRICIndication->ricActionID;
676 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.initiatingMessage.value.choice.RICindication.protocolIEs.list, pRICindication_IEs);
679 return e2err_RICIndicationAllocRICactionIDFail;
682 pRICindication_IEs = calloc(1, sizeof(RICindication_IEs_t));
683 if (pRICindication_IEs) {
684 pRICindication_IEs->id = ProtocolIE_ID_id_RICindicationSN;
685 pRICindication_IEs->criticality = Criticality_reject;
686 pRICindication_IEs->value.present = RICindication_IEs__value_PR_RICindicationSN;
687 pRICindication_IEs->value.choice.RICindicationSN = pRICIndication->ricIndicationSN;
688 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.initiatingMessage.value.choice.RICindication.protocolIEs.list, pRICindication_IEs);
691 return e2err_RICIndicationAllocRICindicationSNFail;
694 pRICindication_IEs = calloc(1, sizeof(RICindication_IEs_t));
695 if (pRICindication_IEs) {
696 pRICindication_IEs->id = ProtocolIE_ID_id_RICindicationType;
697 pRICindication_IEs->criticality = Criticality_reject;
698 pRICindication_IEs->value.present = RICindication_IEs__value_PR_RICindicationType;
699 pRICindication_IEs->value.choice.RICindicationType = pRICIndication->ricIndicationType;
700 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.initiatingMessage.value.choice.RICindication.protocolIEs.list, pRICindication_IEs);
703 return e2err_RICIndicationAllocRICindicationTypeFail;
705 // RICindicationHeader
707 uint64_t logBufferSize = 512;
708 char logBuffer[logBufferSize];
709 if ((returnCode = packRICIndicationHeader(logBuffer, &pRICIndication->ricIndicationHeader)) != e2err_OK) {
713 pRICindication_IEs = calloc(1, sizeof(RICindication_IEs_t));
714 if (pRICindication_IEs) {
715 pRICindication_IEs->id = ProtocolIE_ID_id_RICindicationHeader;
716 pRICindication_IEs->criticality = Criticality_reject;
717 pRICindication_IEs->value.present = RICindication_IEs__value_PR_RICindicationHeader;
718 pRICindication_IEs->value.choice.RICindicationHeader.buf = calloc(1,pRICIndication->ricIndicationHeader.octetString.contentLength);
719 if (pRICindication_IEs->value.choice.RICindicationHeader.buf) {
720 pRICindication_IEs->value.choice.RICindicationHeader.size = pRICIndication->ricIndicationHeader.octetString.contentLength;
721 memcpy(pRICindication_IEs->value.choice.RICindicationHeader.buf,pRICIndication->ricIndicationHeader.octetString.data,
722 pRICIndication->ricIndicationHeader.octetString.contentLength);
723 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.initiatingMessage.value.choice.RICindication.protocolIEs.list, pRICindication_IEs);
726 return e2err_RICIndicationAllocRRICindicationHeaderBufFail;
729 return e2err_RICIndicationAllocRICindicationHeaderFail;
731 // RICindicationMessage
732 if ((returnCode = packRICIndicationMessage(logBuffer, &pRICIndication->ricIndicationMessage)) != e2err_OK) {
736 pRICindication_IEs = calloc(1, sizeof(RICindication_IEs_t));
737 if (pRICindication_IEs) {
738 pRICindication_IEs->id = ProtocolIE_ID_id_RICindicationMessage;
739 pRICindication_IEs->criticality = Criticality_reject;
740 pRICindication_IEs->value.present = RICindication_IEs__value_PR_RICindicationMessage;
741 pRICindication_IEs->value.choice.RICindicationMessage.buf = calloc(1,pRICIndication->ricIndicationMessage.octetString.contentLength);
742 if (pRICindication_IEs->value.choice.RICindicationMessage.buf) {
743 pRICindication_IEs->value.choice.RICindicationMessage.size = pRICIndication->ricIndicationMessage.octetString.contentLength;
744 memcpy(pRICindication_IEs->value.choice.RICindicationHeader.buf,pRICIndication->ricIndicationMessage.octetString.data,
745 pRICIndication->ricIndicationMessage.octetString.contentLength);
746 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.initiatingMessage.value.choice.RICindication.protocolIEs.list, pRICindication_IEs);
749 return e2err_RICIndicationAllocRICindicationMessageBufFail;
752 return e2err_RICIndicationAllocRICindicationMessageFail;
754 // RICcallProcessID, OPTIONAL. Not used in RIC.
756 if (E2encode(pE2AP_PDU, pDataBufferSize, pDataBuffer, pLogBuffer))
759 return e2err_RICIndicationEncodeFail;
762 return e2err_RICIndicationAllocE2AP_PDUFail;
765 //////////////////////////////////////////////////////////////////////
766 uint64_t packRICIndicationHeader(char* pLogBuffer, RICIndicationHeader_t* pRICIndicationHeader) {
768 E2SM_gNB_X2_indicationHeader_t* pE2SM_gNB_X2_indicationHeader = calloc(1, sizeof(E2SM_gNB_X2_indicationHeader_t));
769 if(pE2SM_gNB_X2_indicationHeader)
772 if ((pRICIndicationHeader->interfaceID.globalENBIDPresent == true && pRICIndicationHeader->interfaceID.globalGNBIDPresent == true) ||
773 (pRICIndicationHeader->interfaceID.globalENBIDPresent == false && pRICIndicationHeader->interfaceID.globalGNBIDPresent == false))
774 return e2err_RICindicationHeaderIEValueFail_1;
776 // GlobalENB-ID or GlobalGNB-ID
777 if (pRICIndicationHeader->interfaceID.globalENBIDPresent)
779 pE2SM_gNB_X2_indicationHeader->interface_ID.present = Interface_ID_PR_global_eNB_ID;
783 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.pLMN_Identity.size =
784 pRICIndicationHeader->interfaceID.globalENBID.pLMNIdentity.contentLength;
785 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.pLMN_Identity.buf = calloc(1,3);
786 if (pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.pLMN_Identity.buf) {
787 memcpy(pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.pLMN_Identity.buf,
788 pRICIndicationHeader->interfaceID.globalENBID.pLMNIdentity.pLMNIdentityVal,
789 pRICIndicationHeader->interfaceID.globalENBID.pLMNIdentity.contentLength);
792 return e2err_RICIndicationAllocRICIndicationHeaderglobal_eNB_IDpLMN_IdentityBufFail;
795 if (pRICIndicationHeader->interfaceID.globalENBID.nodeID.bits == cMacroENBIDP_20Bits){
796 // BIT STRING (SIZE (20)
797 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.present = ENB_ID_PR_macro_eNB_ID;
799 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.macro_eNB_ID.buf = calloc(1,3);
800 if (pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.macro_eNB_ID.buf) {
801 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.macro_eNB_ID.size = 3; // bytes
802 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.macro_eNB_ID.bits_unused = 4; // trailing unused bits
803 memcpy(pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.macro_eNB_ID.buf,
804 (void*)&pRICIndicationHeader->interfaceID.globalENBID.nodeID.nodeID,3);
807 return e2err_RICIndicationAllocRICIndicationHeaderglobal_eNB_IDeNB_IDmacro_eNB_IDBufFail;
809 else if (pRICIndicationHeader->interfaceID.globalENBID.nodeID.bits == cHomeENBID_28Bits) {
810 // BIT STRING (SIZE (28)
811 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.present = ENB_ID_PR_home_eNB_ID;
813 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.home_eNB_ID.buf = calloc(1,4);
814 if (pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.home_eNB_ID.buf) {
815 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.home_eNB_ID.size = 4; // bytes
816 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.home_eNB_ID.bits_unused = 4; // trailing unused bits
817 memcpy(pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.home_eNB_ID.buf,
818 (void*)&pRICIndicationHeader->interfaceID.globalENBID.nodeID.nodeID,4);
821 return e2err_RICIndicationAllocRICIndicationHeaderglobal_eNB_IDeNB_IDhome_eNB_IDBufFail;
823 else if (pRICIndicationHeader->interfaceID.globalENBID.nodeID.bits == cShortMacroENBID_18Bits) {
824 // BIT STRING (SIZE(18)
825 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.present = ENB_ID_PR_short_Macro_eNB_ID;
827 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.short_Macro_eNB_ID.buf = calloc(1,3);
828 if (pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.short_Macro_eNB_ID.buf) {
829 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.short_Macro_eNB_ID.size = 3;
830 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.short_Macro_eNB_ID.bits_unused = 6; // trailing unused bits
831 memcpy(pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.short_Macro_eNB_ID.buf,
832 (void*)&pRICIndicationHeader->interfaceID.globalENBID.nodeID.nodeID,3);
835 return e2err_RICIndicationAllocRICIndicationHeaderglobal_eNB_IDeNB_IDshort_Macro_eNB_IDBufFail;
837 else if (pRICIndicationHeader->interfaceID.globalENBID.nodeID.bits == clongMacroENBIDP_21Bits) {
838 // BIT STRING (SIZE(21)
839 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.present = ENB_ID_PR_long_Macro_eNB_ID;
841 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.long_Macro_eNB_ID.buf = calloc(1,3);
842 if (pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.long_Macro_eNB_ID.buf) {
843 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.long_Macro_eNB_ID.size = 3; // bytes
844 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.long_Macro_eNB_ID.bits_unused = 3; // trailing unused bits
845 memcpy(pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.long_Macro_eNB_ID.buf,
846 (void*)&pRICIndicationHeader->interfaceID.globalENBID.nodeID.nodeID,3);
849 return e2err_RICIndicationAllocRICIndicationHeaderglobal_eNB_IDeNB_IDlong_Macro_eNB_IDBufFail;
852 return e2err_RICindicationHeaderIEValueFail_2;
855 else if (pRICIndicationHeader->interfaceID.globalGNBIDPresent) {
857 pE2SM_gNB_X2_indicationHeader->interface_ID.present = Interface_ID_PR_global_gNB_ID;
860 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_gNB_ID.pLMN_Identity.size =
861 pRICIndicationHeader->interfaceID.globalGNBID.pLMNIdentity.contentLength;
862 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_gNB_ID.pLMN_Identity.buf =
863 calloc(1,pRICIndicationHeader->interfaceID.globalGNBID.pLMNIdentity.contentLength);
864 if (pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_gNB_ID.pLMN_Identity.buf) {
865 memcpy(pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_gNB_ID.pLMN_Identity.buf,
866 (void*)&pRICIndicationHeader->interfaceID.globalGNBID.pLMNIdentity.pLMNIdentityVal,
867 pRICIndicationHeader->interfaceID.globalGNBID.pLMNIdentity.contentLength);
870 return e2err_RICIndicationAllocRICIndicationHeaderglobal_gNB_IDpLMN_IdentityBufFail;
872 // GNB-ID, BIT STRING (SIZE (22..32)
873 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_gNB_ID.gNB_ID.choice.gNB_ID.size = 4; //32bits
874 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_gNB_ID.gNB_ID.choice.gNB_ID.buf = calloc(1,4);
875 if (pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_gNB_ID.gNB_ID.choice.gNB_ID.buf) {
876 memcpy(pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_gNB_ID.gNB_ID.choice.gNB_ID.buf,
877 (void*)&pRICIndicationHeader->interfaceID.globalGNBID,4); //32bits
880 return e2err_RICIndicationAllocRICIndicationHeaderglobal_gNB_IDgNB_IDgNB_IDBufFail;
883 return e2err_RICindicationHeaderIEValueFail_3;
885 // InterfaceDirection
886 pE2SM_gNB_X2_indicationHeader->interfaceDirection = pRICIndicationHeader->interfaceDirection;
888 // TimeStamp OPTIONAL. Not used in RIC.
892 asn_fprint(stdout, &asn_DEF_E2SM_gNB_X2_indicationHeader, pE2SM_gNB_X2_indicationHeader);
895 size_t bufferSize = sizeof(pRICIndicationHeader->octetString.data);
897 rval = asn_encode_to_buffer(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2SM_gNB_X2_indicationHeader, pE2SM_gNB_X2_indicationHeader,
898 pRICIndicationHeader->octetString.data, bufferSize);
899 if(rval.encoded == -1)
901 sprintf(pLogBuffer,"Serialization of %s failed.", asn_DEF_E2SM_gNB_X2_indicationHeader.name);
902 return e2err_RICindicationHeaderPackFail_1;
904 else if(rval.encoded > bufferSize)
906 sprintf(pLogBuffer,"Buffer of size %zu is too small for %s, need %zu",bufferSize, asn_DEF_E2SM_gNB_X2_indicationHeader.name, rval.encoded);
907 return e2err_RICindicationHeaderPackFail_2;
911 sprintf(pLogBuffer,"Successfully encoded %s. Buffer size %zu, encoded size %zu",asn_DEF_E2SM_gNB_X2_indicationHeader.name, bufferSize, rval.encoded);
913 ASN_STRUCT_FREE(asn_DEF_E2SM_gNB_X2_indicationHeader, pE2SM_gNB_X2_indicationHeader);
915 pRICIndicationHeader->octetString.contentLength = rval.encoded;
919 return e2err_RICIndicationHeaderAllocE2AP_PDUFail;
922 //////////////////////////////////////////////////////////////////////
923 uint64_t packRICIndicationMessage(char* pLogBuffer, RICIndicationMessage_t* pRICIndicationMessage) {
925 E2SM_gNB_X2_indicationMessage_t* pE2SM_gNB_X2_indicationMessage = calloc(1, sizeof(E2SM_gNB_X2_indicationMessage_t));
926 if(pE2SM_gNB_X2_indicationMessage)
928 pE2SM_gNB_X2_indicationMessage->interfaceMessage.buf = calloc(1, pRICIndicationMessage->interfaceMessage.contentLength);
929 if(pE2SM_gNB_X2_indicationMessage->interfaceMessage.buf)
931 pE2SM_gNB_X2_indicationMessage->interfaceMessage.size = pRICIndicationMessage->interfaceMessage.contentLength;
932 memcpy(pE2SM_gNB_X2_indicationMessage->interfaceMessage.buf,pRICIndicationMessage->interfaceMessage.data,pRICIndicationMessage->interfaceMessage.contentLength);
935 return e2err_RICIndicationMessageAllocinterfaceMessageFail;
939 asn_fprint(stdout, &asn_DEF_E2SM_gNB_X2_indicationMessage, pE2SM_gNB_X2_indicationMessage);
942 size_t bufferSize = sizeof(pRICIndicationMessage->octetString.data);
944 rval = asn_encode_to_buffer(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2SM_gNB_X2_indicationMessage, pE2SM_gNB_X2_indicationMessage,
945 pRICIndicationMessage->octetString.data, bufferSize);
946 if(rval.encoded == -1)
948 sprintf(pLogBuffer,"Serialization of %s failed.", asn_DEF_E2SM_gNB_X2_indicationMessage.name);
949 return e2err_RICindicationMessagePackFail_1;
951 else if(rval.encoded > bufferSize)
953 sprintf(pLogBuffer,"Buffer of size %zu is too small for %s, need %zu",bufferSize, asn_DEF_E2SM_gNB_X2_indicationMessage.name, rval.encoded);
954 return e2err_RICindicationMessagePackFail_2;
958 sprintf(pLogBuffer,"Successfully encoded %s. Buffer size %zu, encoded size %zu",asn_DEF_E2SM_gNB_X2_indicationMessage.name, bufferSize, rval.encoded);
960 ASN_STRUCT_FREE(asn_DEF_E2SM_gNB_X2_indicationMessage, pE2SM_gNB_X2_indicationMessage);
962 pRICIndicationMessage->octetString.contentLength = rval.encoded;
966 return e2err_E2SM_gNB_X2_indicationMessageAllocE2AP_PDUFail;
969 //////////////////////////////////////////////////////////////////////
970 uint64_t packRICSubscriptionDeleteRequest(size_t* pDataBufferSize, byte* pDataBuffer, char* pLogBuffer, RICSubscriptionDeleteRequest_t* pRICSubscriptionDeleteRequest) {
972 E2AP_PDU_t* pE2AP_PDU = calloc(1, sizeof(E2AP_PDU_t));
975 pE2AP_PDU->present = E2AP_PDU_PR_initiatingMessage;
976 pE2AP_PDU->choice.initiatingMessage.procedureCode = ProcedureCode_id_ricSubscriptionDelete;
977 pE2AP_PDU->choice.initiatingMessage.criticality = Criticality_ignore;
978 pE2AP_PDU->choice.initiatingMessage.value.present = RICInitiatingMessage__value_PR_RICsubscriptionDeleteRequest;
981 RICsubscriptionDeleteRequest_IEs_t* pRICsubscriptionDeleteRequest_IEs = calloc(1, sizeof(RICsubscriptionDeleteRequest_IEs_t));
982 if (pRICsubscriptionDeleteRequest_IEs) {
983 pRICsubscriptionDeleteRequest_IEs->id = ProtocolIE_ID_id_RICrequestID;
984 pRICsubscriptionDeleteRequest_IEs->criticality = Criticality_reject;
985 pRICsubscriptionDeleteRequest_IEs->value.present = RICsubscriptionDeleteRequest_IEs__value_PR_RICrequestID;
986 pRICsubscriptionDeleteRequest_IEs->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionDeleteRequest->ricRequestID.ricRequestorID;
987 pRICsubscriptionDeleteRequest_IEs->value.choice.RICrequestID.ricRequestSequenceNumber = pRICSubscriptionDeleteRequest->ricRequestID.ricRequestSequenceNumber;
988 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionDeleteRequest.protocolIEs.list, pRICsubscriptionDeleteRequest_IEs);
991 return e2err_RICSubscriptionDeleteRequestAllocRICrequestIDFail;
994 pRICsubscriptionDeleteRequest_IEs = calloc(1, sizeof(RICsubscriptionDeleteRequest_IEs_t));
995 if (pRICsubscriptionDeleteRequest_IEs) {
996 pRICsubscriptionDeleteRequest_IEs->id = ProtocolIE_ID_id_RANfunctionID;
997 pRICsubscriptionDeleteRequest_IEs->criticality = Criticality_reject;
998 pRICsubscriptionDeleteRequest_IEs->value.present = RICsubscriptionDeleteRequest_IEs__value_PR_RANfunctionID;
999 pRICsubscriptionDeleteRequest_IEs->value.choice.RANfunctionID = pRICSubscriptionDeleteRequest->ranFunctionID;
1000 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionDeleteRequest.protocolIEs.list, pRICsubscriptionDeleteRequest_IEs);
1003 return e2err_RICSubscriptionDeleteRequestAllocRANfunctionIDFail;
1005 if (E2encode(pE2AP_PDU, pDataBufferSize, pDataBuffer, pLogBuffer))
1008 return e2err_RICSubscriptionDeleteRequestEncodeFail;
1011 return e2err_RICSubscriptionDeleteRequestAllocE2AP_PDUFail;
1014 //////////////////////////////////////////////////////////////////////
1015 uint64_t packRICSubscriptionDeleteResponse(size_t* pDataBufferSize, byte* pDataBuffer, char* pLogBuffer, RICSubscriptionDeleteResponse_t* pRICSubscriptionDeleteResponse) {
1017 E2AP_PDU_t* pE2AP_PDU = calloc(1, sizeof(E2AP_PDU_t));
1020 pE2AP_PDU->present = E2AP_PDU_PR_successfulOutcome;
1021 pE2AP_PDU->choice.successfulOutcome.procedureCode = ProcedureCode_id_ricSubscriptionDelete;
1022 pE2AP_PDU->choice.successfulOutcome.criticality = Criticality_ignore;
1023 pE2AP_PDU->choice.successfulOutcome.value.present = RICSuccessfulOutcome__value_PR_RICsubscriptionDeleteResponse;
1026 RICsubscriptionDeleteResponse_IEs_t* pRICsubscriptionDeleteResponse_IEs = calloc(1, sizeof(RICsubscriptionDeleteResponse_IEs_t));
1027 if (pRICsubscriptionDeleteResponse_IEs) {
1028 pRICsubscriptionDeleteResponse_IEs->id = ProtocolIE_ID_id_RICrequestID;
1029 pRICsubscriptionDeleteResponse_IEs->criticality = Criticality_reject;
1030 pRICsubscriptionDeleteResponse_IEs->value.present = RICsubscriptionDeleteResponse_IEs__value_PR_RICrequestID;
1031 pRICsubscriptionDeleteResponse_IEs->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionDeleteResponse->ricRequestID.ricRequestorID;
1032 pRICsubscriptionDeleteResponse_IEs->value.choice.RICrequestID.ricRequestSequenceNumber = pRICSubscriptionDeleteResponse->ricRequestID.ricRequestSequenceNumber;
1033 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionDeleteResponse.protocolIEs.list, pRICsubscriptionDeleteResponse_IEs);
1036 return e2err_RICSubscriptionDeleteResponseAllocRICrequestIDFail;
1039 pRICsubscriptionDeleteResponse_IEs = calloc(1, sizeof(RICsubscriptionDeleteResponse_IEs_t));
1040 if (pRICsubscriptionDeleteResponse_IEs) {
1041 pRICsubscriptionDeleteResponse_IEs->id = ProtocolIE_ID_id_RANfunctionID;
1042 pRICsubscriptionDeleteResponse_IEs->criticality = Criticality_reject;
1043 pRICsubscriptionDeleteResponse_IEs->value.present = RICsubscriptionDeleteResponse_IEs__value_PR_RANfunctionID;
1044 pRICsubscriptionDeleteResponse_IEs->value.choice.RANfunctionID = pRICSubscriptionDeleteResponse->ranFunctionID;
1045 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionDeleteResponse.protocolIEs.list, pRICsubscriptionDeleteResponse_IEs);
1048 return e2err_RICSubscriptionDeleteResponseAllocRANfunctionIDFail;
1050 if (E2encode(pE2AP_PDU, pDataBufferSize, pDataBuffer, pLogBuffer))
1053 return e2err_RICSubscriptionDeleteResponseEncodeFail;
1056 return e2err_RICSubscriptionDeleteResponseAllocE2AP_PDUFail;
1059 uint64_t packRICSubscriptionDeleteFailure(size_t* pDataBufferSize, byte* pDataBuffer, char* pLogBuffer, RICSubscriptionDeleteFailure_t* pRICSubscriptionDeleteFailure) {
1061 E2AP_PDU_t* pE2AP_PDU = calloc(1, sizeof(E2AP_PDU_t));
1064 pE2AP_PDU->present = E2AP_PDU_PR_unsuccessfulOutcome;
1065 pE2AP_PDU->choice.unsuccessfulOutcome.procedureCode = ProcedureCode_id_ricSubscriptionDelete;
1066 pE2AP_PDU->choice.unsuccessfulOutcome.criticality = Criticality_ignore;
1067 pE2AP_PDU->choice.unsuccessfulOutcome.value.present = RICUnsuccessfulOutcome__value_PR_RICsubscriptionDeleteFailure;
1070 RICsubscriptionDeleteFailure_IEs_t* pRICsubscriptionDeleteFailure_IEs = calloc(1, sizeof(RICsubscriptionDeleteFailure_IEs_t));
1071 if (pRICsubscriptionDeleteFailure_IEs) {
1072 pRICsubscriptionDeleteFailure_IEs->id = ProtocolIE_ID_id_RICrequestID;
1073 pRICsubscriptionDeleteFailure_IEs->criticality = Criticality_reject;
1074 pRICsubscriptionDeleteFailure_IEs->value.present = RICsubscriptionDeleteFailure_IEs__value_PR_RICrequestID;
1075 pRICsubscriptionDeleteFailure_IEs->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionDeleteFailure->ricRequestID.ricRequestorID;
1076 pRICsubscriptionDeleteFailure_IEs->value.choice.RICrequestID.ricRequestSequenceNumber = pRICSubscriptionDeleteFailure->ricRequestID.ricRequestSequenceNumber;
1077 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionDeleteFailure.protocolIEs.list, pRICsubscriptionDeleteFailure_IEs);
1080 return e2err_RICSubscriptionDeleteFailureAllocRICrequestIDFail;
1083 pRICsubscriptionDeleteFailure_IEs = calloc(1, sizeof(RICsubscriptionDeleteFailure_IEs_t));
1084 if (pRICsubscriptionDeleteFailure_IEs) {
1085 pRICsubscriptionDeleteFailure_IEs->id = ProtocolIE_ID_id_RANfunctionID;
1086 pRICsubscriptionDeleteFailure_IEs->criticality = Criticality_reject;
1087 pRICsubscriptionDeleteFailure_IEs->value.present = RICsubscriptionDeleteFailure_IEs__value_PR_RANfunctionID;
1088 pRICsubscriptionDeleteFailure_IEs->value.choice.RANfunctionID = pRICSubscriptionDeleteFailure->ranFunctionID;
1089 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionDeleteFailure.protocolIEs.list, pRICsubscriptionDeleteFailure_IEs);
1092 return e2err_RICSubscriptionDeleteFailureAllocRANfunctionIDFail;
1095 pRICsubscriptionDeleteFailure_IEs = calloc(1, sizeof(RICsubscriptionDeleteFailure_IEs_t));
1096 if (pRICsubscriptionDeleteFailure_IEs) {
1097 pRICsubscriptionDeleteFailure_IEs->id = ProtocolIE_ID_id_RICcause;
1098 pRICsubscriptionDeleteFailure_IEs->criticality = Criticality_reject;
1099 pRICsubscriptionDeleteFailure_IEs->value.present = RICsubscriptionDeleteFailure_IEs__value_PR_RICcause;
1100 if (pRICSubscriptionDeleteFailure->ricCause.content == RICcause_PR_radioNetwork) {
1101 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.present = RICcause_PR_radioNetwork;
1102 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.choice.radioNetwork =
1103 pRICSubscriptionDeleteFailure->ricCause.cause;
1105 else if (pRICSubscriptionDeleteFailure->ricCause.content == RICcause_PR_transport) {
1106 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.present = RICcause_PR_transport;
1107 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.choice.transport =
1108 pRICSubscriptionDeleteFailure->ricCause.cause;
1110 else if (pRICSubscriptionDeleteFailure->ricCause.content == RICcause_PR_protocol) {
1111 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.present = RICcause_PR_protocol;
1112 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.choice.protocol =
1113 pRICSubscriptionDeleteFailure->ricCause.cause;
1115 else if (pRICSubscriptionDeleteFailure->ricCause.content == RICcause_PR_misc) {
1116 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.present = RICcause_PR_misc;
1117 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.choice.misc =
1118 pRICSubscriptionDeleteFailure->ricCause.cause;
1120 else if (pRICSubscriptionDeleteFailure->ricCause.content == RICcause_PR_ric) {
1121 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.present = RICcause_PR_ric;
1122 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.choice.ric =
1123 pRICSubscriptionDeleteFailure->ricCause.cause;
1125 ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionDeleteFailure.protocolIEs.list, pRICsubscriptionDeleteFailure_IEs);
1128 return e2err_RICSubscriptionDeleteFailureAllocRICcauseFail;
1130 // CriticalityDiagnostics, OPTIONAL
1132 if (E2encode(pE2AP_PDU, pDataBufferSize, pDataBuffer, pLogBuffer))
1135 return e2err_RICSubscriptionDeleteFailureEncodeFail;
1138 return e2err_RICSubscriptionDeleteFailureAllocE2AP_PDUFail;
1141 //////////////////////////////////////////////////////////////////////
1142 e2ap_pdu_ptr_t* unpackE2AP_pdu(const size_t dataBufferSize, const byte* dataBuffer, char* pLogBuffer, E2MessageInfo_t* pMessageInfo) {
1144 E2AP_PDU_t* pE2AP_PDU = 0;
1145 asn_dec_rval_t rval;
1146 rval = asn_decode(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, (void **)&pE2AP_PDU, dataBuffer, dataBufferSize);
1147 switch (rval.code) {
1151 sprintf(pLogBuffer,"Successfully decoded E2AP-PDU");
1152 asn_fprint(stdout, &asn_DEF_E2AP_PDU, pE2AP_PDU);
1155 if (pE2AP_PDU->present == E2AP_PDU_PR_initiatingMessage) {
1156 if (pE2AP_PDU->choice.initiatingMessage.procedureCode == ProcedureCode_id_ricSubscription) {
1157 if (pE2AP_PDU->choice.initiatingMessage.value.present == RICInitiatingMessage__value_PR_RICsubscriptionRequest) {
1158 pMessageInfo->messageType = cE2InitiatingMessage;
1159 pMessageInfo->messageId = cRICSubscriptionRequest;
1160 return (e2ap_pdu_ptr_t*)pE2AP_PDU;
1163 sprintf(pLogBuffer,"Error. Not supported initiatingMessage MessageId = %u",pE2AP_PDU->choice.initiatingMessage.value.present);
1167 else if (pE2AP_PDU->choice.initiatingMessage.procedureCode == ProcedureCode_id_ricIndication) {
1168 if (pE2AP_PDU->choice.initiatingMessage.value.present == RICInitiatingMessage__value_PR_RICindication) {
1169 pMessageInfo->messageType = cE2InitiatingMessage;
1170 pMessageInfo->messageId = cRICIndication;
1171 return (e2ap_pdu_ptr_t*)pE2AP_PDU;
1174 sprintf(pLogBuffer,"Error. Not supported initiatingMessage MessageId = %u",pE2AP_PDU->choice.initiatingMessage.value.present);
1178 else if (pE2AP_PDU->choice.initiatingMessage.procedureCode == ProcedureCode_id_ricSubscriptionDelete) {
1179 if (pE2AP_PDU->choice.initiatingMessage.value.present == RICInitiatingMessage__value_PR_RICsubscriptionDeleteRequest) {
1180 pMessageInfo->messageType = cE2InitiatingMessage;
1181 pMessageInfo->messageId = cRICSubscriptionDeleteRequest;
1182 return (e2ap_pdu_ptr_t*)pE2AP_PDU;
1185 sprintf(pLogBuffer,"Error. Not supported initiatingMessage MessageId = %u",pE2AP_PDU->choice.initiatingMessage.value.present);
1190 sprintf(pLogBuffer,"Error. Procedure not supported. ProcedureCode = %li",pE2AP_PDU->choice.initiatingMessage.procedureCode);
1194 else if (pE2AP_PDU->present == E2AP_PDU_PR_successfulOutcome) {
1195 if (pE2AP_PDU->choice.successfulOutcome.procedureCode == ProcedureCode_id_ricSubscription) {
1196 if (pE2AP_PDU->choice.successfulOutcome.value.present == RICSuccessfulOutcome__value_PR_RICsubscriptionResponse) {
1197 pMessageInfo->messageType = cE2SuccessfulOutcome;
1198 pMessageInfo->messageId = cRICSubscriptionResponse;
1199 return (e2ap_pdu_ptr_t*)pE2AP_PDU;
1202 sprintf(pLogBuffer,"Error. Not supported successfulOutcome MessageId = %u",pE2AP_PDU->choice.successfulOutcome.value.present);
1206 else if (pE2AP_PDU->choice.successfulOutcome.procedureCode == ProcedureCode_id_ricSubscriptionDelete) {
1207 if (pE2AP_PDU->choice.successfulOutcome.value.present == RICSuccessfulOutcome__value_PR_RICsubscriptionDeleteResponse) {
1208 pMessageInfo->messageType = cE2SuccessfulOutcome;
1209 pMessageInfo->messageId = cRICsubscriptionDeleteResponse;
1210 return (e2ap_pdu_ptr_t*)pE2AP_PDU;
1213 sprintf(pLogBuffer,"Error. Not supported successfulOutcome MessageId = %u",pE2AP_PDU->choice.successfulOutcome.value.present);
1218 sprintf(pLogBuffer,"Error. Procedure not supported. ProcedureCode = %li",pE2AP_PDU->choice.successfulOutcome.procedureCode);
1222 else if (pE2AP_PDU->present == E2AP_PDU_PR_unsuccessfulOutcome) {
1223 if (pE2AP_PDU->choice.unsuccessfulOutcome.procedureCode == ProcedureCode_id_ricSubscription) {
1224 if (pE2AP_PDU->choice.unsuccessfulOutcome.value.present == RICUnsuccessfulOutcome__value_PR_RICsubscriptionFailure) {
1225 pMessageInfo->messageType = cE2UnsuccessfulOutcome;
1226 pMessageInfo->messageId = cRICSubscriptionFailure;
1227 return (e2ap_pdu_ptr_t*)pE2AP_PDU;
1230 sprintf(pLogBuffer,"Error. Not supported unsuccessfulOutcome MessageId = %u",pE2AP_PDU->choice.unsuccessfulOutcome.value.present);
1234 else if (pE2AP_PDU->choice.unsuccessfulOutcome.procedureCode == ProcedureCode_id_ricSubscriptionDelete) {
1235 if (pE2AP_PDU->choice.unsuccessfulOutcome.value.present == RICUnsuccessfulOutcome__value_PR_RICsubscriptionDeleteFailure) {
1236 pMessageInfo->messageType = cE2UnsuccessfulOutcome;
1237 pMessageInfo->messageId = cRICsubscriptionDeleteFailure;
1238 return (e2ap_pdu_ptr_t*)pE2AP_PDU;
1241 sprintf(pLogBuffer,"Error. Not supported unsuccessfulOutcome MessageId = %u",pE2AP_PDU->choice.unsuccessfulOutcome.value.present);
1247 sprintf(pLogBuffer,"Decode failed. Invalid message type %u",pE2AP_PDU->present);
1248 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1251 sprintf(pLogBuffer,"Decode failed. More data needed. Buffer size %zu, %s, consumed %zu",dataBufferSize, asn_DEF_E2AP_PDU.name, rval.consumed);
1254 sprintf(pLogBuffer,"Decode failed. Buffer size %zu, %s, consumed %zu",dataBufferSize, asn_DEF_E2AP_PDU.name, rval.consumed);
1261 //////////////////////////////////////////////////////////////////////
1262 uint64_t getRICSubscriptionRequestData(e2ap_pdu_ptr_t* pE2AP_PDU_pointer, RICSubscriptionRequest_t* pRICSubscriptionRequest) {
1264 E2AP_PDU_t* pE2AP_PDU = (E2AP_PDU_t*)pE2AP_PDU_pointer;
1266 RICsubscriptionRequest_t *asnRicSubscriptionRequest = &pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionRequest;
1267 RICsubscriptionRequest_IEs_t* pRICsubscriptionRequest_IEs;
1270 if (asnRicSubscriptionRequest->protocolIEs.list.count > 0 &&
1271 asnRicSubscriptionRequest->protocolIEs.list.array[0]->id == ProtocolIE_ID_id_RICrequestID) {
1272 pRICsubscriptionRequest_IEs = asnRicSubscriptionRequest->protocolIEs.list.array[0];
1273 pRICSubscriptionRequest->ricRequestID.ricRequestorID = pRICsubscriptionRequest_IEs->value.choice.RICrequestID.ricRequestorID;
1274 pRICSubscriptionRequest->ricRequestID.ricRequestSequenceNumber = pRICsubscriptionRequest_IEs->value.choice.RICrequestID.ricRequestSequenceNumber;
1277 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1278 return e2err_RICsubscriptionRequestRICrequestIDMissing;
1282 if (asnRicSubscriptionRequest->protocolIEs.list.count > 1 &&
1283 asnRicSubscriptionRequest->protocolIEs.list.array[1]->id == ProtocolIE_ID_id_RANfunctionID) {
1284 pRICsubscriptionRequest_IEs = asnRicSubscriptionRequest->protocolIEs.list.array[1];
1285 pRICSubscriptionRequest->ranFunctionID = pRICsubscriptionRequest_IEs->value.choice.RANfunctionID;
1288 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1289 return e2err_RICsubscriptionRequestRANfunctionIDMissing;
1293 if (asnRicSubscriptionRequest->protocolIEs.list.count > 2 &&
1294 asnRicSubscriptionRequest->protocolIEs.list.array[2]->id == ProtocolIE_ID_id_RICsubscription) {
1295 pRICsubscriptionRequest_IEs = asnRicSubscriptionRequest->protocolIEs.list.array[2];
1297 // Unpack EventTriggerDefinition
1298 RICeventTriggerDefinition_t* pRICeventTriggerDefinition =
1299 (RICeventTriggerDefinition_t*)&pRICsubscriptionRequest_IEs->value.choice.RICsubscription.ricEventTriggerDefinition;
1300 pRICSubscriptionRequest->ricSubscription.ricEventTriggerDefinition.octetString.contentLength = pRICeventTriggerDefinition->size;
1301 memcpy(pRICSubscriptionRequest->ricSubscription.ricEventTriggerDefinition.octetString.data, pRICeventTriggerDefinition->buf, pRICeventTriggerDefinition->size); //octetstring
1303 uint64_t returnCode;
1304 if ((returnCode = getRICEventTriggerDefinitionData(&pRICSubscriptionRequest->ricSubscription.ricEventTriggerDefinition) != e2err_OK)) {
1305 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1309 // RICactions-ToBeSetup-List
1310 RICaction_ToBeSetup_ItemIEs_t* pRICaction_ToBeSetup_ItemIEs;
1312 while (index < pRICsubscriptionRequest_IEs->value.choice.RICsubscription.ricAction_ToBeSetup_List.list.count)
1314 pRICaction_ToBeSetup_ItemIEs = (RICaction_ToBeSetup_ItemIEs_t*)pRICsubscriptionRequest_IEs->value.choice.RICsubscription.ricAction_ToBeSetup_List.list.array[index];
1317 pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionID =
1318 pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricActionID;
1321 pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionType =
1322 pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricActionType;
1324 // RICactionDefinition, OPTIONAL
1325 if (pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition)
1327 pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionDefinitionPresent = false;
1331 pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionDefinitionPresent = false;
1333 // RICsubsequentAction, OPTIONAL
1334 RICsubsequentAction_t* pRICsubsequentAction;
1335 if (pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricSubsequentAction)
1337 pRICsubsequentAction = pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricSubsequentAction;
1338 pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricSubsequentActionPresent = true;
1339 pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricSubsequentAction.ricSubsequentActionType =
1340 pRICsubsequentAction->ricSubsequentActionType;
1341 pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricSubsequentAction.ricTimeToWait =
1342 pRICsubsequentAction->ricTimeToWait;
1345 pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricSubsequentActionPresent = false;
1348 pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.contentLength = index;
1351 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1352 return e2err_RICsubscriptionRequestICsubscriptionMissing;
1355 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1359 //////////////////////////////////////////////////////////////////////
1360 uint64_t getRICEventTriggerDefinitionData(RICEventTriggerDefinition_t* pRICEventTriggerDefinition) {
1362 E2SM_gNB_X2_eventTriggerDefinition_t* pE2SM_gNB_X2_eventTriggerDefinition = 0;
1363 asn_dec_rval_t rval;
1364 rval = asn_decode(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2SM_gNB_X2_eventTriggerDefinition, (void **)&pE2SM_gNB_X2_eventTriggerDefinition,
1365 pRICEventTriggerDefinition->octetString.data, pRICEventTriggerDefinition->octetString.contentLength);
1370 printf("Successfully decoded E2SM_gNB_X2_eventTriggerDefinition");
1371 asn_fprint(stdout, &asn_DEF_E2SM_gNB_X2_eventTriggerDefinition, pE2SM_gNB_X2_eventTriggerDefinition);
1374 // InterfaceID, GlobalENB-ID or GlobalGNB-ID
1375 if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.present == Interface_ID_PR_global_eNB_ID) {
1378 pRICEventTriggerDefinition->interfaceID.globalENBIDPresent = true;
1381 pRICEventTriggerDefinition->interfaceID.globalENBID.pLMNIdentity.contentLength =
1382 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.pLMN_Identity.size;
1383 memcpy(pRICEventTriggerDefinition->interfaceID.globalENBID.pLMNIdentity.pLMNIdentityVal,
1384 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.pLMN_Identity.buf,
1385 pRICEventTriggerDefinition->interfaceID.globalENBID.pLMNIdentity.contentLength);
1388 IdOctects_t eNBOctects;
1389 memset(eNBOctects.octets, 0, sizeof(eNBOctects));
1390 if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.present == ENB_ID_PR_macro_eNB_ID) {
1391 // BIT STRING (SIZE (20)
1392 pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.bits = cMacroENBIDP_20Bits;
1393 memcpy(eNBOctects.octets,pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.macro_eNB_ID.buf,
1394 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.macro_eNB_ID.size);
1395 pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.nodeID = eNBOctects.nodeID;
1397 else if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.present == ENB_ID_PR_home_eNB_ID) {
1398 // BIT STRING (SIZE (28)
1399 pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.bits = cHomeENBID_28Bits;
1400 memcpy(eNBOctects.octets,pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.home_eNB_ID.buf,
1401 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.home_eNB_ID.size);
1402 pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.nodeID = eNBOctects.nodeID;
1404 else if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.present == ENB_ID_PR_short_Macro_eNB_ID) {
1405 // BIT STRING (SIZE(18)
1406 pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.bits = cShortMacroENBID_18Bits;
1407 memcpy(eNBOctects.octets,pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.short_Macro_eNB_ID.buf,
1408 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.short_Macro_eNB_ID.size);
1409 pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.nodeID = eNBOctects.nodeID;
1411 else if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.present == ENB_ID_PR_long_Macro_eNB_ID) {
1412 // BIT STRING (SIZE(21)
1413 pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.bits = clongMacroENBIDP_21Bits;
1414 memcpy(eNBOctects.octets,pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.long_Macro_eNB_ID.buf,
1415 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.long_Macro_eNB_ID.size);
1416 pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.nodeID = eNBOctects.nodeID;
1419 pRICEventTriggerDefinition->interfaceID.globalENBIDPresent = false;
1420 pRICEventTriggerDefinition->interfaceID.globalGNBIDPresent = false;
1421 ASN_STRUCT_FREE(asn_DEF_E2SM_gNB_X2_eventTriggerDefinition, pE2SM_gNB_X2_eventTriggerDefinition);
1422 return e2err_RICEventTriggerDefinitionIEValueFail_5;
1425 else if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.present == Interface_ID_PR_global_gNB_ID) {
1427 pRICEventTriggerDefinition->interfaceID.globalGNBIDPresent = true;
1430 pRICEventTriggerDefinition->interfaceID.globalGNBID.pLMNIdentity.contentLength =
1431 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.pLMN_Identity.size;
1432 memcpy(pRICEventTriggerDefinition->interfaceID.globalGNBID.pLMNIdentity.pLMNIdentityVal,
1433 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.pLMN_Identity.buf,
1434 pRICEventTriggerDefinition->interfaceID.globalGNBID.pLMNIdentity.contentLength);
1437 IdOctects_t gNBOctects;
1438 memset(gNBOctects.octets, 0, sizeof(gNBOctects));
1439 if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_gNB_ID.gNB_ID.present == GNB_ID_PR_gNB_ID) {
1440 pRICEventTriggerDefinition->interfaceID.globalGNBID.nodeID.bits = pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_gNB_ID.gNB_ID.choice.gNB_ID.size;
1441 memcpy(gNBOctects.octets, pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_gNB_ID.gNB_ID.choice.gNB_ID.buf,
1442 pRICEventTriggerDefinition->interfaceID.globalGNBID.nodeID.bits);
1443 pRICEventTriggerDefinition->interfaceID.globalGNBID.nodeID.nodeID = gNBOctects.nodeID;
1446 pRICEventTriggerDefinition->interfaceID.globalENBIDPresent = false;
1447 pRICEventTriggerDefinition->interfaceID.globalGNBIDPresent = false;
1448 ASN_STRUCT_FREE(asn_DEF_E2SM_gNB_X2_eventTriggerDefinition, pE2SM_gNB_X2_eventTriggerDefinition);
1449 return e2err_RICEventTriggerDefinitionIEValueFail_6;
1453 pRICEventTriggerDefinition->interfaceID.globalENBIDPresent = false;
1454 pRICEventTriggerDefinition->interfaceID.globalGNBIDPresent = false;
1455 ASN_STRUCT_FREE(asn_DEF_E2SM_gNB_X2_eventTriggerDefinition, pE2SM_gNB_X2_eventTriggerDefinition);
1456 return e2err_RICEventTriggerDefinitionIEValueFail_7;
1459 // InterfaceDirection
1460 pRICEventTriggerDefinition->interfaceDirection = pE2SM_gNB_X2_eventTriggerDefinition->interfaceDirection;
1462 // InterfaceMessageType
1463 pRICEventTriggerDefinition->interfaceMessageType.procedureCode = pE2SM_gNB_X2_eventTriggerDefinition->interfaceMessageType.procedureCode;
1465 if (pE2SM_gNB_X2_eventTriggerDefinition->interfaceMessageType.typeOfMessage == TypeOfMessage_initiating_message)
1466 pRICEventTriggerDefinition->interfaceMessageType.typeOfMessage = cE2InitiatingMessage;
1467 else if (pE2SM_gNB_X2_eventTriggerDefinition->interfaceMessageType.typeOfMessage == TypeOfMessage_successful_outcome)
1468 pRICEventTriggerDefinition->interfaceMessageType.typeOfMessage = cE2SuccessfulOutcome;
1469 else if (pE2SM_gNB_X2_eventTriggerDefinition->interfaceMessageType.typeOfMessage == TypeOfMessage_unsuccessful_outcome)
1470 pRICEventTriggerDefinition->interfaceMessageType.typeOfMessage = cE2UnsuccessfulOutcome;
1472 ASN_STRUCT_FREE(asn_DEF_E2SM_gNB_X2_eventTriggerDefinition, pE2SM_gNB_X2_eventTriggerDefinition);
1473 return e2err_RICEventTriggerDefinitionIEValueFail_8;
1476 ASN_STRUCT_FREE(asn_DEF_E2SM_gNB_X2_eventTriggerDefinition, pE2SM_gNB_X2_eventTriggerDefinition);
1480 printf("Decode failed. More data needed. Buffer size %zu, %s, consumed %zu",pRICEventTriggerDefinition->octetString.contentLength,
1481 asn_DEF_E2SM_gNB_X2_eventTriggerDefinition.name, rval.consumed);
1483 return e2err_RICEventTriggerDefinitionDecodeWMOREFail;
1486 printf("Decode failed. Buffer size %zu, %s, consumed %zu",pRICEventTriggerDefinition->octetString.contentLength,
1487 asn_DEF_E2SM_gNB_X2_eventTriggerDefinition.name, rval.consumed);
1489 return e2err_RICEventTriggerDefinitionDecodeFAIL;
1491 return e2err_RICEventTriggerDefinitionDecodeDefaultFail;
1496 //////////////////////////////////////////////////////////////////////
1497 uint64_t getRICSubscriptionResponseData(e2ap_pdu_ptr_t* pE2AP_PDU_pointer, RICSubscriptionResponse_t* pRICSubscriptionResponse) {
1499 E2AP_PDU_t* pE2AP_PDU = (E2AP_PDU_t*)pE2AP_PDU_pointer;
1501 RICsubscriptionResponse_t *asnRicSubscriptionResponse = &pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionResponse;
1502 RICsubscriptionResponse_IEs_t* pRICsubscriptionResponse_IEs;
1505 if (asnRicSubscriptionResponse->protocolIEs.list.count > 0 &&
1506 asnRicSubscriptionResponse->protocolIEs.list.array[0]->id == ProtocolIE_ID_id_RICrequestID) {
1507 pRICsubscriptionResponse_IEs = asnRicSubscriptionResponse->protocolIEs.list.array[0];
1508 pRICSubscriptionResponse->ricRequestID.ricRequestorID = pRICsubscriptionResponse_IEs->value.choice.RICrequestID.ricRequestorID;
1509 pRICSubscriptionResponse->ricRequestID.ricRequestSequenceNumber = pRICsubscriptionResponse_IEs->value.choice.RICrequestID.ricRequestSequenceNumber;
1512 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1513 return e2err_RICsubscriptionResponseRICrequestIDMissing;
1517 if (asnRicSubscriptionResponse->protocolIEs.list.count > 1 &&
1518 asnRicSubscriptionResponse->protocolIEs.list.array[1]->id == ProtocolIE_ID_id_RANfunctionID) {
1519 pRICsubscriptionResponse_IEs = asnRicSubscriptionResponse->protocolIEs.list.array[1];
1520 pRICSubscriptionResponse->ranFunctionID = pRICsubscriptionResponse_IEs->value.choice.RANfunctionID;
1523 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1524 return e2err_RICsubscriptionResponseRANfunctionIDMissing;
1527 // RICaction-Admitted-List
1528 if (asnRicSubscriptionResponse->protocolIEs.list.count > 2 &&
1529 asnRicSubscriptionResponse->protocolIEs.list.array[2]->id == ProtocolIE_ID_id_RICactions_Admitted) {
1530 pRICsubscriptionResponse_IEs = asnRicSubscriptionResponse->protocolIEs.list.array[2];
1531 pRICSubscriptionResponse->ricActionAdmittedList.contentLength = 0;
1533 while ((index < maxofRICactionID) && (index < pRICsubscriptionResponse_IEs->value.choice.RICaction_Admitted_List.list.count)) {
1534 RICaction_Admitted_ItemIEs_t* pRICaction_Admitted_ItemIEs =
1535 (RICaction_Admitted_ItemIEs_t*)pRICsubscriptionResponse_IEs->value.choice.RICaction_Admitted_List.list.array[index];
1538 pRICSubscriptionResponse->ricActionAdmittedList.ricActionID[index] =
1539 pRICaction_Admitted_ItemIEs->value.choice.RICaction_Admitted_Item.ricActionID;
1542 pRICSubscriptionResponse->ricActionAdmittedList.contentLength = index;
1545 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1546 return e2err_RICsubscriptionResponseRICaction_Admitted_ListMissing;
1549 // RICaction-NotAdmitted-List, OPTIONAL
1550 if (asnRicSubscriptionResponse->protocolIEs.list.count > 3 &&
1551 asnRicSubscriptionResponse->protocolIEs.list.array[3]->id == ProtocolIE_ID_id_RICactions_NotAdmitted) {
1552 pRICsubscriptionResponse_IEs = asnRicSubscriptionResponse->protocolIEs.list.array[3];
1553 if (pRICsubscriptionResponse_IEs->value.present == RICsubscriptionResponse_IEs__value_PR_RICaction_NotAdmitted_List) {
1554 pRICSubscriptionResponse->ricActionNotAdmittedListPresent = true;
1555 pRICSubscriptionResponse->ricActionNotAdmittedList.contentLength = 0;
1557 while ((index < maxofRICactionID) && (index < pRICsubscriptionResponse_IEs->value.choice.RICaction_NotAdmitted_List.list.count)) {
1558 RICaction_NotAdmitted_ItemIEs_t* pRICaction_NotAdmitted_ItemIEs =
1559 (RICaction_NotAdmitted_ItemIEs_t*)pRICsubscriptionResponse_IEs->value.choice.RICaction_NotAdmitted_List.list.array[index];
1562 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricActionID =
1563 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricActionID;
1566 if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present == RICcause_PR_radioNetwork) {
1567 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content = RICcause_PR_radioNetwork;
1568 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause =
1569 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.radioNetwork;
1571 else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present == RICcause_PR_transport) {
1572 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content = RICcause_PR_transport;
1573 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause =
1574 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.transport;
1576 else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present == RICcause_PR_protocol) {
1577 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content = RICcause_PR_protocol;
1578 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause =
1579 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.protocol;
1581 else if(pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present == RICcause_PR_misc) {
1582 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content = RICcause_PR_misc;
1583 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause =
1584 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.misc;
1586 else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present == RICcause_PR_ric) {
1587 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content = RICcause_PR_ric;
1588 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause =
1589 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.ric;
1593 pRICSubscriptionResponse->ricActionNotAdmittedList.contentLength = index;
1597 pRICSubscriptionResponse->ricActionNotAdmittedListPresent = false;
1598 pRICSubscriptionResponse->ricActionNotAdmittedList.contentLength = 0;
1601 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1605 //////////////////////////////////////////////////////////////////////
1606 uint64_t getRICSubscriptionFailureData(e2ap_pdu_ptr_t* pE2AP_PDU_pointer, RICSubscriptionFailure_t* pRICSubscriptionFailure) {
1608 E2AP_PDU_t* pE2AP_PDU = (E2AP_PDU_t*)pE2AP_PDU_pointer;
1610 RICsubscriptionFailure_t *asnRicSubscriptionFailure = &pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionFailure;
1611 RICsubscriptionFailure_IEs_t* pRICsubscriptionFailure_IEs;
1614 RICsubscriptionFailure_IEs_t* RICsubscriptionFailure_IEs_t;
1615 if (asnRicSubscriptionFailure->protocolIEs.list.count > 0 &&
1616 asnRicSubscriptionFailure->protocolIEs.list.array[0]->id == ProtocolIE_ID_id_RICrequestID) {
1617 pRICsubscriptionFailure_IEs = asnRicSubscriptionFailure->protocolIEs.list.array[0];
1618 pRICSubscriptionFailure->ricRequestID.ricRequestorID = pRICsubscriptionFailure_IEs->value.choice.RICrequestID.ricRequestorID;
1619 pRICSubscriptionFailure->ricRequestID.ricRequestSequenceNumber = pRICsubscriptionFailure_IEs->value.choice.RICrequestID.ricRequestSequenceNumber;
1622 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1623 return e2err_RICsubscriptionFailureRICrequestIDMissing;
1627 if (asnRicSubscriptionFailure->protocolIEs.list.count > 1 &&
1628 asnRicSubscriptionFailure->protocolIEs.list.array[1]->id == ProtocolIE_ID_id_RANfunctionID) {
1629 pRICsubscriptionFailure_IEs = asnRicSubscriptionFailure->protocolIEs.list.array[1];
1630 pRICSubscriptionFailure->ranFunctionID = pRICsubscriptionFailure_IEs->value.choice.RANfunctionID;
1633 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1634 return e2err_RICsubscriptionFailureRANfunctionIDMissing;
1637 // RICaction-NotAdmitted-List
1638 if (asnRicSubscriptionFailure->protocolIEs.list.count > 2 &&
1639 asnRicSubscriptionFailure->protocolIEs.list.array[2]->id == ProtocolIE_ID_id_RICactions_NotAdmitted) {
1640 pRICsubscriptionFailure_IEs = asnRicSubscriptionFailure->protocolIEs.list.array[2];
1642 while ((index < maxofRICactionID) && (index < pRICsubscriptionFailure_IEs->value.choice.RICaction_NotAdmitted_List.list.count)) {
1643 RICaction_NotAdmitted_ItemIEs_t* pRICaction_NotAdmitted_ItemIEs =
1644 (RICaction_NotAdmitted_ItemIEs_t*)pRICsubscriptionFailure_IEs->value.choice.RICaction_NotAdmitted_List.list.array[index];
1647 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricActionID =
1648 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricActionID;
1651 if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present == RICcause_PR_radioNetwork) {
1652 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content = RICcause_PR_radioNetwork;
1653 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause =
1654 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.radioNetwork;
1656 else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present == RICcause_PR_transport) {
1657 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content = RICcause_PR_transport;
1658 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause =
1659 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.transport;
1661 else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present == RICcause_PR_protocol) {
1662 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content = RICcause_PR_protocol;
1663 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause =
1664 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.protocol;
1666 else if(pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present == RICcause_PR_misc) {
1667 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content = RICcause_PR_misc;
1668 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause =
1669 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.misc;
1671 else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present == RICcause_PR_ric) {
1672 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content = RICcause_PR_ric;
1673 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause =
1674 pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.ric;
1678 pRICSubscriptionFailure->ricActionNotAdmittedList.contentLength = index;
1680 // CriticalityDiagnostics. OPTIONAL
1684 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1685 return e2err_RICsubscriptionFailureRICaction_NotAdmitted_ListMissing;
1688 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1692 //////////////////////////////////////////////////////////////////////
1693 uint64_t getRICIndicationData(e2ap_pdu_ptr_t* pE2AP_PDU_pointer, RICIndication_t* pRICIndication) {
1695 E2AP_PDU_t* pE2AP_PDU = (E2AP_PDU_t*)pE2AP_PDU_pointer;
1698 RICindication_IEs_t* pRICindication_IEs;
1699 if (pE2AP_PDU->choice.initiatingMessage.value.choice.RICindication.protocolIEs.list.count > 0) {
1700 pRICindication_IEs = pE2AP_PDU->choice.initiatingMessage.value.choice.RICindication.protocolIEs.list.array[0];
1701 pRICIndication->ricRequestID.ricRequestorID = pRICindication_IEs->value.choice.RICrequestID.ricRequestorID;
1702 pRICIndication->ricRequestID.ricRequestSequenceNumber = pRICindication_IEs->value.choice.RICrequestID.ricRequestSequenceNumber;
1705 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1706 return e2err_RICindicationRICrequestIDMissing;
1710 if (pE2AP_PDU->choice.initiatingMessage.value.choice.RICindication.protocolIEs.list.count > 1) {
1711 pRICindication_IEs = pE2AP_PDU->choice.initiatingMessage.value.choice.RICindication.protocolIEs.list.array[1];
1712 pRICIndication->ranFunctionID = pRICindication_IEs->value.choice.RANfunctionID;
1715 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1716 return e2err_RICindicationRANfunctionIDMissing;
1720 if (pE2AP_PDU->choice.initiatingMessage.value.choice.RICindication.protocolIEs.list.count > 2) {
1721 pRICindication_IEs = pE2AP_PDU->choice.initiatingMessage.value.choice.RICindication.protocolIEs.list.array[2];
1722 pRICIndication->ricActionID = pRICindication_IEs->value.choice.RICactionID;
1725 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1726 return e2err_RICindicationRICactionIDMissing;
1730 if (pE2AP_PDU->choice.initiatingMessage.value.choice.RICindication.protocolIEs.list.count > 3) {
1731 pRICindication_IEs = pE2AP_PDU->choice.initiatingMessage.value.choice.RICindication.protocolIEs.list.array[3];
1732 pRICIndication->ricIndicationSN = pRICindication_IEs->value.choice.RICindicationSN;
1735 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1736 return e2err_RICindicationRICindicationSNMissing;
1739 // RICindicationType
1740 if (pE2AP_PDU->choice.initiatingMessage.value.choice.RICindication.protocolIEs.list.count > 4) {
1741 pRICindication_IEs = pE2AP_PDU->choice.initiatingMessage.value.choice.RICindication.protocolIEs.list.array[4];
1742 pRICIndication->ricIndicationType = pRICindication_IEs->value.choice.RICindicationType;
1745 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1746 return e2err_RICindicationRICindicationTypeMissing;
1749 // RICindicationHeader
1750 if (pE2AP_PDU->choice.initiatingMessage.value.choice.RICindication.protocolIEs.list.count > 5) {
1751 pRICindication_IEs = pE2AP_PDU->choice.initiatingMessage.value.choice.RICindication.protocolIEs.list.array[5];
1753 pRICIndication->ricIndicationHeader.octetString.contentLength = pRICindication_IEs->value.choice.RICindicationHeader.size;
1754 if (pRICIndication->ricIndicationHeader.octetString.contentLength < cMaxSizeOfOctetString) {
1755 memcpy(pRICIndication->ricIndicationHeader.octetString.data, pRICindication_IEs->value.choice.RICindicationHeader.buf,
1756 pRICIndication->ricIndicationHeader.octetString.contentLength);
1758 uint64_t returnCode;
1759 if ((returnCode = getRICIndicationHeaderData(&pRICIndication->ricIndicationHeader) != e2err_OK)) {
1760 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1765 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1766 return e2err_RICIndicationHeaderContentLengthFail;
1770 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1771 return e2err_RICindicationRICindicationHeaderMissing;
1774 // RICindicationMessage
1775 if (pE2AP_PDU->choice.initiatingMessage.value.choice.RICindication.protocolIEs.list.count > 6) {
1776 pRICindication_IEs = pE2AP_PDU->choice.initiatingMessage.value.choice.RICindication.protocolIEs.list.array[6];
1778 pRICIndication->ricIndicationMessage.octetString.contentLength = pRICindication_IEs->value.choice.RICindicationMessage.size;
1779 if (pRICIndication->ricIndicationMessage.octetString.contentLength < cMaxSizeOfOctetString) {
1780 memcpy(pRICIndication->ricIndicationMessage.octetString.data, pRICindication_IEs->value.choice.RICindicationMessage.buf,
1781 pRICIndication->ricIndicationMessage.octetString.contentLength);
1783 uint64_t returnCode;
1784 if ((returnCode = getRICIndicationMessageData(&pRICIndication->ricIndicationMessage) != e2err_OK)) {
1785 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1790 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1791 return e2err_RICIndicationMessageContentLengthFail;
1795 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1796 return e2err_RICindicationRICindicationMessageMissing;
1799 // RICcallProcessID, OPTIONAL. Not used in RIC.
1801 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1805 //////////////////////////////////////////////////////////////////////
1806 uint64_t getRICIndicationHeaderData(RICIndicationHeader_t* pRICIndicationHeader) {
1808 E2SM_gNB_X2_indicationHeader_t* pE2SM_gNB_X2_indicationHeader = 0;
1809 asn_dec_rval_t rval;
1810 rval = asn_decode(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2SM_gNB_X2_indicationHeader, (void **)&pE2SM_gNB_X2_indicationHeader,
1811 pRICIndicationHeader->octetString.data, pRICIndicationHeader->octetString.contentLength);
1816 printf("Successfully decoded E2SM_gNB_X2_indicationHeader");
1817 asn_fprint(stdout, &asn_DEF_E2SM_gNB_X2_indicationHeader, pE2SM_gNB_X2_indicationHeader);
1820 // InterfaceID, GlobalENB-ID or GlobalGNB-ID
1821 if (pE2SM_gNB_X2_indicationHeader->interface_ID.present == Interface_ID_PR_global_eNB_ID) {
1824 pRICIndicationHeader->interfaceID.globalENBIDPresent = true;
1827 pRICIndicationHeader->interfaceID.globalENBID.pLMNIdentity.contentLength =
1828 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.pLMN_Identity.size;
1829 memcpy(pRICIndicationHeader->interfaceID.globalENBID.pLMNIdentity.pLMNIdentityVal,
1830 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.pLMN_Identity.buf,
1831 pRICIndicationHeader->interfaceID.globalENBID.pLMNIdentity.contentLength);
1834 IdOctects_t eNBOctects;
1835 memset(eNBOctects.octets, 0, sizeof(eNBOctects));
1836 if (pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.present == ENB_ID_PR_macro_eNB_ID) {
1837 // BIT STRING (SIZE (20)
1838 pRICIndicationHeader->interfaceID.globalENBID.nodeID.bits = cMacroENBIDP_20Bits;
1839 memcpy(eNBOctects.octets,pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.macro_eNB_ID.buf,
1840 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.macro_eNB_ID.size);
1841 pRICIndicationHeader->interfaceID.globalENBID.nodeID.nodeID = eNBOctects.nodeID;
1843 else if (pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.present == ENB_ID_PR_home_eNB_ID) {
1844 // BIT STRING (SIZE (28)
1845 pRICIndicationHeader->interfaceID.globalENBID.nodeID.bits = cHomeENBID_28Bits;
1846 memcpy(eNBOctects.octets,pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.home_eNB_ID.buf,
1847 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.home_eNB_ID.size);
1848 pRICIndicationHeader->interfaceID.globalENBID.nodeID.nodeID = eNBOctects.nodeID;
1850 else if (pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.present == ENB_ID_PR_short_Macro_eNB_ID) {
1851 // BIT STRING (SIZE(18)
1852 pRICIndicationHeader->interfaceID.globalENBID.nodeID.bits = cShortMacroENBID_18Bits;
1853 memcpy(eNBOctects.octets,pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.short_Macro_eNB_ID.buf,
1854 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.short_Macro_eNB_ID.size);
1855 pRICIndicationHeader->interfaceID.globalENBID.nodeID.nodeID = eNBOctects.nodeID;
1857 else if (pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.present == ENB_ID_PR_long_Macro_eNB_ID) {
1858 // BIT STRING (SIZE(21)
1859 pRICIndicationHeader->interfaceID.globalENBID.nodeID.bits = clongMacroENBIDP_21Bits;
1860 memcpy(eNBOctects.octets,pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.long_Macro_eNB_ID.buf,
1861 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.eNB_ID.choice.long_Macro_eNB_ID.size);
1862 pRICIndicationHeader->interfaceID.globalENBID.nodeID.nodeID = eNBOctects.nodeID;
1865 pRICIndicationHeader->interfaceID.globalENBIDPresent = false;
1866 pRICIndicationHeader->interfaceID.globalGNBIDPresent = false;
1867 ASN_STRUCT_FREE(asn_DEF_E2SM_gNB_X2_indicationHeader, pE2SM_gNB_X2_indicationHeader);
1868 return e2err_RICEventTriggerDefinitionIEValueFail_9;
1871 else if (pE2SM_gNB_X2_indicationHeader->interface_ID.present == Interface_ID_PR_global_gNB_ID) {
1873 pRICIndicationHeader->interfaceID.globalGNBIDPresent = true;
1876 pRICIndicationHeader->interfaceID.globalGNBID.pLMNIdentity.contentLength =
1877 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.pLMN_Identity.size;
1878 memcpy(pRICIndicationHeader->interfaceID.globalGNBID.pLMNIdentity.pLMNIdentityVal,
1879 pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_eNB_ID.pLMN_Identity.buf,
1880 pRICIndicationHeader->interfaceID.globalGNBID.pLMNIdentity.contentLength);
1883 IdOctects_t gNBOctects;
1884 memset(gNBOctects.octets, 0, sizeof(gNBOctects));
1885 if (pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_gNB_ID.gNB_ID.present == GNB_ID_PR_gNB_ID) {
1886 pRICIndicationHeader->interfaceID.globalGNBID.nodeID.bits = pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_gNB_ID.gNB_ID.choice.gNB_ID.size;
1887 memcpy(gNBOctects.octets, pE2SM_gNB_X2_indicationHeader->interface_ID.choice.global_gNB_ID.gNB_ID.choice.gNB_ID.buf,
1888 pRICIndicationHeader->interfaceID.globalGNBID.nodeID.bits);
1889 pRICIndicationHeader->interfaceID.globalGNBID.nodeID.nodeID = gNBOctects.nodeID;
1892 pRICIndicationHeader->interfaceID.globalENBIDPresent = false;
1893 pRICIndicationHeader->interfaceID.globalGNBIDPresent = false;
1894 ASN_STRUCT_FREE(asn_DEF_E2SM_gNB_X2_indicationHeader, pE2SM_gNB_X2_indicationHeader);
1895 return e2err_RICEventTriggerDefinitionIEValueFail_10;
1899 pRICIndicationHeader->interfaceID.globalENBIDPresent = false;
1900 pRICIndicationHeader->interfaceID.globalGNBIDPresent = false;
1901 ASN_STRUCT_FREE(asn_DEF_E2SM_gNB_X2_indicationHeader, pE2SM_gNB_X2_indicationHeader);
1902 return e2err_RICEventTriggerDefinitionIEValueFail_11;
1905 // InterfaceDirection
1906 pRICIndicationHeader->interfaceDirection = pE2SM_gNB_X2_indicationHeader->interfaceDirection;
1908 // TimeStamp OPTIONAL. Not used in RIC.
1910 ASN_STRUCT_FREE(asn_DEF_E2SM_gNB_X2_indicationHeader, pE2SM_gNB_X2_indicationHeader);
1914 printf("Decode failed. More data needed. Buffer size %zu, %s, consumed %zu",pRICIndicationHeader->octetString.contentLength,
1915 asn_DEF_E2SM_gNB_X2_indicationHeader.name, rval.consumed);
1916 return e2err_RICIndicationHeaderDecodeWMOREFail;
1919 printf("Decode failed. Buffer size %zu, %s, consumed %zu",pRICIndicationHeader->octetString.contentLength,
1920 asn_DEF_E2SM_gNB_X2_indicationHeader.name, rval.consumed);
1922 return e2err_RICIndicationHeaderDecodeFAIL;
1924 return e2err_RICIndicationHeaderDecodeDefaultFail;
1928 //////////////////////////////////////////////////////////////////////
1929 uint64_t getRICIndicationMessageData(RICIndicationMessage_t* pRICIndicationMessage) {
1931 E2SM_gNB_X2_indicationMessage_t* pE2SM_gNB_X2_indicationMessage = 0;
1932 asn_dec_rval_t rval;
1933 rval = asn_decode(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2SM_gNB_X2_indicationMessage, (void **)&pE2SM_gNB_X2_indicationMessage,
1934 pRICIndicationMessage->octetString.data, pRICIndicationMessage->octetString.contentLength);
1939 printf("Successfully decoded E2SM_gNB_X2_indicationMessage");
1940 asn_fprint(stdout, &asn_DEF_E2SM_gNB_X2_indicationMessage, pE2SM_gNB_X2_indicationMessage);
1944 pRICIndicationMessage->interfaceMessage.contentLength = pE2SM_gNB_X2_indicationMessage->interfaceMessage.size;
1945 if(pRICIndicationMessage->octetString.contentLength < cMaxSizeOfOctetString) {
1946 memcpy(pRICIndicationMessage->interfaceMessage.data,pE2SM_gNB_X2_indicationMessage->interfaceMessage.buf,
1947 pRICIndicationMessage->interfaceMessage.contentLength);
1948 ASN_STRUCT_FREE(asn_DEF_E2SM_gNB_X2_indicationMessage, pE2SM_gNB_X2_indicationMessage);
1952 ASN_STRUCT_FREE(asn_DEF_E2SM_gNB_X2_indicationMessage, pE2SM_gNB_X2_indicationMessage);
1953 return e2err_RICIndicationMessageIEContentLengthFail;
1957 printf("Decode failed. More data needed. Buffer size %zu, %s, consumed %zu",pRICIndicationMessage->octetString.contentLength,
1958 asn_DEF_E2SM_gNB_X2_indicationMessage.name, rval.consumed);
1960 return e2err_RICIndicationMessageDecodeWMOREFail;
1963 printf("Decode failed. Buffer size %zu, %s, consumed %zu",pRICIndicationMessage->octetString.contentLength,
1964 asn_DEF_E2SM_gNB_X2_indicationMessage.name, rval.consumed);
1966 return e2err_RICIndicationMessageDecodeFAIL;
1968 return e2err_RICIndicationMessageDecodeDefaultFail;
1973 //////////////////////////////////////////////////////////////////////
1974 uint64_t getRICSubscriptionDeleteRequestData(e2ap_pdu_ptr_t* pE2AP_PDU_pointer, RICSubscriptionDeleteRequest_t* pRICSubscriptionDeleteRequest) {
1976 E2AP_PDU_t* pE2AP_PDU = (E2AP_PDU_t*)pE2AP_PDU_pointer;
1978 RICsubscriptionDeleteRequest_t *asnRicSubscriptionDeleteRequest = &pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionDeleteRequest;
1979 RICsubscriptionDeleteRequest_IEs_t* pRICsubscriptionDeleteRequest_IEs;
1982 if (asnRicSubscriptionDeleteRequest->protocolIEs.list.count > 0 &&
1983 asnRicSubscriptionDeleteRequest->protocolIEs.list.array[0]->id == ProtocolIE_ID_id_RICrequestID) {
1984 pRICsubscriptionDeleteRequest_IEs = asnRicSubscriptionDeleteRequest->protocolIEs.list.array[0];
1985 pRICSubscriptionDeleteRequest->ricRequestID.ricRequestorID = pRICsubscriptionDeleteRequest_IEs->value.choice.RICrequestID.ricRequestorID;
1986 pRICSubscriptionDeleteRequest->ricRequestID.ricRequestSequenceNumber = pRICsubscriptionDeleteRequest_IEs->value.choice.RICrequestID.ricRequestSequenceNumber;
1989 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1990 return e2err_RICsubscriptionDeleteRequestRICrequestIDMissing;
1994 if (asnRicSubscriptionDeleteRequest->protocolIEs.list.count > 1 &&
1995 asnRicSubscriptionDeleteRequest->protocolIEs.list.array[1]->id == ProtocolIE_ID_id_RANfunctionID) {
1996 pRICsubscriptionDeleteRequest_IEs = asnRicSubscriptionDeleteRequest->protocolIEs.list.array[1];
1997 pRICSubscriptionDeleteRequest->ranFunctionID = pRICsubscriptionDeleteRequest_IEs->value.choice.RANfunctionID;
2000 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
2001 return e2err_RICsubscriptionDeleteRequestRANfunctionIDMissing;
2004 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
2008 //////////////////////////////////////////////////////////////////////
2009 uint64_t getRICSubscriptionDeleteResponseData(e2ap_pdu_ptr_t* pE2AP_PDU_pointer, RICSubscriptionDeleteResponse_t* pRICSubscriptionDeleteResponse) {
2011 E2AP_PDU_t* pE2AP_PDU = (E2AP_PDU_t*)pE2AP_PDU_pointer;
2013 RICsubscriptionDeleteResponse_t *asnRicSubscriptionDeleteResponse = &pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionDeleteResponse;
2014 RICsubscriptionDeleteResponse_IEs_t* pRICsubscriptionDeleteResponse_IEs;
2017 if (asnRicSubscriptionDeleteResponse->protocolIEs.list.count > 0 &&
2018 asnRicSubscriptionDeleteResponse->protocolIEs.list.array[0]->id == ProtocolIE_ID_id_RICrequestID) {
2019 pRICsubscriptionDeleteResponse_IEs = asnRicSubscriptionDeleteResponse->protocolIEs.list.array[0];
2020 pRICSubscriptionDeleteResponse->ricRequestID.ricRequestorID = pRICsubscriptionDeleteResponse_IEs->value.choice.RICrequestID.ricRequestorID;
2021 pRICSubscriptionDeleteResponse->ricRequestID.ricRequestSequenceNumber = pRICsubscriptionDeleteResponse_IEs->value.choice.RICrequestID.ricRequestSequenceNumber;
2024 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
2025 return e2err_RICsubscriptionDeleteResponseRICrequestIDMissing;
2029 if (asnRicSubscriptionDeleteResponse->protocolIEs.list.count > 1 &&
2030 asnRicSubscriptionDeleteResponse->protocolIEs.list.array[1]->id == ProtocolIE_ID_id_RANfunctionID) {
2031 pRICsubscriptionDeleteResponse_IEs = asnRicSubscriptionDeleteResponse->protocolIEs.list.array[1];
2032 pRICSubscriptionDeleteResponse->ranFunctionID = pRICsubscriptionDeleteResponse_IEs->value.choice.RANfunctionID;
2035 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
2036 return e2err_RICsubscriptionDeleteResponseRANfunctionIDMissing;
2039 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
2043 //////////////////////////////////////////////////////////////////////
2044 uint64_t getRICSubscriptionDeleteFailureData(e2ap_pdu_ptr_t* pE2AP_PDU_pointer, RICSubscriptionDeleteFailure_t* pRICSubscriptionDeleteFailure) {
2046 E2AP_PDU_t* pE2AP_PDU = (E2AP_PDU_t*)pE2AP_PDU_pointer;
2048 RICsubscriptionDeleteFailure_t *asnRicSubscriptionDeleteFailure = &pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionDeleteFailure;
2049 RICsubscriptionDeleteFailure_IEs_t* pRICsubscriptionDeleteFailure_IEs;
2052 if (asnRicSubscriptionDeleteFailure->protocolIEs.list.count > 0 &&
2053 asnRicSubscriptionDeleteFailure->protocolIEs.list.array[0]->id == ProtocolIE_ID_id_RICrequestID) {
2054 pRICsubscriptionDeleteFailure_IEs = asnRicSubscriptionDeleteFailure->protocolIEs.list.array[0];
2055 pRICSubscriptionDeleteFailure->ricRequestID.ricRequestorID = pRICsubscriptionDeleteFailure_IEs->value.choice.RICrequestID.ricRequestorID;
2056 pRICSubscriptionDeleteFailure->ricRequestID.ricRequestSequenceNumber = pRICsubscriptionDeleteFailure_IEs->value.choice.RICrequestID.ricRequestSequenceNumber;
2059 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
2060 return e2err_RICsubscriptionDeleteFailureRICrequestIDMissing;
2064 if (asnRicSubscriptionDeleteFailure->protocolIEs.list.count > 1 &&
2065 asnRicSubscriptionDeleteFailure->protocolIEs.list.array[1]->id == ProtocolIE_ID_id_RANfunctionID) {
2066 pRICsubscriptionDeleteFailure_IEs = asnRicSubscriptionDeleteFailure->protocolIEs.list.array[1];
2067 pRICSubscriptionDeleteFailure->ranFunctionID = pRICsubscriptionDeleteFailure_IEs->value.choice.RANfunctionID;
2070 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
2071 return e2err_RICsubscriptionDeleteFailureRANfunctionIDMissing;
2075 if (asnRicSubscriptionDeleteFailure->protocolIEs.list.count > 2 &&
2076 asnRicSubscriptionDeleteFailure->protocolIEs.list.array[2]->id == ProtocolIE_ID_id_RICcause) {
2077 pRICsubscriptionDeleteFailure_IEs = asnRicSubscriptionDeleteFailure->protocolIEs.list.array[2];
2078 if (pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.present == RICcause_PR_radioNetwork) {
2079 pRICSubscriptionDeleteFailure->ricCause.content = RICcause_PR_radioNetwork;
2080 pRICSubscriptionDeleteFailure->ricCause.cause =
2081 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.choice.radioNetwork;
2083 else if (pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.present == RICcause_PR_transport) {
2084 pRICSubscriptionDeleteFailure->ricCause.content = RICcause_PR_transport;
2085 pRICSubscriptionDeleteFailure->ricCause.cause =
2086 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.choice.transport;
2088 else if (pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.present == RICcause_PR_protocol) {
2089 pRICSubscriptionDeleteFailure->ricCause.content = RICcause_PR_protocol;
2090 pRICSubscriptionDeleteFailure->ricCause.cause =
2091 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.choice.protocol;
2093 else if(pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.present == RICcause_PR_misc) {
2094 pRICSubscriptionDeleteFailure->ricCause.content = RICcause_PR_misc;
2095 pRICSubscriptionDeleteFailure->ricCause.cause =
2096 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.choice.misc;
2098 else if (pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.present == RICcause_PR_ric) {
2099 pRICSubscriptionDeleteFailure->ricCause.content = RICcause_PR_ric;
2100 pRICSubscriptionDeleteFailure->ricCause.cause =
2101 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.choice.ric;
2105 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
2106 return e2err_RICsubscriptionDeleteFailureRICcauseMissing;
2108 // CriticalityDiagnostics, OPTIONAL
2110 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);