ASN compiled code for E2AP v1.1
[sim/e2-interface.git] / e2sim / src / encoding / encode_e2apv1.cpp
1
2
3 /*****************************************************************************
4 #                                                                            *
5 # Copyright 2020 AT&T Intellectual Property                                  *
6 # Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved.      *
7 #                                                                            *
8 # Licensed under the Apache License, Version 2.0 (the "License");            *
9 # you may not use this file except in compliance with the License.           *
10 # You may obtain a copy of the License at                                    *
11 #                                                                            *
12 #      http://www.apache.org/licenses/LICENSE-2.0                            *
13 #                                                                            *
14 # Unless required by applicable law or agreed to in writing, software        *
15 # distributed under the License is distributed on an "AS IS" BASIS,          *
16 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   *
17 # See the License for the specific language governing permissions and        *
18 # limitations under the License.                                             *
19 #                                                                            *
20 ******************************************************************************/
21
22 #include <stdio.h>
23 #include <string.h>
24 #include <iostream>
25 #include <unistd.h>
26
27 #include <iterator>
28 #include <vector>
29
30
31 #include "encode_e2apv1.hpp"
32
33 extern "C" {
34
35
36 #include "e2ap_asn1c_codec.h"
37 #include "GlobalE2node-ID.h"
38 #include "GlobalE2node-gNB-ID.h"
39 #include "GlobalgNB-ID.h"
40 #include "OCTET_STRING.h"
41 #include "asn_application.h"
42 #include "GNB-ID-Choice.h"
43 #include "ProtocolIE-Field.h"
44 #include "E2setupRequest.h"
45 #include "RICaction-ToBeSetup-Item.h"
46 #include "RICactions-ToBeSetup-List.h"
47 #include "RICeventTriggerDefinition.h"
48 #include "RICsubscriptionRequest.h"
49 #include "RICsubscriptionResponse.h"
50 #include "ProtocolIE-SingleContainer.h"
51 #include "RANfunctions-List.h"
52 #include "RICindication.h"
53 #include "RICsubsequentActionType.h"
54 #include "RICsubsequentAction.h"  
55 #include "RICtimeToWait.h"
56   
57 }
58
59 long encoding::get_function_id_from_subscription(E2AP_PDU_t *e2ap_pdu) {
60
61   RICsubscriptionRequest_t orig_req =
62     e2ap_pdu->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
63   RICsubscriptionResponse_IEs_t *ricreqid =
64     (RICsubscriptionResponse_IEs_t*)calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
65                                            
66   int count = orig_req.protocolIEs.list.count;
67   int size = orig_req.protocolIEs.list.size;
68   
69   RICsubscriptionRequest_IEs_t **ies = (RICsubscriptionRequest_IEs_t**)orig_req.protocolIEs.list.array;
70
71   fprintf(stderr, "count%d\n", count);
72   fprintf(stderr, "size%d\n", size);
73
74   RICsubscriptionRequest_IEs__value_PR pres;
75
76   long func_id;
77
78   for (int i=0; i < count; i++) {
79     RICsubscriptionRequest_IEs_t *next_ie = ies[i];
80     pres = next_ie->value.present;
81     
82     fprintf(stderr, "next present value %d\n", pres);
83     fprintf(stderr, "value of pres ranfuncid is %d\n", RICsubscriptionRequest_IEs__value_PR_RANfunctionID);
84
85     if (pres == RICsubscriptionRequest_IEs__value_PR_RANfunctionID) {
86       fprintf(stderr, "equal pres to ranfuncid\n");
87       func_id = next_ie->value.choice.RANfunctionID;
88     }
89     
90   }
91
92   fprintf(stderr, "After loop, func_id is %d\n", func_id);
93
94   return func_id;  
95
96 }
97
98 void encoding::generate_e2apv1_service_update(E2AP_PDU_t *e2ap_pdu, std::vector<encoding::ran_func_info> all_funcs) {
99   char* ran_function_op_type = getenv("RAN_FUNCTION_OP_TYPE");
100   LOG_D("Ran funciton : %s", ran_function_op_type);
101   ProtocolIE_ID_t prID;
102   if (ran_function_op_type != NULL)
103   {
104     if (strcmp(ran_function_op_type, "ADD") == 0)
105     {
106       prID = ProtocolIE_ID_id_RANfunctionsAdded;
107     }
108     else if (strcmp(ran_function_op_type, "DELETE"))
109     {
110       prID = ProtocolIE_ID_id_RANfunctionsDeleted;
111     }
112   }
113   else
114   {
115     prID = ProtocolIE_ID_id_RANfunctionsModified;
116   }
117
118
119   RICserviceUpdate_IEs_t *e2serviceUpdateList = (RICserviceUpdate_IEs_t *)calloc(1, sizeof(RICserviceUpdate_IEs_t));
120   e2serviceUpdateList->id = prID;
121   e2serviceUpdateList->criticality = Criticality_reject;
122   e2serviceUpdateList->value.present = RICserviceUpdate_IEs__value_PR_RANfunctions_List;
123
124
125   for (int i=0; i<all_funcs.size(); i++) {
126
127     encoding::ran_func_info nextRanFunc = all_funcs.at(i);
128     long nextRanFuncId = nextRanFunc.ranFunctionId;
129     OCTET_STRING_t *nextRanFuncDesc = nextRanFunc.ranFunctionDesc;
130     long nextRanFuncRev = nextRanFunc.ranFunctionRev;
131
132     auto *itemIes = (RANfunction_ItemIEs_t *)calloc(1, sizeof(RANfunction_ItemIEs_t));
133     itemIes->id = ProtocolIE_ID_id_RANfunction_Item;
134     itemIes->criticality = Criticality_reject;
135     itemIes->value.present = RANfunction_ItemIEs__value_PR_RANfunction_Item;
136     itemIes->value.choice.RANfunction_Item.ranFunctionID = 1;
137
138     itemIes->value.choice.RANfunction_Item.ranFunctionDefinition = *nextRanFuncDesc;
139     itemIes->value.choice.RANfunction_Item.ranFunctionRevision = nextRanFuncRev + 1;
140
141     ASN_SEQUENCE_ADD(&e2serviceUpdateList->value.choice.RANfunctions_List.list, itemIes);
142   }
143
144   RICserviceUpdate_t *ricServiceUpdate = (RICserviceUpdate_t *)calloc(1, sizeof(RICserviceUpdate_t));
145   ASN_SEQUENCE_ADD(&ricServiceUpdate->protocolIEs.list, e2serviceUpdateList);
146
147   InitiatingMessage_t *initiatingMessage = (InitiatingMessage_t *)calloc(1, sizeof(InitiatingMessage_t));
148   initiatingMessage->criticality = Criticality_reject;
149   initiatingMessage->procedureCode = ProcedureCode_id_RICserviceUpdate;
150   initiatingMessage->value.present = InitiatingMessage__value_PR_RICserviceUpdate;
151   initiatingMessage->value.choice.RICserviceUpdate = *ricServiceUpdate;
152
153   E2AP_PDU_PR pres6 = E2AP_PDU_PR_initiatingMessage;
154   e2ap_pdu->present = pres6;
155   e2ap_pdu->choice.initiatingMessage = initiatingMessage;
156 }
157
158 void encoding::generate_e2apv1_setup_request_parameterized(E2AP_PDU_t *e2ap_pdu, std::vector<ran_func_info> all_funcs) {
159   //                                             long ranFunctionId, uint8_t *ranFuncDescEncoded, int ranFuncLength) {
160
161   //  uint8_t *buf = (uint8_t *)"gnb1"
162
163   BIT_STRING_t *gnb_bstring = (BIT_STRING_t*)calloc(1, sizeof(BIT_STRING_t));;
164   gnb_bstring->buf = (uint8_t*)calloc(1,4);
165   gnb_bstring->size = 4;
166   gnb_bstring->buf[0] = 0xB5;
167   gnb_bstring->buf[1] = 0xC6;
168   gnb_bstring->buf[2] = 0x77;
169   gnb_bstring->buf[3] = 0x88;
170
171   gnb_bstring->bits_unused = 3;
172
173   uint8_t *buf2 = (uint8_t *)"747";
174   OCTET_STRING_t *plmn = (OCTET_STRING_t*)calloc(1, sizeof(OCTET_STRING_t));
175   plmn->buf = (uint8_t*)calloc(1,3);
176   memcpy(plmn->buf, buf2, 3);
177   plmn->size = 3;
178
179   GNB_ID_Choice_t *gnbchoice = (GNB_ID_Choice_t*)calloc(1,sizeof(GNB_ID_Choice_t));
180   GNB_ID_Choice_PR pres2 = GNB_ID_Choice_PR_gnb_ID;
181   gnbchoice->present = pres2;
182   gnbchoice->choice.gnb_ID = *gnb_bstring;
183
184   GlobalgNB_ID_t *gnb = (GlobalgNB_ID_t*)calloc(1, sizeof(GlobalgNB_ID_t));
185   gnb->plmn_id = *plmn;
186   gnb->gnb_id = *gnbchoice;
187
188   GlobalE2node_gNB_ID_t *e2gnb = (GlobalE2node_gNB_ID_t*)calloc(1, sizeof(GlobalE2node_gNB_ID_t));
189   e2gnb->global_gNB_ID = *gnb;
190
191   GlobalE2node_ID_t *globale2nodeid = (GlobalE2node_ID_t*)calloc(1, sizeof(GlobalE2node_ID_t));
192   GlobalE2node_ID_PR pres;
193   pres = GlobalE2node_ID_PR_gNB;
194   globale2nodeid->present = pres;
195   globale2nodeid->choice.gNB = e2gnb;
196   
197   E2setupRequestIEs_t *e2setuprid = (E2setupRequestIEs_t*)calloc(1, sizeof(E2setupRequestIEs_t));
198   E2setupRequestIEs__value_PR pres3;
199   pres3 = E2setupRequestIEs__value_PR_GlobalE2node_ID;
200   e2setuprid->id = 3;
201   e2setuprid->criticality = 0;
202   e2setuprid->value.choice.GlobalE2node_ID = *globale2nodeid;
203   e2setuprid->value.present = pres3;
204
205
206   auto *ranFlistIEs = (E2setupRequestIEs_t *)calloc(1, sizeof(E2setupRequestIEs_t));
207   ASN_STRUCT_RESET(asn_DEF_E2setupRequestIEs, ranFlistIEs);
208   ranFlistIEs->criticality = 0;
209   ranFlistIEs->id = ProtocolIE_ID_id_RANfunctionsAdded;
210   ranFlistIEs->value.present = E2setupRequestIEs__value_PR_RANfunctions_List;
211
212
213   for (int i = 0; i < all_funcs.size(); i++) {
214
215     ran_func_info nextRanFunc = all_funcs.at(i);
216     long nextRanFuncId = nextRanFunc.ranFunctionId;
217     OCTET_STRING_t *nextRanFuncDesc = nextRanFunc.ranFunctionDesc;
218     long nextRanFuncRev = nextRanFunc.ranFunctionRev;
219
220     auto *itemIes = (RANfunction_ItemIEs_t *)calloc(1, sizeof(RANfunction_ItemIEs_t));
221     itemIes->id = ProtocolIE_ID_id_RANfunction_Item;
222     itemIes->criticality = Criticality_reject;
223     itemIes->value.present = RANfunction_ItemIEs__value_PR_RANfunction_Item;
224     itemIes->value.choice.RANfunction_Item.ranFunctionID = nextRanFuncId;
225
226     int ranFuncLength = strlen((char*)nextRanFuncDesc);
227
228     itemIes->value.choice.RANfunction_Item.ranFunctionDefinition = *nextRanFuncDesc;
229     itemIes->value.choice.RANfunction_Item.ranFunctionRevision = nextRanFuncRev;
230     
231     ASN_SEQUENCE_ADD(&ranFlistIEs->value.choice.RANfunctions_List.list, itemIes);
232
233   }
234
235   E2setupRequest_t *e2setupreq = (E2setupRequest_t*)calloc(1, sizeof(E2setupRequest_t));
236   ASN_SEQUENCE_ADD(&e2setupreq->protocolIEs.list, e2setuprid);
237   ASN_SEQUENCE_ADD(&e2setupreq->protocolIEs.list, ranFlistIEs);
238
239   InitiatingMessage__value_PR pres4;
240   pres4 = InitiatingMessage__value_PR_E2setupRequest;
241   InitiatingMessage_t *initmsg = (InitiatingMessage_t*)calloc(1, sizeof(InitiatingMessage_t));
242
243   initmsg->procedureCode = ProcedureCode_id_E2setup;
244   initmsg->criticality = Criticality_reject;
245   initmsg->value.present = pres4;
246   initmsg->value.choice.E2setupRequest = *e2setupreq;
247
248   E2AP_PDU_PR pres5;
249   pres5 = E2AP_PDU_PR_initiatingMessage;
250   
251
252   e2ap_pdu->present = pres5;
253   e2ap_pdu->choice.initiatingMessage = initmsg;  
254
255 }
256
257
258
259 void encoding::generate_e2apv1_setup_response(E2AP_PDU_t *e2ap_pdu) {
260
261   E2setupResponseIEs *resp_ies1 = (E2setupResponseIEs_t*)calloc(1, sizeof(E2setupResponseIEs_t));
262   E2setupResponseIEs *resp_ies2 = (E2setupResponseIEs_t*)calloc(1, sizeof(E2setupResponseIEs_t));
263   E2setupResponseIEs *resp_ies3 = (E2setupResponseIEs_t*)calloc(1, sizeof(E2setupResponseIEs_t));
264
265   uint8_t *buf = (uint8_t *)"gnb1";
266
267   BIT_STRING_t *ricid_bstring = (BIT_STRING_t*)calloc(1,sizeof(BIT_STRING_t));
268   ricid_bstring->buf = buf;
269   ricid_bstring->size = 4;
270   ricid_bstring->bits_unused = 0;
271
272   uint8_t *buf2 = (uint8_t *)"plmn3";
273   OCTET_STRING_t *plmn = (OCTET_STRING_t*)calloc(1,sizeof(OCTET_STRING_t));
274   plmn->buf = buf2;
275   plmn->size = 5;
276
277   GlobalRIC_ID_t *globalricid = (GlobalRIC_ID_t*)calloc(1,sizeof(GlobalRIC_ID_t));
278   globalricid->pLMN_Identity = *plmn;
279   globalricid->ric_ID = *ricid_bstring;
280
281   E2setupResponseIEs__value_PR pres1;
282   pres1 = E2setupResponseIEs__value_PR_GlobalRIC_ID;
283   
284   resp_ies1->id = ProtocolIE_ID_id_GlobalRIC_ID;
285   resp_ies1->criticality = 0;
286   resp_ies1->value.present = pres1;
287   resp_ies1->value.choice.GlobalRIC_ID = *globalricid;
288
289   E2setupResponse_t *e2setupresp = (E2setupResponse_t*)calloc(1,sizeof(E2setupResponse_t));
290   int ret = ASN_SEQUENCE_ADD(&e2setupresp->protocolIEs.list, resp_ies1);
291
292
293   SuccessfulOutcome__value_PR pres;
294   pres = SuccessfulOutcome__value_PR_E2setupResponse;
295   SuccessfulOutcome_t *successoutcome = (SuccessfulOutcome_t*)calloc(1, sizeof(SuccessfulOutcome_t));
296   successoutcome->procedureCode = 1;
297   successoutcome->criticality = 0;
298   successoutcome->value.present = pres;
299   successoutcome->value.choice.E2setupResponse = *e2setupresp;
300
301   E2AP_PDU_PR pres5 = E2AP_PDU_PR_successfulOutcome;
302   
303   e2ap_pdu->present = pres5;
304   e2ap_pdu->choice.successfulOutcome = successoutcome;
305   
306 }
307
308
309 void encoding::generate_e2apv1_subscription_request(E2AP_PDU *e2ap_pdu) {
310
311   fprintf(stderr, "in sub 1\n");
312   RICsubscriptionRequest_IEs_t *ricreqid = (RICsubscriptionRequest_IEs_t*)calloc(1, sizeof(RICsubscriptionRequest_IEs_t));
313   fprintf(stderr, "in sub 2\n");  
314   ASN_STRUCT_RESET(asn_DEF_RICsubscriptionRequest_IEs, ricreqid);
315   fprintf(stderr, "in sub 3\n");  
316   auto *ricsubrid = (RICsubscriptionRequest_IEs_t*)calloc(1, sizeof(RICsubscriptionRequest_IEs_t));
317   fprintf(stderr, "in sub 4\n");  
318   ASN_STRUCT_RESET(asn_DEF_RICsubscriptionRequest_IEs, ricsubrid);
319   
320   fprintf(stderr, "in generate sub\n");
321   uint8_t *buf2 = (uint8_t *)"SubscriptionTriggers";
322   fprintf(stderr, "in gen sub 1\n");
323   OCTET_STRING_t *triggerdef = (OCTET_STRING_t*)calloc(1, sizeof(OCTET_STRING_t));
324   triggerdef->buf = (uint8_t *)calloc(1,20);
325   triggerdef->size = 20;  
326   memcpy(triggerdef->buf, buf2, triggerdef->size);
327
328
329   fprintf(stderr, "sub1\n");
330   ProtocolIE_ID_t proto_id= ProtocolIE_ID_id_RICaction_ToBeSetup_Item;
331
332   RICaction_ToBeSetup_ItemIEs__value_PR pres6;
333   pres6 = RICaction_ToBeSetup_ItemIEs__value_PR_RICaction_ToBeSetup_Item;
334
335   printf("sub2\n");
336
337   uint8_t *buf5 = (uint8_t *)"ActionDef";
338
339   OCTET_STRING_t *actdef = (OCTET_STRING_t*)calloc(1, sizeof(OCTET_STRING_t));
340   actdef->buf = (uint8_t *)calloc(1,9);
341   actdef->size = 9;  
342   memcpy(triggerdef->buf, buf5, 9);
343
344   auto *sa = (RICsubsequentAction_t *) calloc(1, sizeof(RICsubsequentAction_t));
345   ASN_STRUCT_RESET(asn_DEF_RICsubsequentAction, sa);
346   
347   sa->ricTimeToWait = RICtimeToWait_w500ms;
348   sa->ricSubsequentActionType = RICsubsequentActionType_continue;
349     
350   printf("sub3\n");
351
352   RICaction_ToBeSetup_ItemIEs_t *action_item_ies = (RICaction_ToBeSetup_ItemIEs_t *)calloc(1, sizeof(RICaction_ToBeSetup_Item_t));
353   action_item_ies->id = proto_id;
354   action_item_ies->criticality = 0;
355
356   action_item_ies->value.present = pres6;
357   action_item_ies->value.choice.RICaction_ToBeSetup_Item.ricActionID = 5;
358   action_item_ies->value.choice.RICaction_ToBeSetup_Item.ricActionType = RICactionType_report;
359   action_item_ies->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition = actdef;
360   action_item_ies->value.choice.RICaction_ToBeSetup_Item.ricSubsequentAction = sa;
361
362
363   printf("sub5\n");
364   
365
366   RICsubscriptionRequest_IEs__value_PR pres3;
367   printf("sub6.1\n");
368   pres3 = RICsubscriptionRequest_IEs__value_PR_RICsubscriptionDetails;
369   ricsubrid->id = ProtocolIE_ID_id_RICsubscriptionDetails;
370   printf("sub6.2\n");
371   
372   ricsubrid->criticality = 0;
373   ricsubrid->value.present = pres3;
374   printf("sub6.3\n");
375
376   ricsubrid->value.choice.RICsubscriptionDetails.ricEventTriggerDefinition = *triggerdef;
377   printf("sub6.4\n");
378   
379   ASN_SEQUENCE_ADD(&ricsubrid->value.choice.RICsubscriptionDetails.ricAction_ToBeSetup_List.list, action_item_ies);
380
381   printf("sub7\n");
382
383
384   ricreqid->id = ProtocolIE_ID_id_RICrequestID;
385   ricreqid->criticality = 0;
386   ricreqid->value.present = RICsubscriptionRequest_IEs__value_PR_RICrequestID;
387   ricreqid->value.choice.RICrequestID.ricRequestorID = 22;
388   ricreqid->value.choice.RICrequestID.ricInstanceID = 6;
389
390   RICsubscriptionRequest_t *ricsubreq = (RICsubscriptionRequest_t*)calloc(1, sizeof(RICsubscriptionRequest_t));
391
392   ASN_SEQUENCE_ADD(&ricsubreq->protocolIEs.list,ricreqid);
393   ASN_SEQUENCE_ADD(&ricsubreq->protocolIEs.list,ricsubrid);
394
395
396
397   InitiatingMessage__value_PR pres4;
398   pres4 = InitiatingMessage__value_PR_RICsubscriptionRequest;
399   InitiatingMessage_t *initmsg = (InitiatingMessage_t*)calloc(1, sizeof(InitiatingMessage_t));
400   initmsg->procedureCode = ProcedureCode_id_RICsubscription;
401   initmsg->criticality = Criticality_reject;
402   initmsg->value.present = pres4;
403   initmsg->value.choice.RICsubscriptionRequest = *ricsubreq;
404
405   E2AP_PDU_PR pres5;
406   pres5 = E2AP_PDU_PR_initiatingMessage;
407   
408
409   e2ap_pdu->present = pres5;
410   e2ap_pdu->choice.initiatingMessage = initmsg;
411
412   char *error_buf = (char*)calloc(300, sizeof(char));;
413   size_t errlen;
414                                                                           
415   asn_check_constraints(&asn_DEF_E2AP_PDU, e2ap_pdu, error_buf, &errlen);
416   printf("error length %d\n", errlen);
417   printf("error buf %s\n", error_buf);
418
419
420 }
421
422 void encoding::generate_e2apv1_subscription_response_success(E2AP_PDU *e2ap_pdu, long reqActionIdsAccepted[],
423                                                    long reqActionIdsRejected[], int accept_size, int reject_size,
424                                                    long reqRequestorId, long reqInstanceId) {
425
426   RICsubscriptionResponse_IEs_t *respricreqid =
427     (RICsubscriptionResponse_IEs_t*)calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
428   
429   respricreqid->id = ProtocolIE_ID_id_RICrequestID;
430   respricreqid->criticality = 0;
431   respricreqid->value.present = RICsubscriptionResponse_IEs__value_PR_RICrequestID;
432   respricreqid->value.choice.RICrequestID.ricRequestorID = reqRequestorId;
433   
434   respricreqid->value.choice.RICrequestID.ricInstanceID = reqInstanceId;
435
436   RICsubscriptionResponse_IEs_t *respfuncid =
437     (RICsubscriptionResponse_IEs_t*)calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
438   respfuncid->id = ProtocolIE_ID_id_RANfunctionID;
439   respfuncid->criticality = 0;
440   respfuncid->value.present = RICsubscriptionResponse_IEs__value_PR_RANfunctionID;
441   respfuncid->value.choice.RANfunctionID = (long)0;
442   
443
444   RICsubscriptionResponse_IEs_t *ricactionadmitted =
445     (RICsubscriptionResponse_IEs_t*)calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
446   ricactionadmitted->id = ProtocolIE_ID_id_RICactions_Admitted;
447   ricactionadmitted->criticality = 0;
448   ricactionadmitted->value.present = RICsubscriptionResponse_IEs__value_PR_RICaction_Admitted_List;
449
450   RICaction_Admitted_List_t* admlist = 
451     (RICaction_Admitted_List_t*)calloc(1,sizeof(RICaction_Admitted_List_t));
452   ricactionadmitted->value.choice.RICaction_Admitted_List = *admlist;
453
454
455   int numAccept = accept_size;
456   int numReject = reject_size;
457
458
459   
460   for (int i=0; i < numAccept ; i++) {
461     fprintf(stderr, "in for loop i = %d\n", i);
462
463     long aid = reqActionIdsAccepted[i];
464
465     RICaction_Admitted_ItemIEs_t *admitie = (RICaction_Admitted_ItemIEs_t*)calloc(1,sizeof(RICaction_Admitted_ItemIEs_t));
466     admitie->id = ProtocolIE_ID_id_RICaction_Admitted_Item;
467     admitie->criticality = 0;
468     admitie->value.present = RICaction_Admitted_ItemIEs__value_PR_RICaction_Admitted_Item;
469     admitie->value.choice.RICaction_Admitted_Item.ricActionID = aid;
470     
471     ASN_SEQUENCE_ADD(&ricactionadmitted->value.choice.RICaction_Admitted_List.list, admitie);
472
473   }
474
475   RICsubscriptionResponse_t *ricsubresp = (RICsubscriptionResponse_t*)calloc(1,sizeof(RICsubscriptionResponse_t));
476   ASN_SEQUENCE_ADD(&ricsubresp->protocolIEs.list, respricreqid);
477   ASN_SEQUENCE_ADD(&ricsubresp->protocolIEs.list, respfuncid);
478   ASN_SEQUENCE_ADD(&ricsubresp->protocolIEs.list, ricactionadmitted);
479   
480
481   if (numReject > 0) {
482
483     RICsubscriptionResponse_IEs_t *ricactionrejected =
484       (RICsubscriptionResponse_IEs_t*)calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
485     ricactionrejected->id = ProtocolIE_ID_id_RICactions_NotAdmitted;
486     ricactionrejected->criticality = 0;
487     ricactionrejected->value.present = RICsubscriptionResponse_IEs__value_PR_RICaction_NotAdmitted_List;
488     
489     RICaction_NotAdmitted_List_t* rejectlist = 
490       (RICaction_NotAdmitted_List_t*)calloc(1,sizeof(RICaction_NotAdmitted_List_t));
491     ricactionadmitted->value.choice.RICaction_NotAdmitted_List = *rejectlist;
492     
493     for (int i=0; i < numReject; i++) {
494       fprintf(stderr, "in for loop i = %d\n", i);
495       
496       long aid = reqActionIdsRejected[i];
497       
498       RICaction_NotAdmitted_ItemIEs_t *noadmitie = (RICaction_NotAdmitted_ItemIEs_t*)calloc(1,sizeof(RICaction_NotAdmitted_ItemIEs_t));
499       noadmitie->id = ProtocolIE_ID_id_RICaction_NotAdmitted_Item;
500       noadmitie->criticality = 0;
501       noadmitie->value.present = RICaction_NotAdmitted_ItemIEs__value_PR_RICaction_NotAdmitted_Item;
502       noadmitie->value.choice.RICaction_NotAdmitted_Item.ricActionID = aid;
503       
504       ASN_SEQUENCE_ADD(&ricactionrejected->value.choice.RICaction_NotAdmitted_List.list, noadmitie);
505       ASN_SEQUENCE_ADD(&ricsubresp->protocolIEs.list, ricactionrejected);      
506     }
507   }
508
509
510   SuccessfulOutcome__value_PR pres2;
511   pres2 = SuccessfulOutcome__value_PR_RICsubscriptionResponse;
512   SuccessfulOutcome_t *successoutcome = (SuccessfulOutcome_t*)calloc(1, sizeof(SuccessfulOutcome_t));
513   successoutcome->procedureCode = ProcedureCode_id_RICsubscription;
514   successoutcome->criticality = 0;
515   successoutcome->value.present = pres2;
516   successoutcome->value.choice.RICsubscriptionResponse = *ricsubresp;
517
518   E2AP_PDU_PR pres5 = E2AP_PDU_PR_successfulOutcome;
519   
520   e2ap_pdu->present = pres5;
521   e2ap_pdu->choice.successfulOutcome = successoutcome;
522
523   char *error_buf = (char*)calloc(300, sizeof(char));
524   size_t errlen;
525
526   asn_check_constraints(&asn_DEF_E2AP_PDU, e2ap_pdu, error_buf, &errlen);
527   printf("error length %d\n", errlen);
528   printf("error buf %s\n", error_buf);
529
530   printf("now printing xer of subscription response\n");
531   xer_fprint(stderr, &asn_DEF_E2AP_PDU, e2ap_pdu);
532   printf("done printing xer of subscription response\n");  
533
534   
535 }
536
537 void encoding::generate_e2apv1_subscription_response(E2AP_PDU *e2ap_pdu, E2AP_PDU *sub_req_pdu) {
538
539   //Gather details of the request
540
541   RICsubscriptionRequest_t orig_req =
542     sub_req_pdu->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
543   
544   RICsubscriptionResponse_IEs_t *ricreqid =
545     (RICsubscriptionResponse_IEs_t*)calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
546                                            
547   int count = orig_req.protocolIEs.list.count;
548   int size = orig_req.protocolIEs.list.size;
549   
550   RICsubscriptionRequest_IEs_t **ies = (RICsubscriptionRequest_IEs_t**)orig_req.protocolIEs.list.array;
551
552   fprintf(stderr, "count%d\n", count);
553   fprintf(stderr, "size%d\n", size);
554
555   RICsubscriptionRequest_IEs__value_PR pres;
556
557   long responseRequestorId;
558   long responseInstanceId;
559   long responseActionId;
560
561   std::vector<long> actionIds;
562
563   for (int i=0; i < count; i++) {
564     RICsubscriptionRequest_IEs_t *next_ie = ies[i];
565     pres = next_ie->value.present;
566     
567     fprintf(stderr, "next present value %d\n", pres);
568
569     switch(pres) {
570     case RICsubscriptionRequest_IEs__value_PR_RICrequestID:
571       {
572         RICrequestID_t reqId = next_ie->value.choice.RICrequestID;
573         long requestorId = reqId.ricRequestorID;
574         long instanceId = reqId.ricInstanceID;
575         fprintf(stderr, "requestorId %d\n", requestorId);
576         fprintf(stderr, "instanceId %d\n", instanceId);
577         responseRequestorId = requestorId;
578         responseInstanceId = instanceId;
579                 
580         break;
581       }
582     case RICsubscriptionRequest_IEs__value_PR_RANfunctionID:
583       break;
584     case RICsubscriptionRequest_IEs__value_PR_RICsubscriptionDetails:
585       {
586         RICsubscriptionDetails_t subDetails = next_ie->value.choice.RICsubscriptionDetails; 
587         RICeventTriggerDefinition_t triggerDef = subDetails.ricEventTriggerDefinition;
588         RICactions_ToBeSetup_List_t actionList = subDetails.ricAction_ToBeSetup_List;
589         
590         int actionCount = actionList.list.count;
591         fprintf(stderr, "action count%d\n", actionCount);
592
593         auto **item_array = actionList.list.array;
594
595         for (int i=0; i < actionCount; i++) {
596           //RICaction_ToBeSetup_Item_t
597           auto *next_item = item_array[i];
598           RICactionID_t actionId = ((RICaction_ToBeSetup_ItemIEs*)next_item)->value.choice.RICaction_ToBeSetup_Item.ricActionID;
599           fprintf(stderr, "Next Action ID %ld\n", actionId);
600           responseActionId = actionId;
601           actionIds.push_back(responseActionId);
602         }
603         
604         break;
605       }
606     }
607     
608   }
609
610   fprintf(stderr, "After Processing Subscription Request\n");
611
612   fprintf(stderr, "requestorId %d\n", responseRequestorId);
613   fprintf(stderr, "instanceId %d\n", responseInstanceId);
614
615
616   for (int i=0; i < actionIds.size(); i++) {
617     fprintf(stderr, "Action ID %d %ld\n", i, actionIds.at(i));
618     
619   }
620
621
622   RICsubscriptionResponse_IEs_t *respricreqid =
623     (RICsubscriptionResponse_IEs_t*)calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
624   
625   respricreqid->id = ProtocolIE_ID_id_RICrequestID;
626   respricreqid->criticality = 0;
627   respricreqid->value.present = RICsubscriptionResponse_IEs__value_PR_RICrequestID;
628   respricreqid->value.choice.RICrequestID.ricRequestorID = responseRequestorId;
629   
630   respricreqid->value.choice.RICrequestID.ricInstanceID = responseInstanceId;
631
632
633   RICsubscriptionResponse_IEs_t *ricactionadmitted =
634     (RICsubscriptionResponse_IEs_t*)calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
635   ricactionadmitted->id = ProtocolIE_ID_id_RICactions_Admitted;
636   ricactionadmitted->criticality = 0;
637   ricactionadmitted->value.present = RICsubscriptionResponse_IEs__value_PR_RICaction_Admitted_List;
638
639   RICaction_Admitted_List_t* admlist = 
640     (RICaction_Admitted_List_t*)calloc(1,sizeof(RICaction_Admitted_List_t));
641   ricactionadmitted->value.choice.RICaction_Admitted_List = *admlist;
642
643   for (int i=0; i < actionIds.size(); i++) {
644     fprintf(stderr, "in for loop i = %d\n", i);
645
646     long aid = actionIds.at(i);
647
648     RICaction_Admitted_ItemIEs_t *admitie = (RICaction_Admitted_ItemIEs_t*)calloc(1,sizeof(RICaction_Admitted_ItemIEs_t));
649     admitie->id = ProtocolIE_ID_id_RICaction_Admitted_Item;
650     admitie->criticality = 0;
651     admitie->value.present = RICaction_Admitted_ItemIEs__value_PR_RICaction_Admitted_Item;
652     admitie->value.choice.RICaction_Admitted_Item.ricActionID = aid;
653     
654     ASN_SEQUENCE_ADD(&ricactionadmitted->value.choice.RICaction_Admitted_List.list, admitie);
655
656   }
657
658
659   RICsubscriptionResponse_t *ricsubresp = (RICsubscriptionResponse_t*)calloc(1,sizeof(RICsubscriptionResponse_t));
660   
661   ASN_SEQUENCE_ADD(&ricsubresp->protocolIEs.list, respricreqid);
662   ASN_SEQUENCE_ADD(&ricsubresp->protocolIEs.list, ricactionadmitted);
663
664
665   SuccessfulOutcome__value_PR pres2;
666   pres2 = SuccessfulOutcome__value_PR_RICsubscriptionResponse;
667   SuccessfulOutcome_t *successoutcome = (SuccessfulOutcome_t*)calloc(1, sizeof(SuccessfulOutcome_t));
668   successoutcome->procedureCode = ProcedureCode_id_RICsubscription;
669   successoutcome->criticality = 0;
670   successoutcome->value.present = pres2;
671   successoutcome->value.choice.RICsubscriptionResponse = *ricsubresp;
672
673   E2AP_PDU_PR pres5 = E2AP_PDU_PR_successfulOutcome;
674   
675   e2ap_pdu->present = pres5;
676   e2ap_pdu->choice.successfulOutcome = successoutcome;
677
678   char *error_buf = (char*)calloc(300, sizeof(char));
679   size_t errlen;
680
681   asn_check_constraints(&asn_DEF_E2AP_PDU, e2ap_pdu, error_buf, &errlen);
682   printf("error length %d\n", errlen);
683   printf("error buf %s\n", error_buf);
684
685
686   
687 }
688
689 void encoding::generate_e2apv1_indication_request_parameterized(E2AP_PDU *e2ap_pdu,
690                                                                 long requestorId,
691                                                                 long instanceId,
692                                                                 long ranFunctionId,
693                                                                 long actionId,
694                                                                 long seqNum,
695                                                                 uint8_t *ind_header_buf,
696                                                                 int header_length,
697                                                                 uint8_t *ind_message_buf,
698                                                                 int message_length) {
699   
700   fprintf(stderr, "ind1\n");
701   RICindication_IEs_t *ricind_ies = (RICindication_IEs_t*)calloc(1, sizeof(RICindication_IEs_t));
702   RICindication_IEs_t *ricind_ies2 = (RICindication_IEs_t*)calloc(1, sizeof(RICindication_IEs_t));
703   RICindication_IEs_t *ricind_ies3 = (RICindication_IEs_t*)calloc(1, sizeof(RICindication_IEs_t));
704   RICindication_IEs_t *ricind_ies4 = (RICindication_IEs_t*)calloc(1, sizeof(RICindication_IEs_t));
705   RICindication_IEs_t *ricind_ies5 = (RICindication_IEs_t*)calloc(1, sizeof(RICindication_IEs_t));
706   RICindication_IEs_t *ricind_ies6 = (RICindication_IEs_t*)calloc(1, sizeof(RICindication_IEs_t));
707   RICindication_IEs_t *ricind_ies7 = (RICindication_IEs_t*)calloc(1, sizeof(RICindication_IEs_t));
708   RICindication_IEs_t *ricind_ies8 = (RICindication_IEs_t*)calloc(1, sizeof(RICindication_IEs_t));
709
710   RICindication_IEs__value_PR pres3;
711
712   pres3 = RICindication_IEs__value_PR_RICrequestID;
713   ricind_ies->id = ProtocolIE_ID_id_RICrequestID;
714   ricind_ies->criticality = 0;
715   ricind_ies->value.present = pres3;
716   ricind_ies->value.choice.RICrequestID.ricRequestorID = requestorId;
717   ricind_ies->value.choice.RICrequestID.ricInstanceID = instanceId;
718
719   fprintf(stderr, "ind2\n");
720
721   pres3 = RICindication_IEs__value_PR_RANfunctionID;
722   ricind_ies2->id = ProtocolIE_ID_id_RANfunctionID;
723   ricind_ies2->criticality = 0;
724   ricind_ies2->value.present = pres3;
725   ricind_ies2->value.choice.RANfunctionID = ranFunctionId;
726
727   
728   ricind_ies3->id = ProtocolIE_ID_id_RICactionID;
729   ricind_ies3->criticality = 0;
730   pres3 =  RICindication_IEs__value_PR_RICactionID;
731   ricind_ies3->value.present = pres3;
732   ricind_ies3->value.choice.RICactionID = actionId;
733
734
735   pres3 = RICindication_IEs__value_PR_RICindicationSN;
736   ricind_ies4->id = ProtocolIE_ID_id_RICindicationSN;
737   ricind_ies4->criticality = 0;
738   ricind_ies4->value.present = pres3;
739   ricind_ies4->value.choice.RICindicationSN = seqNum;
740
741   //Indication type is REPORT
742   pres3 = RICindication_IEs__value_PR_RICindicationType;
743   ricind_ies5->id = ProtocolIE_ID_id_RICindicationType;
744   ricind_ies5->criticality = 0;
745   ricind_ies5->value.present = pres3;
746   ricind_ies5->value.choice.RICindicationType = 0;
747
748
749   uint8_t *buf2 = (uint8_t *)"reportheader";
750   OCTET_STRING_t *hdr_str = (OCTET_STRING_t*)calloc(1,sizeof(OCTET_STRING_t));
751
752   hdr_str->buf = (uint8_t*)calloc(1,header_length);
753   hdr_str->size = header_length;
754   memcpy(hdr_str->buf, ind_header_buf, header_length);
755
756   fprintf(stderr, "ind3\n");
757
758   ricind_ies6->value.choice.RICindicationHeader.buf = (uint8_t*)calloc(1,header_length);
759
760   pres3 = RICindication_IEs__value_PR_RICindicationHeader;
761   ricind_ies6->id = ProtocolIE_ID_id_RICindicationHeader;
762   ricind_ies6->criticality = 0;
763   ricind_ies6->value.present = pres3;
764   ricind_ies6->value.choice.RICindicationHeader.size = header_length;
765   memcpy(ricind_ies6->value.choice.RICindicationHeader.buf, ind_header_buf, header_length);
766   
767   ricind_ies7->value.choice.RICindicationMessage.buf = (uint8_t*)calloc(1,8192);
768
769
770   
771
772   pres3 = RICindication_IEs__value_PR_RICindicationMessage;
773   ricind_ies7->id = ProtocolIE_ID_id_RICindicationMessage;
774   fprintf(stderr, "after encoding message 1\n");
775
776   ricind_ies7->criticality = 0;
777   ricind_ies7->value.present = pres3;
778
779   fprintf(stderr, "after encoding message 2\n");
780
781   fprintf(stderr, "after encoding message 3\n");      
782   ricind_ies7->value.choice.RICindicationMessage.size = message_length;
783
784   fprintf(stderr, "after encoding message 4\n");
785   memcpy(ricind_ies7->value.choice.RICindicationMessage.buf, ind_message_buf, message_length);
786
787   fprintf(stderr, "after encoding message 5\n");
788
789   uint8_t *cpid_buf = (uint8_t *)"cpid";
790   OCTET_STRING_t cpid_str;
791
792   printf("5.1\n");
793
794   int cpid_buf_len = strlen((char*)cpid_buf);
795   pres3 = RICindication_IEs__value_PR_RICcallProcessID;
796   ricind_ies8->id = ProtocolIE_ID_id_RICcallProcessID;
797
798   ricind_ies8->criticality = 0;
799   ricind_ies8->value.present = pres3;
800
801   ricind_ies8->value.choice.RICcallProcessID.buf = (uint8_t*)calloc(1,cpid_buf_len);
802   ricind_ies8->value.choice.RICcallProcessID.size = cpid_buf_len;
803
804   memcpy(ricind_ies8->value.choice.RICcallProcessID.buf, cpid_buf, cpid_buf_len);
805
806   printf("5.2\n");
807
808   RICindication_t *ricindication = (RICindication_t*)calloc(1, sizeof(RICindication_t));
809
810   
811   int ret;
812
813   ret = ASN_SEQUENCE_ADD(&ricindication->protocolIEs.list, ricind_ies);
814   
815   ret = ASN_SEQUENCE_ADD(&ricindication->protocolIEs.list, ricind_ies2);
816
817   printf("5.3\n");
818
819   ret = ASN_SEQUENCE_ADD(&ricindication->protocolIEs.list, ricind_ies3);
820
821   printf("5.35\n");
822   
823   ret = ASN_SEQUENCE_ADD(&ricindication->protocolIEs.list, ricind_ies4);
824
825   printf("5.36\n");
826   
827   ret = ASN_SEQUENCE_ADD(&ricindication->protocolIEs.list, ricind_ies5);
828
829   printf("5.4\n");
830   
831   ret = ASN_SEQUENCE_ADD(&ricindication->protocolIEs.list, ricind_ies6);
832
833   printf("5.5\n");
834
835   ret = ASN_SEQUENCE_ADD(&ricindication->protocolIEs.list, ricind_ies7);  
836   
837   ret = ASN_SEQUENCE_ADD(&ricindication->protocolIEs.list, ricind_ies8);    
838
839
840   InitiatingMessage__value_PR pres4;
841   pres4 = InitiatingMessage__value_PR_RICindication;
842   InitiatingMessage_t *initmsg = (InitiatingMessage_t*)calloc(1, sizeof(InitiatingMessage_t));
843   initmsg->procedureCode = 5;
844   initmsg->criticality = 1;
845   initmsg->value.present = pres4;
846   initmsg->value.choice.RICindication = *ricindication;
847
848   E2AP_PDU_PR pres5;
849   pres5 = E2AP_PDU_PR_initiatingMessage;
850   
851   e2ap_pdu->present = pres5;
852   e2ap_pdu->choice.initiatingMessage = initmsg;
853   char *error_buf = (char*)calloc(300, sizeof(char));
854   size_t errlen;
855
856   asn_check_constraints(&asn_DEF_E2AP_PDU, e2ap_pdu, error_buf, &errlen);
857   printf("error length %d\n", errlen);
858   printf("error buf %s\n", error_buf);
859
860   xer_fprint(stderr, &asn_DEF_E2AP_PDU, e2ap_pdu);  
861
862 }
863
864