blob: 0d4387a3f7153a30dd09a2452ac3eb5d48b6363a [file] [log] [blame]
Shad Ansari01b0e652018-04-05 21:02:53 +00001/*
2 Copyright (C) 2018 Open Networking Foundation
3
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>.
16*/
17#include "indications.h"
Shad Ansarib7b0ced2018-05-11 21:53:32 +000018#include "core.h"
Shad Ansari01b0e652018-04-05 21:02:53 +000019#include "utils.h"
20extern "C"
21{
22#include <bcmos_system.h>
23#include <bal_api.h>
24#include <bal_api_end.h>
25}
26
27using grpc::Status;
28
29Queue<openolt::Indication> oltIndQ;
30//Queue<openolt::Indication*> oltIndQ;
31
32bool subscribed = false;
33
34bcmos_errno OmciIndication(bcmbal_obj *obj);
35
36bcmos_errno OltIndication(bcmbal_obj *obj) {
37 openolt::Indication ind;
38 openolt::OltIndication* olt_ind = new openolt::OltIndication;
39 Status status;
40
41 bcmbal_access_terminal_ind *acc_term_ind = (bcmbal_access_terminal_ind *)obj;
42 if (acc_term_ind->data.oper_status == BCMBAL_STATUS_UP) {
43 olt_ind->set_oper_state("up");
44 } else {
45 olt_ind->set_oper_state("down");
46 }
47 ind.set_allocated_olt_ind(olt_ind);
48 std::cout << "olt indication, oper_state:" << ind.olt_ind().oper_state() << std::endl;
49 oltIndQ.push(ind);
50
51 // Enable all PON interfaces.
52 for (int i = 0; i < MAX_SUPPORTED_INTF; i++) {
53 status = EnablePonIf_(i);
54 if (!status.ok()) {
55 // FIXME - raise alarm to report error in enabling PON
56 }
57 }
58
59 /* register for omci indication */
60 {
61 bcmbal_cb_cfg cb_cfg = {};
62 uint16_t ind_subgroup;
63
64 cb_cfg.module = BCMOS_MODULE_ID_NONE;
65 cb_cfg.obj_type = BCMBAL_OBJ_ID_PACKET;
66 ind_subgroup = BCMBAL_IND_SUBGROUP(packet, itu_omci_channel_rx);
67 cb_cfg.p_object_key_info = NULL;
68 cb_cfg.p_subgroup = &ind_subgroup;
69 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OmciIndication;
70 bcmbal_subscribe_ind(0, &cb_cfg);
71 }
72
73 return BCM_ERR_OK;
74}
75
76bcmos_errno LosIndication(bcmbal_obj *obj) {
77 openolt::Indication ind;
78 std::cout << "LOS indication " << std::endl;
79 return BCM_ERR_OK;
80}
81
82bcmos_errno IfIndication(bcmbal_obj *obj) {
83 openolt::Indication ind;
84 openolt::IntfIndication* intf_ind = new openolt::IntfIndication;
85
86 std::cout << "intf indication, intf_id:"
87 << ((bcmbal_interface_ind *)obj)->key.intf_id << std::endl;
88
89 intf_ind->set_intf_id(((bcmbal_interface_ind *)obj)->key.intf_id);
90 if (((bcmbal_interface_ind *)obj)->data.oper_status == BCMBAL_STATUS_UP) {
91 intf_ind->set_oper_state("up");
92 } else {
93 intf_ind->set_oper_state("down");
94 }
95 ind.set_allocated_intf_ind(intf_ind);
96
97 oltIndQ.push(ind);
98
99 return BCM_ERR_OK;
100}
101
102bcmos_errno IfOperIndication(bcmbal_obj *obj) {
103 openolt::Indication ind;
104 openolt::IntfOperIndication* intf_oper_ind = new openolt::IntfOperIndication;
105 std::cout << "intf oper state indication, intf_id:"
nickc063ffd2018-05-22 14:35:28 -0400106 << ((bcmbal_interface_oper_status_change *)obj)->key.intf_id
Shad Ansari01b0e652018-04-05 21:02:53 +0000107 << " type:" << ((bcmbal_interface_oper_status_change *)obj)->key.intf_type
108 << " oper_state:" << ((bcmbal_interface_oper_status_change *)obj)->data.new_oper_status
109 << " admin_state:" << ((bcmbal_interface_oper_status_change *)obj)->data.admin_state
110 << std::endl;
111
112 intf_oper_ind->set_intf_id(((bcmbal_interface_oper_status_change *)obj)->key.intf_id);
113
114 if (((bcmbal_interface_oper_status_change *)obj)->key.intf_type == BCMBAL_INTF_TYPE_NNI) {
115 intf_oper_ind->set_type("nni");
116 } else if (((bcmbal_interface_oper_status_change *)obj)->key.intf_type == BCMBAL_INTF_TYPE_PON) {
117 intf_oper_ind->set_type("pon");
118 } else {
119 intf_oper_ind->set_type("unknown");
120 }
121
122 if (((bcmbal_interface_oper_status_change *)obj)->data.new_oper_status == BCMBAL_STATUS_UP) {
123 intf_oper_ind->set_oper_state("up");
124 } else {
125 intf_oper_ind->set_oper_state("down");
126 }
127
128 ind.set_allocated_intf_oper_ind(intf_oper_ind);
129
130 oltIndQ.push(ind);
131 return BCM_ERR_OK;
132}
133
134bcmos_errno OnuAlarmIndication(bcmbal_obj *obj) {
135 openolt::Indication ind;
136 std::cout << "onu alarm indication" << std::endl;
137 return BCM_ERR_OK;
138}
139
140bcmos_errno OnuDyingGaspIndication(bcmbal_obj *obj) {
141 openolt::Indication ind;
nickc063ffd2018-05-22 14:35:28 -0400142 openolt::OnuIndication* onu_ind = new openolt::OnuIndication;
143 openolt::SerialNumber* serial_number = new openolt::SerialNumber;
144
145 bcmbal_subscriber_terminal_key *key =
146 &(((bcmbal_subscriber_terminal_dgi*)obj)->key);
147
148 bcmbal_subscriber_terminal_dgi_data *data =
149 &(((bcmbal_subscriber_terminal_dgi*)obj)->data);
150
151
152 std::cout << "onu dying-gasp indication, intf_id:"
153 << key->intf_id
154 << ", onu_id:"
155 << key->sub_term_id
156 << ", alarm: "
157 << data->dgi_status << std::endl;
158
159 onu_ind->set_intf_id(key->intf_id);
160 onu_ind->set_onu_id(key->sub_term_id);
161 const char* zeros4 = "0000";
162 const char* zeros8 = "00000000";
163 serial_number->set_vendor_id(zeros4);
164 serial_number->set_vendor_specific(zeros8);
165 onu_ind->set_allocated_serial_number(serial_number);
166 //ONU is dying, set operating state to down
167 onu_ind->set_oper_state("down");
168 //TODO: set admin state to unknow ? For now assume that it is up otherwise
169 //we would not have received the alarm
170 onu_ind->set_admin_state("up");
171
172
173 ind.set_allocated_onu_ind(onu_ind);
174
175 oltIndQ.push(ind);
Shad Ansari01b0e652018-04-05 21:02:53 +0000176 return BCM_ERR_OK;
177}
178
179bcmos_errno OnuDiscoveryIndication(bcmbal_cfg *obj) {
180 openolt::Indication ind;
181 openolt::OnuDiscIndication* onu_disc_ind = new openolt::OnuDiscIndication;
182 openolt::SerialNumber* serial_number = new openolt::SerialNumber;
183
184 bcmbal_subscriber_terminal_key *key =
185 &(((bcmbal_subscriber_terminal_sub_term_disc*)obj)->key);
186
187 bcmbal_subscriber_terminal_sub_term_disc_data *data =
188 &(((bcmbal_subscriber_terminal_sub_term_disc*)obj)->data);
189
190 bcmbal_serial_number *in_serial_number = &(data->serial_number);
191
192 std::cout << "onu discover indication, intf_id:"
193 << key->intf_id
194 << " serial_number:"
195 << serial_number_to_str(in_serial_number) << std::endl;
196
197 onu_disc_ind->set_intf_id(key->intf_id);
198 serial_number->set_vendor_id(reinterpret_cast<const char *>(in_serial_number->vendor_id), 4);
199 serial_number->set_vendor_specific(reinterpret_cast<const char *>(in_serial_number->vendor_specific), 8);
200 onu_disc_ind->set_allocated_serial_number(serial_number);
201 ind.set_allocated_onu_disc_ind(onu_disc_ind);
202
203 oltIndQ.push(ind);
204
205 return BCM_ERR_OK;
206}
207
208bcmos_errno OnuIndication(bcmbal_obj *obj) {
209 openolt::Indication ind;
210 openolt::OnuIndication* onu_ind = new openolt::OnuIndication;
211 openolt::SerialNumber* serial_number = new openolt::SerialNumber;
212
213 bcmbal_subscriber_terminal_key *key =
214 &(((bcmbal_subscriber_terminal_ind*)obj)->key);
215
216 bcmbal_subscriber_terminal_ind_data *data =
217 &(((bcmbal_subscriber_terminal_ind*)obj)->data);
218
219 bcmbal_serial_number *in_serial_number = &(data->serial_number);
220
221 std::cout << "onu indication, intf_id:"
222 << key->intf_id
223 << " serial_number:"
Nicolas Palpacuer58d252c2018-06-06 11:19:04 -0400224 << serial_number_to_str(in_serial_number)
225 << " oper_state:" << data->oper_status
226 << " admin_state:" << data->admin_state << std::endl;
Shad Ansari01b0e652018-04-05 21:02:53 +0000227
228 onu_ind->set_intf_id(key->intf_id);
229 onu_ind->set_onu_id(key->sub_term_id);
230 serial_number->set_vendor_id(reinterpret_cast<const char *>(in_serial_number->vendor_id), 4);
231 serial_number->set_vendor_specific(reinterpret_cast<const char *>(in_serial_number->vendor_specific), 8);
232 onu_ind->set_allocated_serial_number(serial_number);
nickc063ffd2018-05-22 14:35:28 -0400233 if (data->oper_status == BCMBAL_STATE_UP) {
234 onu_ind->set_oper_state("up");
235 } else {
236 onu_ind->set_oper_state("down");
237 }
238 if (data->admin_state == BCMBAL_STATE_UP) {
239 onu_ind->set_admin_state("up");
240 } else {
241 onu_ind->set_admin_state("down");
242 }
243
Shad Ansari01b0e652018-04-05 21:02:53 +0000244 ind.set_allocated_onu_ind(onu_ind);
245
246 oltIndQ.push(ind);
247 return BCM_ERR_OK;
248}
249
250bcmos_errno OnuOperIndication(bcmbal_obj *obj) {
251 openolt::Indication ind;
nickc063ffd2018-05-22 14:35:28 -0400252 openolt::OnuIndication* onu_ind = new openolt::OnuIndication;
253 openolt::SerialNumber* serial_number = new openolt::SerialNumber;
254
255 bcmbal_subscriber_terminal_key *key =
256 &(((bcmbal_subscriber_terminal_oper_status_change*)obj)->key);
257
258 bcmbal_subscriber_terminal_oper_status_change_data *data =
259 &(((bcmbal_subscriber_terminal_oper_status_change*)obj)->data);
260
261
262 std::cout << "onu oper state indication, intf_id:"
263 << key->intf_id
264 << " onu_id: "
265 << key->sub_term_id
266 << " old oper state: "
267 << data->old_oper_status
268 << " new oper state:"
269 << data->new_oper_status << std::endl;
270
271 onu_ind->set_intf_id(key->intf_id);
272 onu_ind->set_onu_id(key->sub_term_id);
273 const char* zeros4 = "0000";
274 const char* zeros8 = "00000000";
275 serial_number->set_vendor_id(zeros4);
276 serial_number->set_vendor_specific(zeros8);
277 onu_ind->set_allocated_serial_number(serial_number);
278 if (data->new_oper_status == BCMBAL_STATE_UP) {
279 onu_ind->set_oper_state("up");
280 } else {
281 onu_ind->set_oper_state("down");
282 }
283 if (data->admin_state == BCMBAL_STATE_UP) {
284 onu_ind->set_admin_state("up");
285 } else {
286 onu_ind->set_admin_state("down");
287 }
288
289 ind.set_allocated_onu_ind(onu_ind);
290
291 oltIndQ.push(ind);
Shad Ansari01b0e652018-04-05 21:02:53 +0000292 return BCM_ERR_OK;
293}
294
295bcmos_errno OmciIndication(bcmbal_obj *obj) {
296 openolt::Indication ind;
297 openolt::OmciIndication* omci_ind = new openolt::OmciIndication;
Shad Ansari5fe93682018-04-26 05:24:19 +0000298 bcmbal_packet_itu_omci_channel_rx *in =
Shad Ansari01b0e652018-04-05 21:02:53 +0000299 (bcmbal_packet_itu_omci_channel_rx *)obj;
300
301 std::cout << "omci indication" << std::endl;
302
Shad Ansari5fe93682018-04-26 05:24:19 +0000303 omci_ind->set_intf_id(in->key.packet_send_dest.u.itu_omci_channel.intf_id);
304 omci_ind->set_onu_id(in->key.packet_send_dest.u.itu_omci_channel.sub_term_id);
305 omci_ind->set_pkt(in->data.pkt.val, in->data.pkt.len);
Shad Ansari01b0e652018-04-05 21:02:53 +0000306
307 ind.set_allocated_omci_ind(omci_ind);
308 oltIndQ.push(ind);
309
310 return BCM_ERR_OK;
311}
312
Shad Ansari5fe93682018-04-26 05:24:19 +0000313bcmos_errno PacketIndication(bcmbal_obj *obj) {
Shad Ansari01b0e652018-04-05 21:02:53 +0000314 openolt::Indication ind;
Shad Ansari5fe93682018-04-26 05:24:19 +0000315 openolt::PacketIndication* pkt_ind = new openolt::PacketIndication;
316 bcmbal_packet_bearer_channel_rx *in = (bcmbal_packet_bearer_channel_rx *)obj;
317
318 std::cout << "packet indication"
319 << " intf_id:" << in->data.intf_id
320 << " svc_port:" << in->data.svc_port
321 << " flow_id:" << in->data.flow_id
322 << std::endl;
323
324 pkt_ind->set_intf_id(in->data.intf_id);
325 pkt_ind->set_gemport_id(in->data.svc_port);
326 pkt_ind->set_flow_id(in->data.flow_id);
327 pkt_ind->set_pkt(in->data.pkt.val, in->data.pkt.len);
328
329 ind.set_allocated_pkt_ind(pkt_ind);
330 oltIndQ.push(ind);
331
Shad Ansari01b0e652018-04-05 21:02:53 +0000332 return BCM_ERR_OK;
333}
334
335bcmos_errno FlowOperIndication(bcmbal_obj *obj) {
336 openolt::Indication ind;
337 std::cout << "flow oper state indication" << std::endl;
338 return BCM_ERR_OK;
339}
340
341bcmos_errno FlowIndication(bcmbal_obj *obj) {
342 openolt::Indication ind;
343 std::cout << "flow indication" << std::endl;
344 return BCM_ERR_OK;
345}
346
347bcmos_errno TmQIndication(bcmbal_obj *obj) {
348 openolt::Indication ind;
349 std::cout << "traffic mgmt queue indication" << std::endl;
350 return BCM_ERR_OK;
351}
352
353bcmos_errno TmSchedIndication(bcmbal_obj *obj) {
354 openolt::Indication ind;
355 std::cout << "traffic mgmt sheduler indication" << std::endl;
356 return BCM_ERR_OK;
357}
358
359bcmos_errno McastGroupIndication(bcmbal_obj *obj) {
360 openolt::Indication ind;
361 std::cout << "mcast group indication" << std::endl;
362 return BCM_ERR_OK;
363}
364
365Status SubscribeIndication() {
366 bcmbal_cb_cfg cb_cfg = {};
367 uint16_t ind_subgroup;
368
369 if (subscribed) {
370 return Status::OK;
371 }
372
373 cb_cfg.module = BCMOS_MODULE_ID_NONE;
374
375
376 /* OLT device indication */
377 cb_cfg.obj_type = BCMBAL_OBJ_ID_ACCESS_TERMINAL;
378 ind_subgroup = bcmbal_access_terminal_auto_id_ind;
379 cb_cfg.p_subgroup = &ind_subgroup;
380 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OltIndication;
381 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
382 return Status(grpc::StatusCode::INTERNAL, "Olt indication subscribe failed");
383 }
384
385 /* Interface LOS indication */
386 cb_cfg.obj_type = BCMBAL_OBJ_ID_INTERFACE;
387 ind_subgroup = bcmbal_interface_auto_id_los;
388 cb_cfg.p_subgroup = &ind_subgroup;
389 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)LosIndication;
390 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
391 return Status(grpc::StatusCode::INTERNAL, "LOS indication subscribe failed");
392 }
393
394 /* Interface indication */
395 cb_cfg.obj_type = BCMBAL_OBJ_ID_INTERFACE;
396 ind_subgroup = bcmbal_interface_auto_id_ind;
397 cb_cfg.p_subgroup = &ind_subgroup;
398 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)IfIndication;
399 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
400 return Status(grpc::StatusCode::INTERNAL, "Interface indication subscribe failed");
401 }
402
403 /* Interface operational state change indication */
404 cb_cfg.obj_type = BCMBAL_OBJ_ID_INTERFACE;
405 ind_subgroup = bcmbal_interface_auto_id_oper_status_change;
406 cb_cfg.p_subgroup = &ind_subgroup;
407 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)IfOperIndication;
408 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
409 return Status(grpc::StatusCode::INTERNAL, "Interface operations state change indication subscribe failed");
410 }
411
412 /* onu alarm indication */
413 cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
414 ind_subgroup = bcmbal_subscriber_terminal_auto_id_sub_term_alarm;
415 cb_cfg.p_subgroup = &ind_subgroup;
416 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuAlarmIndication;
417 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
418 return Status(grpc::StatusCode::INTERNAL, "onu alarm indication subscribe failed");
419 }
420
421 /* onu dying-gasp indication */
422 cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
423 ind_subgroup = bcmbal_subscriber_terminal_auto_id_dgi;
424 cb_cfg.p_subgroup = &ind_subgroup;
425 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuDyingGaspIndication;
426 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
427 return Status(grpc::StatusCode::INTERNAL, "onu dying-gasp indication subscribe failed");
428 }
429
430 /* onu discovery indication */
431 cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
432 ind_subgroup = bcmbal_subscriber_terminal_auto_id_sub_term_disc;
433 cb_cfg.p_subgroup = &ind_subgroup;
434 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuDiscoveryIndication;
435 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
436 return Status(grpc::StatusCode::INTERNAL, "onu discovery indication subscribe failed");
437 }
438
439 /* onu indication */
440 cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
441 ind_subgroup = bcmbal_subscriber_terminal_auto_id_ind;
442 cb_cfg.p_subgroup = &ind_subgroup;
443 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuIndication;
444 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
445 return Status(grpc::StatusCode::INTERNAL, "onu indication subscribe failed");
446 }
447 /* onu operational state change indication */
448 cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
449 ind_subgroup = bcmbal_subscriber_terminal_auto_id_oper_status_change;
450 cb_cfg.p_subgroup = &ind_subgroup;
451 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuOperIndication;
452 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
453 return Status(grpc::StatusCode::INTERNAL, "onu operational state change indication subscribe failed");
454 }
455
Shad Ansari5fe93682018-04-26 05:24:19 +0000456 /* Packet (bearer) indication */
Shad Ansari01b0e652018-04-05 21:02:53 +0000457 cb_cfg.obj_type = BCMBAL_OBJ_ID_PACKET;
458 ind_subgroup = bcmbal_packet_auto_id_bearer_channel_rx;
459 cb_cfg.p_subgroup = &ind_subgroup;
Shad Ansari5fe93682018-04-26 05:24:19 +0000460 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)PacketIndication;
Shad Ansari01b0e652018-04-05 21:02:53 +0000461 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
Shad Ansari5fe93682018-04-26 05:24:19 +0000462 return Status(grpc::StatusCode::INTERNAL, "Packet indication subscribe failed");
Shad Ansari01b0e652018-04-05 21:02:53 +0000463 }
464
465 /* Flow Operational State Change */
466 cb_cfg.obj_type = BCMBAL_OBJ_ID_FLOW;
467 ind_subgroup = bcmbal_flow_auto_id_oper_status_change;
468 cb_cfg.p_subgroup = &ind_subgroup;
469 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)FlowOperIndication;
470 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
471 return Status(grpc::StatusCode::INTERNAL, "Flow operational state change indication subscribe failed");
472 }
473 /* Flow Indication */
474 cb_cfg.obj_type = BCMBAL_OBJ_ID_FLOW;
475 ind_subgroup = bcmbal_flow_auto_id_ind;
476 cb_cfg.p_subgroup = &ind_subgroup;
477 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)FlowIndication;
478 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
479 return Status(grpc::StatusCode::INTERNAL, "Flow indication subscribe failed");
480 }
481
482 /* TM queue indication */
483 cb_cfg.obj_type = BCMBAL_OBJ_ID_TM_QUEUE;
484 ind_subgroup = bcmbal_tm_queue_auto_id_ind;
485 cb_cfg.p_subgroup = &ind_subgroup;
486 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)TmQIndication;
487 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
488 return Status(grpc::StatusCode::INTERNAL, "Traffic mgmt queue indication subscribe failed");
489 }
490
491 /* TM sched indication */
492 cb_cfg.obj_type = BCMBAL_OBJ_ID_TM_SCHED;
493 ind_subgroup = bcmbal_tm_sched_auto_id_ind;
494 cb_cfg.p_subgroup = &ind_subgroup;
495 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)TmSchedIndication;
496 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
497 return Status(grpc::StatusCode::INTERNAL, "Traffic mgmt queue indication subscribe failed");
498 }
499
500 /* Multicast group indication */
501 cb_cfg.obj_type = BCMBAL_OBJ_ID_GROUP;
502 ind_subgroup = bcmbal_group_auto_id_ind;
503 cb_cfg.p_subgroup = &ind_subgroup;
504 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)McastGroupIndication;
505 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
506 return Status(grpc::StatusCode::INTERNAL, "Multicast group indication subscribe failed");
507 }
508
509 subscribed = true;
510
511 return Status::OK;
512}