Issue-ID: SIM-18
[sim/e2-interface.git] / e2sim / e2apv1sim / e2sim / encode_e2apv1.cpp
1 #include <stdio.h>
2 #include <string.h>
3 #include <iostream>
4 #include <unistd.h>
5
6 #include <iterator>
7 #include <vector>
8
9
10 #include "encode_e2apv1.hpp"
11
12 extern "C" {
13 #include "E2SM-KPM-RANfunction-Description.h"
14
15 #include "e2ap_asn1c_codec.h"
16 #include "GlobalE2node-ID.h"
17 #include "GlobalE2node-gNB-ID.h"
18 #include "GlobalgNB-ID.h"
19 #include "OCTET_STRING.h"
20 #include "asn_application.h"
21 #include "GNB-ID-Choice.h"
22 #include "ProtocolIE-Field.h"
23 #include "E2setupRequest.h"
24 #include "RICaction-ToBeSetup-Item.h"
25 #include "RICactions-ToBeSetup-List.h"
26 #include "RICeventTriggerDefinition.h"
27 #include "RICsubscriptionRequest.h"
28 #include "RICsubscriptionResponse.h"
29 #include "ProtocolIE-SingleContainer.h"
30 #include "RANfunctions-List.h"
31 #include "RICindication.h"
32 #include "RICsubsequentActionType.h"
33 #include "RICsubsequentAction.h"  
34 #include "RICtimeToWait.h"
35   
36 }
37
38 long get_function_id_from_subscription(E2AP_PDU_t *e2ap_pdu) {
39
40   RICsubscriptionRequest_t orig_req =
41     e2ap_pdu->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
42   
43   RICsubscriptionResponse_IEs_t *ricreqid =
44     (RICsubscriptionResponse_IEs_t*)calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
45                                            
46   int count = orig_req.protocolIEs.list.count;
47   int size = orig_req.protocolIEs.list.size;
48   
49   RICsubscriptionRequest_IEs_t **ies = (RICsubscriptionRequest_IEs_t**)orig_req.protocolIEs.list.array;
50
51   fprintf(stderr, "count%d\n", count);
52   fprintf(stderr, "size%d\n", size);
53
54   RICsubscriptionRequest_IEs__value_PR pres;
55
56   long func_id;
57
58   for (int i=0; i < count; i++) {
59     RICsubscriptionRequest_IEs_t *next_ie = ies[i];
60     pres = next_ie->value.present;
61     
62     fprintf(stderr, "next present value %d\n", pres);
63
64     if (pres == RICsubscriptionRequest_IEs__value_PR_RANfunctionID) {
65       func_id = next_ie->value.choice.RANfunctionID;
66     }
67     
68   }
69
70   return func_id;  
71
72 }
73
74 void generate_e2apv1_setup_request_parameterized(E2AP_PDU_t *e2ap_pdu, std::vector<ran_func_info> all_funcs) {
75   //                                             long ranFunctionId, uint8_t *ranFuncDescEncoded, int ranFuncLength) {
76
77   //  uint8_t *buf = (uint8_t *)"gnb1"
78
79   BIT_STRING_t *gnb_bstring = (BIT_STRING_t*)calloc(1, sizeof(BIT_STRING_t));;
80   gnb_bstring->buf = (uint8_t*)calloc(1,4);
81   gnb_bstring->size = 4;
82   gnb_bstring->buf[0] = 0xB5;
83   gnb_bstring->buf[1] = 0xC6;
84   gnb_bstring->buf[2] = 0x77;
85   gnb_bstring->buf[3] = 0x88;
86
87   gnb_bstring->bits_unused = 3;
88
89   uint8_t *buf2 = (uint8_t *)"747";
90   OCTET_STRING_t *plmn = (OCTET_STRING_t*)calloc(1, sizeof(OCTET_STRING_t));
91   plmn->buf = (uint8_t*)calloc(1,3);
92   memcpy(plmn->buf, buf2, 3);
93   plmn->size = 3;
94
95   GNB_ID_Choice_t *gnbchoice = (GNB_ID_Choice_t*)calloc(1,sizeof(GNB_ID_Choice_t));
96   GNB_ID_Choice_PR pres2 = GNB_ID_Choice_PR_gnb_ID;
97   gnbchoice->present = pres2;
98   gnbchoice->choice.gnb_ID = *gnb_bstring;
99
100   GlobalgNB_ID_t *gnb = (GlobalgNB_ID_t*)calloc(1, sizeof(GlobalgNB_ID_t));
101   gnb->plmn_id = *plmn;
102   gnb->gnb_id = *gnbchoice;
103
104   GlobalE2node_gNB_ID_t *e2gnb = (GlobalE2node_gNB_ID_t*)calloc(1, sizeof(GlobalE2node_gNB_ID_t));
105   e2gnb->global_gNB_ID = *gnb;
106
107   GlobalE2node_ID_t *globale2nodeid = (GlobalE2node_ID_t*)calloc(1, sizeof(GlobalE2node_ID_t));
108   GlobalE2node_ID_PR pres;
109   pres = GlobalE2node_ID_PR_gNB;
110   globale2nodeid->present = pres;
111   globale2nodeid->choice.gNB = e2gnb;
112   
113   E2setupRequestIEs_t *e2setuprid = (E2setupRequestIEs_t*)calloc(1, sizeof(E2setupRequestIEs_t));
114   E2setupRequestIEs__value_PR pres3;
115   pres3 = E2setupRequestIEs__value_PR_GlobalE2node_ID;
116   e2setuprid->id = 3;
117   e2setuprid->criticality = 0;
118   e2setuprid->value.choice.GlobalE2node_ID = *globale2nodeid;
119   e2setuprid->value.present = pres3;
120
121
122   auto *ranFlistIEs = (E2setupRequestIEs_t *)calloc(1, sizeof(E2setupRequestIEs_t));
123   ASN_STRUCT_RESET(asn_DEF_E2setupRequestIEs, ranFlistIEs);
124   ranFlistIEs->criticality = 0;
125   ranFlistIEs->id = ProtocolIE_ID_id_RANfunctionsAdded;
126   ranFlistIEs->value.present = E2setupRequestIEs__value_PR_RANfunctions_List;
127
128
129   for (int i = 0; i < all_funcs.size(); i++) {
130
131     ran_func_info nextRanFunc = all_funcs.at(i);
132     long nextRanFuncId = nextRanFunc.ranFunctionId;
133     OCTET_STRING_t *nextRanFuncDesc = nextRanFunc.ranFunctionDesc;
134     long nextRanFuncRev = nextRanFunc.ranFunctionRev;
135
136     auto *itemIes = (RANfunction_ItemIEs_t *)calloc(1, sizeof(RANfunction_ItemIEs_t));
137     itemIes->id = ProtocolIE_ID_id_RANfunction_Item;
138     itemIes->criticality = Criticality_reject;
139     itemIes->value.present = RANfunction_ItemIEs__value_PR_RANfunction_Item;
140     itemIes->value.choice.RANfunction_Item.ranFunctionID = nextRanFuncId;
141
142     int ranFuncLength = strlen((char*)nextRanFuncDesc);
143
144     itemIes->value.choice.RANfunction_Item.ranFunctionDefinition = *nextRanFuncDesc;
145     itemIes->value.choice.RANfunction_Item.ranFunctionRevision = nextRanFuncRev;
146     
147     ASN_SEQUENCE_ADD(&ranFlistIEs->value.choice.RANfunctions_List.list, itemIes);
148
149   }
150
151   E2setupRequest_t *e2setupreq = (E2setupRequest_t*)calloc(1, sizeof(E2setupRequest_t));
152   ASN_SEQUENCE_ADD(&e2setupreq->protocolIEs.list, e2setuprid);
153   ASN_SEQUENCE_ADD(&e2setupreq->protocolIEs.list, ranFlistIEs);
154
155   InitiatingMessage__value_PR pres4;
156   pres4 = InitiatingMessage__value_PR_E2setupRequest;
157   InitiatingMessage_t *initmsg = (InitiatingMessage_t*)calloc(1, sizeof(InitiatingMessage_t));
158
159   initmsg->procedureCode = ProcedureCode_id_E2setup;
160   initmsg->criticality = Criticality_reject;
161   initmsg->value.present = pres4;
162   initmsg->value.choice.E2setupRequest = *e2setupreq;
163
164   E2AP_PDU_PR pres5;
165   pres5 = E2AP_PDU_PR_initiatingMessage;
166   
167
168   e2ap_pdu->present = pres5;
169   e2ap_pdu->choice.initiatingMessage = initmsg;  
170
171 }
172
173 void generate_e2apv1_setup_request(E2AP_PDU_t *e2ap_pdu) {
174   
175   //  uint8_t *buf = (uint8_t *)"gnb1"
176
177   BIT_STRING_t *gnb_bstring = (BIT_STRING_t*)calloc(1, sizeof(BIT_STRING_t));;
178   gnb_bstring->buf = (uint8_t*)calloc(1,4);
179   gnb_bstring->size = 4;
180   gnb_bstring->buf[0] = 0xB5;
181   gnb_bstring->buf[1] = 0xC6;
182   gnb_bstring->buf[2] = 0x77;
183   gnb_bstring->buf[3] = 0x88;
184
185   gnb_bstring->bits_unused = 3;
186
187   uint8_t *buf2 = (uint8_t *)"747";
188   OCTET_STRING_t *plmn = (OCTET_STRING_t*)calloc(1, sizeof(OCTET_STRING_t));
189   plmn->buf = (uint8_t*)calloc(1,3);
190   memcpy(plmn->buf, buf2, 3);
191   plmn->size = 3;
192
193   GNB_ID_Choice_t *gnbchoice = (GNB_ID_Choice_t*)calloc(1,sizeof(GNB_ID_Choice_t));
194   GNB_ID_Choice_PR pres2 = GNB_ID_Choice_PR_gnb_ID;
195   gnbchoice->present = pres2;
196   gnbchoice->choice.gnb_ID = *gnb_bstring;
197
198   GlobalgNB_ID_t *gnb = (GlobalgNB_ID_t*)calloc(1, sizeof(GlobalgNB_ID_t));
199   gnb->plmn_id = *plmn;
200   gnb->gnb_id = *gnbchoice;
201
202   GlobalE2node_gNB_ID_t *e2gnb = (GlobalE2node_gNB_ID_t*)calloc(1, sizeof(GlobalE2node_gNB_ID_t));
203   e2gnb->global_gNB_ID = *gnb;
204
205   GlobalE2node_ID_t *globale2nodeid = (GlobalE2node_ID_t*)calloc(1, sizeof(GlobalE2node_ID_t));
206   GlobalE2node_ID_PR pres;
207   pres = GlobalE2node_ID_PR_gNB;
208   globale2nodeid->present = pres;
209   globale2nodeid->choice.gNB = e2gnb;
210   
211   E2setupRequestIEs_t *e2setuprid = (E2setupRequestIEs_t*)calloc(1, sizeof(E2setupRequestIEs_t));
212   E2setupRequestIEs__value_PR pres3;
213   pres3 = E2setupRequestIEs__value_PR_GlobalE2node_ID;
214   e2setuprid->id = 3;
215   e2setuprid->criticality = 0;
216   e2setuprid->value.choice.GlobalE2node_ID = *globale2nodeid;
217   e2setuprid->value.present = pres3;
218
219
220   auto *ranFlistIEs = (E2setupRequestIEs_t *)calloc(1, sizeof(E2setupRequestIEs_t));
221   ASN_STRUCT_RESET(asn_DEF_E2setupRequestIEs, ranFlistIEs);
222   ranFlistIEs->criticality = 0;
223   ranFlistIEs->id = ProtocolIE_ID_id_RANfunctionsAdded;
224   ranFlistIEs->value.present = E2setupRequestIEs__value_PR_RANfunctions_List;
225
226   auto *itemIes = (RANfunction_ItemIEs_t *)calloc(1, sizeof(RANfunction_ItemIEs_t));
227   itemIes->id = ProtocolIE_ID_id_RANfunction_Item;
228   itemIes->criticality = Criticality_reject;
229   itemIes->value.present = RANfunction_ItemIEs__value_PR_RANfunction_Item;
230   itemIes->value.choice.RANfunction_Item.ranFunctionID = 1;
231
232   E2SM_KPM_RANfunction_Description_t *ranfunc_desc =
233     (E2SM_KPM_RANfunction_Description_t*)calloc(1,sizeof(E2SM_KPM_RANfunction_Description_t));
234   encode_kpm_function_description(ranfunc_desc);
235
236   uint8_t e2smbuffer[8192];
237   size_t e2smbuffer_size = 8192;
238
239   asn_codec_ctx_t *opt_cod;  
240
241   asn_enc_rval_t er =
242     asn_encode_to_buffer(opt_cod,
243                          ATS_ALIGNED_BASIC_PER,
244                          &asn_DEF_E2SM_KPM_RANfunction_Description,
245                          ranfunc_desc, e2smbuffer, e2smbuffer_size);
246   
247   fprintf(stderr, "er encded is %d\n", er.encoded);
248   fprintf(stderr, "after encoding message\n");
249
250   OCTET_STRING_t *ranfuncdesc_str = (OCTET_STRING_t*)calloc(1,sizeof(OCTET_STRING_t));
251   ranfuncdesc_str->buf = (uint8_t*)calloc(1,er.encoded);
252   ranfuncdesc_str->size = er.encoded;
253   memcpy(ranfuncdesc_str->buf, e2smbuffer, er.encoded);
254   
255
256   itemIes->value.choice.RANfunction_Item.ranFunctionDefinition = *ranfuncdesc_str;
257   itemIes->value.choice.RANfunction_Item.ranFunctionRevision = (long)2;
258
259   ASN_SEQUENCE_ADD(&ranFlistIEs->value.choice.RANfunctions_List.list, itemIes);
260
261   E2setupRequest_t *e2setupreq = (E2setupRequest_t*)calloc(1, sizeof(E2setupRequest_t));
262   ASN_SEQUENCE_ADD(&e2setupreq->protocolIEs.list, e2setuprid);
263   ASN_SEQUENCE_ADD(&e2setupreq->protocolIEs.list, ranFlistIEs);
264
265   InitiatingMessage__value_PR pres4;
266   pres4 = InitiatingMessage__value_PR_E2setupRequest;
267   InitiatingMessage_t *initmsg = (InitiatingMessage_t*)calloc(1, sizeof(InitiatingMessage_t));
268
269   initmsg->procedureCode = ProcedureCode_id_E2setup;
270   initmsg->criticality = Criticality_reject;
271   initmsg->value.present = pres4;
272   initmsg->value.choice.E2setupRequest = *e2setupreq;
273
274   E2AP_PDU_PR pres5;
275   pres5 = E2AP_PDU_PR_initiatingMessage;
276   
277
278   e2ap_pdu->present = pres5;
279   e2ap_pdu->choice.initiatingMessage = initmsg;
280
281 }
282
283
284 void generate_e2apv1_setup_response(E2AP_PDU_t *e2ap_pdu) {
285
286   E2setupResponseIEs *resp_ies1 = (E2setupResponseIEs_t*)calloc(1, sizeof(E2setupResponseIEs_t));
287   E2setupResponseIEs *resp_ies2 = (E2setupResponseIEs_t*)calloc(1, sizeof(E2setupResponseIEs_t));
288   E2setupResponseIEs *resp_ies3 = (E2setupResponseIEs_t*)calloc(1, sizeof(E2setupResponseIEs_t));
289
290   uint8_t *buf = (uint8_t *)"gnb1";
291
292   BIT_STRING_t *ricid_bstring = (BIT_STRING_t*)calloc(1,sizeof(BIT_STRING_t));
293   ricid_bstring->buf = buf;
294   ricid_bstring->size = 4;
295   ricid_bstring->bits_unused = 0;
296
297   uint8_t *buf2 = (uint8_t *)"plmn3";
298   OCTET_STRING_t *plmn = (OCTET_STRING_t*)calloc(1,sizeof(OCTET_STRING_t));
299   plmn->buf = buf2;
300   plmn->size = 5;
301
302   GlobalRIC_ID_t *globalricid = (GlobalRIC_ID_t*)calloc(1,sizeof(GlobalRIC_ID_t));
303   globalricid->pLMN_Identity = *plmn;
304   globalricid->ric_ID = *ricid_bstring;
305
306   E2setupResponseIEs__value_PR pres1;
307   pres1 = E2setupResponseIEs__value_PR_GlobalRIC_ID;
308   
309   resp_ies1->id = ProtocolIE_ID_id_GlobalRIC_ID;
310   resp_ies1->criticality = 0;
311   resp_ies1->value.present = pres1;
312   resp_ies1->value.choice.GlobalRIC_ID = *globalricid;
313
314   E2setupResponse_t *e2setupresp = (E2setupResponse_t*)calloc(1,sizeof(E2setupResponse_t));
315   int ret = ASN_SEQUENCE_ADD(&e2setupresp->protocolIEs.list, resp_ies1);
316
317
318   SuccessfulOutcome__value_PR pres;
319   pres = SuccessfulOutcome__value_PR_E2setupResponse;
320   SuccessfulOutcome_t *successoutcome = (SuccessfulOutcome_t*)calloc(1, sizeof(SuccessfulOutcome_t));
321   successoutcome->procedureCode = 1;
322   successoutcome->criticality = 0;
323   successoutcome->value.present = pres;
324   successoutcome->value.choice.E2setupResponse = *e2setupresp;
325
326   E2AP_PDU_PR pres5 = E2AP_PDU_PR_successfulOutcome;
327   
328   e2ap_pdu->present = pres5;
329   e2ap_pdu->choice.successfulOutcome = successoutcome;
330   
331 }
332
333
334 void generate_e2apv1_subscription_request(E2AP_PDU *e2ap_pdu) {
335
336   fprintf(stderr, "in sub 1\n");
337   RICsubscriptionRequest_IEs_t *ricreqid = (RICsubscriptionRequest_IEs_t*)calloc(1, sizeof(RICsubscriptionRequest_IEs_t));
338   fprintf(stderr, "in sub 2\n");  
339   ASN_STRUCT_RESET(asn_DEF_RICsubscriptionRequest_IEs, ricreqid);
340   fprintf(stderr, "in sub 3\n");  
341   auto *ricsubrid = (RICsubscriptionRequest_IEs_t*)calloc(1, sizeof(RICsubscriptionRequest_IEs_t));
342   fprintf(stderr, "in sub 4\n");  
343   ASN_STRUCT_RESET(asn_DEF_RICsubscriptionRequest_IEs, ricsubrid);
344   
345   fprintf(stderr, "in generate sub\n");
346   uint8_t *buf2 = (uint8_t *)"SubscriptionTriggers";
347   fprintf(stderr, "in gen sub 1\n");
348   OCTET_STRING_t *triggerdef = (OCTET_STRING_t*)calloc(1, sizeof(OCTET_STRING_t));
349   triggerdef->buf = (uint8_t *)calloc(1,20);
350   triggerdef->size = 20;  
351   memcpy(triggerdef->buf, buf2, triggerdef->size);
352
353
354   fprintf(stderr, "sub1\n");
355   ProtocolIE_ID_t proto_id= ProtocolIE_ID_id_RICaction_ToBeSetup_Item;
356
357   RICaction_ToBeSetup_ItemIEs__value_PR pres6;
358   pres6 = RICaction_ToBeSetup_ItemIEs__value_PR_RICaction_ToBeSetup_Item;
359
360   printf("sub2\n");
361
362   uint8_t *buf5 = (uint8_t *)"ActionDef";
363
364   OCTET_STRING_t *actdef = (OCTET_STRING_t*)calloc(1, sizeof(OCTET_STRING_t));
365   actdef->buf = (uint8_t *)calloc(1,9);
366   actdef->size = 9;  
367   memcpy(triggerdef->buf, buf5, 9);
368
369   auto *sa = (RICsubsequentAction_t *) calloc(1, sizeof(RICsubsequentAction_t));
370   ASN_STRUCT_RESET(asn_DEF_RICsubsequentAction, sa);
371   
372   sa->ricTimeToWait = RICtimeToWait_w500ms;
373   sa->ricSubsequentActionType = RICsubsequentActionType_continue;
374     
375   printf("sub3\n");
376
377   RICaction_ToBeSetup_ItemIEs_t *action_item_ies = (RICaction_ToBeSetup_ItemIEs_t *)calloc(1, sizeof(RICaction_ToBeSetup_Item_t));
378   action_item_ies->id = proto_id;
379   action_item_ies->criticality = 0;
380
381   action_item_ies->value.present = pres6;
382   action_item_ies->value.choice.RICaction_ToBeSetup_Item.ricActionID = 5;
383   action_item_ies->value.choice.RICaction_ToBeSetup_Item.ricActionType = RICactionType_report;
384   action_item_ies->value.choice.RICaction_ToBeSetup_Item.ricActionDefinition = actdef;
385   action_item_ies->value.choice.RICaction_ToBeSetup_Item.ricSubsequentAction = sa;
386
387
388   printf("sub5\n");
389   
390
391   RICsubscriptionRequest_IEs__value_PR pres3;
392   printf("sub6.1\n");
393   pres3 = RICsubscriptionRequest_IEs__value_PR_RICsubscriptionDetails;
394   ricsubrid->id = ProtocolIE_ID_id_RICsubscriptionDetails;
395   printf("sub6.2\n");
396   
397   ricsubrid->criticality = 0;
398   ricsubrid->value.present = pres3;
399   printf("sub6.3\n");
400
401   ricsubrid->value.choice.RICsubscriptionDetails.ricEventTriggerDefinition = *triggerdef;
402   printf("sub6.4\n");
403   
404   ASN_SEQUENCE_ADD(&ricsubrid->value.choice.RICsubscriptionDetails.ricAction_ToBeSetup_List.list, action_item_ies);
405
406   printf("sub7\n");
407
408
409   ricreqid->id = ProtocolIE_ID_id_RICrequestID;
410   ricreqid->criticality = 0;
411   ricreqid->value.present = RICsubscriptionRequest_IEs__value_PR_RICrequestID;
412   ricreqid->value.choice.RICrequestID.ricRequestorID = 22;
413   ricreqid->value.choice.RICrequestID.ricInstanceID = 6;
414
415   RICsubscriptionRequest_t *ricsubreq = (RICsubscriptionRequest_t*)calloc(1, sizeof(RICsubscriptionRequest_t));
416
417   ASN_SEQUENCE_ADD(&ricsubreq->protocolIEs.list,ricreqid);
418   ASN_SEQUENCE_ADD(&ricsubreq->protocolIEs.list,ricsubrid);
419
420
421
422   InitiatingMessage__value_PR pres4;
423   pres4 = InitiatingMessage__value_PR_RICsubscriptionRequest;
424   InitiatingMessage_t *initmsg = (InitiatingMessage_t*)calloc(1, sizeof(InitiatingMessage_t));
425   initmsg->procedureCode = ProcedureCode_id_RICsubscription;
426   initmsg->criticality = Criticality_reject;
427   initmsg->value.present = pres4;
428   initmsg->value.choice.RICsubscriptionRequest = *ricsubreq;
429
430   E2AP_PDU_PR pres5;
431   pres5 = E2AP_PDU_PR_initiatingMessage;
432   
433
434   e2ap_pdu->present = pres5;
435   e2ap_pdu->choice.initiatingMessage = initmsg;
436
437   char *error_buf = (char*)calloc(300, sizeof(char));;
438   size_t errlen;
439                                                                           
440   asn_check_constraints(&asn_DEF_E2AP_PDU, e2ap_pdu, error_buf, &errlen);
441   printf("error length %d\n", errlen);
442   printf("error buf %s\n", error_buf);
443
444
445 }
446
447 void generate_e2apv1_subscription_response_success(E2AP_PDU *e2ap_pdu, long reqActionIdsAccepted[],
448                                                    long reqActionIdsRejected[], int accept_size, int reject_size,
449                                                    long reqRequestorId, long reqInstanceId) {
450
451   RICsubscriptionResponse_IEs_t *respricreqid =
452     (RICsubscriptionResponse_IEs_t*)calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
453   
454   respricreqid->id = ProtocolIE_ID_id_RICrequestID;
455   respricreqid->criticality = 0;
456   respricreqid->value.present = RICsubscriptionResponse_IEs__value_PR_RICrequestID;
457   respricreqid->value.choice.RICrequestID.ricRequestorID = reqRequestorId;
458   
459   respricreqid->value.choice.RICrequestID.ricInstanceID = reqInstanceId;
460
461
462   RICsubscriptionResponse_IEs_t *ricactionadmitted =
463     (RICsubscriptionResponse_IEs_t*)calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
464   ricactionadmitted->id = ProtocolIE_ID_id_RICactions_Admitted;
465   ricactionadmitted->criticality = 0;
466   ricactionadmitted->value.present = RICsubscriptionResponse_IEs__value_PR_RICaction_Admitted_List;
467
468   RICaction_Admitted_List_t* admlist = 
469     (RICaction_Admitted_List_t*)calloc(1,sizeof(RICaction_Admitted_List_t));
470   ricactionadmitted->value.choice.RICaction_Admitted_List = *admlist;
471
472
473   int numAccept = accept_size;
474   int numReject = reject_size;
475
476
477   
478   for (int i=0; i < numAccept ; i++) {
479     fprintf(stderr, "in for loop i = %d\n", i);
480
481     long aid = reqActionIdsAccepted[i];
482
483     RICaction_Admitted_ItemIEs_t *admitie = (RICaction_Admitted_ItemIEs_t*)calloc(1,sizeof(RICaction_Admitted_ItemIEs_t));
484     admitie->id = ProtocolIE_ID_id_RICaction_Admitted_Item;
485     admitie->criticality = 0;
486     admitie->value.present = RICaction_Admitted_ItemIEs__value_PR_RICaction_Admitted_Item;
487     admitie->value.choice.RICaction_Admitted_Item.ricActionID = aid;
488     
489     ASN_SEQUENCE_ADD(&ricactionadmitted->value.choice.RICaction_Admitted_List.list, admitie);
490
491   }
492
493   RICsubscriptionResponse_t *ricsubresp = (RICsubscriptionResponse_t*)calloc(1,sizeof(RICsubscriptionResponse_t));
494   ASN_SEQUENCE_ADD(&ricsubresp->protocolIEs.list, respricreqid);
495   ASN_SEQUENCE_ADD(&ricsubresp->protocolIEs.list, ricactionadmitted);
496   
497
498   if (numReject > 0) {
499
500     RICsubscriptionResponse_IEs_t *ricactionrejected =
501       (RICsubscriptionResponse_IEs_t*)calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
502     ricactionrejected->id = ProtocolIE_ID_id_RICactions_NotAdmitted;
503     ricactionrejected->criticality = 0;
504     ricactionrejected->value.present = RICsubscriptionResponse_IEs__value_PR_RICaction_NotAdmitted_List;
505     
506     RICaction_NotAdmitted_List_t* rejectlist = 
507       (RICaction_NotAdmitted_List_t*)calloc(1,sizeof(RICaction_NotAdmitted_List_t));
508     ricactionadmitted->value.choice.RICaction_NotAdmitted_List = *rejectlist;
509     
510     for (int i=0; i < numReject; i++) {
511       fprintf(stderr, "in for loop i = %d\n", i);
512       
513       long aid = reqActionIdsRejected[i];
514       
515       RICaction_NotAdmitted_ItemIEs_t *noadmitie = (RICaction_NotAdmitted_ItemIEs_t*)calloc(1,sizeof(RICaction_NotAdmitted_ItemIEs_t));
516       noadmitie->id = ProtocolIE_ID_id_RICaction_NotAdmitted_Item;
517       noadmitie->criticality = 0;
518       noadmitie->value.present = RICaction_NotAdmitted_ItemIEs__value_PR_RICaction_NotAdmitted_Item;
519       noadmitie->value.choice.RICaction_NotAdmitted_Item.ricActionID = aid;
520       
521       ASN_SEQUENCE_ADD(&ricactionrejected->value.choice.RICaction_NotAdmitted_List.list, noadmitie);
522       ASN_SEQUENCE_ADD(&ricsubresp->protocolIEs.list, ricactionrejected);      
523     }
524   }
525
526
527   SuccessfulOutcome__value_PR pres2;
528   pres2 = SuccessfulOutcome__value_PR_RICsubscriptionResponse;
529   SuccessfulOutcome_t *successoutcome = (SuccessfulOutcome_t*)calloc(1, sizeof(SuccessfulOutcome_t));
530   successoutcome->procedureCode = ProcedureCode_id_RICsubscription;
531   successoutcome->criticality = 0;
532   successoutcome->value.present = pres2;
533   successoutcome->value.choice.RICsubscriptionResponse = *ricsubresp;
534
535   E2AP_PDU_PR pres5 = E2AP_PDU_PR_successfulOutcome;
536   
537   e2ap_pdu->present = pres5;
538   e2ap_pdu->choice.successfulOutcome = successoutcome;
539
540   char *error_buf = (char*)calloc(300, sizeof(char));
541   size_t errlen;
542
543   asn_check_constraints(&asn_DEF_E2AP_PDU, e2ap_pdu, error_buf, &errlen);
544   printf("error length %d\n", errlen);
545   printf("error buf %s\n", error_buf);
546
547   
548 }
549
550 void generate_e2apv1_subscription_response(E2AP_PDU *e2ap_pdu, E2AP_PDU *sub_req_pdu) {
551
552   //Gather details of the request
553
554   RICsubscriptionRequest_t orig_req =
555     sub_req_pdu->choice.initiatingMessage->value.choice.RICsubscriptionRequest;
556   
557   RICsubscriptionResponse_IEs_t *ricreqid =
558     (RICsubscriptionResponse_IEs_t*)calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
559                                            
560   int count = orig_req.protocolIEs.list.count;
561   int size = orig_req.protocolIEs.list.size;
562   
563   RICsubscriptionRequest_IEs_t **ies = (RICsubscriptionRequest_IEs_t**)orig_req.protocolIEs.list.array;
564
565   fprintf(stderr, "count%d\n", count);
566   fprintf(stderr, "size%d\n", size);
567
568   RICsubscriptionRequest_IEs__value_PR pres;
569
570   long responseRequestorId;
571   long responseInstanceId;
572   long responseActionId;
573
574   std::vector<long> actionIds;
575
576   for (int i=0; i < count; i++) {
577     RICsubscriptionRequest_IEs_t *next_ie = ies[i];
578     pres = next_ie->value.present;
579     
580     fprintf(stderr, "next present value %d\n", pres);
581
582     switch(pres) {
583     case RICsubscriptionRequest_IEs__value_PR_RICrequestID:
584       {
585         RICrequestID_t reqId = next_ie->value.choice.RICrequestID;
586         long requestorId = reqId.ricRequestorID;
587         long instanceId = reqId.ricInstanceID;
588         fprintf(stderr, "requestorId %d\n", requestorId);
589         fprintf(stderr, "instanceId %d\n", instanceId);
590         responseRequestorId = requestorId;
591         responseInstanceId = instanceId;
592                 
593         break;
594       }
595     case RICsubscriptionRequest_IEs__value_PR_RANfunctionID:
596       break;
597     case RICsubscriptionRequest_IEs__value_PR_RICsubscriptionDetails:
598       {
599         RICsubscriptionDetails_t subDetails = next_ie->value.choice.RICsubscriptionDetails; 
600         RICeventTriggerDefinition_t triggerDef = subDetails.ricEventTriggerDefinition;
601         RICactions_ToBeSetup_List_t actionList = subDetails.ricAction_ToBeSetup_List;
602         
603         int actionCount = actionList.list.count;
604         fprintf(stderr, "action count%d\n", actionCount);
605
606         auto **item_array = actionList.list.array;
607
608         for (int i=0; i < actionCount; i++) {
609           //RICaction_ToBeSetup_Item_t
610           auto *next_item = item_array[i];
611           RICactionID_t actionId = ((RICaction_ToBeSetup_ItemIEs*)next_item)->value.choice.RICaction_ToBeSetup_Item.ricActionID;
612           fprintf(stderr, "Next Action ID %ld\n", actionId);
613           responseActionId = actionId;
614           actionIds.push_back(responseActionId);
615         }
616         
617         break;
618       }
619     }
620     
621   }
622
623   fprintf(stderr, "After Processing Subscription Request\n");
624
625   fprintf(stderr, "requestorId %d\n", responseRequestorId);
626   fprintf(stderr, "instanceId %d\n", responseInstanceId);
627
628
629   for (int i=0; i < actionIds.size(); i++) {
630     fprintf(stderr, "Action ID %d %ld\n", i, actionIds.at(i));
631     
632   }
633
634
635   RICsubscriptionResponse_IEs_t *respricreqid =
636     (RICsubscriptionResponse_IEs_t*)calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
637   
638   respricreqid->id = ProtocolIE_ID_id_RICrequestID;
639   respricreqid->criticality = 0;
640   respricreqid->value.present = RICsubscriptionResponse_IEs__value_PR_RICrequestID;
641   respricreqid->value.choice.RICrequestID.ricRequestorID = responseRequestorId;
642   
643   respricreqid->value.choice.RICrequestID.ricInstanceID = responseInstanceId;
644
645
646   RICsubscriptionResponse_IEs_t *ricactionadmitted =
647     (RICsubscriptionResponse_IEs_t*)calloc(1, sizeof(RICsubscriptionResponse_IEs_t));
648   ricactionadmitted->id = ProtocolIE_ID_id_RICactions_Admitted;
649   ricactionadmitted->criticality = 0;
650   ricactionadmitted->value.present = RICsubscriptionResponse_IEs__value_PR_RICaction_Admitted_List;
651
652   RICaction_Admitted_List_t* admlist = 
653     (RICaction_Admitted_List_t*)calloc(1,sizeof(RICaction_Admitted_List_t));
654   ricactionadmitted->value.choice.RICaction_Admitted_List = *admlist;
655
656   for (int i=0; i < actionIds.size(); i++) {
657     fprintf(stderr, "in for loop i = %d\n", i);
658
659     long aid = actionIds.at(i);
660
661     RICaction_Admitted_ItemIEs_t *admitie = (RICaction_Admitted_ItemIEs_t*)calloc(1,sizeof(RICaction_Admitted_ItemIEs_t));
662     admitie->id = ProtocolIE_ID_id_RICaction_Admitted_Item;
663     admitie->criticality = 0;
664     admitie->value.present = RICaction_Admitted_ItemIEs__value_PR_RICaction_Admitted_Item;
665     admitie->value.choice.RICaction_Admitted_Item.ricActionID = aid;
666     
667     ASN_SEQUENCE_ADD(&ricactionadmitted->value.choice.RICaction_Admitted_List.list, admitie);
668
669   }
670
671
672   RICsubscriptionResponse_t *ricsubresp = (RICsubscriptionResponse_t*)calloc(1,sizeof(RICsubscriptionResponse_t));
673   
674   ASN_SEQUENCE_ADD(&ricsubresp->protocolIEs.list, respricreqid);
675   ASN_SEQUENCE_ADD(&ricsubresp->protocolIEs.list, ricactionadmitted);
676
677
678   SuccessfulOutcome__value_PR pres2;
679   pres2 = SuccessfulOutcome__value_PR_RICsubscriptionResponse;
680   SuccessfulOutcome_t *successoutcome = (SuccessfulOutcome_t*)calloc(1, sizeof(SuccessfulOutcome_t));
681   successoutcome->procedureCode = ProcedureCode_id_RICsubscription;
682   successoutcome->criticality = 0;
683   successoutcome->value.present = pres2;
684   successoutcome->value.choice.RICsubscriptionResponse = *ricsubresp;
685
686   E2AP_PDU_PR pres5 = E2AP_PDU_PR_successfulOutcome;
687   
688   e2ap_pdu->present = pres5;
689   e2ap_pdu->choice.successfulOutcome = successoutcome;
690
691   char *error_buf = (char*)calloc(300, sizeof(char));
692   size_t errlen;
693
694   asn_check_constraints(&asn_DEF_E2AP_PDU, e2ap_pdu, error_buf, &errlen);
695   printf("error length %d\n", errlen);
696   printf("error buf %s\n", error_buf);
697   
698 }
699
700 void generate_e2apv1_indication_request_parameterized(E2AP_PDU *e2ap_pdu,
701                                                       long requestorId,
702                                                       long instanceId,
703                                                       long ranFunctionId,
704                                                       long actionId,
705                                                       long seqNum,
706                                                       uint8_t *ind_header_buf,
707                                                       int header_length,
708                                                       uint8_t *ind_message_buf,
709                                                       int message_length) {
710
711   fprintf(stderr, "ind1\n");
712   RICindication_IEs_t *ricind_ies = (RICindication_IEs_t*)calloc(1, sizeof(RICindication_IEs_t));
713   RICindication_IEs_t *ricind_ies2 = (RICindication_IEs_t*)calloc(1, sizeof(RICindication_IEs_t));
714   RICindication_IEs_t *ricind_ies3 = (RICindication_IEs_t*)calloc(1, sizeof(RICindication_IEs_t));
715   RICindication_IEs_t *ricind_ies4 = (RICindication_IEs_t*)calloc(1, sizeof(RICindication_IEs_t));
716   RICindication_IEs_t *ricind_ies5 = (RICindication_IEs_t*)calloc(1, sizeof(RICindication_IEs_t));
717   RICindication_IEs_t *ricind_ies6 = (RICindication_IEs_t*)calloc(1, sizeof(RICindication_IEs_t));
718   RICindication_IEs_t *ricind_ies7 = (RICindication_IEs_t*)calloc(1, sizeof(RICindication_IEs_t));
719   RICindication_IEs_t *ricind_ies8 = (RICindication_IEs_t*)calloc(1, sizeof(RICindication_IEs_t));
720
721   RICindication_IEs__value_PR pres3;
722
723   pres3 = RICindication_IEs__value_PR_RICrequestID;
724   ricind_ies->id = ProtocolIE_ID_id_RICrequestID;
725   ricind_ies->criticality = 0;
726   ricind_ies->value.present = pres3;
727   ricind_ies->value.choice.RICrequestID.ricRequestorID = requestorId;
728   ricind_ies->value.choice.RICrequestID.ricInstanceID = instanceId;
729
730   fprintf(stderr, "ind2\n");
731
732   pres3 = RICindication_IEs__value_PR_RANfunctionID;
733   ricind_ies2->id = ProtocolIE_ID_id_RANfunctionID;
734   ricind_ies2->criticality = 0;
735   ricind_ies2->value.present = pres3;
736   ricind_ies2->value.choice.RANfunctionID = ranFunctionId;
737
738   
739   ricind_ies3->id = ProtocolIE_ID_id_RICactionID;
740   ricind_ies3->criticality = 0;
741   pres3 =  RICindication_IEs__value_PR_RICactionID;
742   ricind_ies3->value.present = pres3;
743   ricind_ies3->value.choice.RICactionID = actionId;
744
745
746   pres3 = RICindication_IEs__value_PR_RICindicationSN;
747   ricind_ies4->id = ProtocolIE_ID_id_RICindicationSN;
748   ricind_ies4->criticality = 0;
749   ricind_ies4->value.present = pres3;
750   ricind_ies4->value.choice.RICindicationSN = seqNum;
751
752   //Indication type is REPORT
753   pres3 = RICindication_IEs__value_PR_RICindicationType;
754   ricind_ies5->id = ProtocolIE_ID_id_RICindicationType;
755   ricind_ies5->criticality = 0;
756   ricind_ies5->value.present = pres3;
757   ricind_ies5->value.choice.RICindicationType = 0;
758
759
760   uint8_t *buf2 = (uint8_t *)"reportheader";
761   OCTET_STRING_t *hdr_str = (OCTET_STRING_t*)calloc(1,sizeof(OCTET_STRING_t));
762
763   hdr_str->buf = (uint8_t*)calloc(1,header_length);
764   hdr_str->size = header_length;
765   memcpy(hdr_str->buf, ind_header_buf, header_length);
766
767   fprintf(stderr, "ind3\n");
768
769   ricind_ies6->value.choice.RICindicationHeader.buf = (uint8_t*)calloc(1,header_length);
770
771   pres3 = RICindication_IEs__value_PR_RICindicationHeader;
772   ricind_ies6->id = ProtocolIE_ID_id_RICindicationHeader;
773   ricind_ies6->criticality = 0;
774   ricind_ies6->value.present = pres3;
775   ricind_ies6->value.choice.RICindicationHeader.size = header_length;
776   memcpy(ricind_ies6->value.choice.RICindicationHeader.buf, ind_header_buf, header_length);
777   
778   ricind_ies7->value.choice.RICindicationMessage.buf = (uint8_t*)calloc(1,8192);
779
780
781   
782
783   pres3 = RICindication_IEs__value_PR_RICindicationMessage;
784   ricind_ies7->id = ProtocolIE_ID_id_RICindicationMessage;
785   fprintf(stderr, "after encoding message 1\n");
786
787   ricind_ies7->criticality = 0;
788   ricind_ies7->value.present = pres3;
789
790   fprintf(stderr, "after encoding message 2\n");
791
792   fprintf(stderr, "after encoding message 3\n");      
793   ricind_ies7->value.choice.RICindicationMessage.size = message_length;
794
795   fprintf(stderr, "after encoding message 4\n");
796   memcpy(ricind_ies7->value.choice.RICindicationMessage.buf, ind_message_buf, message_length);
797
798   fprintf(stderr, "after encoding message 5\n");      
799
800   uint8_t *cpid_buf = (uint8_t *)"cpid";
801   OCTET_STRING_t cpid_str;
802
803   printf("5.1\n");
804
805   int cpid_buf_len = strlen((char*)cpid_buf);
806   pres3 = RICindication_IEs__value_PR_RICcallProcessID;
807   ricind_ies8->id = ProtocolIE_ID_id_RICcallProcessID;
808
809   ricind_ies8->criticality = 0;
810   ricind_ies8->value.present = pres3;
811
812   ricind_ies8->value.choice.RICcallProcessID.buf = (uint8_t*)calloc(1,cpid_buf_len);
813   ricind_ies8->value.choice.RICcallProcessID.size = cpid_buf_len;
814
815   memcpy(ricind_ies8->value.choice.RICcallProcessID.buf, cpid_buf, cpid_buf_len);
816
817   printf("5.2\n");
818
819   RICindication_t *ricindication = (RICindication_t*)calloc(1, sizeof(RICindication_t));
820
821   
822   int ret;
823
824   ret = ASN_SEQUENCE_ADD(&ricindication->protocolIEs.list, ricind_ies);
825   
826   ret = ASN_SEQUENCE_ADD(&ricindication->protocolIEs.list, ricind_ies2);
827
828   printf("5.3\n");
829
830   ret = ASN_SEQUENCE_ADD(&ricindication->protocolIEs.list, ricind_ies3);
831
832   printf("5.35\n");
833   
834   ret = ASN_SEQUENCE_ADD(&ricindication->protocolIEs.list, ricind_ies4);
835
836   printf("5.36\n");
837   
838   ret = ASN_SEQUENCE_ADD(&ricindication->protocolIEs.list, ricind_ies5);
839
840   printf("5.4\n");
841   
842   ret = ASN_SEQUENCE_ADD(&ricindication->protocolIEs.list, ricind_ies6);
843
844   printf("5.5\n");
845
846   ret = ASN_SEQUENCE_ADD(&ricindication->protocolIEs.list, ricind_ies7);  
847   
848   //  ret = ASN_SEQUENCE_ADD(&ricindication->protocolIEs.list, ricind_ies8);    
849
850
851   InitiatingMessage__value_PR pres4;
852   pres4 = InitiatingMessage__value_PR_RICindication;
853   InitiatingMessage_t *initmsg = (InitiatingMessage_t*)calloc(1, sizeof(InitiatingMessage_t));
854   initmsg->procedureCode = 5;
855   initmsg->criticality = 1;
856   initmsg->value.present = pres4;
857   initmsg->value.choice.RICindication = *ricindication;
858
859   E2AP_PDU_PR pres5;
860   pres5 = E2AP_PDU_PR_initiatingMessage;
861   
862   e2ap_pdu->present = pres5;
863   e2ap_pdu->choice.initiatingMessage = initmsg;
864
865   char *error_buf = (char*)calloc(300, sizeof(char));
866   size_t errlen;
867
868   asn_check_constraints(&asn_DEF_E2AP_PDU, e2ap_pdu, error_buf, &errlen);
869   printf("error length %d\n", errlen);
870   printf("error buf %s\n", error_buf);
871
872   xer_fprint(stderr, &asn_DEF_E2AP_PDU, e2ap_pdu);  
873
874 }
875
876 void generate_e2apv1_indication_request(E2AP_PDU *e2ap_pdu) {
877   fprintf(stderr, "ind1\n");
878   RICindication_IEs_t *ricind_ies = (RICindication_IEs_t*)calloc(1, sizeof(RICindication_IEs_t));
879   RICindication_IEs_t *ricind_ies2 = (RICindication_IEs_t*)calloc(1, sizeof(RICindication_IEs_t));
880   RICindication_IEs_t *ricind_ies3 = (RICindication_IEs_t*)calloc(1, sizeof(RICindication_IEs_t));
881   RICindication_IEs_t *ricind_ies4 = (RICindication_IEs_t*)calloc(1, sizeof(RICindication_IEs_t));
882   RICindication_IEs_t *ricind_ies5 = (RICindication_IEs_t*)calloc(1, sizeof(RICindication_IEs_t));
883   RICindication_IEs_t *ricind_ies6 = (RICindication_IEs_t*)calloc(1, sizeof(RICindication_IEs_t));
884   RICindication_IEs_t *ricind_ies7 = (RICindication_IEs_t*)calloc(1, sizeof(RICindication_IEs_t));
885   RICindication_IEs_t *ricind_ies8 = (RICindication_IEs_t*)calloc(1, sizeof(RICindication_IEs_t));
886
887   RICindication_IEs__value_PR pres3;
888
889   pres3 = RICindication_IEs__value_PR_RICrequestID;
890   ricind_ies->id = ProtocolIE_ID_id_RICrequestID;
891   ricind_ies->criticality = 0;
892   ricind_ies->value.present = pres3;
893   ricind_ies->value.choice.RICrequestID.ricRequestorID = 25;
894   ricind_ies->value.choice.RICrequestID.ricInstanceID = 3;
895
896   fprintf(stderr, "ind2\n");  
897
898   pres3 = RICindication_IEs__value_PR_RANfunctionID;
899   ricind_ies2->id = ProtocolIE_ID_id_RANfunctionID;
900   ricind_ies2->criticality = 0;
901   ricind_ies2->value.present = pres3;
902   ricind_ies2->value.choice.RANfunctionID = 70;
903
904   
905   ricind_ies3->id = ProtocolIE_ID_id_RICactionID;
906   ricind_ies3->criticality = 0;
907   pres3 =  RICindication_IEs__value_PR_RICactionID;
908   ricind_ies3->value.present = pres3;
909   ricind_ies3->value.choice.RICactionID = 80;
910
911
912   pres3 = RICindication_IEs__value_PR_RICindicationSN;
913   ricind_ies4->id = ProtocolIE_ID_id_RICindicationSN;
914   ricind_ies4->criticality = 0;
915   ricind_ies4->value.present = pres3;
916   ricind_ies4->value.choice.RICindicationSN = 45;
917
918   pres3 = RICindication_IEs__value_PR_RICindicationType;
919   ricind_ies5->id = ProtocolIE_ID_id_RICindicationType;
920   ricind_ies5->criticality = 0;
921   ricind_ies5->value.present = pres3;
922   ricind_ies5->value.choice.RICindicationType = 0;
923
924
925   uint8_t *buf2 = (uint8_t *)"reportheader";
926   OCTET_STRING_t *hdr_str = (OCTET_STRING_t*)calloc(1,sizeof(OCTET_STRING_t));
927   hdr_str->buf = (uint8_t*)calloc(1,12);
928   hdr_str->size = 12;
929   memcpy(hdr_str->buf, buf2, 12);
930
931   fprintf(stderr, "ind3\n");
932
933   ricind_ies6->value.choice.RICindicationHeader.buf = (uint8_t*)calloc(1,12);
934
935   pres3 = RICindication_IEs__value_PR_RICindicationHeader;
936   ricind_ies6->id = ProtocolIE_ID_id_RICindicationHeader;
937   ricind_ies6->criticality = 0;
938   ricind_ies6->value.present = pres3;
939   ricind_ies6->value.choice.RICindicationHeader.size = 12;
940   memcpy(ricind_ies6->value.choice.RICindicationHeader.buf, buf2, 12);
941   
942   ricind_ies7->value.choice.RICindicationMessage.buf = (uint8_t*)calloc(1,8192);
943
944
945
946   E2SM_KPM_RANfunction_Description_t *e2sm_desc =
947     (E2SM_KPM_RANfunction_Description_t*)calloc(1,sizeof(E2SM_KPM_RANfunction_Description_t));
948
949   encode_kpm_function_description(e2sm_desc);
950   
951   
952   uint8_t e2smbuffer[8192];
953   size_t e2smbuffer_size = 8192;
954
955   asn_codec_ctx_t *opt_cod;
956
957   
958   asn_enc_rval_t er =
959     asn_encode_to_buffer(opt_cod,
960                          ATS_ALIGNED_BASIC_PER,
961                          &asn_DEF_E2SM_KPM_RANfunction_Description,
962                          e2sm_desc, e2smbuffer, e2smbuffer_size);
963     
964   
965   fprintf(stderr, "er encded is %d\n", er.encoded);
966   fprintf(stderr, "after encoding message\n");
967   
968   OCTET_STRING_t *msg_str = (OCTET_STRING_t*)calloc(1,sizeof(OCTET_STRING_t));
969   msg_str->buf = (uint8_t*)calloc(1,er.encoded);
970   msg_str->size = er.encoded;
971   memcpy(msg_str->buf, e2smbuffer, er.encoded);
972   
973
974   pres3 = RICindication_IEs__value_PR_RICindicationMessage;
975   ricind_ies7->id = ProtocolIE_ID_id_RICindicationMessage;
976   fprintf(stderr, "after encoding message 1\n");
977
978   ricind_ies7->criticality = 0;
979   ricind_ies7->value.present = pres3;
980
981   fprintf(stderr, "after encoding message 2\n");
982
983   fprintf(stderr, "after encoding message 3\n");      
984   ricind_ies7->value.choice.RICindicationMessage.size = er.encoded;
985
986   fprintf(stderr, "after encoding message 4\n");      
987   memcpy(ricind_ies7->value.choice.RICindicationMessage.buf, e2smbuffer, er.encoded);
988
989   fprintf(stderr, "after encoding message 5\n");      
990
991   uint8_t *buf4 = (uint8_t *)"cpid";
992   OCTET_STRING_t cpid_str;
993   cpid_str.buf = buf4;
994   cpid_str.size = 4;      
995
996
997   pres3 = RICindication_IEs__value_PR_RICcallProcessID;
998   ricind_ies8->id = ProtocolIE_ID_id_RICcallProcessID;
999
1000   ricind_ies8->criticality = 0;
1001   ricind_ies8->value.present = pres3;
1002
1003   ricind_ies8->value.choice.RICcallProcessID = cpid_str;
1004
1005
1006   RICindication_t *ricindication = (RICindication_t*)calloc(1, sizeof(RICindication_t));
1007
1008   
1009   int ret;
1010   /*
1011     ret = ASN_SEQUENCE_ADD(&ricindication->protocolIEs.list, ricind_ies);
1012
1013     ret = ASN_SEQUENCE_ADD(&ricindication->protocolIEs.list, ricind_ies2);
1014
1015     ret = ASN_SEQUENCE_ADD(&ricindication->protocolIEs.list, ricind_ies3);  
1016     ret = ASN_SEQUENCE_ADD(&ricindication->protocolIEs.list, ricind_ies4);
1017     ret = ASN_SEQUENCE_ADD(&ricindication->protocolIEs.list, ricind_ies5);  
1018
1019     ret = ASN_SEQUENCE_ADD(&ricindication->protocolIEs.list, ricind_ies6);
1020   */
1021     ret = ASN_SEQUENCE_ADD(&ricindication->protocolIEs.list, ricind_ies7);  
1022
1023   ret = ASN_SEQUENCE_ADD(&ricindication->protocolIEs.list, ricind_ies8);    
1024
1025
1026   InitiatingMessage__value_PR pres4;
1027   pres4 = InitiatingMessage__value_PR_RICindication;
1028   InitiatingMessage_t *initmsg = (InitiatingMessage_t*)calloc(1, sizeof(InitiatingMessage_t));
1029   initmsg->procedureCode = 5;
1030   initmsg->criticality = 1;
1031   initmsg->value.present = pres4;
1032   initmsg->value.choice.RICindication = *ricindication;
1033
1034   E2AP_PDU_PR pres5;
1035   pres5 = E2AP_PDU_PR_initiatingMessage;
1036   
1037   e2ap_pdu->present = pres5;
1038   e2ap_pdu->choice.initiatingMessage = initmsg;
1039
1040   char *error_buf = (char*)calloc(300, sizeof(char));;
1041   size_t errlen;  
1042
1043   asn_check_constraints(&asn_DEF_E2AP_PDU, e2ap_pdu, error_buf, &errlen);
1044   printf("error length %d\n", errlen);
1045   printf("error buf %s\n", error_buf);
1046
1047   xer_fprint(stderr, &asn_DEF_E2AP_PDU, e2ap_pdu);
1048 }
1049
1050
1051 void generate_e2apv1_indication_response(E2AP_PDU *e2ap_pdu) {
1052
1053
1054 }