32aeeba2071b568264fa544da8a3ae70dfdd5470
[ric-plt/submgr.git] / e2ap / libe2ap_wrapper / E2AP_if.c
1 /*
2 ==================================================================================
3   Copyright (c) 2019 AT&T Intellectual Property.
4   Copyright (c) 2019 Nokia
5
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
9
10        http://www.apache.org/licenses/LICENSE-2.0
11
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 ==================================================================================
18 */
19
20 #include <stdio.h>
21 #include <stdlib.h>
22
23 #include "E2AP-PDU.h"
24 #include "ProtocolIE-Field.h"
25 #include "RICsubsequentAction.h"
26 #include "E2SM-gNB-X2-eventTriggerDefinition.h"
27 #include "asn_constant.h"
28 #include "E2AP_if.h"
29
30 #ifdef DEBUG
31     static const bool debug = true;
32 #else
33     static const bool debug = false;
34 #endif
35
36
37 const int64_t cMaxNrOfErrors = 256;
38
39 const uint64_t cMaxSizeOfOctetString = 1024;
40
41 const size_t cMacroENBIDP_20Bits = 20;
42 const size_t cHomeENBID_28Bits = 28;
43 const size_t cShortMacroENBID_18Bits = 18;
44 const size_t clongMacroENBIDP_21Bits = 21;
45
46 const int cRICCauseRadioNetwork = 1; // this is content of type RICCause_t
47 const int cRICCauseTransport = 2; // this is content of type RICCause_t
48 const int cRICCauseProtocol = 3; // this is content of type RICCause_t
49 const int cRICCauseMisc = 4; // this is content of type RICCause_t
50 const int cRICCauseRic = 5; // this is content of type RICCause_t
51
52 //////////////////////////////////////////////////////////////////////
53 // Message definitons
54
55 // Below constant values are same as in E2AP, E2SM and X2AP specs
56 const uint64_t cE2InitiatingMessage = 1;
57 const uint64_t cE2SuccessfulOutcome = 2;
58 const uint64_t cE2UnsuccessfulOutcome = 3;
59
60 // E2AP messages
61 // Initiating message
62 const uint64_t cRICSubscriptionRequest = 1;
63 const uint64_t cRICSubscriptionDeleteRequest = 2;
64
65 // Successful outcome
66 const uint64_t cRICSubscriptionResponse = 1;
67 const uint64_t cRICsubscriptionDeleteResponse = 2;
68
69 // Unsuccessful outcome
70 const uint64_t cRICSubscriptionFailure = 1;
71 const uint64_t cRICsubscriptionDeleteFailure = 2;
72
73 typedef union {
74     uint32_t  nodeID;
75     uint8_t   octets[4];
76 } IdOctects_t;
77
78 //////////////////////////////////////////////////////////////////////
79 const char* getE2ErrorString(uint64_t errorCode) {
80
81     return E2ErrorStrings[errorCode];
82 }
83
84 /////////////////////////////////////////////////////////////////////
85 bool E2encode(E2AP_PDU_t* pE2AP_PDU, size_t* dataBufferSize, byte* dataBuffer, char* pLogBuffer) {
86
87     // Debug print
88     if (debug)
89         asn_fprint(stdout, &asn_DEF_E2AP_PDU, pE2AP_PDU);
90
91     asn_enc_rval_t rval;
92     rval = asn_encode_to_buffer(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, pE2AP_PDU, dataBuffer, *dataBufferSize);
93     if (rval.encoded == -1) {
94         sprintf(pLogBuffer,"Serialization of %s failed.", asn_DEF_E2AP_PDU.name);
95         ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
96         return false;
97     }
98     else if (rval.encoded > *dataBufferSize) {
99         sprintf(pLogBuffer,"Buffer of size %zu is too small for %s, need %zu",*dataBufferSize, asn_DEF_E2AP_PDU.name, rval.encoded);
100         ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
101         return false;
102     }
103     else {
104         if (debug)
105             sprintf(pLogBuffer,"Successfully encoded %s. Buffer size %zu, encoded size %zu",asn_DEF_E2AP_PDU.name, *dataBufferSize, rval.encoded);
106
107         ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
108         *dataBufferSize = rval.encoded;
109         return true;
110     }
111 }
112
113 //////////////////////////////////////////////////////////////////////
114 uint64_t packRICSubscriptionRequest(size_t* pdataBufferSize, byte* pDataBuffer, char* pLogBuffer, RICSubscriptionRequest_t* pRICSubscriptionRequest) {
115
116     E2AP_PDU_t* pE2AP_PDU = calloc(1, sizeof(E2AP_PDU_t));
117     if(pE2AP_PDU)
118         {
119         pE2AP_PDU->present = E2AP_PDU_PR_initiatingMessage;
120         pE2AP_PDU->choice.initiatingMessage.procedureCode = ProcedureCode_id_ricSubscription;
121         pE2AP_PDU->choice.initiatingMessage.criticality = Criticality_ignore;
122         pE2AP_PDU->choice.initiatingMessage.value.present = RICInitiatingMessage__value_PR_RICsubscriptionRequest;
123
124         // RICrequestID
125         RICsubscriptionRequest_IEs_t* pRICsubscriptionRequest_IEs = calloc(1, sizeof(RICsubscriptionRequest_IEs_t));
126         if (pRICsubscriptionRequest_IEs) {
127             pRICsubscriptionRequest_IEs->id = ProtocolIE_ID_id_RICrequestID;
128             pRICsubscriptionRequest_IEs->criticality = Criticality_reject;
129             pRICsubscriptionRequest_IEs->value.present = RICsubscriptionRequest_IEs__value_PR_RICrequestID;
130             pRICsubscriptionRequest_IEs->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionRequest->ricRequestID.ricRequestorID;
131             pRICsubscriptionRequest_IEs->value.choice.RICrequestID.ricRequestSequenceNumber = pRICSubscriptionRequest->ricRequestID.ricRequestSequenceNumber;
132             ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionRequest.protocolIEs.list, pRICsubscriptionRequest_IEs);
133         }
134         else
135             return e2err_RICSubscriptionRequestAllocRICrequestIDFail;
136
137         // RANfunctionID
138         pRICsubscriptionRequest_IEs = calloc(1, sizeof(RICsubscriptionRequest_IEs_t));
139         if (pRICsubscriptionRequest_IEs) {
140             pRICsubscriptionRequest_IEs->id = ProtocolIE_ID_id_RANfunctionID;
141             pRICsubscriptionRequest_IEs->criticality = Criticality_reject;
142             pRICsubscriptionRequest_IEs->value.present = RICsubscriptionRequest_IEs__value_PR_RANfunctionID;
143             pRICsubscriptionRequest_IEs->value.choice.RANfunctionID = pRICSubscriptionRequest->ranFunctionID;
144             ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionRequest.protocolIEs.list, pRICsubscriptionRequest_IEs);
145         }
146         else
147             return e2err_RICSubscriptionRequestAllocRANfunctionIDFail;
148
149         // RICsubscription
150         pRICsubscriptionRequest_IEs = calloc(1, sizeof(RICsubscriptionRequest_IEs_t));
151         if (pRICsubscriptionRequest_IEs) {
152             pRICsubscriptionRequest_IEs->id = ProtocolIE_ID_id_RICsubscription;
153             pRICsubscriptionRequest_IEs->criticality = Criticality_reject;
154             pRICsubscriptionRequest_IEs->value.present = RICsubscriptionRequest_IEs__value_PR_RICsubscription;
155
156             // RICeventTriggerDefinition
157             uint64_t returnCode;
158             if ((returnCode = packRICEventTriggerDefinition(pLogBuffer, &pRICSubscriptionRequest->ricSubscription.ricEventTriggerDefinition) != e2err_OK))
159                 return returnCode;
160
161             pRICsubscriptionRequest_IEs->value.choice.RICsubscription.ricEventTriggerDefinition.buf =
162               calloc(1, pRICSubscriptionRequest->ricSubscription.ricEventTriggerDefinition.octetString.contentLength);
163             if (pRICsubscriptionRequest_IEs->value.choice.RICsubscription.ricEventTriggerDefinition.buf) {
164                 pRICsubscriptionRequest_IEs->value.choice.RICsubscription.ricEventTriggerDefinition.size =
165                   pRICSubscriptionRequest->ricSubscription.ricEventTriggerDefinition.octetString.contentLength;
166                 memcpy(pRICsubscriptionRequest_IEs->value.choice.RICsubscription.ricEventTriggerDefinition.buf,
167                        pRICSubscriptionRequest->ricSubscription.ricEventTriggerDefinition.octetString.data,
168                        pRICSubscriptionRequest->ricSubscription.ricEventTriggerDefinition.octetString.contentLength);
169             }
170             else
171                 return e2err_RICSubscriptionRequestAllocRICeventTriggerDefinitionBufFail;
172
173             // RICactions-ToBeSetup-List
174             uint64_t index = 0;
175             while (index < pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.contentLength && index < maxofRICactionID) {
176
177                 RICaction_ToBeSetup_ItemIEs_t* pRICaction_ToBeSetup_ItemIEs = calloc(1, sizeof(RICaction_ToBeSetup_ItemIEs_t));
178                 if (pRICaction_ToBeSetup_ItemIEs) {
179                     pRICaction_ToBeSetup_ItemIEs->id = ProtocolIE_ID_id_RICaction_ToBeSetup_Item;
180                     pRICaction_ToBeSetup_ItemIEs->criticality = Criticality_reject;
181                     pRICaction_ToBeSetup_ItemIEs->value.present = RICaction_ToBeSetup_ItemIEs__value_PR_RICaction_ToBeSetup_Item;
182                     // RICActionID
183                     pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricActionID =
184                       pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionID;
185                     // RICActionType
186                     pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricActionType =
187                       pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionType;
188                 }
189                 else
190                     return e2err_RICSubscriptionRequestAllocRICaction_ToBeSetup_ItemIEsFail;
191
192                 // RICactionDefinition, OPTIONAL
193                   // This is not used in RIC
194
195                 // RICsubsequentAction, OPTIONAL
196                 if (pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricSubsequentActionPresent) {
197                     RICsubsequentAction_t* pRICsubsequentAction = calloc(1, sizeof(RICsubsequentAction_t));
198                     if (pRICsubsequentAction) {
199                         pRICsubsequentAction->ricSubsequentActionType =
200                         pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricSubsequentAction.ricSubsequentActionType;
201                         pRICsubsequentAction->ricTimeToWait =
202                         pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricSubsequentAction.ricTimeToWait;
203                         pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricSubsequentAction = pRICsubsequentAction;
204                     }
205                     else
206                         return e2err_RICSubscriptionRequestAllocRICsubsequentActionFail;
207                 }
208                 ASN_SEQUENCE_ADD(&pRICsubscriptionRequest_IEs->value.choice.RICsubscription.ricAction_ToBeSetup_List.list, pRICaction_ToBeSetup_ItemIEs);
209                 index++;
210             }
211             ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionRequest.protocolIEs.list, pRICsubscriptionRequest_IEs);
212         }
213         else
214             return e2err_RICSubscriptionRequestAllocRICsubscriptionRequest_IEsFail;
215
216         if (E2encode(pE2AP_PDU, pdataBufferSize, pDataBuffer, pLogBuffer))
217             return e2err_OK;
218         else
219             return e2err_RICSubscriptionRequestEncodeFail;
220     }
221     return e2err_RICSubscriptionRequestAllocE2AP_PDUFail;
222 }
223
224 //////////////////////////////////////////////////////////////////////
225 uint64_t packRICEventTriggerDefinition(char* pLogBuffer, RICEventTriggerDefinition_t* pRICEventTriggerDefinition) {
226
227     E2SM_gNB_X2_eventTriggerDefinition_t* pE2SM_gNB_X2_eventTriggerDefinition = calloc(1, sizeof(E2SM_gNB_X2_eventTriggerDefinition_t));
228     if(pE2SM_gNB_X2_eventTriggerDefinition)
229         {
230         // RICeventTriggerDefinition
231         // InterfaceID
232         if ((pRICEventTriggerDefinition->interfaceID.globalENBIDPresent == true && pRICEventTriggerDefinition->interfaceID.globalGNBIDPresent == true) ||
233             (pRICEventTriggerDefinition->interfaceID.globalENBIDPresent == false && pRICEventTriggerDefinition->interfaceID.globalGNBIDPresent == false))
234             return e2err_RICEventTriggerDefinitionIEValueFail_1;
235
236         // GlobalENB-ID or GlobalGNB-ID
237         if (pRICEventTriggerDefinition->interfaceID.globalENBIDPresent)
238         {
239             pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.present = Interface_ID_PR_global_eNB_ID;
240
241             // GlobalENB-ID
242             // PLMN-Identity
243             pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.pLMN_Identity.size =
244             pRICEventTriggerDefinition->interfaceID.globalENBID.pLMNIdentity.contentLength;
245             pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.pLMN_Identity.buf = calloc(1,3);
246             if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.pLMN_Identity.buf) {
247                 memcpy(pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.pLMN_Identity.buf,
248                        pRICEventTriggerDefinition->interfaceID.globalENBID.pLMNIdentity.pLMNIdentityVal,
249                        pRICEventTriggerDefinition->interfaceID.globalENBID.pLMNIdentity.contentLength);
250             }
251             else
252                 return e2err_RICIndicationAllocRICEventTriggerDefinitionglobal_eNB_IDpLMN_IdentityBufFail;
253
254             // Add ENB-ID
255             if (pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.bits == cMacroENBIDP_20Bits){
256                 // BIT STRING (SIZE (20)
257                 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.present = ENB_ID_PR_macro_eNB_ID;
258                 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.macro_eNB_ID.buf = calloc(1,3);
259                 if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.macro_eNB_ID.buf) {
260                     pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.macro_eNB_ID.size = 3; // bytes
261                     pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.macro_eNB_ID.bits_unused = 4; // trailing unused bits
262                     memcpy(pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.macro_eNB_ID.buf,
263                            (void*)&pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.nodeID,3);
264                 }
265                 else
266                     return e2err_RICIndicationAllocRICEventTriggerDefinitionglobal_eNB_IDeNB_IDmacro_eNB_IDBufFail;
267             }
268             else if (pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.bits == cHomeENBID_28Bits) {
269                 // BIT STRING (SIZE (28)
270                 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.present = ENB_ID_PR_home_eNB_ID;
271                 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.home_eNB_ID.buf = calloc(1,4);
272                 if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.home_eNB_ID.buf) {
273                     pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.home_eNB_ID.size = 4; // bytes
274                     pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.home_eNB_ID.bits_unused = 4; // trailing unused bits
275                     memcpy(pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.home_eNB_ID.buf,
276                            (void*)&pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.nodeID,4);
277                 }
278                 else
279                     return e2err_RICIndicationAllocRICEventTriggerDefinitionglobal_eNB_IDeNB_IDhome_eNB_IDBufFail;
280             }
281             else if (pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.bits == cShortMacroENBID_18Bits) {
282                 // BIT STRING (SIZE(18)
283                 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.present = ENB_ID_PR_short_Macro_eNB_ID;
284                 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.short_Macro_eNB_ID.buf = calloc(1,3);
285                 if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.short_Macro_eNB_ID.buf) {
286                     pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.short_Macro_eNB_ID.size = 3;
287                     pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.short_Macro_eNB_ID.bits_unused = 6; // trailing unused bits
288                     memcpy(pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.short_Macro_eNB_ID.buf,
289                            (void*)&pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.nodeID,3);
290                 }
291                 else
292                     return e2err_RICIndicationAllocRICEventTriggerDefinitionglobal_eNB_IDeNB_IDshort_Macro_eNB_IDBufFail;
293             }
294             else if (pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.bits == clongMacroENBIDP_21Bits) {
295                 // BIT STRING (SIZE(21)
296                 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.present = ENB_ID_PR_long_Macro_eNB_ID;
297                 pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.long_Macro_eNB_ID.buf = calloc(1,3);
298                 if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.long_Macro_eNB_ID.buf) {
299                     pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.long_Macro_eNB_ID.size = 3; // bytes
300                     pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.long_Macro_eNB_ID.bits_unused = 3; // trailing unused bits
301                     memcpy(pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.long_Macro_eNB_ID.buf,
302                            (void*)&pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.nodeID,3);
303                 }
304                 else
305                     return e2err_RICIndicationAllocRICEventTriggerDefinitionglobal_eNB_IDeNB_IDlong_Macro_eNB_IDBufFail;
306             }
307             else
308                 return e2err_RICEventTriggerDefinitionIEValueFail_2;
309
310         }
311         else if (pRICEventTriggerDefinition->interfaceID.globalGNBIDPresent) {
312             // GlobalGNB-ID
313             pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.present = Interface_ID_PR_global_gNB_ID;
314
315             // PLMN-Identity
316             pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_gNB_ID.pLMN_Identity.size =
317               pRICEventTriggerDefinition->interfaceID.globalGNBID.pLMNIdentity.contentLength;
318             pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_gNB_ID.pLMN_Identity.buf =
319               calloc(1,pRICEventTriggerDefinition->interfaceID.globalGNBID.pLMNIdentity.contentLength);
320             if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_gNB_ID.pLMN_Identity.buf) {
321                 memcpy(pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_gNB_ID.pLMN_Identity.buf,
322                        (void*)&pRICEventTriggerDefinition->interfaceID.globalGNBID.pLMNIdentity.pLMNIdentityVal,
323                         pRICEventTriggerDefinition->interfaceID.globalGNBID.pLMNIdentity.contentLength);
324             }
325             else
326                 return e2err_RICIndicationAllocRICEventTriggerDefinitionglobal_gNB_IDpLMN_IdentityBufFail;
327
328             // GNB-ID, BIT STRING (SIZE (22..32)
329             pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_gNB_ID.gNB_ID.choice.gNB_ID.size = 4;  //32bits
330             pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_gNB_ID.gNB_ID.choice.gNB_ID.buf = calloc(1, 4);
331             if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_gNB_ID.gNB_ID.choice.gNB_ID.buf) {
332                 memcpy(pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_gNB_ID.gNB_ID.choice.gNB_ID.buf,
333                        (void*)&pRICEventTriggerDefinition->interfaceID.globalGNBID,4); //32bits
334             }
335             else
336                 return e2err_RICIndicationAllocRICEventTriggerDefinitionglobal_gNB_IDgNB_IDBufFail;
337         }
338         else
339             return e2err_RICEventTriggerDefinitionIEValueFail_3;
340
341         // InterfaceDirection
342         pE2SM_gNB_X2_eventTriggerDefinition->interfaceDirection = pRICEventTriggerDefinition->interfaceDirection;
343
344         // InterfaceMessageType
345         // ProcedureCode
346         pE2SM_gNB_X2_eventTriggerDefinition->interfaceMessageType.procedureCode = pRICEventTriggerDefinition->interfaceMessageType.procedureCode;
347
348         // TypeOfMessage
349         if(pRICEventTriggerDefinition->interfaceMessageType.typeOfMessage == cE2InitiatingMessage)
350             pE2SM_gNB_X2_eventTriggerDefinition->interfaceMessageType.typeOfMessage = TypeOfMessage_initiating_message;
351         else if(pRICEventTriggerDefinition->interfaceMessageType.typeOfMessage == cE2SuccessfulOutcome)
352             pE2SM_gNB_X2_eventTriggerDefinition->interfaceMessageType.typeOfMessage = TypeOfMessage_successful_outcome;
353         else if(pRICEventTriggerDefinition->interfaceMessageType.typeOfMessage == cE2UnsuccessfulOutcome)
354             pE2SM_gNB_X2_eventTriggerDefinition->interfaceMessageType.typeOfMessage = TypeOfMessage_unsuccessful_outcome;
355         else
356             return e2err_RICEventTriggerDefinitionIEValueFail_4;
357
358         // InterfaceProtocolIE-List, OPTIONAL
359
360         // Debug print
361         if (debug)
362             asn_fprint(stdout, &asn_DEF_E2SM_gNB_X2_eventTriggerDefinition, pE2SM_gNB_X2_eventTriggerDefinition);
363
364         // Encode
365         size_t bufferSize = sizeof(pRICEventTriggerDefinition->octetString.data);
366         asn_enc_rval_t rval;
367         rval = asn_encode_to_buffer(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2SM_gNB_X2_eventTriggerDefinition, pE2SM_gNB_X2_eventTriggerDefinition,
368                                     pRICEventTriggerDefinition->octetString.data, bufferSize);
369         if(rval.encoded == -1)
370         {
371             sprintf(pLogBuffer,"Serialization of %s failed.", asn_DEF_E2SM_gNB_X2_eventTriggerDefinition.name);
372             return e2err_RICEventTriggerDefinitionPackFail_1;
373         }
374         else if(rval.encoded > bufferSize)
375         {
376            sprintf(pLogBuffer,"Buffer of size %zu is too small for %s, need %zu",bufferSize, asn_DEF_E2SM_gNB_X2_eventTriggerDefinition.name, rval.encoded);
377             return e2err_RICEventTriggerDefinitionPackFail_2;
378         }
379         else
380         if (debug)
381                sprintf(pLogBuffer,"Successfully encoded %s. Buffer size %zu, encoded size %zu",asn_DEF_E2SM_gNB_X2_eventTriggerDefinition.name, bufferSize, rval.encoded);
382
383         ASN_STRUCT_FREE(asn_DEF_E2SM_gNB_X2_eventTriggerDefinition, pE2SM_gNB_X2_eventTriggerDefinition);
384
385         pRICEventTriggerDefinition->octetString.contentLength = rval.encoded;
386         return e2err_OK;
387     }
388     return e2err_RICEventTriggerDefinitionAllocE2SM_gNB_X2_eventTriggerDefinitionFail;
389 }
390
391 //////////////////////////////////////////////////////////////////////
392 uint64_t packRICSubscriptionResponse(size_t* pDataBufferSize, byte* pDataBuffer, char* pLogBuffer, RICSubscriptionResponse_t* pRICSubscriptionResponse) {
393
394     E2AP_PDU_t* pE2AP_PDU = calloc(1, sizeof(E2AP_PDU_t));
395     if(pE2AP_PDU)
396         {
397         pE2AP_PDU->present = E2AP_PDU_PR_successfulOutcome;
398         pE2AP_PDU->choice.initiatingMessage.procedureCode = ProcedureCode_id_ricSubscription;
399         pE2AP_PDU->choice.initiatingMessage.criticality = Criticality_ignore;
400         pE2AP_PDU->choice.initiatingMessage.value.present = RICSuccessfulOutcome__value_PR_RICsubscriptionResponse;
401
402         // RICrequestID
403         RICsubscriptionResponse_IEs_t* pRICsubscriptionResponse_IEs = calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
404         if (pRICsubscriptionResponse_IEs) {
405             pRICsubscriptionResponse_IEs->id = ProtocolIE_ID_id_RICrequestID;
406             pRICsubscriptionResponse_IEs->criticality = Criticality_reject;
407             pRICsubscriptionResponse_IEs->value.present = RICsubscriptionResponse_IEs__value_PR_RICrequestID;
408             pRICsubscriptionResponse_IEs->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionResponse->ricRequestID.ricRequestorID;
409             pRICsubscriptionResponse_IEs->value.choice.RICrequestID.ricRequestSequenceNumber = pRICSubscriptionResponse->ricRequestID.ricRequestSequenceNumber;
410             ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionResponse.protocolIEs.list, pRICsubscriptionResponse_IEs);
411         }
412         else
413             return e2err_RICSubscriptionResponseAllocRICrequestIDFail;
414
415         // RANfunctionID
416         pRICsubscriptionResponse_IEs = calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
417         if (pRICsubscriptionResponse_IEs) {
418             pRICsubscriptionResponse_IEs->id = ProtocolIE_ID_id_RANfunctionID;
419             pRICsubscriptionResponse_IEs->criticality = Criticality_reject;
420             pRICsubscriptionResponse_IEs->value.present = RICsubscriptionResponse_IEs__value_PR_RANfunctionID;
421             pRICsubscriptionResponse_IEs->value.choice.RANfunctionID = pRICSubscriptionResponse->ranFunctionID;
422             ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionResponse.protocolIEs.list, pRICsubscriptionResponse_IEs);
423         }
424         else
425             return e2err_RICSubscriptionResponseAllocRANfunctionIDFail;
426
427         // RICaction-Admitted list
428         pRICsubscriptionResponse_IEs = calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
429         if (pRICsubscriptionResponse_IEs) {
430             pRICsubscriptionResponse_IEs->id = ProtocolIE_ID_id_RICactions_Admitted;
431             pRICsubscriptionResponse_IEs->criticality = Criticality_reject;
432             pRICsubscriptionResponse_IEs->value.present = RICsubscriptionResponse_IEs__value_PR_RICaction_Admitted_List;
433
434             uint64_t index = 0;
435             while (index < pRICSubscriptionResponse->ricActionAdmittedList.contentLength && index < maxofRICactionID) {
436
437                 RICaction_Admitted_ItemIEs_t* pRICaction_Admitted_ItemIEs = calloc(1, sizeof (RICaction_Admitted_ItemIEs_t));
438                 if (pRICaction_Admitted_ItemIEs)
439                 {
440                     pRICaction_Admitted_ItemIEs->id = ProtocolIE_ID_id_RICaction_Admitted_Item;
441                     pRICaction_Admitted_ItemIEs->criticality = Criticality_reject;
442                     pRICaction_Admitted_ItemIEs->value.present = RICaction_Admitted_ItemIEs__value_PR_RICaction_Admitted_Item;
443
444                     // RICActionID
445                     pRICaction_Admitted_ItemIEs->value.choice.RICaction_Admitted_Item.ricActionID = pRICSubscriptionResponse->ricActionAdmittedList.ricActionID[index];
446                     ASN_SEQUENCE_ADD(&pRICsubscriptionResponse_IEs->value.choice.RICaction_Admitted_List.list, pRICaction_Admitted_ItemIEs);
447                 }
448                 else
449                     return e2err_RICSubscriptionResponseAllocRICaction_Admitted_ItemIEsFail;
450                 index++;
451             }
452         }
453         else
454             return e2err_RICSubscriptionResponseAllocRICActionAdmittedListFail;
455
456         ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionResponse.protocolIEs.list, pRICsubscriptionResponse_IEs);
457
458         // RICaction-NotAdmitted list, OPTIONAL
459         if (pRICSubscriptionResponse->ricActionNotAdmittedListPresent) {
460             pRICsubscriptionResponse_IEs = calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
461             if (pRICsubscriptionResponse_IEs) {
462                 pRICsubscriptionResponse_IEs->id = ProtocolIE_ID_id_RICactions_NotAdmitted;
463                 pRICsubscriptionResponse_IEs->criticality = Criticality_reject;
464                 pRICsubscriptionResponse_IEs->value.present = RICsubscriptionResponse_IEs__value_PR_RICaction_NotAdmitted_List;
465
466                 uint64_t index = 0;
467                 while (index < pRICSubscriptionResponse->ricActionNotAdmittedList.contentLength && index < maxofRICactionID) {
468
469                     RICaction_NotAdmitted_ItemIEs_t* pRICaction_NotAdmitted_ItemIEs = calloc(1, sizeof (RICaction_NotAdmitted_ItemIEs_t));
470                     if (pRICaction_NotAdmitted_ItemIEs)
471                     {
472                         pRICaction_NotAdmitted_ItemIEs->id = ProtocolIE_ID_id_RICaction_NotAdmitted_Item;
473                         pRICaction_NotAdmitted_ItemIEs->criticality = Criticality_reject;
474                         pRICaction_NotAdmitted_ItemIEs->value.present = RICaction_NotAdmitted_ItemIEs__value_PR_RICaction_NotAdmitted_Item;
475
476                         // RICActionID
477                         pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricActionID =
478                           pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricActionID;
479
480                         // RICCause
481                         if (pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content == RICcause_PR_radioNetwork) {
482                             pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present = RICcause_PR_radioNetwork;
483                             pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.radioNetwork =
484                               pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause;
485                         }
486                         else if (pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content == RICcause_PR_transport) {
487                             pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present = RICcause_PR_transport;
488                             pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.transport =
489                               pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause;
490                         }
491                         else if (pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content == RICcause_PR_protocol) {
492                             pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present = RICcause_PR_protocol;
493                             pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.protocol =
494                               pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause;
495                         }
496                         else if (pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content == RICcause_PR_misc) {
497                             pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present = RICcause_PR_misc;
498                             pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.misc =
499                               pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause;
500                         }
501                         else if (pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content == RICcause_PR_ric) {
502                             pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present = RICcause_PR_ric;
503                             pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.ric =
504                               pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause;
505                         }
506                         ASN_SEQUENCE_ADD(&pRICsubscriptionResponse_IEs->value.choice.RICaction_NotAdmitted_List.list, pRICaction_NotAdmitted_ItemIEs);
507                     }
508                     else
509                         return e2err_RICSubscriptionResponseAllocRICaction_NotAdmitted_ItemIEsFail;
510                     index++;
511                 }
512             }
513             ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionResponse.protocolIEs.list, pRICsubscriptionResponse_IEs);
514         }
515
516         if (E2encode(pE2AP_PDU, pDataBufferSize, pDataBuffer, pLogBuffer))
517             return e2err_OK;
518         else
519             return e2err_RICSubscriptionResponseEncodeFail;
520     }
521     return e2err_RICSubscriptionResponseAllocE2AP_PDUFail;
522 }
523
524 //////////////////////////////////////////////////////////////////////
525 uint64_t packRICSubscriptionFailure(size_t* pDataBufferSize, byte* pDataBuffer, char* pLogBuffer, RICSubscriptionFailure_t* pRICSubscriptionFailure) {
526
527     E2AP_PDU_t* pE2AP_PDU = calloc(1, sizeof(E2AP_PDU_t));
528     if(pE2AP_PDU)
529         {
530         pE2AP_PDU->present = E2AP_PDU_PR_unsuccessfulOutcome;
531         pE2AP_PDU->choice.unsuccessfulOutcome.procedureCode = ProcedureCode_id_ricSubscription;
532         pE2AP_PDU->choice.unsuccessfulOutcome.criticality = Criticality_ignore;
533         pE2AP_PDU->choice.unsuccessfulOutcome.value.present = RICUnsuccessfulOutcome__value_PR_RICsubscriptionFailure;
534
535         // RICrequestID
536         RICsubscriptionFailure_IEs_t* pRICsubscriptionFailure_IEs = calloc(1, sizeof(RICsubscriptionFailure_IEs_t));
537         if (pRICsubscriptionFailure_IEs) {
538             pRICsubscriptionFailure_IEs->id = ProtocolIE_ID_id_RICrequestID;
539             pRICsubscriptionFailure_IEs->criticality = Criticality_reject;
540             pRICsubscriptionFailure_IEs->value.present = RICsubscriptionFailure_IEs__value_PR_RICrequestID;
541             pRICsubscriptionFailure_IEs->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionFailure->ricRequestID.ricRequestorID;
542             pRICsubscriptionFailure_IEs->value.choice.RICrequestID.ricRequestSequenceNumber = pRICSubscriptionFailure->ricRequestID.ricRequestSequenceNumber;
543             ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionFailure.protocolIEs.list, pRICsubscriptionFailure_IEs);
544         }
545         else
546             return e2err_RICSubscriptionFailureAllocRICrequestIDFail;
547
548         // RANfunctionID
549         pRICsubscriptionFailure_IEs = calloc(1, sizeof(RICsubscriptionFailure_IEs_t));
550         if (pRICsubscriptionFailure_IEs) {
551             pRICsubscriptionFailure_IEs->id = ProtocolIE_ID_id_RANfunctionID;
552             pRICsubscriptionFailure_IEs->criticality = Criticality_reject;
553             pRICsubscriptionFailure_IEs->value.present = RICsubscriptionFailure_IEs__value_PR_RANfunctionID;
554             pRICsubscriptionFailure_IEs->value.choice.RANfunctionID = pRICSubscriptionFailure->ranFunctionID;
555             ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionFailure.protocolIEs.list, pRICsubscriptionFailure_IEs);
556         }
557         else
558             return e2err_RICSubscriptionFailureAllocRANfunctionIDFail;
559
560         // RICaction-NotAdmitted list
561         pRICsubscriptionFailure_IEs = calloc(1, sizeof(RICsubscriptionFailure_IEs_t));
562         if (pRICsubscriptionFailure_IEs) {
563             pRICsubscriptionFailure_IEs->id = ProtocolIE_ID_id_RICactions_NotAdmitted;
564             pRICsubscriptionFailure_IEs->criticality = Criticality_reject;
565             pRICsubscriptionFailure_IEs->value.present = RICsubscriptionFailure_IEs__value_PR_RICaction_NotAdmitted_List;
566
567             uint64_t index = 0;
568             while (index < pRICSubscriptionFailure->ricActionNotAdmittedList.contentLength && index < maxofRICactionID) {
569
570                 RICaction_NotAdmitted_ItemIEs_t* pRICaction_NotAdmitted_ItemIEs = calloc(1, sizeof (RICaction_NotAdmitted_ItemIEs_t));
571                 if (pRICaction_NotAdmitted_ItemIEs)
572                 {
573                     pRICaction_NotAdmitted_ItemIEs->id = ProtocolIE_ID_id_RICaction_NotAdmitted_Item;
574                     pRICaction_NotAdmitted_ItemIEs->criticality = Criticality_reject;
575                     pRICaction_NotAdmitted_ItemIEs->value.present = RICaction_NotAdmitted_ItemIEs__value_PR_RICaction_NotAdmitted_Item;
576
577                     // RICActionID
578                     pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricActionID =
579                       pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricActionID;
580
581                     // RICCause
582                     if (pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content == RICcause_PR_radioNetwork) {
583                         pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present = RICcause_PR_radioNetwork;
584                         pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.radioNetwork =
585                           pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause;
586                     }
587                     else if (pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content == RICcause_PR_transport) {
588                         pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present = RICcause_PR_transport;
589                         pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.transport =
590                           pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause;
591                     }
592                     else if (pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content == RICcause_PR_protocol) {
593                         pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present = RICcause_PR_protocol;
594                         pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.protocol =
595                           pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause;
596                     }
597                     else if (pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content == RICcause_PR_misc) {
598                         pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present = RICcause_PR_misc;
599                         pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.misc =
600                           pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause;
601                     }
602                     else if (pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content == RICcause_PR_ric) {
603                         pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present = RICcause_PR_ric;
604                         pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.ric =
605                           pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause;
606                     }
607                     ASN_SEQUENCE_ADD(&pRICsubscriptionFailure_IEs->value.choice.RICaction_NotAdmitted_List.list, pRICaction_NotAdmitted_ItemIEs);
608                 }
609                 else
610                     return e2err_RICSubscriptionFailureAllocRICaction_NotAdmitted_ItemIEsFail;
611                 index++;
612             }
613             ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionFailure.protocolIEs.list, pRICsubscriptionFailure_IEs);
614         }
615         else
616             return e2err_RICSubscriptionFailureAllocRICActionAdmittedListFail;
617
618         // CriticalityDiagnostics, OPTIONAL. Not used in RIC
619
620         if (E2encode(pE2AP_PDU, pDataBufferSize, pDataBuffer, pLogBuffer))
621             return e2err_OK;
622         else
623             return e2err_RICSubscriptionFailureEncodeFail;
624     }
625     else
626         return e2err_RICSubscriptionFailureAllocE2AP_PDUFail;
627 }
628
629 //////////////////////////////////////////////////////////////////////
630 uint64_t packRICSubscriptionDeleteRequest(size_t* pDataBufferSize, byte* pDataBuffer, char* pLogBuffer, RICSubscriptionDeleteRequest_t* pRICSubscriptionDeleteRequest) {
631
632     E2AP_PDU_t* pE2AP_PDU = calloc(1, sizeof(E2AP_PDU_t));
633     if(pE2AP_PDU)
634         {
635         pE2AP_PDU->present = E2AP_PDU_PR_initiatingMessage;
636         pE2AP_PDU->choice.initiatingMessage.procedureCode = ProcedureCode_id_ricSubscriptionDelete;
637         pE2AP_PDU->choice.initiatingMessage.criticality = Criticality_ignore;
638         pE2AP_PDU->choice.initiatingMessage.value.present = RICInitiatingMessage__value_PR_RICsubscriptionDeleteRequest;
639
640         // RICrequestID
641         RICsubscriptionDeleteRequest_IEs_t* pRICsubscriptionDeleteRequest_IEs = calloc(1, sizeof(RICsubscriptionDeleteRequest_IEs_t));
642         if (pRICsubscriptionDeleteRequest_IEs) {
643             pRICsubscriptionDeleteRequest_IEs->id = ProtocolIE_ID_id_RICrequestID;
644             pRICsubscriptionDeleteRequest_IEs->criticality = Criticality_reject;
645             pRICsubscriptionDeleteRequest_IEs->value.present = RICsubscriptionDeleteRequest_IEs__value_PR_RICrequestID;
646             pRICsubscriptionDeleteRequest_IEs->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionDeleteRequest->ricRequestID.ricRequestorID;
647             pRICsubscriptionDeleteRequest_IEs->value.choice.RICrequestID.ricRequestSequenceNumber = pRICSubscriptionDeleteRequest->ricRequestID.ricRequestSequenceNumber;
648             ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionDeleteRequest.protocolIEs.list, pRICsubscriptionDeleteRequest_IEs);
649         }
650         else
651             return e2err_RICSubscriptionDeleteRequestAllocRICrequestIDFail;
652
653         // RANfunctionID
654         pRICsubscriptionDeleteRequest_IEs = calloc(1, sizeof(RICsubscriptionDeleteRequest_IEs_t));
655         if (pRICsubscriptionDeleteRequest_IEs) {
656             pRICsubscriptionDeleteRequest_IEs->id = ProtocolIE_ID_id_RANfunctionID;
657             pRICsubscriptionDeleteRequest_IEs->criticality = Criticality_reject;
658             pRICsubscriptionDeleteRequest_IEs->value.present = RICsubscriptionDeleteRequest_IEs__value_PR_RANfunctionID;
659             pRICsubscriptionDeleteRequest_IEs->value.choice.RANfunctionID = pRICSubscriptionDeleteRequest->ranFunctionID;
660             ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionDeleteRequest.protocolIEs.list, pRICsubscriptionDeleteRequest_IEs);
661         }
662         else
663             return e2err_RICSubscriptionDeleteRequestAllocRANfunctionIDFail;
664
665         if (E2encode(pE2AP_PDU, pDataBufferSize, pDataBuffer, pLogBuffer))
666             return e2err_OK;
667         else
668             return e2err_RICSubscriptionDeleteRequestEncodeFail;
669     }
670     else
671         return e2err_RICSubscriptionDeleteRequestAllocE2AP_PDUFail;
672 }
673
674 //////////////////////////////////////////////////////////////////////
675 uint64_t packRICSubscriptionDeleteResponse(size_t* pDataBufferSize, byte* pDataBuffer, char* pLogBuffer, RICSubscriptionDeleteResponse_t* pRICSubscriptionDeleteResponse) {
676
677     E2AP_PDU_t* pE2AP_PDU = calloc(1, sizeof(E2AP_PDU_t));
678     if(pE2AP_PDU)
679         {
680         pE2AP_PDU->present = E2AP_PDU_PR_successfulOutcome;
681         pE2AP_PDU->choice.successfulOutcome.procedureCode = ProcedureCode_id_ricSubscriptionDelete;
682         pE2AP_PDU->choice.successfulOutcome.criticality = Criticality_ignore;
683         pE2AP_PDU->choice.successfulOutcome.value.present = RICSuccessfulOutcome__value_PR_RICsubscriptionDeleteResponse;
684
685         // RICrequestID
686         RICsubscriptionDeleteResponse_IEs_t* pRICsubscriptionDeleteResponse_IEs = calloc(1, sizeof(RICsubscriptionDeleteResponse_IEs_t));
687         if (pRICsubscriptionDeleteResponse_IEs) {
688             pRICsubscriptionDeleteResponse_IEs->id = ProtocolIE_ID_id_RICrequestID;
689             pRICsubscriptionDeleteResponse_IEs->criticality = Criticality_reject;
690             pRICsubscriptionDeleteResponse_IEs->value.present = RICsubscriptionDeleteResponse_IEs__value_PR_RICrequestID;
691             pRICsubscriptionDeleteResponse_IEs->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionDeleteResponse->ricRequestID.ricRequestorID;
692             pRICsubscriptionDeleteResponse_IEs->value.choice.RICrequestID.ricRequestSequenceNumber = pRICSubscriptionDeleteResponse->ricRequestID.ricRequestSequenceNumber;
693             ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionDeleteResponse.protocolIEs.list, pRICsubscriptionDeleteResponse_IEs);
694         }
695         else
696             return e2err_RICSubscriptionDeleteResponseAllocRICrequestIDFail;
697
698         // RANfunctionID
699         pRICsubscriptionDeleteResponse_IEs = calloc(1, sizeof(RICsubscriptionDeleteResponse_IEs_t));
700         if (pRICsubscriptionDeleteResponse_IEs) {
701             pRICsubscriptionDeleteResponse_IEs->id = ProtocolIE_ID_id_RANfunctionID;
702             pRICsubscriptionDeleteResponse_IEs->criticality = Criticality_reject;
703             pRICsubscriptionDeleteResponse_IEs->value.present = RICsubscriptionDeleteResponse_IEs__value_PR_RANfunctionID;
704             pRICsubscriptionDeleteResponse_IEs->value.choice.RANfunctionID = pRICSubscriptionDeleteResponse->ranFunctionID;
705             ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionDeleteResponse.protocolIEs.list, pRICsubscriptionDeleteResponse_IEs);
706         }
707         else
708             return e2err_RICSubscriptionDeleteResponseAllocRANfunctionIDFail;
709
710         if (E2encode(pE2AP_PDU, pDataBufferSize, pDataBuffer, pLogBuffer))
711             return e2err_OK;
712         else
713             return e2err_RICSubscriptionDeleteResponseEncodeFail;
714     }
715     else
716         return e2err_RICSubscriptionDeleteResponseAllocE2AP_PDUFail;
717 }
718
719 uint64_t packRICSubscriptionDeleteFailure(size_t* pDataBufferSize, byte* pDataBuffer, char* pLogBuffer, RICSubscriptionDeleteFailure_t* pRICSubscriptionDeleteFailure) {
720
721     E2AP_PDU_t* pE2AP_PDU = calloc(1, sizeof(E2AP_PDU_t));
722     if(pE2AP_PDU)
723         {
724         pE2AP_PDU->present = E2AP_PDU_PR_unsuccessfulOutcome;
725         pE2AP_PDU->choice.unsuccessfulOutcome.procedureCode = ProcedureCode_id_ricSubscriptionDelete;
726         pE2AP_PDU->choice.unsuccessfulOutcome.criticality = Criticality_ignore;
727         pE2AP_PDU->choice.unsuccessfulOutcome.value.present = RICUnsuccessfulOutcome__value_PR_RICsubscriptionDeleteFailure;
728
729         // RICrequestID
730         RICsubscriptionDeleteFailure_IEs_t* pRICsubscriptionDeleteFailure_IEs = calloc(1, sizeof(RICsubscriptionDeleteFailure_IEs_t));
731         if (pRICsubscriptionDeleteFailure_IEs) {
732             pRICsubscriptionDeleteFailure_IEs->id = ProtocolIE_ID_id_RICrequestID;
733             pRICsubscriptionDeleteFailure_IEs->criticality = Criticality_reject;
734             pRICsubscriptionDeleteFailure_IEs->value.present = RICsubscriptionDeleteFailure_IEs__value_PR_RICrequestID;
735             pRICsubscriptionDeleteFailure_IEs->value.choice.RICrequestID.ricRequestorID = pRICSubscriptionDeleteFailure->ricRequestID.ricRequestorID;
736             pRICsubscriptionDeleteFailure_IEs->value.choice.RICrequestID.ricRequestSequenceNumber = pRICSubscriptionDeleteFailure->ricRequestID.ricRequestSequenceNumber;
737             ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionDeleteFailure.protocolIEs.list, pRICsubscriptionDeleteFailure_IEs);
738         }
739         else
740             return e2err_RICSubscriptionDeleteFailureAllocRICrequestIDFail;
741
742         // RANfunctionID
743         pRICsubscriptionDeleteFailure_IEs = calloc(1, sizeof(RICsubscriptionDeleteFailure_IEs_t));
744         if (pRICsubscriptionDeleteFailure_IEs) {
745             pRICsubscriptionDeleteFailure_IEs->id = ProtocolIE_ID_id_RANfunctionID;
746             pRICsubscriptionDeleteFailure_IEs->criticality = Criticality_reject;
747             pRICsubscriptionDeleteFailure_IEs->value.present = RICsubscriptionDeleteFailure_IEs__value_PR_RANfunctionID;
748             pRICsubscriptionDeleteFailure_IEs->value.choice.RANfunctionID = pRICSubscriptionDeleteFailure->ranFunctionID;
749             ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionDeleteFailure.protocolIEs.list, pRICsubscriptionDeleteFailure_IEs);
750         }
751         else
752             return e2err_RICSubscriptionDeleteFailureAllocRANfunctionIDFail;
753
754         // RICcause
755         pRICsubscriptionDeleteFailure_IEs = calloc(1, sizeof(RICsubscriptionDeleteFailure_IEs_t));
756         if (pRICsubscriptionDeleteFailure_IEs) {
757             pRICsubscriptionDeleteFailure_IEs->id = ProtocolIE_ID_id_RICcause;
758             pRICsubscriptionDeleteFailure_IEs->criticality = Criticality_reject;
759             pRICsubscriptionDeleteFailure_IEs->value.present = RICsubscriptionDeleteFailure_IEs__value_PR_RICcause;
760             if (pRICSubscriptionDeleteFailure->ricCause.content == RICcause_PR_radioNetwork) {
761                 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.present = RICcause_PR_radioNetwork;
762                 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.choice.radioNetwork =
763                   pRICSubscriptionDeleteFailure->ricCause.cause;
764             }
765             else if (pRICSubscriptionDeleteFailure->ricCause.content == RICcause_PR_transport) {
766                 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.present = RICcause_PR_transport;
767                 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.choice.transport =
768                   pRICSubscriptionDeleteFailure->ricCause.cause;
769             }
770             else if (pRICSubscriptionDeleteFailure->ricCause.content == RICcause_PR_protocol) {
771                 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.present = RICcause_PR_protocol;
772                 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.choice.protocol =
773                   pRICSubscriptionDeleteFailure->ricCause.cause;
774             }
775             else if (pRICSubscriptionDeleteFailure->ricCause.content == RICcause_PR_misc) {
776                 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.present = RICcause_PR_misc;
777                 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.choice.misc =
778                   pRICSubscriptionDeleteFailure->ricCause.cause;
779             }
780             else if (pRICSubscriptionDeleteFailure->ricCause.content == RICcause_PR_ric) {
781                 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.present = RICcause_PR_ric;
782                 pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.choice.ric =
783                   pRICSubscriptionDeleteFailure->ricCause.cause;
784             }
785             ASN_SEQUENCE_ADD(&pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionDeleteFailure.protocolIEs.list, pRICsubscriptionDeleteFailure_IEs);
786         }
787         else
788             return e2err_RICSubscriptionDeleteFailureAllocRICcauseFail;
789
790         // CriticalityDiagnostics, OPTIONAL
791
792         if (E2encode(pE2AP_PDU, pDataBufferSize, pDataBuffer, pLogBuffer))
793             return e2err_OK;
794         else
795             return e2err_RICSubscriptionDeleteFailureEncodeFail;
796     }
797     else
798         return e2err_RICSubscriptionDeleteFailureAllocE2AP_PDUFail;
799 }
800
801 //////////////////////////////////////////////////////////////////////
802 e2ap_pdu_ptr_t* unpackE2AP_pdu(const size_t dataBufferSize, const byte* dataBuffer, char* pLogBuffer, E2MessageInfo_t* pMessageInfo) {
803
804     E2AP_PDU_t* pE2AP_PDU = 0;
805     asn_dec_rval_t rval;
806     rval = asn_decode(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, (void **)&pE2AP_PDU, dataBuffer, dataBufferSize);
807     switch (rval.code) {
808     case RC_OK:
809         // Debug print
810         if (debug) {
811             sprintf(pLogBuffer,"Successfully decoded E2AP-PDU");
812             asn_fprint(stdout, &asn_DEF_E2AP_PDU, pE2AP_PDU);
813         }
814
815         if (pE2AP_PDU->present == E2AP_PDU_PR_initiatingMessage) {
816             if (pE2AP_PDU->choice.initiatingMessage.procedureCode == ProcedureCode_id_ricSubscription) {
817                 if (pE2AP_PDU->choice.initiatingMessage.value.present == RICInitiatingMessage__value_PR_RICsubscriptionRequest) {
818                     pMessageInfo->messageType = cE2InitiatingMessage;
819                     pMessageInfo->messageId = cRICSubscriptionRequest;
820                     return (e2ap_pdu_ptr_t*)pE2AP_PDU;
821                 }
822                 else {
823                     sprintf(pLogBuffer,"Error. Not supported initiatingMessage MessageId = %u",pE2AP_PDU->choice.initiatingMessage.value.present);
824                     return 0;
825                 }
826             }
827             else if (pE2AP_PDU->choice.initiatingMessage.procedureCode == ProcedureCode_id_ricSubscriptionDelete) {
828                 if (pE2AP_PDU->choice.initiatingMessage.value.present == RICInitiatingMessage__value_PR_RICsubscriptionDeleteRequest) {
829                     pMessageInfo->messageType = cE2InitiatingMessage;
830                     pMessageInfo->messageId = cRICSubscriptionDeleteRequest;
831                     return (e2ap_pdu_ptr_t*)pE2AP_PDU;
832                 }
833                 else {
834                     sprintf(pLogBuffer,"Error. Not supported initiatingMessage MessageId = %u",pE2AP_PDU->choice.initiatingMessage.value.present);
835                     return 0;
836                 }
837             }
838             else {
839                 sprintf(pLogBuffer,"Error. Procedure not supported. ProcedureCode = %li",pE2AP_PDU->choice.initiatingMessage.procedureCode);
840                 return 0;
841             }
842         }
843         else if (pE2AP_PDU->present == E2AP_PDU_PR_successfulOutcome) {
844             if (pE2AP_PDU->choice.successfulOutcome.procedureCode == ProcedureCode_id_ricSubscription) {
845                 if (pE2AP_PDU->choice.successfulOutcome.value.present == RICSuccessfulOutcome__value_PR_RICsubscriptionResponse) {
846                     pMessageInfo->messageType = cE2SuccessfulOutcome;
847                     pMessageInfo->messageId = cRICSubscriptionResponse;
848                     return (e2ap_pdu_ptr_t*)pE2AP_PDU;
849                 }
850                 else {
851                     sprintf(pLogBuffer,"Error. Not supported successfulOutcome MessageId = %u",pE2AP_PDU->choice.successfulOutcome.value.present);
852                     return 0;
853                 }
854             }
855             else if (pE2AP_PDU->choice.successfulOutcome.procedureCode == ProcedureCode_id_ricSubscriptionDelete) {
856                 if (pE2AP_PDU->choice.successfulOutcome.value.present == RICSuccessfulOutcome__value_PR_RICsubscriptionDeleteResponse) {
857                     pMessageInfo->messageType = cE2SuccessfulOutcome;
858                     pMessageInfo->messageId = cRICsubscriptionDeleteResponse;
859                     return (e2ap_pdu_ptr_t*)pE2AP_PDU;
860                 }
861                 else {
862                     sprintf(pLogBuffer,"Error. Not supported successfulOutcome MessageId = %u",pE2AP_PDU->choice.successfulOutcome.value.present);
863                     return 0;
864                 }
865             }
866             else {
867                 sprintf(pLogBuffer,"Error. Procedure not supported. ProcedureCode = %li",pE2AP_PDU->choice.successfulOutcome.procedureCode);
868                 return 0;
869             }
870         }
871         else if (pE2AP_PDU->present == E2AP_PDU_PR_unsuccessfulOutcome) {
872             if (pE2AP_PDU->choice.unsuccessfulOutcome.procedureCode == ProcedureCode_id_ricSubscription) {
873                 if (pE2AP_PDU->choice.unsuccessfulOutcome.value.present == RICUnsuccessfulOutcome__value_PR_RICsubscriptionFailure) {
874                     pMessageInfo->messageType = cE2UnsuccessfulOutcome;
875                     pMessageInfo->messageId = cRICSubscriptionFailure;
876                     return (e2ap_pdu_ptr_t*)pE2AP_PDU;
877                 }
878                 else {
879                     sprintf(pLogBuffer,"Error. Not supported unsuccessfulOutcome MessageId = %u",pE2AP_PDU->choice.unsuccessfulOutcome.value.present);
880                     return 0;
881                 }
882             }
883             else if (pE2AP_PDU->choice.unsuccessfulOutcome.procedureCode == ProcedureCode_id_ricSubscriptionDelete) {
884                 if (pE2AP_PDU->choice.unsuccessfulOutcome.value.present == RICUnsuccessfulOutcome__value_PR_RICsubscriptionDeleteFailure) {
885                     pMessageInfo->messageType = cE2UnsuccessfulOutcome;
886                     pMessageInfo->messageId = cRICsubscriptionDeleteFailure;
887                     return (e2ap_pdu_ptr_t*)pE2AP_PDU;
888                 }
889                 else {
890                     sprintf(pLogBuffer,"Error. Not supported unsuccessfulOutcome MessageId = %u",pE2AP_PDU->choice.unsuccessfulOutcome.value.present);
891                     return 0;
892                 }
893             }
894         }
895         else
896             sprintf(pLogBuffer,"Decode failed. Invalid message type %u",pE2AP_PDU->present);
897         ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
898         return 0;
899     case RC_WMORE:
900         sprintf(pLogBuffer,"Decode failed. More data needed. Buffer size %zu, %s, consumed %zu",dataBufferSize, asn_DEF_E2AP_PDU.name, rval.consumed);
901         return 0;
902     case RC_FAIL:
903         sprintf(pLogBuffer,"Decode failed. Buffer size %zu, %s, consumed %zu",dataBufferSize, asn_DEF_E2AP_PDU.name, rval.consumed);
904         return 0;
905     default:
906         return 0;
907     }
908 }
909
910 //////////////////////////////////////////////////////////////////////
911 uint64_t getRICSubscriptionRequestData(e2ap_pdu_ptr_t* pE2AP_PDU_pointer, RICSubscriptionRequest_t* pRICSubscriptionRequest) {
912
913     E2AP_PDU_t* pE2AP_PDU = (E2AP_PDU_t*)pE2AP_PDU_pointer;
914
915     RICsubscriptionRequest_t *asnRicSubscriptionRequest = &pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionRequest;
916     RICsubscriptionRequest_IEs_t* pRICsubscriptionRequest_IEs;
917
918     // RICrequestID
919     if (asnRicSubscriptionRequest->protocolIEs.list.count > 0 &&
920         asnRicSubscriptionRequest->protocolIEs.list.array[0]->id == ProtocolIE_ID_id_RICrequestID) {
921         pRICsubscriptionRequest_IEs = asnRicSubscriptionRequest->protocolIEs.list.array[0];
922         pRICSubscriptionRequest->ricRequestID.ricRequestorID = pRICsubscriptionRequest_IEs->value.choice.RICrequestID.ricRequestorID;
923         pRICSubscriptionRequest->ricRequestID.ricRequestSequenceNumber = pRICsubscriptionRequest_IEs->value.choice.RICrequestID.ricRequestSequenceNumber;
924     }
925     else {
926         ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
927         return e2err_RICsubscriptionRequestRICrequestIDMissing;
928     }
929
930     // RANfunctionID
931     if (asnRicSubscriptionRequest->protocolIEs.list.count > 1 &&
932         asnRicSubscriptionRequest->protocolIEs.list.array[1]->id == ProtocolIE_ID_id_RANfunctionID) {
933         pRICsubscriptionRequest_IEs = asnRicSubscriptionRequest->protocolIEs.list.array[1];
934         pRICSubscriptionRequest->ranFunctionID = pRICsubscriptionRequest_IEs->value.choice.RANfunctionID;
935     }
936     else {
937         ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
938         return e2err_RICsubscriptionRequestRANfunctionIDMissing;
939     }
940
941     // RICsubscription
942     if (asnRicSubscriptionRequest->protocolIEs.list.count > 2 &&
943         asnRicSubscriptionRequest->protocolIEs.list.array[2]->id == ProtocolIE_ID_id_RICsubscription) {
944         pRICsubscriptionRequest_IEs = asnRicSubscriptionRequest->protocolIEs.list.array[2];
945
946         // Unpack EventTriggerDefinition
947         RICeventTriggerDefinition_t* pRICeventTriggerDefinition =
948           (RICeventTriggerDefinition_t*)&pRICsubscriptionRequest_IEs->value.choice.RICsubscription.ricEventTriggerDefinition;
949         pRICSubscriptionRequest->ricSubscription.ricEventTriggerDefinition.octetString.contentLength = pRICeventTriggerDefinition->size;
950         memcpy(pRICSubscriptionRequest->ricSubscription.ricEventTriggerDefinition.octetString.data, pRICeventTriggerDefinition->buf, pRICeventTriggerDefinition->size); //octetstring
951
952         uint64_t returnCode;
953         if ((returnCode = getRICEventTriggerDefinitionData(&pRICSubscriptionRequest->ricSubscription.ricEventTriggerDefinition) != e2err_OK)) {
954             ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
955             return returnCode;
956         }
957
958         // RICactions-ToBeSetup-List
959         RICaction_ToBeSetup_ItemIEs_t* pRICaction_ToBeSetup_ItemIEs;
960         uint64_t index = 0;
961         while (index < pRICsubscriptionRequest_IEs->value.choice.RICsubscription.ricAction_ToBeSetup_List.list.count)
962         {
963             pRICaction_ToBeSetup_ItemIEs = (RICaction_ToBeSetup_ItemIEs_t*)pRICsubscriptionRequest_IEs->value.choice.RICsubscription.ricAction_ToBeSetup_List.list.array[index];
964
965             // RICActionID
966             pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionID =
967               pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricActionID;
968
969             // RICActionType
970             pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionType =
971               pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricActionType;
972
973             // RICactionDefinition, OPTIONAL
974             if (pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition)
975             {
976                 pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionDefinitionPresent = false;
977                 // not used in RIC
978             }
979             else
980                 pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricActionDefinitionPresent = false;
981
982             // RICsubsequentAction, OPTIONAL
983             RICsubsequentAction_t* pRICsubsequentAction;
984             if (pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricSubsequentAction)
985             {
986                 pRICsubsequentAction = pRICaction_ToBeSetup_ItemIEs->value.choice.RICaction_ToBeSetup_Item.ricSubsequentAction;
987                 pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricSubsequentActionPresent = true;
988                 pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricSubsequentAction.ricSubsequentActionType =
989                   pRICsubsequentAction->ricSubsequentActionType;
990                 pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricSubsequentAction.ricTimeToWait =
991                   pRICsubsequentAction->ricTimeToWait;
992             }
993             else
994                 pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.ricActionToBeSetupItem[index].ricSubsequentActionPresent = false;
995             index++;
996         }
997         pRICSubscriptionRequest->ricSubscription.ricActionToBeSetupItemIEs.contentLength = index;
998     }
999     else {
1000         ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1001         return e2err_RICsubscriptionRequestICsubscriptionMissing;
1002     }
1003
1004     ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1005     return e2err_OK;
1006 }
1007
1008 //////////////////////////////////////////////////////////////////////
1009 uint64_t getRICEventTriggerDefinitionData(RICEventTriggerDefinition_t* pRICEventTriggerDefinition) {
1010
1011     E2SM_gNB_X2_eventTriggerDefinition_t* pE2SM_gNB_X2_eventTriggerDefinition = 0;
1012     asn_dec_rval_t rval;
1013     rval = asn_decode(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2SM_gNB_X2_eventTriggerDefinition, (void **)&pE2SM_gNB_X2_eventTriggerDefinition,
1014                       pRICEventTriggerDefinition->octetString.data, pRICEventTriggerDefinition->octetString.contentLength);
1015     switch(rval.code) {
1016     case RC_OK:
1017         // Debug print
1018         if (debug) {
1019             printf("Successfully decoded E2SM_gNB_X2_eventTriggerDefinition");
1020             asn_fprint(stdout, &asn_DEF_E2SM_gNB_X2_eventTriggerDefinition, pE2SM_gNB_X2_eventTriggerDefinition);
1021         }
1022
1023         // InterfaceID, GlobalENB-ID or GlobalGNB-ID
1024         if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.present == Interface_ID_PR_global_eNB_ID) {
1025
1026             // GlobalENB-ID
1027             pRICEventTriggerDefinition->interfaceID.globalENBIDPresent = true;
1028
1029             // PLMN-Identity
1030             pRICEventTriggerDefinition->interfaceID.globalENBID.pLMNIdentity.contentLength =
1031               pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.pLMN_Identity.size;
1032             memcpy(pRICEventTriggerDefinition->interfaceID.globalENBID.pLMNIdentity.pLMNIdentityVal,
1033               pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.pLMN_Identity.buf,
1034               pRICEventTriggerDefinition->interfaceID.globalENBID.pLMNIdentity.contentLength);
1035
1036             //  ENB-ID
1037             IdOctects_t eNBOctects;
1038             memset(eNBOctects.octets, 0, sizeof(eNBOctects));
1039             if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.present == ENB_ID_PR_macro_eNB_ID) {
1040                 // BIT STRING (SIZE (20)
1041                 pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.bits = cMacroENBIDP_20Bits;
1042                 memcpy(eNBOctects.octets,pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.macro_eNB_ID.buf,
1043                   pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.macro_eNB_ID.size);
1044                 pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.nodeID = eNBOctects.nodeID;
1045             }
1046             else if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.present == ENB_ID_PR_home_eNB_ID) {
1047                 // BIT STRING (SIZE (28)
1048                 pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.bits = cHomeENBID_28Bits;
1049                 memcpy(eNBOctects.octets,pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.home_eNB_ID.buf,
1050                   pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.home_eNB_ID.size);
1051                 pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.nodeID = eNBOctects.nodeID;
1052             }
1053             else if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.present == ENB_ID_PR_short_Macro_eNB_ID) {
1054                 // BIT STRING (SIZE(18)
1055                 pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.bits = cShortMacroENBID_18Bits;
1056                 memcpy(eNBOctects.octets,pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.short_Macro_eNB_ID.buf,
1057                   pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.short_Macro_eNB_ID.size);
1058                 pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.nodeID = eNBOctects.nodeID;
1059             }
1060             else if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.present == ENB_ID_PR_long_Macro_eNB_ID) {
1061                 // BIT STRING (SIZE(21)
1062                 pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.bits =  clongMacroENBIDP_21Bits;
1063                 memcpy(eNBOctects.octets,pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.long_Macro_eNB_ID.buf,
1064                   pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.eNB_ID.choice.long_Macro_eNB_ID.size);
1065                 pRICEventTriggerDefinition->interfaceID.globalENBID.nodeID.nodeID = eNBOctects.nodeID;
1066             }
1067             else {
1068                 pRICEventTriggerDefinition->interfaceID.globalENBIDPresent = false;
1069                 pRICEventTriggerDefinition->interfaceID.globalGNBIDPresent = false;
1070                 ASN_STRUCT_FREE(asn_DEF_E2SM_gNB_X2_eventTriggerDefinition, pE2SM_gNB_X2_eventTriggerDefinition);
1071                 return e2err_RICEventTriggerDefinitionIEValueFail_5;
1072             }
1073         }
1074         else if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.present == Interface_ID_PR_global_gNB_ID) {
1075             // GlobalGNB-ID
1076             pRICEventTriggerDefinition->interfaceID.globalGNBIDPresent = true;
1077
1078             // PLMN-Identity
1079             pRICEventTriggerDefinition->interfaceID.globalGNBID.pLMNIdentity.contentLength =
1080               pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.pLMN_Identity.size;
1081             memcpy(pRICEventTriggerDefinition->interfaceID.globalGNBID.pLMNIdentity.pLMNIdentityVal,
1082               pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_eNB_ID.pLMN_Identity.buf,
1083               pRICEventTriggerDefinition->interfaceID.globalGNBID.pLMNIdentity.contentLength);
1084
1085             // GNB-ID
1086             IdOctects_t gNBOctects;
1087             memset(gNBOctects.octets, 0, sizeof(gNBOctects));
1088             if (pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_gNB_ID.gNB_ID.present == GNB_ID_PR_gNB_ID) {
1089                 pRICEventTriggerDefinition->interfaceID.globalGNBID.nodeID.bits = pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_gNB_ID.gNB_ID.choice.gNB_ID.size;
1090                 memcpy(gNBOctects.octets, pE2SM_gNB_X2_eventTriggerDefinition->interface_ID.choice.global_gNB_ID.gNB_ID.choice.gNB_ID.buf,
1091                    pRICEventTriggerDefinition->interfaceID.globalGNBID.nodeID.bits);
1092                 pRICEventTriggerDefinition->interfaceID.globalGNBID.nodeID.nodeID = gNBOctects.nodeID;
1093             }
1094             else {
1095                 pRICEventTriggerDefinition->interfaceID.globalENBIDPresent = false;
1096                 pRICEventTriggerDefinition->interfaceID.globalGNBIDPresent = false;
1097                 ASN_STRUCT_FREE(asn_DEF_E2SM_gNB_X2_eventTriggerDefinition, pE2SM_gNB_X2_eventTriggerDefinition);
1098                 return e2err_RICEventTriggerDefinitionIEValueFail_6;
1099             }
1100         }
1101         else {
1102             pRICEventTriggerDefinition->interfaceID.globalENBIDPresent = false;
1103             pRICEventTriggerDefinition->interfaceID.globalGNBIDPresent = false;
1104             ASN_STRUCT_FREE(asn_DEF_E2SM_gNB_X2_eventTriggerDefinition, pE2SM_gNB_X2_eventTriggerDefinition);
1105             return e2err_RICEventTriggerDefinitionIEValueFail_7;
1106         }
1107
1108         // InterfaceDirection
1109         pRICEventTriggerDefinition->interfaceDirection = pE2SM_gNB_X2_eventTriggerDefinition->interfaceDirection;
1110
1111         // InterfaceMessageType
1112         pRICEventTriggerDefinition->interfaceMessageType.procedureCode = pE2SM_gNB_X2_eventTriggerDefinition->interfaceMessageType.procedureCode;
1113
1114         if (pE2SM_gNB_X2_eventTriggerDefinition->interfaceMessageType.typeOfMessage == TypeOfMessage_initiating_message)
1115             pRICEventTriggerDefinition->interfaceMessageType.typeOfMessage = cE2InitiatingMessage;
1116         else if (pE2SM_gNB_X2_eventTriggerDefinition->interfaceMessageType.typeOfMessage == TypeOfMessage_successful_outcome)
1117             pRICEventTriggerDefinition->interfaceMessageType.typeOfMessage = cE2SuccessfulOutcome;
1118         else if (pE2SM_gNB_X2_eventTriggerDefinition->interfaceMessageType.typeOfMessage == TypeOfMessage_unsuccessful_outcome)
1119             pRICEventTriggerDefinition->interfaceMessageType.typeOfMessage = cE2UnsuccessfulOutcome;
1120         else {
1121             ASN_STRUCT_FREE(asn_DEF_E2SM_gNB_X2_eventTriggerDefinition, pE2SM_gNB_X2_eventTriggerDefinition);
1122             return e2err_RICEventTriggerDefinitionIEValueFail_8;
1123         }
1124
1125         ASN_STRUCT_FREE(asn_DEF_E2SM_gNB_X2_eventTriggerDefinition, pE2SM_gNB_X2_eventTriggerDefinition);
1126         return e2err_OK;
1127     case RC_WMORE:
1128         if (debug)
1129             printf("Decode failed. More data needed. Buffer size %zu, %s, consumed %zu",pRICEventTriggerDefinition->octetString.contentLength,
1130                    asn_DEF_E2SM_gNB_X2_eventTriggerDefinition.name, rval.consumed);
1131
1132         return e2err_RICEventTriggerDefinitionDecodeWMOREFail;
1133     case RC_FAIL:
1134         if (debug)
1135             printf("Decode failed. Buffer size %zu, %s, consumed %zu",pRICEventTriggerDefinition->octetString.contentLength,
1136                    asn_DEF_E2SM_gNB_X2_eventTriggerDefinition.name, rval.consumed);
1137
1138         return e2err_RICEventTriggerDefinitionDecodeFAIL;
1139     default:
1140         return e2err_RICEventTriggerDefinitionDecodeDefaultFail;
1141     }
1142 }
1143
1144 //////////////////////////////////////////////////////////////////////
1145 uint64_t getRICSubscriptionResponseData(e2ap_pdu_ptr_t* pE2AP_PDU_pointer, RICSubscriptionResponse_t* pRICSubscriptionResponse) {
1146
1147     E2AP_PDU_t* pE2AP_PDU = (E2AP_PDU_t*)pE2AP_PDU_pointer;
1148
1149     RICsubscriptionResponse_t *asnRicSubscriptionResponse = &pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionResponse;
1150     RICsubscriptionResponse_IEs_t* pRICsubscriptionResponse_IEs;
1151
1152     // RICrequestID
1153     if (asnRicSubscriptionResponse->protocolIEs.list.count > 0 &&
1154         asnRicSubscriptionResponse->protocolIEs.list.array[0]->id == ProtocolIE_ID_id_RICrequestID) {
1155         pRICsubscriptionResponse_IEs = asnRicSubscriptionResponse->protocolIEs.list.array[0];
1156         pRICSubscriptionResponse->ricRequestID.ricRequestorID = pRICsubscriptionResponse_IEs->value.choice.RICrequestID.ricRequestorID;
1157         pRICSubscriptionResponse->ricRequestID.ricRequestSequenceNumber = pRICsubscriptionResponse_IEs->value.choice.RICrequestID.ricRequestSequenceNumber;
1158     }
1159     else {
1160         ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1161         return e2err_RICsubscriptionResponseRICrequestIDMissing;
1162     }
1163
1164     // RANfunctionID
1165     if (asnRicSubscriptionResponse->protocolIEs.list.count > 1 &&
1166         asnRicSubscriptionResponse->protocolIEs.list.array[1]->id == ProtocolIE_ID_id_RANfunctionID) {
1167         pRICsubscriptionResponse_IEs = asnRicSubscriptionResponse->protocolIEs.list.array[1];
1168         pRICSubscriptionResponse->ranFunctionID = pRICsubscriptionResponse_IEs->value.choice.RANfunctionID;
1169     }
1170     else {
1171         ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1172         return e2err_RICsubscriptionResponseRANfunctionIDMissing;
1173     }
1174
1175     // RICaction-Admitted-List
1176     if (asnRicSubscriptionResponse->protocolIEs.list.count > 2  &&
1177         asnRicSubscriptionResponse->protocolIEs.list.array[2]->id == ProtocolIE_ID_id_RICactions_Admitted) {
1178         pRICsubscriptionResponse_IEs = asnRicSubscriptionResponse->protocolIEs.list.array[2];
1179         pRICSubscriptionResponse->ricActionAdmittedList.contentLength = 0;
1180         uint64_t index = 0;
1181         while ((index < maxofRICactionID) && (index < pRICsubscriptionResponse_IEs->value.choice.RICaction_Admitted_List.list.count)) {
1182             RICaction_Admitted_ItemIEs_t* pRICaction_Admitted_ItemIEs =
1183               (RICaction_Admitted_ItemIEs_t*)pRICsubscriptionResponse_IEs->value.choice.RICaction_Admitted_List.list.array[index];
1184
1185             // RICActionID
1186             pRICSubscriptionResponse->ricActionAdmittedList.ricActionID[index] =
1187               pRICaction_Admitted_ItemIEs->value.choice.RICaction_Admitted_Item.ricActionID;
1188             index++;
1189         }
1190         pRICSubscriptionResponse->ricActionAdmittedList.contentLength = index;
1191     }
1192     else {
1193         ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1194         return e2err_RICsubscriptionResponseRICaction_Admitted_ListMissing;
1195     }
1196
1197     // RICaction-NotAdmitted-List, OPTIONAL
1198     if (asnRicSubscriptionResponse->protocolIEs.list.count > 3 &&
1199         asnRicSubscriptionResponse->protocolIEs.list.array[3]->id == ProtocolIE_ID_id_RICactions_NotAdmitted) {
1200         pRICsubscriptionResponse_IEs = asnRicSubscriptionResponse->protocolIEs.list.array[3];
1201         if (pRICsubscriptionResponse_IEs->value.present == RICsubscriptionResponse_IEs__value_PR_RICaction_NotAdmitted_List) {
1202             pRICSubscriptionResponse->ricActionNotAdmittedListPresent = true;
1203             pRICSubscriptionResponse->ricActionNotAdmittedList.contentLength = 0;
1204             uint64_t index = 0;
1205             while ((index < maxofRICactionID) && (index < pRICsubscriptionResponse_IEs->value.choice.RICaction_NotAdmitted_List.list.count)) {
1206                 RICaction_NotAdmitted_ItemIEs_t* pRICaction_NotAdmitted_ItemIEs =
1207                   (RICaction_NotAdmitted_ItemIEs_t*)pRICsubscriptionResponse_IEs->value.choice.RICaction_NotAdmitted_List.list.array[index];
1208
1209                 // RICActionID
1210                 pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricActionID =
1211                   pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricActionID;
1212
1213                 //  RICcause
1214                 if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present == RICcause_PR_radioNetwork) {
1215                     pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content = RICcause_PR_radioNetwork;
1216                     pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause =
1217                       pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.radioNetwork;
1218                 }
1219                 else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present == RICcause_PR_transport) {
1220                     pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content = RICcause_PR_transport;
1221                     pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause =
1222                       pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.transport;
1223                 }
1224                 else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present == RICcause_PR_protocol) {
1225                     pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content = RICcause_PR_protocol;
1226                     pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause =
1227                       pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.protocol;
1228                 }
1229                 else if(pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present == RICcause_PR_misc) {
1230                     pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content = RICcause_PR_misc;
1231                     pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause =
1232                       pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.misc;
1233                 }
1234                 else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present == RICcause_PR_ric) {
1235                     pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content = RICcause_PR_ric;
1236                     pRICSubscriptionResponse->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause =
1237                       pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.ric;
1238                 }
1239                index++;
1240             }
1241             pRICSubscriptionResponse->ricActionNotAdmittedList.contentLength = index;
1242         }
1243     }
1244     else {
1245         pRICSubscriptionResponse->ricActionNotAdmittedListPresent = false;
1246         pRICSubscriptionResponse->ricActionNotAdmittedList.contentLength = 0;
1247     }
1248
1249     ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1250     return e2err_OK;
1251 }
1252
1253 //////////////////////////////////////////////////////////////////////
1254 uint64_t getRICSubscriptionFailureData(e2ap_pdu_ptr_t* pE2AP_PDU_pointer, RICSubscriptionFailure_t* pRICSubscriptionFailure) {
1255
1256     E2AP_PDU_t* pE2AP_PDU = (E2AP_PDU_t*)pE2AP_PDU_pointer;
1257
1258     RICsubscriptionFailure_t *asnRicSubscriptionFailure = &pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionFailure;
1259     RICsubscriptionFailure_IEs_t* pRICsubscriptionFailure_IEs;
1260
1261     // RICrequestID
1262     RICsubscriptionFailure_IEs_t* RICsubscriptionFailure_IEs_t;
1263     if (asnRicSubscriptionFailure->protocolIEs.list.count > 0 &&
1264         asnRicSubscriptionFailure->protocolIEs.list.array[0]->id == ProtocolIE_ID_id_RICrequestID) {
1265         pRICsubscriptionFailure_IEs = asnRicSubscriptionFailure->protocolIEs.list.array[0];
1266         pRICSubscriptionFailure->ricRequestID.ricRequestorID = pRICsubscriptionFailure_IEs->value.choice.RICrequestID.ricRequestorID;
1267         pRICSubscriptionFailure->ricRequestID.ricRequestSequenceNumber = pRICsubscriptionFailure_IEs->value.choice.RICrequestID.ricRequestSequenceNumber;
1268     }
1269     else {
1270         ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1271         return e2err_RICsubscriptionFailureRICrequestIDMissing;
1272     }
1273
1274     // RANfunctionID
1275     if (asnRicSubscriptionFailure->protocolIEs.list.count > 1 &&
1276         asnRicSubscriptionFailure->protocolIEs.list.array[1]->id == ProtocolIE_ID_id_RANfunctionID) {
1277         pRICsubscriptionFailure_IEs = asnRicSubscriptionFailure->protocolIEs.list.array[1];
1278         pRICSubscriptionFailure->ranFunctionID = pRICsubscriptionFailure_IEs->value.choice.RANfunctionID;
1279     }
1280     else {
1281         ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1282         return e2err_RICsubscriptionFailureRANfunctionIDMissing;
1283     }
1284
1285     // RICaction-NotAdmitted-List
1286     if (asnRicSubscriptionFailure->protocolIEs.list.count > 2 &&
1287         asnRicSubscriptionFailure->protocolIEs.list.array[2]->id == ProtocolIE_ID_id_RICactions_NotAdmitted) {
1288         pRICsubscriptionFailure_IEs = asnRicSubscriptionFailure->protocolIEs.list.array[2];
1289         uint64_t index = 0;
1290         while ((index < maxofRICactionID) && (index < pRICsubscriptionFailure_IEs->value.choice.RICaction_NotAdmitted_List.list.count)) {
1291             RICaction_NotAdmitted_ItemIEs_t* pRICaction_NotAdmitted_ItemIEs =
1292               (RICaction_NotAdmitted_ItemIEs_t*)pRICsubscriptionFailure_IEs->value.choice.RICaction_NotAdmitted_List.list.array[index];
1293
1294             // RICActionID
1295             pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricActionID =
1296               pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricActionID;
1297
1298             //  RICcause
1299             if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present == RICcause_PR_radioNetwork) {
1300                 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content = RICcause_PR_radioNetwork;
1301                 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause =
1302                   pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.radioNetwork;
1303             }
1304             else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present == RICcause_PR_transport) {
1305                 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content = RICcause_PR_transport;
1306                 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause =
1307                   pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.transport;
1308             }
1309             else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present == RICcause_PR_protocol) {
1310                 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content = RICcause_PR_protocol;
1311                 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause =
1312                   pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.protocol;
1313             }
1314             else if(pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present == RICcause_PR_misc) {
1315                 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content = RICcause_PR_misc;
1316                 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause =
1317                   pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.misc;
1318             }
1319             else if (pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.present == RICcause_PR_ric) {
1320                 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.content = RICcause_PR_ric;
1321                 pRICSubscriptionFailure->ricActionNotAdmittedList.RICActionNotAdmittedItem[index].ricCause.cause =
1322                   pRICaction_NotAdmitted_ItemIEs->value.choice.RICaction_NotAdmitted_Item.ricCause.choice.ric;
1323             }
1324             index++;
1325         }
1326         pRICSubscriptionFailure->ricActionNotAdmittedList.contentLength = index;
1327
1328         // CriticalityDiagnostics. OPTIONAL
1329
1330     }
1331     else {
1332         ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1333         return e2err_RICsubscriptionFailureRICaction_NotAdmitted_ListMissing;
1334     }
1335
1336     ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1337     return e2err_OK;
1338 }
1339
1340 //////////////////////////////////////////////////////////////////////
1341 uint64_t getRICSubscriptionDeleteRequestData(e2ap_pdu_ptr_t* pE2AP_PDU_pointer, RICSubscriptionDeleteRequest_t* pRICSubscriptionDeleteRequest) {
1342
1343     E2AP_PDU_t* pE2AP_PDU = (E2AP_PDU_t*)pE2AP_PDU_pointer;
1344
1345     RICsubscriptionDeleteRequest_t *asnRicSubscriptionDeleteRequest = &pE2AP_PDU->choice.initiatingMessage.value.choice.RICsubscriptionDeleteRequest;
1346     RICsubscriptionDeleteRequest_IEs_t* pRICsubscriptionDeleteRequest_IEs;
1347
1348     // RICrequestID
1349     if (asnRicSubscriptionDeleteRequest->protocolIEs.list.count > 0 &&
1350         asnRicSubscriptionDeleteRequest->protocolIEs.list.array[0]->id == ProtocolIE_ID_id_RICrequestID) {
1351         pRICsubscriptionDeleteRequest_IEs = asnRicSubscriptionDeleteRequest->protocolIEs.list.array[0];
1352         pRICSubscriptionDeleteRequest->ricRequestID.ricRequestorID = pRICsubscriptionDeleteRequest_IEs->value.choice.RICrequestID.ricRequestorID;
1353         pRICSubscriptionDeleteRequest->ricRequestID.ricRequestSequenceNumber = pRICsubscriptionDeleteRequest_IEs->value.choice.RICrequestID.ricRequestSequenceNumber;
1354     }
1355     else {
1356         ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1357         return e2err_RICsubscriptionDeleteRequestRICrequestIDMissing;
1358     }
1359
1360     // RANfunctionID
1361     if (asnRicSubscriptionDeleteRequest->protocolIEs.list.count > 1 &&
1362         asnRicSubscriptionDeleteRequest->protocolIEs.list.array[1]->id == ProtocolIE_ID_id_RANfunctionID) {
1363         pRICsubscriptionDeleteRequest_IEs = asnRicSubscriptionDeleteRequest->protocolIEs.list.array[1];
1364         pRICSubscriptionDeleteRequest->ranFunctionID = pRICsubscriptionDeleteRequest_IEs->value.choice.RANfunctionID;
1365     }
1366     else {
1367         ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1368         return e2err_RICsubscriptionDeleteRequestRANfunctionIDMissing;
1369     }
1370
1371     ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1372     return e2err_OK;
1373 }
1374
1375 //////////////////////////////////////////////////////////////////////
1376 uint64_t getRICSubscriptionDeleteResponseData(e2ap_pdu_ptr_t* pE2AP_PDU_pointer, RICSubscriptionDeleteResponse_t* pRICSubscriptionDeleteResponse) {
1377
1378     E2AP_PDU_t* pE2AP_PDU = (E2AP_PDU_t*)pE2AP_PDU_pointer;
1379
1380     RICsubscriptionDeleteResponse_t *asnRicSubscriptionDeleteResponse = &pE2AP_PDU->choice.successfulOutcome.value.choice.RICsubscriptionDeleteResponse;
1381     RICsubscriptionDeleteResponse_IEs_t* pRICsubscriptionDeleteResponse_IEs;
1382
1383     // RICrequestID
1384     if (asnRicSubscriptionDeleteResponse->protocolIEs.list.count > 0 &&
1385         asnRicSubscriptionDeleteResponse->protocolIEs.list.array[0]->id == ProtocolIE_ID_id_RICrequestID) {
1386         pRICsubscriptionDeleteResponse_IEs = asnRicSubscriptionDeleteResponse->protocolIEs.list.array[0];
1387         pRICSubscriptionDeleteResponse->ricRequestID.ricRequestorID = pRICsubscriptionDeleteResponse_IEs->value.choice.RICrequestID.ricRequestorID;
1388         pRICSubscriptionDeleteResponse->ricRequestID.ricRequestSequenceNumber = pRICsubscriptionDeleteResponse_IEs->value.choice.RICrequestID.ricRequestSequenceNumber;
1389     }
1390     else {
1391         ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1392         return e2err_RICsubscriptionDeleteResponseRICrequestIDMissing;
1393     }
1394
1395     // RANfunctionID
1396     if (asnRicSubscriptionDeleteResponse->protocolIEs.list.count > 1 &&
1397         asnRicSubscriptionDeleteResponse->protocolIEs.list.array[1]->id == ProtocolIE_ID_id_RANfunctionID) {
1398         pRICsubscriptionDeleteResponse_IEs = asnRicSubscriptionDeleteResponse->protocolIEs.list.array[1];
1399         pRICSubscriptionDeleteResponse->ranFunctionID = pRICsubscriptionDeleteResponse_IEs->value.choice.RANfunctionID;
1400     }
1401     else {
1402         ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1403         return e2err_RICsubscriptionDeleteResponseRANfunctionIDMissing;
1404     }
1405
1406     ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1407     return e2err_OK;
1408 }
1409
1410 //////////////////////////////////////////////////////////////////////
1411 uint64_t getRICSubscriptionDeleteFailureData(e2ap_pdu_ptr_t* pE2AP_PDU_pointer, RICSubscriptionDeleteFailure_t* pRICSubscriptionDeleteFailure) {
1412
1413     E2AP_PDU_t* pE2AP_PDU = (E2AP_PDU_t*)pE2AP_PDU_pointer;
1414
1415     RICsubscriptionDeleteFailure_t *asnRicSubscriptionDeleteFailure = &pE2AP_PDU->choice.unsuccessfulOutcome.value.choice.RICsubscriptionDeleteFailure;
1416     RICsubscriptionDeleteFailure_IEs_t* pRICsubscriptionDeleteFailure_IEs;
1417
1418     // RICrequestID
1419     if (asnRicSubscriptionDeleteFailure->protocolIEs.list.count > 0 &&
1420         asnRicSubscriptionDeleteFailure->protocolIEs.list.array[0]->id == ProtocolIE_ID_id_RICrequestID) {
1421         pRICsubscriptionDeleteFailure_IEs = asnRicSubscriptionDeleteFailure->protocolIEs.list.array[0];
1422         pRICSubscriptionDeleteFailure->ricRequestID.ricRequestorID = pRICsubscriptionDeleteFailure_IEs->value.choice.RICrequestID.ricRequestorID;
1423         pRICSubscriptionDeleteFailure->ricRequestID.ricRequestSequenceNumber = pRICsubscriptionDeleteFailure_IEs->value.choice.RICrequestID.ricRequestSequenceNumber;
1424     }
1425     else {
1426         ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1427         return e2err_RICsubscriptionDeleteFailureRICrequestIDMissing;
1428     }
1429
1430     // RANfunctionID
1431     if (asnRicSubscriptionDeleteFailure->protocolIEs.list.count > 1 &&
1432         asnRicSubscriptionDeleteFailure->protocolIEs.list.array[1]->id == ProtocolIE_ID_id_RANfunctionID) {
1433         pRICsubscriptionDeleteFailure_IEs = asnRicSubscriptionDeleteFailure->protocolIEs.list.array[1];
1434         pRICSubscriptionDeleteFailure->ranFunctionID = pRICsubscriptionDeleteFailure_IEs->value.choice.RANfunctionID;
1435     }
1436     else {
1437         ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1438         return e2err_RICsubscriptionDeleteFailureRANfunctionIDMissing;
1439     }
1440
1441     // RICcause
1442     if (asnRicSubscriptionDeleteFailure->protocolIEs.list.count > 2 &&
1443         asnRicSubscriptionDeleteFailure->protocolIEs.list.array[2]->id == ProtocolIE_ID_id_RICcause) {
1444         pRICsubscriptionDeleteFailure_IEs = asnRicSubscriptionDeleteFailure->protocolIEs.list.array[2];
1445         if (pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.present == RICcause_PR_radioNetwork) {
1446             pRICSubscriptionDeleteFailure->ricCause.content = RICcause_PR_radioNetwork;
1447             pRICSubscriptionDeleteFailure->ricCause.cause =
1448               pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.choice.radioNetwork;
1449         }
1450         else if (pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.present == RICcause_PR_transport) {
1451             pRICSubscriptionDeleteFailure->ricCause.content = RICcause_PR_transport;
1452             pRICSubscriptionDeleteFailure->ricCause.cause =
1453               pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.choice.transport;
1454         }
1455         else if (pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.present == RICcause_PR_protocol) {
1456             pRICSubscriptionDeleteFailure->ricCause.content = RICcause_PR_protocol;
1457             pRICSubscriptionDeleteFailure->ricCause.cause =
1458               pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.choice.protocol;
1459         }
1460         else if(pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.present == RICcause_PR_misc) {
1461             pRICSubscriptionDeleteFailure->ricCause.content = RICcause_PR_misc;
1462             pRICSubscriptionDeleteFailure->ricCause.cause =
1463               pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.choice.misc;
1464         }
1465         else if (pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.present == RICcause_PR_ric) {
1466             pRICSubscriptionDeleteFailure->ricCause.content = RICcause_PR_ric;
1467             pRICSubscriptionDeleteFailure->ricCause.cause =
1468               pRICsubscriptionDeleteFailure_IEs->value.choice.RICcause.choice.ric;
1469         }
1470     }
1471     else {
1472         ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1473         return e2err_RICsubscriptionDeleteFailureRICcauseMissing;
1474     }
1475     // CriticalityDiagnostics, OPTIONAL
1476
1477     ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pE2AP_PDU);
1478     return e2err_OK;
1479 }