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