blob: 83a83efddaea66c9c4a403134e2bfeaaa4eb29ed [file] [log] [blame]
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +05301/*
2** Copyright 2017-present Open Networking Foundation
3**
4** Licensed under the Apache License, Version 2.0 (the "License");
5** you may not use this file except in compliance with the License.
6** You may obtain a copy of the License at
7**
8** http://www.apache.org/licenses/LICENSE-2.0
9**
10** Unless required by applicable law or agreed to in writing, software
11** distributed under the License is distributed on an "AS IS" BASIS,
12** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13** See the License for the specific language governing permissions and
14** limitations under the License.
15*/
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +053016#include <signal.h>
17#include <stdio.h>
18#include <unistd.h>
19#include <sys/time.h>
20#include "bal_msg_type.grpc-c.h"
21#include "bal_osmsg.grpc-c.h"
22#include "bal_model_ids.grpc-c.h"
23#include "bal_obj.grpc-c.h"
24#include "bal_model_types.grpc-c.h"
25#include "bal_errno.grpc-c.h"
26#include "bal.grpc-c.h"
27
28#ifdef BAL_STUB
29#include "bal_stub.h"
30#else
31#include "asfvolt16_driver.h"
32#endif
33
Rajeswara Raoa3efbca2017-09-08 18:01:16 +053034#include <unistd.h>
35#include <sys/reboot.h>
VoLTHA753536e2017-11-02 20:15:09 +053036#include "bal_indications_queue.h"
Rajeswara Raoa3efbca2017-09-08 18:01:16 +053037
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +053038/* Global varibles */
39balCoreIpInfo coreIpPortInfo;
40
VoLTHA753536e2017-11-02 20:15:09 +053041/* extern variables*/
42list_node *bal_ind_queue_tail = NULL;
43list_node *bal_ind_queue_head = NULL;
44pthread_mutex_t bal_ind_queue_lock;
45unsigned int num_of_nodes = 0;
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +053046
VoLTHA753536e2017-11-02 20:15:09 +053047/* static variables*/
48static grpc_c_server_t *test_server;
Rajeswara Raoa3efbca2017-09-08 18:01:16 +053049static void sigint_handler (int x) {
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +053050 grpc_c_server_destroy(test_server);
51 exit(0);
52}
53
Rajeswara Rao9f1cea12017-10-10 18:25:29 +053054void is_grpc_write_pending(int return_value)
55{
56 if (return_value != GRPC_C_WRITE_OK)
57 {
58 if(return_value == GRPC_C_WRITE_PENDING)
59 {
60 /* TODO: Register call back with grpc-c which will give an indication whenever write was succussful */
61 ASFVOLT_LOG(ASFVOLT_INFO, "write(%d) is pending, sleep for 5 sec\n", return_value);
62 sleep(5);
63 }
64 else
65 {
66 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to write %d \n", return_value);
67 }
68 }
69
70}
71
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +053072/*
Rajeswara Raoa3efbca2017-09-08 18:01:16 +053073 * This functions gets invoked whenever bal Heartbeat RPC gets called
74 */
75void bal__bal_api_heartbeat_cb(grpc_c_context_t *context)
76{
77 BalHeartbeat *bal_hb;
Rajeswara Rao9f1cea12017-10-10 18:25:29 +053078 BalRebootState bal_reboot;
Rajeswara Raob2e441c2017-09-20 16:40:21 +053079 int ret_val;
Rajeswara Raoa3efbca2017-09-08 18:01:16 +053080 /*
81 * Read incoming message into set_cfg
82 */
Rajeswara Raoa3efbca2017-09-08 18:01:16 +053083 if (context->gcc_payload) {
84 context->gcc_stream->read(context, (void **)&bal_hb, 0);
85 }
86
Rajeswara Rao9f1cea12017-10-10 18:25:29 +053087 bal_reboot_state__init(&bal_reboot);
Rajeswara Raoa3efbca2017-09-08 18:01:16 +053088
Rajeswara Rao9f1cea12017-10-10 18:25:29 +053089 bal_reboot.has_is_reboot = 1;
90#ifndef BAL_STUB
91 bal_reboot.is_reboot = is_reboot;
92#else
93 bal_reboot.is_reboot = is_stub_reboot;
94#endif
Rajeswara Raoa3efbca2017-09-08 18:01:16 +053095
96 /*
97 * Write reply back to the client
98 */
Rajeswara Rao9f1cea12017-10-10 18:25:29 +053099 ret_val = context->gcc_stream->write(context, &bal_reboot, 0);
100 is_grpc_write_pending(ret_val);
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530101
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530102 grpc_c_status_t status;
103 status.gcs_code = 0;
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530104
105 /*
106 * Finish response for RPC
107 */
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530108 if (context->gcc_stream->finish(context, &status))
109 {
110 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to write status\n");
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530111 }
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530112}
113
114/*
115 * This functions gets invoked whenever Bal reboot gets called
116 */
117void bal__bal_api_reboot_cb(grpc_c_context_t *context)
118{
119 BalReboot *read_device;
120 BalErr bal_err;
Rajeswara Raob2e441c2017-09-20 16:40:21 +0530121 int ret_val;
122
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530123 /*
124 * Read incoming message into get_cfg
125 */
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530126 if (context->gcc_payload)
127 {
128 context->gcc_stream->read(context, (void **)&read_device, 0);
129 }
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530130
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530131 ASFVOLT_LOG(ASFVOLT_INFO, "Bal Server - Reboot : ======Entering Function Reboot ==============================\n");
132 ASFVOLT_LOG(ASFVOLT_INFO, "Bal Server - Reboot : Device ID is %s\n",read_device->device_id);
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530133
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530134 /*
135 * send it to BAL
136 */
137
138 bal_err__init(&bal_err);
139
140 bal_err.err= 0;
141
142 /*
143 * Write reply back to the client
144 */
Rajeswara Raob2e441c2017-09-20 16:40:21 +0530145 ret_val = context->gcc_stream->write(context, &bal_err, 0);
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530146 is_grpc_write_pending(ret_val);
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530147
148 grpc_c_status_t status;
149 status.gcs_code = 0;
150
151 /*
152 * Finish response for RPC
153 */
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530154 if (context->gcc_stream->finish(context, &status))
155 {
156 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to write status\n");
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530157 }
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530158
VoLTHA753536e2017-11-02 20:15:09 +0530159 ret_val = system("shutdown -r now");
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530160 sleep(30); /* allow system to shutdown gracefully */
161 sync(); /* force shutdown if graceful did not work */
162 reboot(RB_AUTOBOOT);
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530163}
164
165/*
166 * This functions gets invoked whenever Bal Stats gets called
167 */
168void bal__bal_cfg_stat_get_cb(grpc_c_context_t *context)
169{
170 BalInterfaceKey *read_stats;
Rajeswara Raob2e441c2017-09-20 16:40:21 +0530171 int ret_val;
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530172
173 /*
174 * Read incoming message into get_cfg
175 */
176 if (context->gcc_payload) {
177 context->gcc_stream->read(context, (void **)&read_stats, 0);
178 }
179
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530180 ASFVOLT_LOG(ASFVOLT_DEBUG, "Bal Server - Get Stats :======Entering Function Get Stats ============\n");
181 ASFVOLT_LOG(ASFVOLT_DEBUG, "Bal Server - Get Stats :NNI port is %d\n",read_stats->intf_id);
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530182
183 BalInterfaceStat get_stats;
184 memset(&get_stats, 0, sizeof(BalInterfaceStat));
185 bal_interface_stat__init(&get_stats);
186
187 BalInterfaceStatData stat_data;
188 memset(&stat_data, 0, sizeof(BalInterfaceStatData));
189 bal_interface_stat_data__init(&stat_data);
190
Rajeswara Rao92e3fd42017-10-26 10:47:03 +0530191 BalInterfaceKey stat_key;
192 memset(&stat_key, 0, sizeof(BalInterfaceKey));
193 bal_interface_key__init(&stat_key);
194
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530195#ifndef BAL_STUB
196 /* Interface Type, Interface ID
197 stat_data - Statistics Data */
Rajeswara Rao92e3fd42017-10-26 10:47:03 +0530198 asfvolt16_bal_stats_get(read_stats->intf_type, read_stats->intf_id, &stat_data, &stat_key);
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530199#else
200 stub_bal_stats_get(&stat_data);
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530201 ASFVOLT_LOG(ASFVOLT_DEBUG, "Bal Server - Get Stats In BalStubs : Got all the statistics\n");
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530202#endif
203
204 get_stats.data = &stat_data;
Rajeswara Rao92e3fd42017-10-26 10:47:03 +0530205 get_stats.key = &stat_key;
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530206
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530207 ret_val = context->gcc_stream->write(context, &get_stats, 0);
208 is_grpc_write_pending(ret_val);
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530209
210 grpc_c_status_t status;
211 status.gcs_code = 0;
212
213 /*
214 * Finish response for RPC
215 */
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530216 if (context->gcc_stream->finish(context, &status))
217 {
218 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to write status\n");
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530219 }
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530220}
221
222/*
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530223 * This functions gets invoked whenever bal RPC gets called
224 */
225void bal__bal_cfg_get_cb(grpc_c_context_t *context)
226{
227 BalCfg *get_cfg;
228
229 /*
230 * Read incoming message into get_cfg
231 */
232 if (context->gcc_payload) {
233 context->gcc_stream->read(context, (void **)&get_cfg, 0);
234 }
235
236#ifndef BAL_STUB
237 //asfvolt16_bal_cfg_get(key, get_cfg);
238#endif
239}
240
241/*
242 * This functions gets invoked whenever bal RPC gets called
243 */
244void bal__bal_cfg_set_cb(grpc_c_context_t *context)
245{
246 BalCfg *set_cfg;
247 BalErr bal_err;
248 int ret_val = 0;
249
250 /*
251 * Read incoming message into set_cfg
252 */
253 if (context->gcc_payload) {
254 context->gcc_stream->read(context, (void **)&set_cfg, 0);
255 }
256
257 /*
258 * send it to BAL
259 */
260
261 bal_err__init(&bal_err);
262
263 bal_err.err= 0;
264
265 /*
266 * Write reply back to the client
267 */
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530268
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530269 ret_val = context->gcc_stream->write(context, &bal_err, 0);
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530270 is_grpc_write_pending(ret_val);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530271
272 grpc_c_status_t status;
273 status.gcs_code = 0;
274
275 /*
276 * Finish response for RPC
277 */
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530278 if (context->gcc_stream->finish(context, &status))
279 {
280 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to write status\n");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530281 }
282
283#ifdef BAL_STUB
284 pthread_mutex_lock(&lock);
285
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530286 struct QNode *temp = newNode(set_cfg->hdr->obj_type,
287 BAL_ERRNO__BAL_ERR_OK,
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530288 set_cfg->device_id);
289
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530290 switch(set_cfg->hdr->obj_type)
291 {
292 case BAL_OBJ_ID__BAL_OBJ_ID_ACCESS_TERMINAL:
293 {
294 ASFVOLT_LOG(ASFVOLT_INFO, "\n***************************************************\n");
295 ASFVOLT_LOG(ASFVOLT_INFO, "Received Access Terminal Configuration msg\n");
296 ASFVOLT_LOG(ASFVOLT_INFO, "***************************************************\n");
297 }
298 break;
299 case BAL_OBJ_ID__BAL_OBJ_ID_INTERFACE:
300 {
301 ASFVOLT_LOG(ASFVOLT_INFO, "\n***************************************************\n");
302 ASFVOLT_LOG(ASFVOLT_INFO, "Received PON Interface Configuration msg\n");
303 ASFVOLT_LOG(ASFVOLT_INFO, "***************************************************\n");
304 temp->intf_id = set_cfg->interface->key->intf_id;
305 ASFVOLT_LOG(ASFVOLT_INFO, "Pon ID = %d\n", temp->intf_id);
306 }
307 break;
308 case BAL_OBJ_ID__BAL_OBJ_ID_SUBSCRIBER_TERMINAL:
309 {
310 ASFVOLT_LOG(ASFVOLT_INFO, "\n*****************************************************\n");
311 ASFVOLT_LOG(ASFVOLT_INFO, "Received ONU Activation msg\n");
312 ASFVOLT_LOG(ASFVOLT_INFO, "*****************************************************\n");
313 temp->intf_id = set_cfg->terminal->key->intf_id;
314 temp->onu_id = set_cfg->terminal->key->sub_term_id;
315 memset(temp->vendor_id, 0, BAL_DEVICE_STR_LEN);
316 memcpy(temp->vendor_id,
317 set_cfg->terminal->data->serial_number->vendor_id,
318 strlen(set_cfg->terminal->data->serial_number->vendor_id));
319 memset(temp->vendor_specific, 0, BAL_DEVICE_STR_LEN);
320 memcpy(temp->vendor_specific,
321 set_cfg->terminal->data->serial_number->vendor_specific,
322 strlen(set_cfg->terminal->data->serial_number->vendor_specific));
323 }
324 break;
325 case BAL_OBJ_ID__BAL_OBJ_ID_TM_SCHED:
326 {
327 ASFVOLT_LOG(ASFVOLT_INFO, "\n*****************************************************\n");
328 ASFVOLT_LOG(ASFVOLT_INFO, "Received TM schedule msg\n");
329 ASFVOLT_LOG(ASFVOLT_INFO, "*****************************************************\n");
330 }
331 break;
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530332 case BAL_OBJ_ID__BAL_OBJ_ID_PACKET:
333 {
334 switch(set_cfg->packet->key->packet_send_dest->type)
335 {
336 case BAL_DEST_TYPE__BAL_DEST_TYPE_ITU_OMCI_CHANNEL:
337 {
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530338 ASFVOLT_LOG(ASFVOLT_INFO, "\n*****************************************************\n");
339 ASFVOLT_LOG(ASFVOLT_INFO, "Received OMCI msg\n");
340 ASFVOLT_LOG(ASFVOLT_INFO, "*****************************************************\n");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530341 temp->intf_id = set_cfg->terminal->key->intf_id;
342 temp->onu_id = set_cfg->terminal->key->sub_term_id;
343 }
344 break;
345 default:
346 {
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530347 ASFVOLT_LOG(ASFVOLT_INFO, "\n*****************************************************\n");
348 ASFVOLT_LOG(ASFVOLT_INFO, "Dest type invalid\n");
349 ASFVOLT_LOG(ASFVOLT_INFO, "*****************************************************\n");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530350 }
351 break;
352 }
353 }
354 break;
355 default:
356 {
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530357 ASFVOLT_LOG(ASFVOLT_INFO, "\n*****************************************************\n");
358 ASFVOLT_LOG(ASFVOLT_INFO, "Received Invalid msg type === %d \n", set_cfg->hdr->obj_type);
359 ASFVOLT_LOG(ASFVOLT_INFO, "*****************************************************\n");
360 pthread_mutex_unlock(&lock);
361 return;
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530362 }
363 break;
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530364 }
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530365 enQueue(set_cfg->hdr->obj_type, temp);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530366 pthread_mutex_unlock(&lock);
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530367 sleep(2);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530368 pthread_cond_signal(&cv);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530369#else
370 if(BAL_OBJ_ID__BAL_OBJ_ID_ACCESS_TERMINAL == set_cfg->hdr->obj_type)
371 {
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530372 sleep(5); /* enable this if running with gdb */
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530373 }
374 asfvolt16_bal_cfg_set(set_cfg);
375#endif
376}
377
378
379/*
380 * This functions gets invoked whenever bal clear RPC gets called
381 */
382void bal__bal_cfg_clear_cb(grpc_c_context_t *context)
383{
384 BalKey *clear_key;
385
386 /*
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530387 * Read incoming message into clear_key
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530388 */
389 if (context->gcc_payload) {
390 context->gcc_stream->read(context, (void **)&clear_key, 0);
391 }
392
393#ifndef BAL_STUB
394 asfvolt16_bal_cfg_clear(clear_key);
395#endif
396}
397
398
399/*
400 * This functions gets invoked whenever bal Init RPC gets called
401 */
402void bal__bal_api_init_cb(grpc_c_context_t *context)
403{
404 BalInit *bal_init;
405 BalErr bal_err;
406 int ret_val;
407
408 /*
409 * Read incoming message into set_cfg
410 */
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530411 if (context->gcc_payload)
412 {
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530413 context->gcc_stream->read(context, (void **)&bal_init, 0);
414 }
415
416 /*
417 * send it to BAL
418 */
419
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530420 ASFVOLT_LOG(ASFVOLT_INFO, "\n*****************************************************\n");
421 ASFVOLT_LOG(ASFVOLT_INFO, "Received API Init msg\n");
422 ASFVOLT_LOG(ASFVOLT_INFO, "*****************************************************\n");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530423
424 bal_err__init(&bal_err);
425
426 bal_err.err= 0;
427
428 /*
429 * Write reply back to the client
430 */
431 ret_val = context->gcc_stream->write(context, &bal_err, 0);
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530432 is_grpc_write_pending(ret_val);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530433
434 grpc_c_status_t status;
435 status.gcs_code = 0;
436
437 /*
438 * Finish response for RPC
439 */
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530440 if (context->gcc_stream->finish(context, &status))
441 {
442 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to write status\n");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530443 }
444
445#ifndef BAL_STUB
446 asfvolt16_bal_init(bal_init, &coreIpPortInfo);
447#else
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530448 ASFVOLT_LOG(ASFVOLT_INFO, "\nRecevied IP Address == %s \n", bal_init->voltha_adapter_ip_port);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530449 stub_bal_init(bal_init);
450#endif
451
452}
453
VoLTHA753536e2017-11-02 20:15:09 +0530454void bal_get_ind__free_mem_access_term_ind(BalIndications *balIndCfg)
455{
456 free(balIndCfg->access_term_ind->data->sw_version);
457 free(balIndCfg->access_term_ind->data->topology);
458 free(balIndCfg->access_term_ind->data);
459 free(balIndCfg->access_term_ind->key);
460 free(balIndCfg->access_term_ind->hdr);
461 free(balIndCfg->access_term_ind);
462 free(balIndCfg);
463}
464
465void bal_get_ind__free_mem_access_term_ind_op_state(BalIndications *balIndCfg)
466{
467 free(balIndCfg->access_term_ind_op_state->data);
468 free(balIndCfg->access_term_ind_op_state->key);
469 free(balIndCfg->access_term_ind_op_state->hdr);
470 free(balIndCfg->access_term_ind_op_state);
471 free(balIndCfg);
472}
473
474void bal_get_ind__free_mem_flow_op_state(BalIndications *balIndCfg)
475{
476 free(balIndCfg->flow_op_state->data);
477 free(balIndCfg->flow_op_state->key);
478 free(balIndCfg->flow_op_state->hdr);
479 free(balIndCfg->flow_op_state);
480 free(balIndCfg);
481}
482
483void bal_get_ind__free_mem_flow_ind(BalIndications *balIndCfg)
484{
485 free(balIndCfg->flow_ind->data->action);
486 free(balIndCfg->flow_ind->data->classifier->src_mac.data);
487 free(balIndCfg->flow_ind->data->classifier->dst_mac.data);
488 free(balIndCfg->flow_ind->data->classifier);
489 free(balIndCfg->flow_ind->data);
490 free(balIndCfg->flow_ind->key);
491 free(balIndCfg->flow_ind->hdr);
492 free(balIndCfg->flow_ind);
493 free(balIndCfg);
494}
495
496void bal_get_ind__free_mem_group_ind(BalIndications *balIndCfg)
497{
498 int i = 0;
499 free(balIndCfg->group_ind->data->flows->val);
500 free(balIndCfg->group_ind->data->flows);
501 for (i = 0; i < balIndCfg->group_ind->data->members->n_val; i++)
502 {
503 free(balIndCfg->group_ind->data->members->val[i]->queue);
504 free(balIndCfg->group_ind->data->members->val[i]->action);
505 }
506 free(balIndCfg->group_ind->data->members->val);
507 free(balIndCfg->group_ind->data->members);
508 free(balIndCfg->group_ind->data);
509 free(balIndCfg->group_ind->key);
510 free(balIndCfg->group_ind->hdr);
511 free(balIndCfg->group_ind);
512 free(balIndCfg);
513}
514
515void bal_get_ind__free_mem_interface_op_state(BalIndications *balIndCfg)
516{
517 free(balIndCfg->interface_op_state->data);
518 free(balIndCfg->interface_op_state->key);
519 free(balIndCfg->interface_op_state->hdr);
520 free(balIndCfg->interface_op_state);
521 free(balIndCfg);
522}
523
524void bal_get_ind__free_mem_interface_los(BalIndications *balIndCfg)
525{
526 free(balIndCfg->interface_los->data);
527 free(balIndCfg->interface_los->hdr);
528 free(balIndCfg->interface_los);
529 free(balIndCfg);
530}
531
532void bal_get_ind__free_mem_interface_ind(BalIndications *balIndCfg)
533{
534 free(balIndCfg->interface_ind->data->sub_term_id_list->val);
535 free(balIndCfg->interface_ind->data->sub_term_id_list);
536 free(balIndCfg->interface_ind->data);
537 free(balIndCfg->interface_ind->key);
538 free(balIndCfg->interface_ind->hdr);
539 free(balIndCfg->interface_ind);
540 free(balIndCfg);
541}
542
543void bal_get_ind__free_mem_terminal_op_state(BalIndications *balIndCfg)
544{
545 free(balIndCfg->terminal_op_state->data);
546 free(balIndCfg->terminal_op_state->key);
547 free(balIndCfg->terminal_op_state->hdr);
548 free(balIndCfg->terminal_op_state);
549 free(balIndCfg);
550}
551
552void bal_get_ind__free_mem_terminal_disc(BalIndications *balIndCfg)
553{
554 free(balIndCfg->terminal_disc->data->serial_number->vendor_specific);
555 free(balIndCfg->terminal_disc->data->serial_number->vendor_id);
556 free(balIndCfg->terminal_disc->data->serial_number);
557 free(balIndCfg->terminal_disc->data);
558 free(balIndCfg->terminal_disc->key);
559 free(balIndCfg->terminal_disc->hdr);
560 free(balIndCfg->terminal_disc);
561 free(balIndCfg);
562}
563
564void bal_get_ind__free_mem_terminal_alarm(BalIndications *balIndCfg)
565{
566 free(balIndCfg->terminal_alarm->data->alarm);
567 free(balIndCfg->terminal_alarm->data);
568 free(balIndCfg->terminal_alarm->key);
569 free(balIndCfg->terminal_alarm->hdr);
570 free(balIndCfg->terminal_alarm);
571 free(balIndCfg);
572}
573
574void bal_get_ind__free_mem_terminal_dgi(BalIndications *balIndCfg)
575{
576 free(balIndCfg->terminal_dgi->data);
577 free(balIndCfg->terminal_dgi->key);
578 free(balIndCfg->terminal_dgi->hdr);
579 free(balIndCfg->terminal_dgi);
580 free(balIndCfg);
581}
582
583void bal_get_ind__free_mem_terminal_ind(BalIndications *balIndCfg)
584{
585 free(balIndCfg->terminal_ind->data->agg_port_id_list);
586 free(balIndCfg->terminal_ind->data->serial_number->vendor_specific);
587 free(balIndCfg->terminal_ind->data->serial_number->vendor_id);
588 free(balIndCfg->terminal_ind->data->serial_number);
589 free(balIndCfg->terminal_ind->data->registration_id);
590 free(balIndCfg->terminal_ind->data->password);
591 free(balIndCfg->terminal_ind->data);
592 free(balIndCfg->terminal_ind->key);
593 free(balIndCfg->terminal_ind->hdr);
594 free(balIndCfg->terminal_ind);
595 free(balIndCfg);
596}
597
598void bal_get_ind__free_mem_tm_queue_ind(BalIndications *balIndCfg)
599{
600 switch (balIndCfg->tm_queue_ind->data->bac->type)
601 {
602 case BAL_TM_BAC_TYPE__BAL_TM_BAC_TYPE_TAILDROP:
603 free(balIndCfg->tm_queue_ind->data->bac->taildrop);
604 break;
605 case BAL_TM_BAC_TYPE__BAL_TM_BAC_TYPE_WTAILDROP:
606 /*Nothing to do*/
607 break;
608 case BAL_TM_BAC_TYPE__BAL_TM_BAC_TYPE_RED:
609 free(balIndCfg->tm_queue_ind->data->bac->red->red);
610 free(balIndCfg->tm_queue_ind->data->bac->red);
611 break;
612 case BAL_TM_BAC_TYPE__BAL_TM_BAC_TYPE_WRED:
613 free(balIndCfg->tm_queue_ind->data->bac->wred->red);
614 free(balIndCfg->tm_queue_ind->data->bac->wred->yellow);
615 free(balIndCfg->tm_queue_ind->data->bac->wred->green);
616 free(balIndCfg->tm_queue_ind->data->bac->wred);
617 default:
618 /*Nothing to do*/
619 break;
620 }
621 free(balIndCfg->tm_queue_ind->data->bac);
622 free(balIndCfg->tm_queue_ind->data->rate);
623 free(balIndCfg->tm_queue_ind->data);
624 free(balIndCfg->tm_queue_ind->key);
625 free(balIndCfg->tm_queue_ind);
626 free(balIndCfg);
627}
628
629void bal_get_ind__free_mem_u_tm_sched_ind(BalIndications *balIndCfg)
630{
631 free(balIndCfg->tm_sched_ind->data);
632 free(balIndCfg->tm_sched_ind->key);
633 free(balIndCfg->tm_sched_ind);
634 free(balIndCfg);
635}
636
637void bal_get_ind__free_mem_u_pkt_data(BalIndications *balIndCfg)
638{
639 free(balIndCfg->pktdata->data->pkt.data);
640 free(balIndCfg->pktdata->data);
641 switch(balIndCfg->pktdata->key->packet_send_dest->type)
642 {
643 case BAL_DEST_TYPE__BAL_DEST_TYPE_NNI:
644 free(balIndCfg->pktdata->key->packet_send_dest->nni);
645 break;
646 case BAL_DEST_TYPE__BAL_DEST_TYPE_SUB_TERM:
647 free(balIndCfg->pktdata->key->packet_send_dest->sub_term);
648 break;
649 case BAL_DEST_TYPE__BAL_DEST_TYPE_SVC_PORT:
650 free(balIndCfg->pktdata->key->packet_send_dest->svc_port);
651 break;
652 default:
653 /*Nothing to do*/
654 break;
655 }
656 free(balIndCfg->pktdata->key->packet_send_dest);
657 free(balIndCfg->pktdata->key);
658 free(balIndCfg->pktdata->hdr);
659 free(balIndCfg->pktdata);
660 free(balIndCfg);
661}
662
663void bal_get_ind__free_mem_u_bal_omci_resp(BalIndications *balIndCfg)
664{
665 switch(balIndCfg->balomciresp->key->packet_send_dest->type)
666 {
667 case BAL_DEST_TYPE__BAL_DEST_TYPE_ITU_OMCI_CHANNEL:
668 free(balIndCfg->balomciresp->key->packet_send_dest->itu_omci_channel);
669 break;
670 default:
671 /*Nothing to do*/
672 break;
673 }
674 free(balIndCfg->balomciresp->key->packet_send_dest);
675 free(balIndCfg->balomciresp->data->pkt.data);
676 free(balIndCfg->balomciresp->data);
677 free(balIndCfg->balomciresp->key);
678 free(balIndCfg->balomciresp->hdr);
679 free(balIndCfg->balomciresp);
680 free(balIndCfg);
681}
682
683void bal_get_ind__free_mem_u_bal_oam_resp(BalIndications *balIndCfg)
684{
685 free(balIndCfg->baloamresp->data->pkt.data);
686 free(balIndCfg->baloamresp->data);
687 switch(balIndCfg->baloamresp->key->packet_send_dest->type)
688 {
689 case BAL_DEST_TYPE__BAL_DEST_TYPE_IEEE_OAM_CHANNEL:
690 free(balIndCfg->baloamresp->key->packet_send_dest->ieee_oam_channel);
691 break;
692 default:
693 /*Nothing to do*/
694 break;
695 }
696 free(balIndCfg->baloamresp->key->packet_send_dest);
697 free(balIndCfg->baloamresp->key);
698 free(balIndCfg->baloamresp->hdr);
699 free(balIndCfg->baloamresp);
700 free(balIndCfg);
701}
702
703void bal_get_ind__free_mem(BalIndications *balIndCfg)
704{
705 switch (balIndCfg->u_case)
706 {
707 case BAL_INDICATIONS__U_ACCESS_TERM_IND:
708 bal_get_ind__free_mem_access_term_ind(balIndCfg);
709 break;
710
711 case BAL_INDICATIONS__U_ACCESS_TERM_IND_OP_STATE:
712 bal_get_ind__free_mem_access_term_ind_op_state(balIndCfg);
713 break;
714
715 case BAL_INDICATIONS__U_FLOW_OP_STATE:
716 bal_get_ind__free_mem_flow_op_state(balIndCfg);
717 break;
718
719 case BAL_INDICATIONS__U_FLOW_IND:
720 bal_get_ind__free_mem_flow_ind(balIndCfg);
721 break;
722
723 case BAL_INDICATIONS__U_GROUP_IND:
724 bal_get_ind__free_mem_group_ind(balIndCfg);
725 break;
726
727 case BAL_INDICATIONS__U_INTERFACE_OP_STATE:
728 bal_get_ind__free_mem_interface_op_state(balIndCfg);
729 break;
730
731 case BAL_INDICATIONS__U_INTERFACE_LOS:
732 bal_get_ind__free_mem_interface_los(balIndCfg);
733 break;
734
735 case BAL_INDICATIONS__U_INTERFACE_IND:
736 bal_get_ind__free_mem_interface_ind(balIndCfg);
737 break;
738
739 case BAL_INDICATIONS__U_TERMINAL_OP_STATE:
740 bal_get_ind__free_mem_terminal_op_state(balIndCfg);
741 break;
742
743 case BAL_INDICATIONS__U_TERMINAL_DISC:
744 bal_get_ind__free_mem_terminal_disc(balIndCfg);
745 break;
746
747 case BAL_INDICATIONS__U_TERMINAL_ALARM:
748 bal_get_ind__free_mem_terminal_alarm(balIndCfg);
749 break;
750
751 case BAL_INDICATIONS__U_TERMINAL_DGI:
752 bal_get_ind__free_mem_terminal_dgi(balIndCfg);
753 break;
754
755 case BAL_INDICATIONS__U_TERMINAL_IND:
756 bal_get_ind__free_mem_terminal_ind(balIndCfg);
757 break;
758
759 case BAL_INDICATIONS__U_TM_QUEUE__IND:
760 bal_get_ind__free_mem_tm_queue_ind(balIndCfg);
761 break;
762
763 case BAL_INDICATIONS__U_TM_SCHED__IND:
764 bal_get_ind__free_mem_u_tm_sched_ind(balIndCfg);
765 break;
766
767 case BAL_INDICATIONS__U_PKT_DATA:
768 bal_get_ind__free_mem_u_pkt_data(balIndCfg);
769 break;
770
771 case BAL_INDICATIONS__U_BAL_OMCI_RESP:
772 bal_get_ind__free_mem_u_bal_omci_resp(balIndCfg);
773 break;
774
775 case BAL_INDICATIONS__U_BAL_OAM_RESP:
776 bal_get_ind__free_mem_u_bal_oam_resp(balIndCfg);
777 break;
778
779 default:
780 ASFVOLT_LOG(ASFVOLT_ERROR, "Unknown case %lu\n", balIndCfg->u_case);
781 break;
782 }
783}
784
785void bal_get_ind__bal_get_ind_from_device_cb(grpc_c_context_t *context)
786{
787 BalDefault *dummy;
788 BalIndications *bal_indication;
789 list_node *node = NULL;
790 int ret_val = 0;
791
792 /*
793 * Read incoming message into set_cfg
794 */
795 if (context->gcc_payload) {
796 context->gcc_stream->read(context, (void **)&dummy, 0);
797 }
798
799 /*
800 * send it to BAL
801 */
802
803 pthread_mutex_lock(&bal_ind_queue_lock);
804 node = get_bal_indication_node();
805 pthread_mutex_unlock(&bal_ind_queue_lock);
806
807 if(node != NULL)
808 {
809 bal_indication = node->bal_indication;
810 bal_indication->ind_present = true;
811 bal_indication->has_ind_present = true;
812 }
813 else
814 {
815 bal_indication = malloc(sizeof(BalIndications));
816 memset(bal_indication, 0, sizeof(BalIndications));
817 bal_indications__init(bal_indication);
818 bal_indication->ind_present = false;
819 bal_indication->has_ind_present = true;
820 }
821
822 /*
823 * Write reply back to the client
824 */
825
826 ret_val = context->gcc_stream->write(context, bal_indication, 0);
827 is_grpc_write_pending(ret_val);
828
829 grpc_c_status_t status;
830 status.gcs_code = 0;
831
832 /*
833 * Finish response for RPC
834 */
835 if (context->gcc_stream->finish(context, &status))
836 {
837 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to write status\n");
838 }
839
840 /*Free memory for 'bal_indication' and 'node'*/
841 if (bal_indication->ind_present)
842 {
843 bal_get_ind__free_mem(bal_indication);
844 free(node);
845 }
846 else
847 {
848 free(bal_indication);
849 }
850}
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530851
852/*
853 * This functions gets invoked whenever bal finish RPC gets called
854 */
855void bal__bal_api_finish_cb(grpc_c_context_t *context)
856{
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530857
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530858}
859
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530860void bal_ind__bal_acc_term_ind_cb(grpc_c_context_t *context)
861{
862}
863void bal_ind__bal_acc_term_oper_sts_cng_ind_cb(grpc_c_context_t *context)
864{
865}
866void bal_ind__bal_flow_oper_sts_cng_cb(grpc_c_context_t *context)
867{
868}
869void bal_ind__bal_flow_ind_cb(grpc_c_context_t *context)
870{
871}
872void bal_ind__bal_group_ind_cb(grpc_c_context_t *context)
873{
874}
875void bal_ind__bal_iface_oper_sts_cng_cb(grpc_c_context_t *context)
876{
877}
878void bal_ind__bal_iface_los_cb(grpc_c_context_t *context)
879{
880}
881void bal_ind__bal_iface_ind_cb(grpc_c_context_t *context)
882{
883}
884void bal_ind__bal_iface_stat_cb(grpc_c_context_t *context)
885{
886}
887void bal_ind__bal_subs_term_oper_sts_cng_cb(grpc_c_context_t *context)
888{
889}
890void bal_ind__bal_subs_term_discovery_ind_cb(grpc_c_context_t *context)
891{
892}
893void bal_ind__bal_subs_term_alarm_ind_cb(grpc_c_context_t *context)
894{
895}
896void bal_ind__bal_subs_term_dgi_ind_cb(grpc_c_context_t *context)
897{
898}
899void bal_ind__bal_subs_term_ind_cb(grpc_c_context_t *context)
900{
901}
902void bal_ind__bal_tm_queue_ind_info_cb(grpc_c_context_t *context)
903{
904}
905void bal_ind__bal_tm_sched_ind_info_cb(grpc_c_context_t *context)
906{
907}
908void bal_ind__bal_pkt_bearer_channel_rx_ind_cb(grpc_c_context_t *context)
909{
910}
911void bal_ind__bal_pkt_omci_channel_rx_ind_cb(grpc_c_context_t *context)
912{
913}
914void bal_ind__bal_pkt_ieee_oam_channel_rx_ind_cb(grpc_c_context_t *context)
915{
916}
A R Karthick1d251032017-09-06 09:38:34 -0700917
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530918
919/*
920 * Takes socket path as argument
921 */
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530922int main (int argc, char **argv)
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530923{
924 int i = 0;
925 grpc_c_server_t *server = NULL;
926
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530927 if (argc < 6)
928 {
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530929 fprintf(stderr, "Missing socket path argument\n");
930 exit(1);
931 }
932
933 strcpy(coreIpPortInfo.bal_core_arg1, argv[2] /*, strlen(argv[2])*/);
934 strcpy(coreIpPortInfo.bal_core_ip_port, argv[3]/*, strlen(argv[3])*/);
935 strcpy(coreIpPortInfo.bal_core_arg2, argv[4]/*, strlen(argv[4])*/);
936 strcpy(coreIpPortInfo.bal_shared_lib_ip_port, argv[5]/*, strlen(argv[5])*/);
937
938 signal(SIGINT, sigint_handler);
939 /*
940 * Initialize grpc-c library to be used with vanilla gRPC
941 */
942 grpc_c_init(GRPC_THREADS, NULL);
943
944 /*
945 * Create server object
946 */
947 test_server = grpc_c_server_create(argv[1]);
948
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530949 if (test_server == NULL)
950 {
951 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to create server\n");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530952 exit(1);
953 }
954
955 /*
956 * Initialize greeter service
957 */
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530958 ASFVOLT_LOG(ASFVOLT_INFO, "\nvoltha_bal_driver running.....\n");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530959 bal__service_init(test_server);
VoLTHA753536e2017-11-02 20:15:09 +0530960 bal_get_ind__service_init(test_server);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530961
962 /*
963 * Start server
964 */
965 grpc_c_server_start(test_server);
966
967#ifdef BAL_STUB
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530968 create_stub_thread();
969#endif
970
971 /*
972 * Blocks server to wait to completion
973 */
974 grpc_c_server_wait(test_server);
975
976 /* code added for example Makefile to compile grpc-c along with edgecore driver */
977 bal__service_init(server);
VoLTHA753536e2017-11-02 20:15:09 +0530978 bal_get_ind__service_init(server);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530979}