Revision of copyright
[ric-app/kpimon.git] / src / E2AP-c / subscription / subscription_request.cc
1 \r
2 \r
3 /*\r
4 ==================================================================================\r
5         Copyright (c) 2018-2019 SAMSUNG Intellectual Property.\r
6 \r
7    Licensed under the Apache License, Version 2.0 (the "License");\r
8    you may not use this file except in compliance with the License.\r
9    You may obtain a copy of the License at\r
10 \r
11        http://www.apache.org/licenses/LICENSE-2.0\r
12 \r
13    Unless required by applicable law or agreed to in writing, software\r
14    distributed under the License is distributed on an "AS IS" BASIS,\r
15    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16    See the License for the specific language governing permissions and\r
17    limitations under the License.\r
18 ==================================================================================\r
19 */\r
20 \r
21 \r
22 #include "subscription_request.hpp"\r
23   \r
24 subscription_request::subscription_request(void){\r
25 \r
26   _name = "default";\r
27 \r
28   e2ap_pdu_obj = 0;\r
29   e2ap_pdu_obj = (E2AP_PDU_t * )calloc(1, sizeof(E2AP_PDU_t));\r
30   assert(e2ap_pdu_obj != 0);\r
31 \r
32   initMsg = 0;\r
33   initMsg = (InitiatingMessage_t * )calloc(1, sizeof(InitiatingMessage_t));\r
34   assert(initMsg != 0);\r
35 \r
36   IE_array = 0;\r
37   IE_array = (RICsubscriptionRequest_IEs_t *)calloc(NUM_SUBSCRIPTION_REQUEST_IES, sizeof(RICsubscriptionRequest_IEs_t));\r
38   assert(IE_array != 0);\r
39   \r
40   action_array = 0;\r
41   action_array = (RICaction_ToBeSetup_ItemIEs_t *)calloc(INITIAL_LIST_SIZE, sizeof(RICaction_ToBeSetup_ItemIEs_t));\r
42   assert(action_array != 0);\r
43   action_array_size = INITIAL_LIST_SIZE;\r
44   \r
45 };\r
46 \r
47 \r
48 \r
49 // Clear assigned protocolIE list from RIC indication IE container\r
50 subscription_request::~subscription_request(void){\r
51     \r
52   mdclog_write(MDCLOG_INFO, "Freeing subscription request memory for");;\r
53   \r
54   // Sequence of actions to be admitted causes special heart-ache. Free ric subscription element manually and reset the ie pointer  \r
55   RICsubscription_t * ricsubscription_ie = &(IE_array[2].value.choice.RICsubscription);\r
56 \r
57   for(int i = 0; i < ricsubscription_ie->ricAction_ToBeSetup_List.list.size; i++){\r
58     ricsubscription_ie->ricAction_ToBeSetup_List.list.array[i] = 0;\r
59   }\r
60 \r
61   if (ricsubscription_ie->ricAction_ToBeSetup_List.list.size > 0){\r
62     free(ricsubscription_ie->ricAction_ToBeSetup_List.list.array);\r
63     ricsubscription_ie->ricAction_ToBeSetup_List.list.size = 0;\r
64     ricsubscription_ie->ricAction_ToBeSetup_List.list.count = 0;\r
65     ricsubscription_ie->ricAction_ToBeSetup_List.list.array = 0;\r
66   }\r
67   \r
68   free(action_array);\r
69   RICsubscriptionRequest_t * subscription_request = &(initMsg->value.choice.RICsubscriptionRequest);\r
70   \r
71   for(int i = 0; i < subscription_request->protocolIEs.list.size; i++){\r
72     subscription_request->protocolIEs.list.array[i] = 0;\r
73   }\r
74   \r
75   if( subscription_request->protocolIEs.list.size > 0){\r
76     free( subscription_request->protocolIEs.list.array);\r
77     subscription_request->protocolIEs.list.array = 0;\r
78     subscription_request->protocolIEs.list.size = 0;\r
79     subscription_request->protocolIEs.list.count = 0;\r
80   }\r
81   \r
82   free(IE_array);\r
83   free(initMsg);\r
84   e2ap_pdu_obj->choice.initiatingMessage = 0;\r
85   \r
86   ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, e2ap_pdu_obj);\r
87   mdclog_write(MDCLOG_INFO, "Freed subscription request memory ");\r
88 };\r
89 \r
90 \r
91 bool subscription_request::encode_e2ap_subscription(unsigned char *buf, size_t *size, E2AP_PDU_t *e2ap_pdu, subscription_helper &dinput){\r
92 \r
93   bool res;\r
94   \r
95   e2ap_pdu_obj->choice.initiatingMessage = initMsg;\r
96   e2ap_pdu_obj->present = E2AP_PDU_PR_initiatingMessage;\r
97   \r
98   res = set_fields(e2ap_pdu_obj->choice.initiatingMessage, dinput);\r
99   if (!res){\r
100     return false;\r
101   }\r
102   \r
103   //xer_fprint(stdout, &asn_DEF_E2AP_PDU, e2ap_pdu_obj);\r
104   int ret_constr = asn_check_constraints(&asn_DEF_E2AP_PDU, (void *) e2ap_pdu_obj, errbuf, &errbuf_len);\r
105   if(ret_constr){\r
106     error_string.assign(errbuf, errbuf_len);\r
107     error_string = "Constraints failed for encoding subscription request. Reason = " + error_string;\r
108     return false;\r
109   }\r
110   \r
111   asn_enc_rval_t retval = asn_encode_to_buffer(0, ATS_ALIGNED_BASIC_PER, &asn_DEF_E2AP_PDU, e2ap_pdu_obj, buf, *size);\r
112     \r
113   if(retval.encoded == -1){\r
114     error_string.assign(strerror(errno));\r
115     error_string = "Error encoding Subscription Delete Request. Reason = " + error_string;\r
116     return false;\r
117   }\r
118   else {\r
119     if(*size < retval.encoded){\r
120       std::stringstream ss;\r
121       ss  <<"Error encoding Subscription Delete Request . Reason =  encoded pdu size " << retval.encoded << " exceeds buffer size " << *size << std::endl;\r
122       error_string = ss.str();\r
123       retval.encoded = -1;\r
124       return false;\r
125     }\r
126   }\r
127     \r
128   *size = retval.encoded;\r
129   return true;\r
130     \r
131 }\r
132 \r
133 \r
134 bool subscription_request::set_fields(InitiatingMessage_t *ref_initMsg, subscription_helper &helper){\r
135 \r
136   if (ref_initMsg == 0){\r
137     error_string = "Error : Invalid reference when setting fields for subscription request";\r
138     return false;\r
139   }\r
140   \r
141   int ie_index;\r
142   int result = 0;\r
143   \r
144   ref_initMsg->procedureCode = ProcedureCode_id_ricSubscription;\r
145   ref_initMsg->criticality = Criticality_reject;\r
146   ref_initMsg->value.present = InitiatingMessage__value_PR_RICsubscriptionRequest;\r
147 \r
148   RICsubscriptionRequest_t * subscription_request = &(ref_initMsg->value.choice.RICsubscriptionRequest);\r
149 \r
150   // Reset field count for protocolIEs\r
151   subscription_request->protocolIEs.list.count = 0;\r
152   \r
153   ie_index = 0;\r
154   RICsubscriptionRequest_IEs_t *ies_ricreq = &IE_array[ie_index];\r
155   ies_ricreq->criticality = Criticality_reject;\r
156   ies_ricreq->id = ProtocolIE_ID_id_RICrequestID;\r
157   ies_ricreq->value.present = RICsubscriptionRequest_IEs__value_PR_RICrequestID;\r
158   RICrequestID_t *ricrequest_ie = &ies_ricreq->value.choice.RICrequestID;\r
159   ricrequest_ie->ricRequestorID = helper.get_request_id();\r
160   ricrequest_ie->ricRequestSequenceNumber = helper.get_req_seq();\r
161   result = ASN_SEQUENCE_ADD(&subscription_request->protocolIEs, ies_ricreq);\r
162   if (result == -1){\r
163      error_string = "Erorr : Unable to assign memory to add RIC request id to subscription request";\r
164     return false;\r
165   }\r
166      \r
167   ie_index = 1;\r
168   RICsubscriptionRequest_IEs_t *ies_ranfunc = &IE_array[ie_index];\r
169   ies_ranfunc->criticality = Criticality_reject;\r
170   ies_ranfunc->id = ProtocolIE_ID_id_RANfunctionID;\r
171   ies_ranfunc->value.present = RICsubscriptionRequest_IEs__value_PR_RANfunctionID;\r
172   RANfunctionID_t *ranfunction_ie = &ies_ranfunc->value.choice.RANfunctionID;\r
173   *ranfunction_ie = helper.get_function_id();\r
174   ASN_SEQUENCE_ADD(&subscription_request->protocolIEs, ies_ranfunc);\r
175   if (result == -1){\r
176     error_string = "Erorr : Unable to assign memory to add RAN function id to subscription request";\r
177     return false;\r
178   }\r
179 \r
180 \r
181   ie_index = 2;\r
182   RICsubscriptionRequest_IEs_t *ies_actid = &IE_array[ie_index];\r
183   ies_actid->criticality = Criticality_reject;\r
184   ies_actid->id = ProtocolIE_ID_id_RICsubscription;\r
185   ies_actid->value.present = RICsubscriptionRequest_IEs__value_PR_RICsubscription;\r
186   RICsubscription_t *ricsubscription_ie = &ies_actid->value.choice.RICsubscription;\r
187 \r
188   ricsubscription_ie->ricEventTriggerDefinition.buf = (uint8_t *) helper.get_event_def();\r
189   ricsubscription_ie->ricEventTriggerDefinition.size = helper.get_event_def_size();\r
190    \r
191   std::vector<Action> * ref_action_array = helper.get_list();\r
192   \r
193   // do we need to reallocate ?\r
194   if(action_array_size < ref_action_array->size()){\r
195     action_array_size = 2 * ref_action_array->size();\r
196     RICaction_ToBeSetup_ItemIEs_t * new_ref = 0;\r
197     new_ref = (RICaction_ToBeSetup_ItemIEs_t *  )realloc(action_array, action_array_size);\r
198     assert(new_ref != 0);\r
199     action_array = new_ref;\r
200   }\r
201   \r
202   // reset the list count on ricAction_ToBeSetup_List;\r
203   ricsubscription_ie->ricAction_ToBeSetup_List.list.count = 0;\r
204     \r
205   for(int i = 0; i < ref_action_array->size(); i ++){\r
206     action_array[i].criticality = Criticality_ignore;\r
207     action_array[i].id = ProtocolIE_ID_id_RICaction_ToBeSetup_Item ;\r
208     action_array[i].value.present = RICaction_ToBeSetup_ItemIEs__value_PR_RICaction_ToBeSetup_Item;\r
209     action_array[i].value.choice.RICaction_ToBeSetup_Item.ricActionID = (*ref_action_array)[i].get_id();\r
210     action_array[i].value.choice.RICaction_ToBeSetup_Item.ricActionType = (*ref_action_array)[i].get_type();\r
211 \r
212     result = ASN_SEQUENCE_ADD(&ricsubscription_ie->ricAction_ToBeSetup_List, &(action_array[i]));\r
213     if (result == -1){\r
214       error_string = "Erorr : Unable to assign memory to add Action item to set up list";\r
215       return false;\r
216     }\r
217     \r
218 \r
219   }\r
220   \r
221   result = ASN_SEQUENCE_ADD(&subscription_request->protocolIEs, ies_actid);\r
222   if (result == -1){\r
223     error_string = "Erorr : Unable to assign memory to action item to be setup list  subscription request";\r
224     return false;\r
225   }\r
226 \r
227   return true;\r
228 };\r
229 \r
230 \r
231 \r
232 bool subscription_request:: get_fields(InitiatingMessage_t * init_msg,  subscription_helper & dout)\r
233 {\r
234 \r
235   if (init_msg == 0){\r
236     error_string = "Error. Invalid reference when getting fields from subscription request";\r
237     return false;\r
238   }\r
239   \r
240   RICrequestID_t *requestid;\r
241   RANfunctionID_t * ranfunctionid;\r
242   RICsubscription_t * ricsubscription;\r
243     \r
244   for(int edx = 0; edx < init_msg->value.choice.RICsubscriptionRequest.protocolIEs.list.count; edx++) {\r
245     RICsubscriptionRequest_IEs_t *memb_ptr = init_msg->value.choice.RICsubscriptionRequest.protocolIEs.list.array[edx];\r
246     \r
247     switch(memb_ptr->id)\r
248       {\r
249       case (ProtocolIE_ID_id_RICrequestID):\r
250         requestid = &memb_ptr->value.choice.RICrequestID;\r
251         dout.set_request(requestid->ricRequestorID, requestid->ricRequestSequenceNumber);\r
252         break;\r
253           \r
254       case (ProtocolIE_ID_id_RANfunctionID):\r
255         ranfunctionid = &memb_ptr->value.choice.RANfunctionID;\r
256         dout.set_function_id(*ranfunctionid);\r
257         break;\r
258           \r
259       case (ProtocolIE_ID_id_RICsubscription):\r
260         ricsubscription = &memb_ptr->value.choice.RICsubscription;\r
261         dout.set_event_def(ricsubscription->ricEventTriggerDefinition.buf, ricsubscription->ricEventTriggerDefinition.size);\r
262           \r
263         for(int index = 0; index < ricsubscription->ricAction_ToBeSetup_List.list.count; index ++){\r
264           RICaction_ToBeSetup_ItemIEs_t * item = (RICaction_ToBeSetup_ItemIEs_t *)ricsubscription->ricAction_ToBeSetup_List.list.array[index];\r
265           dout.add_action(item->value.choice.RICaction_ToBeSetup_Item.ricActionID, item->value.choice.RICaction_ToBeSetup_Item.ricActionType);\r
266         };\r
267           \r
268         break;\r
269       }\r
270       \r
271   }\r
272     \r
273   //asn_fprint(stdout, &asn_DEF_E2AP_PDU, e2pdu);\r
274   return true;\r
275 };\r
276 \r
277 \r
278 \r