blob: 60e398130f2a9d8a8ca9134a884cc6babf8d3acb [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;
Girish Gowdru50278de2017-11-23 12:35:41 +0530369 BalErr bal_err;
370 int ret_val = 0;
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530371
372 /*
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530373 * Read incoming message into clear_key
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530374 */
375 if (context->gcc_payload) {
376 context->gcc_stream->read(context, (void **)&clear_key, 0);
377 }
378
Girish Gowdru50278de2017-11-23 12:35:41 +0530379 /*
380 * send it to BAL
381 */
382
383 bal_err__init(&bal_err);
384
385 bal_err.err= 0;
386
387 /*
388 * Write reply back to the client
389 */
390
391 ret_val = context->gcc_stream->write(context, &bal_err, 0);
392 is_grpc_write_pending(ret_val);
393
394 grpc_c_status_t status;
395 status.gcs_code = 0;
396
397 /*
398 * Finish response for RPC
399 */
400 if (context->gcc_stream->finish(context, &status))
401 {
402 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to write status");
403 }
404
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530405#ifndef BAL_STUB
406 asfvolt16_bal_cfg_clear(clear_key);
407#endif
408}
409
410
411/*
412 * This functions gets invoked whenever bal Init RPC gets called
413 */
414void bal__bal_api_init_cb(grpc_c_context_t *context)
415{
416 BalInit *bal_init;
417 BalErr bal_err;
418 int ret_val;
419
420 /*
421 * Read incoming message into set_cfg
422 */
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530423 if (context->gcc_payload)
424 {
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530425 context->gcc_stream->read(context, (void **)&bal_init, 0);
426 }
427
428 /*
429 * send it to BAL
430 */
431
Kim Kempfafa1ab42017-11-13 09:31:47 -0800432 ASFVOLT_LOG(ASFVOLT_INFO, "Received API Init msg");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530433
434 bal_err__init(&bal_err);
435
436 bal_err.err= 0;
437
438 /*
439 * Write reply back to the client
440 */
root2ca2cc02017-11-03 19:51:57 +0530441 ret_val = context->gcc_stream->write(context, &bal_err, -1);
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530442 is_grpc_write_pending(ret_val);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530443
444 grpc_c_status_t status;
445 status.gcs_code = 0;
446
447 /*
448 * Finish response for RPC
449 */
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530450 if (context->gcc_stream->finish(context, &status))
451 {
Kim Kempfafa1ab42017-11-13 09:31:47 -0800452 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to write status");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530453 }
454
455#ifndef BAL_STUB
456 asfvolt16_bal_init(bal_init, &coreIpPortInfo);
457#else
Kim Kempfafa1ab42017-11-13 09:31:47 -0800458 ASFVOLT_LOG(ASFVOLT_INFO, "Received IP Address == %s", bal_init->voltha_adapter_ip_port);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530459 stub_bal_init(bal_init);
460#endif
461
462}
463
VoLTHA753536e2017-11-02 20:15:09 +0530464void bal_get_ind__free_mem_access_term_ind(BalIndications *balIndCfg)
465{
466 free(balIndCfg->access_term_ind->data->sw_version);
467 free(balIndCfg->access_term_ind->data->topology);
468 free(balIndCfg->access_term_ind->data);
469 free(balIndCfg->access_term_ind->key);
470 free(balIndCfg->access_term_ind->hdr);
471 free(balIndCfg->access_term_ind);
472 free(balIndCfg);
473}
474
475void bal_get_ind__free_mem_access_term_ind_op_state(BalIndications *balIndCfg)
476{
477 free(balIndCfg->access_term_ind_op_state->data);
478 free(balIndCfg->access_term_ind_op_state->key);
479 free(balIndCfg->access_term_ind_op_state->hdr);
480 free(balIndCfg->access_term_ind_op_state);
481 free(balIndCfg);
482}
483
484void bal_get_ind__free_mem_flow_op_state(BalIndications *balIndCfg)
485{
486 free(balIndCfg->flow_op_state->data);
487 free(balIndCfg->flow_op_state->key);
488 free(balIndCfg->flow_op_state->hdr);
489 free(balIndCfg->flow_op_state);
490 free(balIndCfg);
491}
492
493void bal_get_ind__free_mem_flow_ind(BalIndications *balIndCfg)
494{
495 free(balIndCfg->flow_ind->data->action);
496 free(balIndCfg->flow_ind->data->classifier->src_mac.data);
497 free(balIndCfg->flow_ind->data->classifier->dst_mac.data);
498 free(balIndCfg->flow_ind->data->classifier);
499 free(balIndCfg->flow_ind->data);
500 free(balIndCfg->flow_ind->key);
501 free(balIndCfg->flow_ind->hdr);
502 free(balIndCfg->flow_ind);
503 free(balIndCfg);
504}
505
506void bal_get_ind__free_mem_group_ind(BalIndications *balIndCfg)
507{
root2ca2cc02017-11-03 19:51:57 +0530508 unsigned int i = 0;
VoLTHA753536e2017-11-02 20:15:09 +0530509 free(balIndCfg->group_ind->data->flows->val);
510 free(balIndCfg->group_ind->data->flows);
511 for (i = 0; i < balIndCfg->group_ind->data->members->n_val; i++)
512 {
513 free(balIndCfg->group_ind->data->members->val[i]->queue);
514 free(balIndCfg->group_ind->data->members->val[i]->action);
root2ca2cc02017-11-03 19:51:57 +0530515 free(balIndCfg->group_ind->data->members->val[i]);
VoLTHA753536e2017-11-02 20:15:09 +0530516 }
VoLTHA753536e2017-11-02 20:15:09 +0530517 free(balIndCfg->group_ind->data->members);
518 free(balIndCfg->group_ind->data);
519 free(balIndCfg->group_ind->key);
520 free(balIndCfg->group_ind->hdr);
521 free(balIndCfg->group_ind);
522 free(balIndCfg);
523}
524
525void bal_get_ind__free_mem_interface_op_state(BalIndications *balIndCfg)
526{
527 free(balIndCfg->interface_op_state->data);
528 free(balIndCfg->interface_op_state->key);
529 free(balIndCfg->interface_op_state->hdr);
530 free(balIndCfg->interface_op_state);
531 free(balIndCfg);
532}
533
534void bal_get_ind__free_mem_interface_los(BalIndications *balIndCfg)
535{
536 free(balIndCfg->interface_los->data);
537 free(balIndCfg->interface_los->hdr);
root2ca2cc02017-11-03 19:51:57 +0530538 free(balIndCfg->interface_los);
VoLTHA753536e2017-11-02 20:15:09 +0530539 free(balIndCfg);
540}
541
542void bal_get_ind__free_mem_interface_ind(BalIndications *balIndCfg)
543{
544 free(balIndCfg->interface_ind->data->sub_term_id_list->val);
545 free(balIndCfg->interface_ind->data->sub_term_id_list);
546 free(balIndCfg->interface_ind->data);
547 free(balIndCfg->interface_ind->key);
548 free(balIndCfg->interface_ind->hdr);
549 free(balIndCfg->interface_ind);
550 free(balIndCfg);
551}
552
553void bal_get_ind__free_mem_terminal_op_state(BalIndications *balIndCfg)
554{
555 free(balIndCfg->terminal_op_state->data);
556 free(balIndCfg->terminal_op_state->key);
557 free(balIndCfg->terminal_op_state->hdr);
558 free(balIndCfg->terminal_op_state);
559 free(balIndCfg);
560}
561
562void bal_get_ind__free_mem_terminal_disc(BalIndications *balIndCfg)
563{
564 free(balIndCfg->terminal_disc->data->serial_number->vendor_specific);
565 free(balIndCfg->terminal_disc->data->serial_number->vendor_id);
566 free(balIndCfg->terminal_disc->data->serial_number);
567 free(balIndCfg->terminal_disc->data);
568 free(balIndCfg->terminal_disc->key);
569 free(balIndCfg->terminal_disc->hdr);
570 free(balIndCfg->terminal_disc);
571 free(balIndCfg);
572}
573
574void bal_get_ind__free_mem_terminal_alarm(BalIndications *balIndCfg)
575{
576 free(balIndCfg->terminal_alarm->data->alarm);
577 free(balIndCfg->terminal_alarm->data);
578 free(balIndCfg->terminal_alarm->key);
579 free(balIndCfg->terminal_alarm->hdr);
580 free(balIndCfg->terminal_alarm);
581 free(balIndCfg);
582}
583
584void bal_get_ind__free_mem_terminal_dgi(BalIndications *balIndCfg)
585{
586 free(balIndCfg->terminal_dgi->data);
587 free(balIndCfg->terminal_dgi->key);
588 free(balIndCfg->terminal_dgi->hdr);
589 free(balIndCfg->terminal_dgi);
590 free(balIndCfg);
591}
592
593void bal_get_ind__free_mem_terminal_ind(BalIndications *balIndCfg)
594{
595 free(balIndCfg->terminal_ind->data->agg_port_id_list);
596 free(balIndCfg->terminal_ind->data->serial_number->vendor_specific);
597 free(balIndCfg->terminal_ind->data->serial_number->vendor_id);
598 free(balIndCfg->terminal_ind->data->serial_number);
599 free(balIndCfg->terminal_ind->data->registration_id);
600 free(balIndCfg->terminal_ind->data->password);
601 free(balIndCfg->terminal_ind->data);
602 free(balIndCfg->terminal_ind->key);
603 free(balIndCfg->terminal_ind->hdr);
604 free(balIndCfg->terminal_ind);
605 free(balIndCfg);
606}
607
608void bal_get_ind__free_mem_tm_queue_ind(BalIndications *balIndCfg)
609{
610 switch (balIndCfg->tm_queue_ind->data->bac->type)
611 {
612 case BAL_TM_BAC_TYPE__BAL_TM_BAC_TYPE_TAILDROP:
613 free(balIndCfg->tm_queue_ind->data->bac->taildrop);
614 break;
615 case BAL_TM_BAC_TYPE__BAL_TM_BAC_TYPE_WTAILDROP:
616 /*Nothing to do*/
617 break;
618 case BAL_TM_BAC_TYPE__BAL_TM_BAC_TYPE_RED:
619 free(balIndCfg->tm_queue_ind->data->bac->red->red);
620 free(balIndCfg->tm_queue_ind->data->bac->red);
621 break;
622 case BAL_TM_BAC_TYPE__BAL_TM_BAC_TYPE_WRED:
623 free(balIndCfg->tm_queue_ind->data->bac->wred->red);
624 free(balIndCfg->tm_queue_ind->data->bac->wred->yellow);
625 free(balIndCfg->tm_queue_ind->data->bac->wred->green);
626 free(balIndCfg->tm_queue_ind->data->bac->wred);
627 default:
628 /*Nothing to do*/
629 break;
630 }
631 free(balIndCfg->tm_queue_ind->data->bac);
632 free(balIndCfg->tm_queue_ind->data->rate);
633 free(balIndCfg->tm_queue_ind->data);
634 free(balIndCfg->tm_queue_ind->key);
635 free(balIndCfg->tm_queue_ind);
636 free(balIndCfg);
637}
638
639void bal_get_ind__free_mem_u_tm_sched_ind(BalIndications *balIndCfg)
640{
641 free(balIndCfg->tm_sched_ind->data);
642 free(balIndCfg->tm_sched_ind->key);
643 free(balIndCfg->tm_sched_ind);
644 free(balIndCfg);
645}
646
647void bal_get_ind__free_mem_u_pkt_data(BalIndications *balIndCfg)
648{
649 free(balIndCfg->pktdata->data->pkt.data);
650 free(balIndCfg->pktdata->data);
651 switch(balIndCfg->pktdata->key->packet_send_dest->type)
652 {
653 case BAL_DEST_TYPE__BAL_DEST_TYPE_NNI:
654 free(balIndCfg->pktdata->key->packet_send_dest->nni);
655 break;
656 case BAL_DEST_TYPE__BAL_DEST_TYPE_SUB_TERM:
657 free(balIndCfg->pktdata->key->packet_send_dest->sub_term);
658 break;
659 case BAL_DEST_TYPE__BAL_DEST_TYPE_SVC_PORT:
660 free(balIndCfg->pktdata->key->packet_send_dest->svc_port);
661 break;
662 default:
663 /*Nothing to do*/
664 break;
665 }
666 free(balIndCfg->pktdata->key->packet_send_dest);
667 free(balIndCfg->pktdata->key);
668 free(balIndCfg->pktdata->hdr);
669 free(balIndCfg->pktdata);
670 free(balIndCfg);
671}
672
673void bal_get_ind__free_mem_u_bal_omci_resp(BalIndications *balIndCfg)
674{
675 switch(balIndCfg->balomciresp->key->packet_send_dest->type)
676 {
677 case BAL_DEST_TYPE__BAL_DEST_TYPE_ITU_OMCI_CHANNEL:
678 free(balIndCfg->balomciresp->key->packet_send_dest->itu_omci_channel);
679 break;
680 default:
681 /*Nothing to do*/
682 break;
683 }
684 free(balIndCfg->balomciresp->key->packet_send_dest);
685 free(balIndCfg->balomciresp->data->pkt.data);
686 free(balIndCfg->balomciresp->data);
687 free(balIndCfg->balomciresp->key);
688 free(balIndCfg->balomciresp->hdr);
689 free(balIndCfg->balomciresp);
690 free(balIndCfg);
691}
692
693void bal_get_ind__free_mem_u_bal_oam_resp(BalIndications *balIndCfg)
694{
695 free(balIndCfg->baloamresp->data->pkt.data);
696 free(balIndCfg->baloamresp->data);
697 switch(balIndCfg->baloamresp->key->packet_send_dest->type)
698 {
699 case BAL_DEST_TYPE__BAL_DEST_TYPE_IEEE_OAM_CHANNEL:
700 free(balIndCfg->baloamresp->key->packet_send_dest->ieee_oam_channel);
701 break;
702 default:
703 /*Nothing to do*/
704 break;
705 }
706 free(balIndCfg->baloamresp->key->packet_send_dest);
707 free(balIndCfg->baloamresp->key);
708 free(balIndCfg->baloamresp->hdr);
709 free(balIndCfg->baloamresp);
710 free(balIndCfg);
711}
712
713void bal_get_ind__free_mem(BalIndications *balIndCfg)
714{
715 switch (balIndCfg->u_case)
716 {
717 case BAL_INDICATIONS__U_ACCESS_TERM_IND:
718 bal_get_ind__free_mem_access_term_ind(balIndCfg);
719 break;
root2ca2cc02017-11-03 19:51:57 +0530720
VoLTHA753536e2017-11-02 20:15:09 +0530721 case BAL_INDICATIONS__U_ACCESS_TERM_IND_OP_STATE:
722 bal_get_ind__free_mem_access_term_ind_op_state(balIndCfg);
723 break;
724
725 case BAL_INDICATIONS__U_FLOW_OP_STATE:
726 bal_get_ind__free_mem_flow_op_state(balIndCfg);
727 break;
728
729 case BAL_INDICATIONS__U_FLOW_IND:
730 bal_get_ind__free_mem_flow_ind(balIndCfg);
731 break;
732
733 case BAL_INDICATIONS__U_GROUP_IND:
734 bal_get_ind__free_mem_group_ind(balIndCfg);
735 break;
736
737 case BAL_INDICATIONS__U_INTERFACE_OP_STATE:
738 bal_get_ind__free_mem_interface_op_state(balIndCfg);
739 break;
740
741 case BAL_INDICATIONS__U_INTERFACE_LOS:
742 bal_get_ind__free_mem_interface_los(balIndCfg);
743 break;
744
745 case BAL_INDICATIONS__U_INTERFACE_IND:
746 bal_get_ind__free_mem_interface_ind(balIndCfg);
747 break;
748
749 case BAL_INDICATIONS__U_TERMINAL_OP_STATE:
750 bal_get_ind__free_mem_terminal_op_state(balIndCfg);
751 break;
752
753 case BAL_INDICATIONS__U_TERMINAL_DISC:
754 bal_get_ind__free_mem_terminal_disc(balIndCfg);
755 break;
756
757 case BAL_INDICATIONS__U_TERMINAL_ALARM:
758 bal_get_ind__free_mem_terminal_alarm(balIndCfg);
759 break;
760
761 case BAL_INDICATIONS__U_TERMINAL_DGI:
762 bal_get_ind__free_mem_terminal_dgi(balIndCfg);
763 break;
764
765 case BAL_INDICATIONS__U_TERMINAL_IND:
766 bal_get_ind__free_mem_terminal_ind(balIndCfg);
767 break;
768
769 case BAL_INDICATIONS__U_TM_QUEUE__IND:
770 bal_get_ind__free_mem_tm_queue_ind(balIndCfg);
771 break;
772
773 case BAL_INDICATIONS__U_TM_SCHED__IND:
774 bal_get_ind__free_mem_u_tm_sched_ind(balIndCfg);
775 break;
776
777 case BAL_INDICATIONS__U_PKT_DATA:
778 bal_get_ind__free_mem_u_pkt_data(balIndCfg);
779 break;
780
781 case BAL_INDICATIONS__U_BAL_OMCI_RESP:
782 bal_get_ind__free_mem_u_bal_omci_resp(balIndCfg);
783 break;
784
785 case BAL_INDICATIONS__U_BAL_OAM_RESP:
786 bal_get_ind__free_mem_u_bal_oam_resp(balIndCfg);
787 break;
788
789 default:
Kim Kempfafa1ab42017-11-13 09:31:47 -0800790 ASFVOLT_LOG(ASFVOLT_ERROR, "Unknown BAL indication %u", balIndCfg->u_case);
VoLTHA753536e2017-11-02 20:15:09 +0530791 break;
792 }
793}
794
795void bal_get_ind__bal_get_ind_from_device_cb(grpc_c_context_t *context)
796{
797 BalDefault *dummy;
798 BalIndications *bal_indication;
799 list_node *node = NULL;
800 int ret_val = 0;
801
802 /*
803 * Read incoming message into set_cfg
804 */
805 if (context->gcc_payload) {
806 context->gcc_stream->read(context, (void **)&dummy, 0);
807 }
808
809 /*
810 * send it to BAL
811 */
812
813 pthread_mutex_lock(&bal_ind_queue_lock);
814 node = get_bal_indication_node();
815 pthread_mutex_unlock(&bal_ind_queue_lock);
root2ca2cc02017-11-03 19:51:57 +0530816
VoLTHA753536e2017-11-02 20:15:09 +0530817 if(node != NULL)
818 {
819 bal_indication = node->bal_indication;
820 bal_indication->ind_present = true;
821 bal_indication->has_ind_present = true;
822 }
823 else
824 {
825 bal_indication = malloc(sizeof(BalIndications));
826 memset(bal_indication, 0, sizeof(BalIndications));
827 bal_indications__init(bal_indication);
828 bal_indication->ind_present = false;
829 bal_indication->has_ind_present = true;
830 }
831
832 /*
833 * Write reply back to the client
834 */
835
root2ca2cc02017-11-03 19:51:57 +0530836 ret_val = context->gcc_stream->write(context, bal_indication, -1);
VoLTHA753536e2017-11-02 20:15:09 +0530837 is_grpc_write_pending(ret_val);
838
839 grpc_c_status_t status;
840 status.gcs_code = 0;
841
842 /*
843 * Finish response for RPC
844 */
845 if (context->gcc_stream->finish(context, &status))
846 {
Kim Kempfafa1ab42017-11-13 09:31:47 -0800847 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to write status");
VoLTHA753536e2017-11-02 20:15:09 +0530848 }
root2ca2cc02017-11-03 19:51:57 +0530849
VoLTHA753536e2017-11-02 20:15:09 +0530850 /*Free memory for 'bal_indication' and 'node'*/
851 if (bal_indication->ind_present)
852 {
853 bal_get_ind__free_mem(bal_indication);
854 free(node);
855 }
856 else
857 {
858 free(bal_indication);
859 }
860}
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530861
862/*
863 * This functions gets invoked whenever bal finish RPC gets called
864 */
865void bal__bal_api_finish_cb(grpc_c_context_t *context)
866{
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530867
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530868}
869
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530870void bal_ind__bal_acc_term_ind_cb(grpc_c_context_t *context)
871{
872}
873void bal_ind__bal_acc_term_oper_sts_cng_ind_cb(grpc_c_context_t *context)
874{
875}
876void bal_ind__bal_flow_oper_sts_cng_cb(grpc_c_context_t *context)
877{
878}
879void bal_ind__bal_flow_ind_cb(grpc_c_context_t *context)
880{
881}
882void bal_ind__bal_group_ind_cb(grpc_c_context_t *context)
883{
884}
885void bal_ind__bal_iface_oper_sts_cng_cb(grpc_c_context_t *context)
886{
887}
888void bal_ind__bal_iface_los_cb(grpc_c_context_t *context)
889{
890}
891void bal_ind__bal_iface_ind_cb(grpc_c_context_t *context)
892{
893}
894void bal_ind__bal_iface_stat_cb(grpc_c_context_t *context)
895{
896}
897void bal_ind__bal_subs_term_oper_sts_cng_cb(grpc_c_context_t *context)
898{
899}
900void bal_ind__bal_subs_term_discovery_ind_cb(grpc_c_context_t *context)
901{
902}
903void bal_ind__bal_subs_term_alarm_ind_cb(grpc_c_context_t *context)
904{
905}
906void bal_ind__bal_subs_term_dgi_ind_cb(grpc_c_context_t *context)
907{
908}
909void bal_ind__bal_subs_term_ind_cb(grpc_c_context_t *context)
910{
911}
912void bal_ind__bal_tm_queue_ind_info_cb(grpc_c_context_t *context)
913{
914}
915void bal_ind__bal_tm_sched_ind_info_cb(grpc_c_context_t *context)
916{
917}
918void bal_ind__bal_pkt_bearer_channel_rx_ind_cb(grpc_c_context_t *context)
919{
920}
921void bal_ind__bal_pkt_omci_channel_rx_ind_cb(grpc_c_context_t *context)
922{
923}
924void bal_ind__bal_pkt_ieee_oam_channel_rx_ind_cb(grpc_c_context_t *context)
925{
926}
A R Karthick1d251032017-09-06 09:38:34 -0700927
Kim Kempfafa1ab42017-11-13 09:31:47 -0800928/*
929** ASFVOLT_HEX2LOG(ASFVOLT_DEBUG, "OMCI Response with %zd bytes is",
930** balIndCfg.balomciresp->data->pkt.data, balIndCfg.balomciresp->data->pkt.len);
931*/
932#define SYSLOG_MAX_SIZE 1024
933void asfvolt_hexlog2(int prio, const char *_file_loc, int _file_line, const char *pFormat, void* pData, size_t len)
934{
935 unsigned char *inpPtr = pData;
936 char tempBuf[SYSLOG_MAX_SIZE];
937 size_t idx = 0;
938
939 idx += snprintf(tempBuf+idx, SYSLOG_MAX_SIZE-1, pFormat, len);
940 while (len-- > 0 && idx < SYSLOG_MAX_SIZE)
941 {
942 idx += snprintf(tempBuf+idx, SYSLOG_MAX_SIZE-idx, "%02x", *inpPtr++);
943 }
944 ASFVOLT_LOG_LOC(prio, _file_loc, _file_line, "%s", tempBuf);
945}
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530946
947/*
948 * Takes socket path as argument
949 */
Rajeswara Raoa3efbca2017-09-08 18:01:16 +0530950int main (int argc, char **argv)
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530951{
952 int i = 0;
953 grpc_c_server_t *server = NULL;
954
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530955 if (argc < 6)
956 {
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530957 fprintf(stderr, "Missing socket path argument\n");
958 exit(1);
959 }
960
961 strcpy(coreIpPortInfo.bal_core_arg1, argv[2] /*, strlen(argv[2])*/);
962 strcpy(coreIpPortInfo.bal_core_ip_port, argv[3]/*, strlen(argv[3])*/);
963 strcpy(coreIpPortInfo.bal_core_arg2, argv[4]/*, strlen(argv[4])*/);
964 strcpy(coreIpPortInfo.bal_shared_lib_ip_port, argv[5]/*, strlen(argv[5])*/);
965
966 signal(SIGINT, sigint_handler);
Kim Kempfafa1ab42017-11-13 09:31:47 -0800967
968 /*
969 ** syslog initialization
970 */
971 //setlogmask (LOG_UPTO (LOG_NOTICE));
972
973 openlog (ASFVOLT_SYSLOG_NAME, ASFVOLT_SYSLOG_MODE, LOG_LOCAL1);
974
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530975 /*
976 * Initialize grpc-c library to be used with vanilla gRPC
977 */
978 grpc_c_init(GRPC_THREADS, NULL);
979
980 /*
981 * Create server object
982 */
983 test_server = grpc_c_server_create(argv[1]);
984
Rajeswara Rao9f1cea12017-10-10 18:25:29 +0530985 if (test_server == NULL)
986 {
Kim Kempfafa1ab42017-11-13 09:31:47 -0800987 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to create server");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530988 exit(1);
989 }
990
991 /*
992 * Initialize greeter service
993 */
Kim Kempfafa1ab42017-11-13 09:31:47 -0800994 ASFVOLT_LOG(ASFVOLT_INFO, "voltha_bal_driver running.....");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530995 bal__service_init(test_server);
VoLTHA753536e2017-11-02 20:15:09 +0530996 bal_get_ind__service_init(test_server);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530997
998 /*
999 * Start server
1000 */
1001 grpc_c_server_start(test_server);
1002
1003#ifdef BAL_STUB
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +05301004 create_stub_thread();
1005#endif
1006
1007 /*
1008 * Blocks server to wait to completion
1009 */
1010 grpc_c_server_wait(test_server);
1011
1012 /* code added for example Makefile to compile grpc-c along with edgecore driver */
1013 bal__service_init(server);
VoLTHA753536e2017-11-02 20:15:09 +05301014 bal_get_ind__service_init(server);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +05301015}