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