1. Transitioned to using latest asn1c compiler
[ric-app/admin.git] / src / E2AP-c / e2ap_control.cc
1 /*
2 ==================================================================================
3
4         Copyright (c) 2018-2019 AT&T Intellectual Property.
5
6    Licensed under the Apache License, Version 2.0 (the "License");
7    you may not use this file except in compliance with the License.
8    You may obtain a copy of the License at
9
10        http://www.apache.org/licenses/LICENSE-2.0
11
12    Unless required by applicable law or agreed to in writing, software
13    distributed under the License is distributed on an "AS IS" BASIS,
14    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15    See the License for the specific language governing permissions and
16    limitations under the License.
17 ==================================================================================
18 */
19 /*
20  * ric_control_request.c
21  *
22  *  Created on: Jul 11, 2019
23  *      Author: sjana, Ashwin Sridharan
24  */
25
26 #include <e2ap_control.hpp>
27
28 // Set up the initiating message and also allocate protocolIEs in container
29 // Note : this bypasses requirement to use ASN_SEQUENCE_ADD. We can directly
30 // assign pointers to the array in ProtocolIE. However, this also leaves us on the
31 // hook to manually clear the memory
32
33 ric_control_request::ric_control_request(void){
34
35   e2ap_pdu_obj = 0;
36   e2ap_pdu_obj = (E2N_E2AP_PDU_t * )calloc(1, sizeof(E2N_E2AP_PDU_t));
37   assert(e2ap_pdu_obj != 0);
38
39   initMsg = 0;
40   initMsg = (E2N_InitiatingMessage_t * )calloc(1, sizeof(E2N_InitiatingMessage_t));
41   assert(initMsg != 0);
42
43   IE_array = 0;
44   IE_array = (E2N_RICcontrolRequest_IEs_t *)calloc(NUM_CONTROL_REQUEST_IES, sizeof(E2N_RICcontrolRequest_IEs_t));
45   assert(IE_array != 0);
46
47   e2ap_pdu_obj->present = E2N_E2AP_PDU_PR_initiatingMessage;
48   e2ap_pdu_obj->choice.initiatingMessage = initMsg;
49
50   
51 };
52
53
54 // Clear assigned protocolIE list from RIC control_request IE container
55 ric_control_request::~ric_control_request(void){
56
57   mdclog_write(MDCLOG_DEBUG, "Freeing E2AP Control Request object memory");
58   
59   E2N_RICcontrolRequest_t *ricControl_Request  = &(initMsg->value.choice.RICcontrolRequest);
60   for(int i = 0; i < ricControl_Request->protocolIEs.list.size; i++){
61     ricControl_Request->protocolIEs.list.array[i] = 0;
62   }
63   
64   if (ricControl_Request->protocolIEs.list.size > 0){
65     free(ricControl_Request->protocolIEs.list.array);
66     ricControl_Request->protocolIEs.list.size = 0;
67     ricControl_Request->protocolIEs.list.count = 0;
68   }
69   
70   free(IE_array);
71   free(initMsg);
72   e2ap_pdu_obj->choice.initiatingMessage = 0;
73   
74   ASN_STRUCT_FREE(asn_DEF_E2N_E2AP_PDU, e2ap_pdu_obj);
75   mdclog_write(MDCLOG_DEBUG, "Freed E2N_E2AP Control Request object mempory");
76   
77 }
78
79
80 bool ric_control_request::encode_e2ap_control_request(unsigned char *buf, size_t *size, ric_control_helper & dinput){
81
82   initMsg->procedureCode = E2N_ProcedureCode_id_ricControl;
83   initMsg->criticality = E2N_Criticality_ignore;
84   initMsg->value.present = E2N_InitiatingMessage__value_PR_RICcontrolRequest;
85
86   bool res;
87   
88   res = set_fields(initMsg, dinput);
89   if (!res){
90     return false;
91   }
92
93   int ret_constr = asn_check_constraints(&asn_DEF_E2N_E2AP_PDU, (void *) e2ap_pdu_obj, errbuf, &errbuf_len);
94   if(ret_constr){
95     error_string.assign(errbuf, errbuf_len);
96     error_string = "Constraints failed for encoding control . Reason = " + error_string;
97     return false;
98   }
99
100   //xer_fprint(stdout, &asn_DEF_E2N_E2AP_PDU, e2ap_pdu_obj);
101   
102   asn_enc_rval_t retval = asn_encode_to_buffer(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2N_E2AP_PDU, e2ap_pdu_obj, buf, *size);
103   
104   if(retval.encoded == -1){
105     error_string.assign(strerror(errno));
106     return false;
107   }
108   else {
109     if(*size < retval.encoded){
110       std::stringstream ss;
111       ss  <<"Error encoding event trigger definition. Reason =  encoded pdu size " << retval.encoded << " exceeds buffer size " << *size << std::endl;
112       error_string = ss.str();
113       return false;
114     }
115   }
116
117   *size = retval.encoded;
118   return true;
119   
120 }
121
122 bool ric_control_request::set_fields(E2N_InitiatingMessage_t *initMsg, ric_control_helper &dinput){
123   unsigned int ie_index;
124
125   if (initMsg == 0){
126     error_string = "Invalid reference for E2AP Control_Request message in set_fields";
127     return false;
128   }
129
130   E2N_RICcontrolRequest_t * ric_control_request = &(initMsg->value.choice.RICcontrolRequest);
131   ric_control_request->protocolIEs.list.count = 0;
132   
133   // for(i = 0; i < NUM_CONTROL_REQUEST_IES;i++){
134   //   memset(&(IE_array[i]), 0, sizeof(RICcontrolRequest_IEs_t));
135   // }
136  
137  
138   ie_index = 0;
139   E2N_RICcontrolRequest_IEs_t *ies_ricreq = &IE_array[ie_index];  
140   ies_ricreq->criticality = E2N_Criticality_reject;
141   ies_ricreq->id = E2N_ProtocolIE_ID_id_RICrequestID;
142   ies_ricreq->value.present = E2N_RICcontrolRequest_IEs__value_PR_RICrequestID;
143   E2N_RICrequestID_t *ricrequest_ie = &ies_ricreq->value.choice.RICrequestID;
144   ricrequest_ie->ricRequestorID = dinput.req_id;
145   ricrequest_ie->ricRequestSequenceNumber = dinput.req_seq_no;
146   ASN_SEQUENCE_ADD(&(ric_control_request->protocolIEs), &(IE_array[ie_index]));
147
148   ie_index = 1;
149   E2N_RICcontrolRequest_IEs_t *ies_ranfunc = &IE_array[ie_index];
150   ies_ranfunc->criticality = E2N_Criticality_reject;
151   ies_ranfunc->id = E2N_ProtocolIE_ID_id_RANfunctionID;
152   ies_ranfunc->value.present = E2N_RICcontrolRequest_IEs__value_PR_RANfunctionID;
153   E2N_RANfunctionID_t *ranfunction_ie = &ies_ranfunc->value.choice.RANfunctionID;
154   *ranfunction_ie = dinput.func_id;
155   ASN_SEQUENCE_ADD(&(ric_control_request->protocolIEs), &(IE_array[ie_index]));
156
157
158   // ie_index = 2;
159   // RICcontrolRequest_IEs_t *ies_riccallprocessid = &IE_array[ie_index];
160   // ies_riccallprocessid->criticality = E2N_Criticality_reject;
161   // ies_riccallprocessid->id = E2N_ProtocolIE_ID_id_RICcallProcessID;
162   // ies_riccallprocessid->value.present = E2N_RICcontrolRequest_IEs__value_PR_RICcallProcessID;
163   // RICcallProcessID_t *riccallprocessid_ie = &ies_riccallprocessid->value.choice.RICcallProcessID;
164   // riccallprocessid_ie->buf = dinput.call_process_id;
165   // riccallprocessid_ie->size = dinput.call_process_id_size;
166
167   ie_index = 2;
168   E2N_RICcontrolRequest_IEs_t *ies_richead = &IE_array[ie_index];
169   ies_richead->criticality = E2N_Criticality_reject;
170   ies_richead->id = E2N_ProtocolIE_ID_id_RICcontrolHeader;
171   ies_richead->value.present = E2N_RICcontrolRequest_IEs__value_PR_RICcontrolHeader;
172   E2N_RICcontrolHeader_t *richeader_ie = &ies_richead->value.choice.RICcontrolHeader;
173   richeader_ie->buf = dinput.control_header;
174   richeader_ie->size = dinput.control_header_size;
175   ASN_SEQUENCE_ADD(&(ric_control_request->protocolIEs), &(IE_array[ie_index]));
176   
177   ie_index = 3;
178   E2N_RICcontrolRequest_IEs_t *ies_indmsg = &IE_array[ie_index];
179   ies_indmsg->criticality = E2N_Criticality_reject;
180   ies_indmsg->id = E2N_ProtocolIE_ID_id_RICcontrolMessage;
181   ies_indmsg->value.present = E2N_RICcontrolRequest_IEs__value_PR_RICcontrolMessage;
182   E2N_RICcontrolMessage_t *ricmsg_ie = &ies_indmsg->value.choice.RICcontrolMessage;
183   ricmsg_ie->buf = dinput.control_msg;
184   ricmsg_ie->size = dinput.control_msg_size;
185   ASN_SEQUENCE_ADD(&(ric_control_request->protocolIEs), &(IE_array[ie_index]));
186
187   ie_index = 4;
188   E2N_RICcontrolRequest_IEs_t *ies_indtyp = &IE_array[ie_index];
189   ies_indtyp->criticality = E2N_Criticality_reject;
190   ies_indtyp->id = E2N_ProtocolIE_ID_id_RICcontrolAckRequest;
191   ies_indtyp->value.present = E2N_RICcontrolRequest_IEs__value_PR_RICcontrolAckRequest;
192   E2N_RICcontrolAckRequest_t *ricackreq_ie = &ies_indtyp->value.choice.RICcontrolAckRequest;
193   *ricackreq_ie = dinput.control_ack;
194   ASN_SEQUENCE_ADD(&(ric_control_request->protocolIEs), &(IE_array[ie_index]));
195
196   return true;
197
198 };
199
200   
201
202
203 bool ric_control_request:: get_fields(E2N_InitiatingMessage_t * init_msg,  ric_control_helper &dout)
204 {
205   if (init_msg == 0){
206     error_string = "Invalid reference for E2AP Control_Request message in get_fields";
207     return false;
208   }
209   
210  
211   for(int edx = 0; edx < init_msg->value.choice.RICcontrolRequest.protocolIEs.list.count; edx++) {
212     E2N_RICcontrolRequest_IEs_t *memb_ptr = init_msg->value.choice.RICcontrolRequest.protocolIEs.list.array[edx];
213     
214     switch(memb_ptr->id)
215       {
216       case (E2N_ProtocolIE_ID_id_RICcontrolHeader):
217         dout.control_header = memb_ptr->value.choice.RICcontrolHeader.buf;
218         dout.control_header_size = memb_ptr->value.choice.RICcontrolHeader.size;
219         break;
220         
221       case (E2N_ProtocolIE_ID_id_RICcontrolMessage):
222         dout.control_msg =  memb_ptr->value.choice.RICcontrolMessage.buf;
223         dout.control_msg_size = memb_ptr->value.choice.RICcontrolMessage.size;
224         break;
225
226       case (E2N_ProtocolIE_ID_id_RICcallProcessID):
227         dout.call_process_id =  memb_ptr->value.choice.RICcallProcessID.buf;
228         dout.call_process_id_size = memb_ptr->value.choice.RICcallProcessID.size;
229         break;
230
231       case (E2N_ProtocolIE_ID_id_RICrequestID):
232         dout.req_id = memb_ptr->value.choice.RICrequestID.ricRequestorID;
233         dout.req_seq_no = memb_ptr->value.choice.RICrequestID.ricRequestSequenceNumber;
234         break;
235         
236       case (E2N_ProtocolIE_ID_id_RANfunctionID):
237         dout.func_id = memb_ptr->value.choice.RANfunctionID;
238         break;
239         
240       case (E2N_ProtocolIE_ID_id_RICcontrolAckRequest):
241         dout.control_ack = memb_ptr->value.choice.RICcontrolAckRequest;
242         break;
243         
244         
245       default:
246         break;
247       }
248     
249   }
250   
251   return true;
252
253 }
254
255 E2N_InitiatingMessage_t * ric_control_request::get_message(void)  {
256     return initMsg;
257 }