036d704dcd210870f691a2b06cf282b046c07211
[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   ie_index = 5;
197   if(dinput.call_process_id_size > 0){
198     E2N_RICcontrolRequest_IEs_t *ies_callprocid = &IE_array[ie_index];
199     ies_callprocid->criticality = E2N_Criticality_reject;
200     ies_callprocid->id = E2N_ProtocolIE_ID_id_RICcallProcessID;
201     ies_callprocid->value.present = E2N_RICcontrolRequest_IEs__value_PR_RICcallProcessID;
202     E2N_RICcallProcessID_t *riccallprocessid_ie = &ies_callprocid->value.choice.RICcallProcessID;
203     riccallprocessid_ie->buf = dinput.call_process_id;
204     riccallprocessid_ie->size = dinput.call_process_id_size;
205     ASN_SEQUENCE_ADD(&(ric_control_request->protocolIEs), &(IE_array[ie_index]));
206
207   }
208   return true;
209
210 };
211
212   
213
214
215 bool ric_control_request:: get_fields(E2N_InitiatingMessage_t * init_msg,  ric_control_helper &dout)
216 {
217   if (init_msg == 0){
218     error_string = "Invalid reference for E2AP Control_Request message in get_fields";
219     return false;
220   }
221   
222  
223   for(int edx = 0; edx < init_msg->value.choice.RICcontrolRequest.protocolIEs.list.count; edx++) {
224     E2N_RICcontrolRequest_IEs_t *memb_ptr = init_msg->value.choice.RICcontrolRequest.protocolIEs.list.array[edx];
225     
226     switch(memb_ptr->id)
227       {
228       case (E2N_ProtocolIE_ID_id_RICcontrolHeader):
229         dout.control_header = memb_ptr->value.choice.RICcontrolHeader.buf;
230         dout.control_header_size = memb_ptr->value.choice.RICcontrolHeader.size;
231         break;
232         
233       case (E2N_ProtocolIE_ID_id_RICcontrolMessage):
234         dout.control_msg =  memb_ptr->value.choice.RICcontrolMessage.buf;
235         dout.control_msg_size = memb_ptr->value.choice.RICcontrolMessage.size;
236         break;
237
238       case (E2N_ProtocolIE_ID_id_RICcallProcessID):
239         dout.call_process_id =  memb_ptr->value.choice.RICcallProcessID.buf;
240         dout.call_process_id_size = memb_ptr->value.choice.RICcallProcessID.size;
241         break;
242
243       case (E2N_ProtocolIE_ID_id_RICrequestID):
244         dout.req_id = memb_ptr->value.choice.RICrequestID.ricRequestorID;
245         dout.req_seq_no = memb_ptr->value.choice.RICrequestID.ricRequestSequenceNumber;
246         break;
247         
248       case (E2N_ProtocolIE_ID_id_RANfunctionID):
249         dout.func_id = memb_ptr->value.choice.RANfunctionID;
250         break;
251         
252       case (E2N_ProtocolIE_ID_id_RICcontrolAckRequest):
253         dout.control_ack = memb_ptr->value.choice.RICcontrolAckRequest;
254         break;
255         
256       default:
257         break;
258       }
259     
260   }
261   
262   return true;
263
264 }
265
266 E2N_InitiatingMessage_t * ric_control_request::get_message(void)  {
267     return initMsg;
268 }