blob: a64597887392f1501488cba78518642004ec7463 [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 */
Kim Kempfafa1ab42017-11-13 09:31:47 -080061 ASFVOLT_LOG(ASFVOLT_INFO, "write(%d) is pending, sleep for 5 sec", return_value);
Rajeswara Rao9f1cea12017-10-10 18:25:29 +053062 sleep(5);
63 }
64 else
65 {
Kim Kempfafa1ab42017-11-13 09:31:47 -080066 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to write %d", return_value);
Rajeswara Rao9f1cea12017-10-10 18:25:29 +053067 }
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 */
root2ca2cc02017-11-03 19:51:57 +053099 ret_val = context->gcc_stream->write(context, &bal_reboot, -1);
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530100 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 {
Kim Kempfafa1ab42017-11-13 09:31:47 -0800110 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to write status");
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
Kim Kempfafa1ab42017-11-13 09:31:47 -0800131 ASFVOLT_LOG(ASFVOLT_INFO, "Bal Server - Reboot : Device ID is %s",read_device->device_id);
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530132
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530133 /*
134 * send it to BAL
135 */
136
137 bal_err__init(&bal_err);
138
139 bal_err.err= 0;
140
141 /*
142 * Write reply back to the client
143 */
root2ca2cc02017-11-03 19:51:57 +0530144 ret_val = context->gcc_stream->write(context, &bal_err, -1);
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530145 is_grpc_write_pending(ret_val);
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530146
147 grpc_c_status_t status;
148 status.gcs_code = 0;
149
150 /*
151 * Finish response for RPC
152 */
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530153 if (context->gcc_stream->finish(context, &status))
154 {
Kim Kempfafa1ab42017-11-13 09:31:47 -0800155 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to write status");
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530156 }
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530157
VoLTHA753536e2017-11-02 20:15:09 +0530158 ret_val = system("shutdown -r now");
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530159 sleep(30); /* allow system to shutdown gracefully */
160 sync(); /* force shutdown if graceful did not work */
161 reboot(RB_AUTOBOOT);
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530162}
163
164/*
165 * This functions gets invoked whenever Bal Stats gets called
166 */
167void bal__bal_cfg_stat_get_cb(grpc_c_context_t *context)
168{
169 BalInterfaceKey *read_stats;
Rajeswara Raob2e441c2017-09-20 16:40:21 +0530170 int ret_val;
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530171
172 /*
173 * Read incoming message into get_cfg
174 */
175 if (context->gcc_payload) {
176 context->gcc_stream->read(context, (void **)&read_stats, 0);
177 }
178
Kim Kempfafa1ab42017-11-13 09:31:47 -0800179 ASFVOLT_LOG(ASFVOLT_DEBUG, "Bal Server - Get Stats :NNI port is %d",read_stats->intf_id);
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530180
181 BalInterfaceStat get_stats;
182 memset(&get_stats, 0, sizeof(BalInterfaceStat));
183 bal_interface_stat__init(&get_stats);
184
185 BalInterfaceStatData stat_data;
186 memset(&stat_data, 0, sizeof(BalInterfaceStatData));
187 bal_interface_stat_data__init(&stat_data);
188
Rajeswara Rao92e3fd42017-10-26 10:47:03 +0530189 BalInterfaceKey stat_key;
190 memset(&stat_key, 0, sizeof(BalInterfaceKey));
191 bal_interface_key__init(&stat_key);
192
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530193#ifndef BAL_STUB
194 /* Interface Type, Interface ID
195 stat_data - Statistics Data */
Rajeswara Rao92e3fd42017-10-26 10:47:03 +0530196 asfvolt16_bal_stats_get(read_stats->intf_type, read_stats->intf_id, &stat_data, &stat_key);
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530197#else
198 stub_bal_stats_get(&stat_data);
Kim Kempfafa1ab42017-11-13 09:31:47 -0800199 ASFVOLT_LOG(ASFVOLT_DEBUG, "Bal Server - Get Stats In BalStubs : Got all the statistics");
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530200#endif
201
202 get_stats.data = &stat_data;
Rajeswara Rao92e3fd42017-10-26 10:47:03 +0530203 get_stats.key = &stat_key;
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530204
root2ca2cc02017-11-03 19:51:57 +0530205 ret_val = context->gcc_stream->write(context, &get_stats, -1);
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530206 is_grpc_write_pending(ret_val);
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530207
208 grpc_c_status_t status;
209 status.gcs_code = 0;
210
211 /*
212 * Finish response for RPC
213 */
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530214 if (context->gcc_stream->finish(context, &status))
215 {
Kim Kempfafa1ab42017-11-13 09:31:47 -0800216 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to write status");
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530217 }
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530218}
219
220/*
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530221 * This functions gets invoked whenever bal RPC gets called
222 */
223void bal__bal_cfg_get_cb(grpc_c_context_t *context)
224{
225 BalCfg *get_cfg;
226
227 /*
228 * Read incoming message into get_cfg
229 */
230 if (context->gcc_payload) {
231 context->gcc_stream->read(context, (void **)&get_cfg, 0);
232 }
233
234#ifndef BAL_STUB
235 //asfvolt16_bal_cfg_get(key, get_cfg);
236#endif
237}
238
239/*
240 * This functions gets invoked whenever bal RPC gets called
241 */
242void bal__bal_cfg_set_cb(grpc_c_context_t *context)
243{
244 BalCfg *set_cfg;
245 BalErr bal_err;
246 int ret_val = 0;
247
248 /*
249 * Read incoming message into set_cfg
250 */
251 if (context->gcc_payload) {
252 context->gcc_stream->read(context, (void **)&set_cfg, 0);
253 }
254
255 /*
256 * send it to BAL
257 */
258
259 bal_err__init(&bal_err);
260
261 bal_err.err= 0;
262
263 /*
264 * Write reply back to the client
265 */
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530266
root2ca2cc02017-11-03 19:51:57 +0530267 ret_val = context->gcc_stream->write(context, &bal_err, -1);
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530268 is_grpc_write_pending(ret_val);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530269
270 grpc_c_status_t status;
271 status.gcs_code = 0;
272
273 /*
274 * Finish response for RPC
275 */
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530276 if (context->gcc_stream->finish(context, &status))
277 {
Kim Kempfafa1ab42017-11-13 09:31:47 -0800278 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to write status");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530279 }
280
281#ifdef BAL_STUB
282 pthread_mutex_lock(&lock);
283
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530284 struct QNode *temp = newNode(set_cfg->hdr->obj_type,
285 BAL_ERRNO__BAL_ERR_OK,
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530286 set_cfg->device_id);
287
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530288 switch(set_cfg->hdr->obj_type)
289 {
290 case BAL_OBJ_ID__BAL_OBJ_ID_ACCESS_TERMINAL:
291 {
Kim Kempfafa1ab42017-11-13 09:31:47 -0800292 ASFVOLT_LOG(ASFVOLT_INFO, "Received Access Terminal Configuration msg");
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530293 }
294 break;
295 case BAL_OBJ_ID__BAL_OBJ_ID_INTERFACE:
296 {
Kim Kempfafa1ab42017-11-13 09:31:47 -0800297 ASFVOLT_LOG(ASFVOLT_INFO, "Received PON Interface Configuration msg");
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530298 temp->intf_id = set_cfg->interface->key->intf_id;
Kim Kempfafa1ab42017-11-13 09:31:47 -0800299 ASFVOLT_LOG(ASFVOLT_INFO, "Pon ID = %d", temp->intf_id);
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530300 }
301 break;
302 case BAL_OBJ_ID__BAL_OBJ_ID_SUBSCRIBER_TERMINAL:
303 {
Kim Kempfafa1ab42017-11-13 09:31:47 -0800304 ASFVOLT_LOG(ASFVOLT_INFO, "Received ONU Activation msg");
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530305 temp->intf_id = set_cfg->terminal->key->intf_id;
306 temp->onu_id = set_cfg->terminal->key->sub_term_id;
307 memset(temp->vendor_id, 0, BAL_DEVICE_STR_LEN);
308 memcpy(temp->vendor_id,
309 set_cfg->terminal->data->serial_number->vendor_id,
310 strlen(set_cfg->terminal->data->serial_number->vendor_id));
311 memset(temp->vendor_specific, 0, BAL_DEVICE_STR_LEN);
312 memcpy(temp->vendor_specific,
313 set_cfg->terminal->data->serial_number->vendor_specific,
314 strlen(set_cfg->terminal->data->serial_number->vendor_specific));
315 }
316 break;
317 case BAL_OBJ_ID__BAL_OBJ_ID_TM_SCHED:
318 {
Kim Kempfafa1ab42017-11-13 09:31:47 -0800319 ASFVOLT_LOG(ASFVOLT_INFO, "Received TM schedule msg");
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530320 }
321 break;
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530322 case BAL_OBJ_ID__BAL_OBJ_ID_PACKET:
323 {
324 switch(set_cfg->packet->key->packet_send_dest->type)
325 {
326 case BAL_DEST_TYPE__BAL_DEST_TYPE_ITU_OMCI_CHANNEL:
327 {
Kim Kempfafa1ab42017-11-13 09:31:47 -0800328 ASFVOLT_LOG(ASFVOLT_INFO, "Received OMCI msg");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530329 temp->intf_id = set_cfg->terminal->key->intf_id;
330 temp->onu_id = set_cfg->terminal->key->sub_term_id;
331 }
332 break;
333 default:
334 {
Kim Kempfafa1ab42017-11-13 09:31:47 -0800335 ASFVOLT_LOG(ASFVOLT_INFO, "Dest type invalid");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530336 }
337 break;
338 }
339 }
340 break;
341 default:
342 {
Kim Kempfafa1ab42017-11-13 09:31:47 -0800343 ASFVOLT_LOG(ASFVOLT_INFO, "Received Invalid msg type === %d", set_cfg->hdr->obj_type);
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530344 pthread_mutex_unlock(&lock);
345 return;
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530346 }
347 break;
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530348 }
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530349 enQueue(set_cfg->hdr->obj_type, temp);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530350 pthread_mutex_unlock(&lock);
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530351 sleep(2);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530352 pthread_cond_signal(&cv);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530353#else
354 if(BAL_OBJ_ID__BAL_OBJ_ID_ACCESS_TERMINAL == set_cfg->hdr->obj_type)
355 {
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530356 sleep(5); /* enable this if running with gdb */
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530357 }
358 asfvolt16_bal_cfg_set(set_cfg);
359#endif
360}
361
362
363/*
364 * This functions gets invoked whenever bal clear RPC gets called
365 */
366void bal__bal_cfg_clear_cb(grpc_c_context_t *context)
367{
368 BalKey *clear_key;
369
370 /*
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530371 * Read incoming message into clear_key
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530372 */
373 if (context->gcc_payload) {
374 context->gcc_stream->read(context, (void **)&clear_key, 0);
375 }
376
377#ifndef BAL_STUB
378 asfvolt16_bal_cfg_clear(clear_key);
379#endif
380}
381
382
383/*
384 * This functions gets invoked whenever bal Init RPC gets called
385 */
386void bal__bal_api_init_cb(grpc_c_context_t *context)
387{
388 BalInit *bal_init;
389 BalErr bal_err;
390 int ret_val;
391
392 /*
393 * Read incoming message into set_cfg
394 */
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530395 if (context->gcc_payload)
396 {
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530397 context->gcc_stream->read(context, (void **)&bal_init, 0);
398 }
399
400 /*
401 * send it to BAL
402 */
403
Kim Kempfafa1ab42017-11-13 09:31:47 -0800404 ASFVOLT_LOG(ASFVOLT_INFO, "Received API Init msg");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530405
406 bal_err__init(&bal_err);
407
408 bal_err.err= 0;
409
410 /*
411 * Write reply back to the client
412 */
root2ca2cc02017-11-03 19:51:57 +0530413 ret_val = context->gcc_stream->write(context, &bal_err, -1);
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530414 is_grpc_write_pending(ret_val);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530415
416 grpc_c_status_t status;
417 status.gcs_code = 0;
418
419 /*
420 * Finish response for RPC
421 */
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530422 if (context->gcc_stream->finish(context, &status))
423 {
Kim Kempfafa1ab42017-11-13 09:31:47 -0800424 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to write status");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530425 }
426
427#ifndef BAL_STUB
428 asfvolt16_bal_init(bal_init, &coreIpPortInfo);
429#else
Kim Kempfafa1ab42017-11-13 09:31:47 -0800430 ASFVOLT_LOG(ASFVOLT_INFO, "Received IP Address == %s", bal_init->voltha_adapter_ip_port);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530431 stub_bal_init(bal_init);
432#endif
433
434}
435
VoLTHA753536e2017-11-02 20:15:09 +0530436void bal_get_ind__free_mem_access_term_ind(BalIndications *balIndCfg)
437{
438 free(balIndCfg->access_term_ind->data->sw_version);
439 free(balIndCfg->access_term_ind->data->topology);
440 free(balIndCfg->access_term_ind->data);
441 free(balIndCfg->access_term_ind->key);
442 free(balIndCfg->access_term_ind->hdr);
443 free(balIndCfg->access_term_ind);
444 free(balIndCfg);
445}
446
447void bal_get_ind__free_mem_access_term_ind_op_state(BalIndications *balIndCfg)
448{
449 free(balIndCfg->access_term_ind_op_state->data);
450 free(balIndCfg->access_term_ind_op_state->key);
451 free(balIndCfg->access_term_ind_op_state->hdr);
452 free(balIndCfg->access_term_ind_op_state);
453 free(balIndCfg);
454}
455
456void bal_get_ind__free_mem_flow_op_state(BalIndications *balIndCfg)
457{
458 free(balIndCfg->flow_op_state->data);
459 free(balIndCfg->flow_op_state->key);
460 free(balIndCfg->flow_op_state->hdr);
461 free(balIndCfg->flow_op_state);
462 free(balIndCfg);
463}
464
465void bal_get_ind__free_mem_flow_ind(BalIndications *balIndCfg)
466{
467 free(balIndCfg->flow_ind->data->action);
468 free(balIndCfg->flow_ind->data->classifier->src_mac.data);
469 free(balIndCfg->flow_ind->data->classifier->dst_mac.data);
470 free(balIndCfg->flow_ind->data->classifier);
471 free(balIndCfg->flow_ind->data);
472 free(balIndCfg->flow_ind->key);
473 free(balIndCfg->flow_ind->hdr);
474 free(balIndCfg->flow_ind);
475 free(balIndCfg);
476}
477
478void bal_get_ind__free_mem_group_ind(BalIndications *balIndCfg)
479{
root2ca2cc02017-11-03 19:51:57 +0530480 unsigned int i = 0;
VoLTHA753536e2017-11-02 20:15:09 +0530481 free(balIndCfg->group_ind->data->flows->val);
482 free(balIndCfg->group_ind->data->flows);
483 for (i = 0; i < balIndCfg->group_ind->data->members->n_val; i++)
484 {
485 free(balIndCfg->group_ind->data->members->val[i]->queue);
486 free(balIndCfg->group_ind->data->members->val[i]->action);
root2ca2cc02017-11-03 19:51:57 +0530487 free(balIndCfg->group_ind->data->members->val[i]);
VoLTHA753536e2017-11-02 20:15:09 +0530488 }
VoLTHA753536e2017-11-02 20:15:09 +0530489 free(balIndCfg->group_ind->data->members);
490 free(balIndCfg->group_ind->data);
491 free(balIndCfg->group_ind->key);
492 free(balIndCfg->group_ind->hdr);
493 free(balIndCfg->group_ind);
494 free(balIndCfg);
495}
496
497void bal_get_ind__free_mem_interface_op_state(BalIndications *balIndCfg)
498{
499 free(balIndCfg->interface_op_state->data);
500 free(balIndCfg->interface_op_state->key);
501 free(balIndCfg->interface_op_state->hdr);
502 free(balIndCfg->interface_op_state);
503 free(balIndCfg);
504}
505
506void bal_get_ind__free_mem_interface_los(BalIndications *balIndCfg)
507{
508 free(balIndCfg->interface_los->data);
509 free(balIndCfg->interface_los->hdr);
root2ca2cc02017-11-03 19:51:57 +0530510 free(balIndCfg->interface_los);
VoLTHA753536e2017-11-02 20:15:09 +0530511 free(balIndCfg);
512}
513
514void bal_get_ind__free_mem_interface_ind(BalIndications *balIndCfg)
515{
516 free(balIndCfg->interface_ind->data->sub_term_id_list->val);
517 free(balIndCfg->interface_ind->data->sub_term_id_list);
518 free(balIndCfg->interface_ind->data);
519 free(balIndCfg->interface_ind->key);
520 free(balIndCfg->interface_ind->hdr);
521 free(balIndCfg->interface_ind);
522 free(balIndCfg);
523}
524
525void bal_get_ind__free_mem_terminal_op_state(BalIndications *balIndCfg)
526{
527 free(balIndCfg->terminal_op_state->data);
528 free(balIndCfg->terminal_op_state->key);
529 free(balIndCfg->terminal_op_state->hdr);
530 free(balIndCfg->terminal_op_state);
531 free(balIndCfg);
532}
533
534void bal_get_ind__free_mem_terminal_disc(BalIndications *balIndCfg)
535{
536 free(balIndCfg->terminal_disc->data->serial_number->vendor_specific);
537 free(balIndCfg->terminal_disc->data->serial_number->vendor_id);
538 free(balIndCfg->terminal_disc->data->serial_number);
539 free(balIndCfg->terminal_disc->data);
540 free(balIndCfg->terminal_disc->key);
541 free(balIndCfg->terminal_disc->hdr);
542 free(balIndCfg->terminal_disc);
543 free(balIndCfg);
544}
545
546void bal_get_ind__free_mem_terminal_alarm(BalIndications *balIndCfg)
547{
548 free(balIndCfg->terminal_alarm->data->alarm);
549 free(balIndCfg->terminal_alarm->data);
550 free(balIndCfg->terminal_alarm->key);
551 free(balIndCfg->terminal_alarm->hdr);
552 free(balIndCfg->terminal_alarm);
553 free(balIndCfg);
554}
555
556void bal_get_ind__free_mem_terminal_dgi(BalIndications *balIndCfg)
557{
558 free(balIndCfg->terminal_dgi->data);
559 free(balIndCfg->terminal_dgi->key);
560 free(balIndCfg->terminal_dgi->hdr);
561 free(balIndCfg->terminal_dgi);
562 free(balIndCfg);
563}
564
565void bal_get_ind__free_mem_terminal_ind(BalIndications *balIndCfg)
566{
567 free(balIndCfg->terminal_ind->data->agg_port_id_list);
568 free(balIndCfg->terminal_ind->data->serial_number->vendor_specific);
569 free(balIndCfg->terminal_ind->data->serial_number->vendor_id);
570 free(balIndCfg->terminal_ind->data->serial_number);
571 free(balIndCfg->terminal_ind->data->registration_id);
572 free(balIndCfg->terminal_ind->data->password);
573 free(balIndCfg->terminal_ind->data);
574 free(balIndCfg->terminal_ind->key);
575 free(balIndCfg->terminal_ind->hdr);
576 free(balIndCfg->terminal_ind);
577 free(balIndCfg);
578}
579
580void bal_get_ind__free_mem_tm_queue_ind(BalIndications *balIndCfg)
581{
582 switch (balIndCfg->tm_queue_ind->data->bac->type)
583 {
584 case BAL_TM_BAC_TYPE__BAL_TM_BAC_TYPE_TAILDROP:
585 free(balIndCfg->tm_queue_ind->data->bac->taildrop);
586 break;
587 case BAL_TM_BAC_TYPE__BAL_TM_BAC_TYPE_WTAILDROP:
588 /*Nothing to do*/
589 break;
590 case BAL_TM_BAC_TYPE__BAL_TM_BAC_TYPE_RED:
591 free(balIndCfg->tm_queue_ind->data->bac->red->red);
592 free(balIndCfg->tm_queue_ind->data->bac->red);
593 break;
594 case BAL_TM_BAC_TYPE__BAL_TM_BAC_TYPE_WRED:
595 free(balIndCfg->tm_queue_ind->data->bac->wred->red);
596 free(balIndCfg->tm_queue_ind->data->bac->wred->yellow);
597 free(balIndCfg->tm_queue_ind->data->bac->wred->green);
598 free(balIndCfg->tm_queue_ind->data->bac->wred);
599 default:
600 /*Nothing to do*/
601 break;
602 }
603 free(balIndCfg->tm_queue_ind->data->bac);
604 free(balIndCfg->tm_queue_ind->data->rate);
605 free(balIndCfg->tm_queue_ind->data);
606 free(balIndCfg->tm_queue_ind->key);
607 free(balIndCfg->tm_queue_ind);
608 free(balIndCfg);
609}
610
611void bal_get_ind__free_mem_u_tm_sched_ind(BalIndications *balIndCfg)
612{
613 free(balIndCfg->tm_sched_ind->data);
614 free(balIndCfg->tm_sched_ind->key);
615 free(balIndCfg->tm_sched_ind);
616 free(balIndCfg);
617}
618
619void bal_get_ind__free_mem_u_pkt_data(BalIndications *balIndCfg)
620{
621 free(balIndCfg->pktdata->data->pkt.data);
622 free(balIndCfg->pktdata->data);
623 switch(balIndCfg->pktdata->key->packet_send_dest->type)
624 {
625 case BAL_DEST_TYPE__BAL_DEST_TYPE_NNI:
626 free(balIndCfg->pktdata->key->packet_send_dest->nni);
627 break;
628 case BAL_DEST_TYPE__BAL_DEST_TYPE_SUB_TERM:
629 free(balIndCfg->pktdata->key->packet_send_dest->sub_term);
630 break;
631 case BAL_DEST_TYPE__BAL_DEST_TYPE_SVC_PORT:
632 free(balIndCfg->pktdata->key->packet_send_dest->svc_port);
633 break;
634 default:
635 /*Nothing to do*/
636 break;
637 }
638 free(balIndCfg->pktdata->key->packet_send_dest);
639 free(balIndCfg->pktdata->key);
640 free(balIndCfg->pktdata->hdr);
641 free(balIndCfg->pktdata);
642 free(balIndCfg);
643}
644
645void bal_get_ind__free_mem_u_bal_omci_resp(BalIndications *balIndCfg)
646{
647 switch(balIndCfg->balomciresp->key->packet_send_dest->type)
648 {
649 case BAL_DEST_TYPE__BAL_DEST_TYPE_ITU_OMCI_CHANNEL:
650 free(balIndCfg->balomciresp->key->packet_send_dest->itu_omci_channel);
651 break;
652 default:
653 /*Nothing to do*/
654 break;
655 }
656 free(balIndCfg->balomciresp->key->packet_send_dest);
657 free(balIndCfg->balomciresp->data->pkt.data);
658 free(balIndCfg->balomciresp->data);
659 free(balIndCfg->balomciresp->key);
660 free(balIndCfg->balomciresp->hdr);
661 free(balIndCfg->balomciresp);
662 free(balIndCfg);
663}
664
665void bal_get_ind__free_mem_u_bal_oam_resp(BalIndications *balIndCfg)
666{
667 free(balIndCfg->baloamresp->data->pkt.data);
668 free(balIndCfg->baloamresp->data);
669 switch(balIndCfg->baloamresp->key->packet_send_dest->type)
670 {
671 case BAL_DEST_TYPE__BAL_DEST_TYPE_IEEE_OAM_CHANNEL:
672 free(balIndCfg->baloamresp->key->packet_send_dest->ieee_oam_channel);
673 break;
674 default:
675 /*Nothing to do*/
676 break;
677 }
678 free(balIndCfg->baloamresp->key->packet_send_dest);
679 free(balIndCfg->baloamresp->key);
680 free(balIndCfg->baloamresp->hdr);
681 free(balIndCfg->baloamresp);
682 free(balIndCfg);
683}
684
685void bal_get_ind__free_mem(BalIndications *balIndCfg)
686{
687 switch (balIndCfg->u_case)
688 {
689 case BAL_INDICATIONS__U_ACCESS_TERM_IND:
690 bal_get_ind__free_mem_access_term_ind(balIndCfg);
691 break;
root2ca2cc02017-11-03 19:51:57 +0530692
VoLTHA753536e2017-11-02 20:15:09 +0530693 case BAL_INDICATIONS__U_ACCESS_TERM_IND_OP_STATE:
694 bal_get_ind__free_mem_access_term_ind_op_state(balIndCfg);
695 break;
696
697 case BAL_INDICATIONS__U_FLOW_OP_STATE:
698 bal_get_ind__free_mem_flow_op_state(balIndCfg);
699 break;
700
701 case BAL_INDICATIONS__U_FLOW_IND:
702 bal_get_ind__free_mem_flow_ind(balIndCfg);
703 break;
704
705 case BAL_INDICATIONS__U_GROUP_IND:
706 bal_get_ind__free_mem_group_ind(balIndCfg);
707 break;
708
709 case BAL_INDICATIONS__U_INTERFACE_OP_STATE:
710 bal_get_ind__free_mem_interface_op_state(balIndCfg);
711 break;
712
713 case BAL_INDICATIONS__U_INTERFACE_LOS:
714 bal_get_ind__free_mem_interface_los(balIndCfg);
715 break;
716
717 case BAL_INDICATIONS__U_INTERFACE_IND:
718 bal_get_ind__free_mem_interface_ind(balIndCfg);
719 break;
720
721 case BAL_INDICATIONS__U_TERMINAL_OP_STATE:
722 bal_get_ind__free_mem_terminal_op_state(balIndCfg);
723 break;
724
725 case BAL_INDICATIONS__U_TERMINAL_DISC:
726 bal_get_ind__free_mem_terminal_disc(balIndCfg);
727 break;
728
729 case BAL_INDICATIONS__U_TERMINAL_ALARM:
730 bal_get_ind__free_mem_terminal_alarm(balIndCfg);
731 break;
732
733 case BAL_INDICATIONS__U_TERMINAL_DGI:
734 bal_get_ind__free_mem_terminal_dgi(balIndCfg);
735 break;
736
737 case BAL_INDICATIONS__U_TERMINAL_IND:
738 bal_get_ind__free_mem_terminal_ind(balIndCfg);
739 break;
740
741 case BAL_INDICATIONS__U_TM_QUEUE__IND:
742 bal_get_ind__free_mem_tm_queue_ind(balIndCfg);
743 break;
744
745 case BAL_INDICATIONS__U_TM_SCHED__IND:
746 bal_get_ind__free_mem_u_tm_sched_ind(balIndCfg);
747 break;
748
749 case BAL_INDICATIONS__U_PKT_DATA:
750 bal_get_ind__free_mem_u_pkt_data(balIndCfg);
751 break;
752
753 case BAL_INDICATIONS__U_BAL_OMCI_RESP:
754 bal_get_ind__free_mem_u_bal_omci_resp(balIndCfg);
755 break;
756
757 case BAL_INDICATIONS__U_BAL_OAM_RESP:
758 bal_get_ind__free_mem_u_bal_oam_resp(balIndCfg);
759 break;
760
761 default:
Kim Kempfafa1ab42017-11-13 09:31:47 -0800762 ASFVOLT_LOG(ASFVOLT_ERROR, "Unknown BAL indication %u", balIndCfg->u_case);
VoLTHA753536e2017-11-02 20:15:09 +0530763 break;
764 }
765}
766
767void bal_get_ind__bal_get_ind_from_device_cb(grpc_c_context_t *context)
768{
769 BalDefault *dummy;
770 BalIndications *bal_indication;
771 list_node *node = NULL;
772 int ret_val = 0;
773
774 /*
775 * Read incoming message into set_cfg
776 */
777 if (context->gcc_payload) {
778 context->gcc_stream->read(context, (void **)&dummy, 0);
779 }
780
781 /*
782 * send it to BAL
783 */
784
785 pthread_mutex_lock(&bal_ind_queue_lock);
786 node = get_bal_indication_node();
787 pthread_mutex_unlock(&bal_ind_queue_lock);
root2ca2cc02017-11-03 19:51:57 +0530788
VoLTHA753536e2017-11-02 20:15:09 +0530789 if(node != NULL)
790 {
791 bal_indication = node->bal_indication;
792 bal_indication->ind_present = true;
793 bal_indication->has_ind_present = true;
794 }
795 else
796 {
797 bal_indication = malloc(sizeof(BalIndications));
798 memset(bal_indication, 0, sizeof(BalIndications));
799 bal_indications__init(bal_indication);
800 bal_indication->ind_present = false;
801 bal_indication->has_ind_present = true;
802 }
803
804 /*
805 * Write reply back to the client
806 */
807
root2ca2cc02017-11-03 19:51:57 +0530808 ret_val = context->gcc_stream->write(context, bal_indication, -1);
VoLTHA753536e2017-11-02 20:15:09 +0530809 is_grpc_write_pending(ret_val);
810
811 grpc_c_status_t status;
812 status.gcs_code = 0;
813
814 /*
815 * Finish response for RPC
816 */
817 if (context->gcc_stream->finish(context, &status))
818 {
Kim Kempfafa1ab42017-11-13 09:31:47 -0800819 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to write status");
VoLTHA753536e2017-11-02 20:15:09 +0530820 }
root2ca2cc02017-11-03 19:51:57 +0530821
VoLTHA753536e2017-11-02 20:15:09 +0530822 /*Free memory for 'bal_indication' and 'node'*/
823 if (bal_indication->ind_present)
824 {
825 bal_get_ind__free_mem(bal_indication);
826 free(node);
827 }
828 else
829 {
830 free(bal_indication);
831 }
832}
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530833
834/*
835 * This functions gets invoked whenever bal finish RPC gets called
836 */
837void bal__bal_api_finish_cb(grpc_c_context_t *context)
838{
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530839
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530840}
841
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530842void bal_ind__bal_acc_term_ind_cb(grpc_c_context_t *context)
843{
844}
845void bal_ind__bal_acc_term_oper_sts_cng_ind_cb(grpc_c_context_t *context)
846{
847}
848void bal_ind__bal_flow_oper_sts_cng_cb(grpc_c_context_t *context)
849{
850}
851void bal_ind__bal_flow_ind_cb(grpc_c_context_t *context)
852{
853}
854void bal_ind__bal_group_ind_cb(grpc_c_context_t *context)
855{
856}
857void bal_ind__bal_iface_oper_sts_cng_cb(grpc_c_context_t *context)
858{
859}
860void bal_ind__bal_iface_los_cb(grpc_c_context_t *context)
861{
862}
863void bal_ind__bal_iface_ind_cb(grpc_c_context_t *context)
864{
865}
866void bal_ind__bal_iface_stat_cb(grpc_c_context_t *context)
867{
868}
869void bal_ind__bal_subs_term_oper_sts_cng_cb(grpc_c_context_t *context)
870{
871}
872void bal_ind__bal_subs_term_discovery_ind_cb(grpc_c_context_t *context)
873{
874}
875void bal_ind__bal_subs_term_alarm_ind_cb(grpc_c_context_t *context)
876{
877}
878void bal_ind__bal_subs_term_dgi_ind_cb(grpc_c_context_t *context)
879{
880}
881void bal_ind__bal_subs_term_ind_cb(grpc_c_context_t *context)
882{
883}
884void bal_ind__bal_tm_queue_ind_info_cb(grpc_c_context_t *context)
885{
886}
887void bal_ind__bal_tm_sched_ind_info_cb(grpc_c_context_t *context)
888{
889}
890void bal_ind__bal_pkt_bearer_channel_rx_ind_cb(grpc_c_context_t *context)
891{
892}
893void bal_ind__bal_pkt_omci_channel_rx_ind_cb(grpc_c_context_t *context)
894{
895}
896void bal_ind__bal_pkt_ieee_oam_channel_rx_ind_cb(grpc_c_context_t *context)
897{
898}
A R Karthick1d251032017-09-06 09:38:34 -0700899
Kim Kempfafa1ab42017-11-13 09:31:47 -0800900/*
901** ASFVOLT_HEX2LOG(ASFVOLT_DEBUG, "OMCI Response with %zd bytes is",
902** balIndCfg.balomciresp->data->pkt.data, balIndCfg.balomciresp->data->pkt.len);
903*/
904#define SYSLOG_MAX_SIZE 1024
905void asfvolt_hexlog2(int prio, const char *_file_loc, int _file_line, const char *pFormat, void* pData, size_t len)
906{
907 unsigned char *inpPtr = pData;
908 char tempBuf[SYSLOG_MAX_SIZE];
909 size_t idx = 0;
910
911 idx += snprintf(tempBuf+idx, SYSLOG_MAX_SIZE-1, pFormat, len);
912 while (len-- > 0 && idx < SYSLOG_MAX_SIZE)
913 {
914 idx += snprintf(tempBuf+idx, SYSLOG_MAX_SIZE-idx, "%02x", *inpPtr++);
915 }
916 ASFVOLT_LOG_LOC(prio, _file_loc, _file_line, "%s", tempBuf);
917}
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);
Kim Kempfafa1ab42017-11-13 09:31:47 -0800939
940 /*
941 ** syslog initialization
942 */
943 //setlogmask (LOG_UPTO (LOG_NOTICE));
944
945 openlog (ASFVOLT_SYSLOG_NAME, ASFVOLT_SYSLOG_MODE, LOG_LOCAL1);
946
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530947 /*
948 * Initialize grpc-c library to be used with vanilla gRPC
949 */
950 grpc_c_init(GRPC_THREADS, NULL);
951
952 /*
953 * Create server object
954 */
955 test_server = grpc_c_server_create(argv[1]);
956
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530957 if (test_server == NULL)
958 {
Kim Kempfafa1ab42017-11-13 09:31:47 -0800959 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to create server");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530960 exit(1);
961 }
962
963 /*
964 * Initialize greeter service
965 */
Kim Kempfafa1ab42017-11-13 09:31:47 -0800966 ASFVOLT_LOG(ASFVOLT_INFO, "voltha_bal_driver running.....");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530967 bal__service_init(test_server);
VoLTHA753536e2017-11-02 20:15:09 +0530968 bal_get_ind__service_init(test_server);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530969
970 /*
971 * Start server
972 */
973 grpc_c_server_start(test_server);
974
975#ifdef BAL_STUB
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530976 create_stub_thread();
977#endif
978
979 /*
980 * Blocks server to wait to completion
981 */
982 grpc_c_server_wait(test_server);
983
984 /* code added for example Makefile to compile grpc-c along with edgecore driver */
985 bal__service_init(server);
VoLTHA753536e2017-11-02 20:15:09 +0530986 bal_get_ind__service_init(server);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530987}