blob: 73467728653ce4181aa155cffa48caeaaca81e1d [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"
Nicolas Palpacuer0f19b1a2018-06-07 17:29:31 -040020#include "stats_collection.h"
Shad Ansari01b0e652018-04-05 21:02:53 +000021extern "C"
22{
23#include <bcmos_system.h>
24#include <bal_api.h>
25#include <bal_api_end.h>
26}
27
28using grpc::Status;
29
30Queue<openolt::Indication> oltIndQ;
31//Queue<openolt::Indication*> oltIndQ;
32
33bool subscribed = false;
34
35bcmos_errno OmciIndication(bcmbal_obj *obj);
36
37bcmos_errno OltIndication(bcmbal_obj *obj) {
38 openolt::Indication ind;
39 openolt::OltIndication* olt_ind = new openolt::OltIndication;
40 Status status;
41
42 bcmbal_access_terminal_ind *acc_term_ind = (bcmbal_access_terminal_ind *)obj;
43 if (acc_term_ind->data.oper_status == BCMBAL_STATUS_UP) {
44 olt_ind->set_oper_state("up");
Nicolas Palpacuer0f19b1a2018-06-07 17:29:31 -040045 start_collecting_statistics();
Shad Ansari01b0e652018-04-05 21:02:53 +000046 } else {
47 olt_ind->set_oper_state("down");
Nicolas Palpacuer0f19b1a2018-06-07 17:29:31 -040048 stop_collecting_statistics();
Shad Ansari01b0e652018-04-05 21:02:53 +000049 }
50 ind.set_allocated_olt_ind(olt_ind);
51 std::cout << "olt indication, oper_state:" << ind.olt_ind().oper_state() << std::endl;
52 oltIndQ.push(ind);
53
54 // Enable all PON interfaces.
55 for (int i = 0; i < MAX_SUPPORTED_INTF; i++) {
56 status = EnablePonIf_(i);
57 if (!status.ok()) {
58 // FIXME - raise alarm to report error in enabling PON
59 }
60 }
61
62 /* register for omci indication */
63 {
64 bcmbal_cb_cfg cb_cfg = {};
65 uint16_t ind_subgroup;
66
67 cb_cfg.module = BCMOS_MODULE_ID_NONE;
68 cb_cfg.obj_type = BCMBAL_OBJ_ID_PACKET;
69 ind_subgroup = BCMBAL_IND_SUBGROUP(packet, itu_omci_channel_rx);
70 cb_cfg.p_object_key_info = NULL;
71 cb_cfg.p_subgroup = &ind_subgroup;
72 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OmciIndication;
73 bcmbal_subscribe_ind(0, &cb_cfg);
74 }
75
76 return BCM_ERR_OK;
77}
78
79bcmos_errno LosIndication(bcmbal_obj *obj) {
80 openolt::Indication ind;
81 std::cout << "LOS indication " << std::endl;
82 return BCM_ERR_OK;
83}
84
85bcmos_errno IfIndication(bcmbal_obj *obj) {
86 openolt::Indication ind;
87 openolt::IntfIndication* intf_ind = new openolt::IntfIndication;
88
89 std::cout << "intf indication, intf_id:"
90 << ((bcmbal_interface_ind *)obj)->key.intf_id << std::endl;
91
92 intf_ind->set_intf_id(((bcmbal_interface_ind *)obj)->key.intf_id);
93 if (((bcmbal_interface_ind *)obj)->data.oper_status == BCMBAL_STATUS_UP) {
94 intf_ind->set_oper_state("up");
95 } else {
96 intf_ind->set_oper_state("down");
97 }
98 ind.set_allocated_intf_ind(intf_ind);
99
100 oltIndQ.push(ind);
101
102 return BCM_ERR_OK;
103}
104
105bcmos_errno IfOperIndication(bcmbal_obj *obj) {
106 openolt::Indication ind;
107 openolt::IntfOperIndication* intf_oper_ind = new openolt::IntfOperIndication;
108 std::cout << "intf oper state indication, intf_id:"
nickc063ffd2018-05-22 14:35:28 -0400109 << ((bcmbal_interface_oper_status_change *)obj)->key.intf_id
Shad Ansari01b0e652018-04-05 21:02:53 +0000110 << " type:" << ((bcmbal_interface_oper_status_change *)obj)->key.intf_type
111 << " oper_state:" << ((bcmbal_interface_oper_status_change *)obj)->data.new_oper_status
112 << " admin_state:" << ((bcmbal_interface_oper_status_change *)obj)->data.admin_state
113 << std::endl;
114
115 intf_oper_ind->set_intf_id(((bcmbal_interface_oper_status_change *)obj)->key.intf_id);
116
117 if (((bcmbal_interface_oper_status_change *)obj)->key.intf_type == BCMBAL_INTF_TYPE_NNI) {
118 intf_oper_ind->set_type("nni");
119 } else if (((bcmbal_interface_oper_status_change *)obj)->key.intf_type == BCMBAL_INTF_TYPE_PON) {
120 intf_oper_ind->set_type("pon");
121 } else {
122 intf_oper_ind->set_type("unknown");
123 }
124
125 if (((bcmbal_interface_oper_status_change *)obj)->data.new_oper_status == BCMBAL_STATUS_UP) {
126 intf_oper_ind->set_oper_state("up");
127 } else {
128 intf_oper_ind->set_oper_state("down");
129 }
130
131 ind.set_allocated_intf_oper_ind(intf_oper_ind);
132
133 oltIndQ.push(ind);
134 return BCM_ERR_OK;
135}
136
137bcmos_errno OnuAlarmIndication(bcmbal_obj *obj) {
138 openolt::Indication ind;
139 std::cout << "onu alarm indication" << std::endl;
140 return BCM_ERR_OK;
141}
142
143bcmos_errno OnuDyingGaspIndication(bcmbal_obj *obj) {
144 openolt::Indication ind;
nickc063ffd2018-05-22 14:35:28 -0400145 openolt::OnuIndication* onu_ind = new openolt::OnuIndication;
146 openolt::SerialNumber* serial_number = new openolt::SerialNumber;
147
148 bcmbal_subscriber_terminal_key *key =
149 &(((bcmbal_subscriber_terminal_dgi*)obj)->key);
150
151 bcmbal_subscriber_terminal_dgi_data *data =
152 &(((bcmbal_subscriber_terminal_dgi*)obj)->data);
153
154
155 std::cout << "onu dying-gasp indication, intf_id:"
156 << key->intf_id
157 << ", onu_id:"
158 << key->sub_term_id
159 << ", alarm: "
160 << data->dgi_status << std::endl;
161
162 onu_ind->set_intf_id(key->intf_id);
163 onu_ind->set_onu_id(key->sub_term_id);
164 const char* zeros4 = "0000";
165 const char* zeros8 = "00000000";
166 serial_number->set_vendor_id(zeros4);
167 serial_number->set_vendor_specific(zeros8);
168 onu_ind->set_allocated_serial_number(serial_number);
169 //ONU is dying, set operating state to down
170 onu_ind->set_oper_state("down");
171 //TODO: set admin state to unknow ? For now assume that it is up otherwise
172 //we would not have received the alarm
173 onu_ind->set_admin_state("up");
174
175
176 ind.set_allocated_onu_ind(onu_ind);
177
178 oltIndQ.push(ind);
Shad Ansari01b0e652018-04-05 21:02:53 +0000179 return BCM_ERR_OK;
180}
181
182bcmos_errno OnuDiscoveryIndication(bcmbal_cfg *obj) {
183 openolt::Indication ind;
184 openolt::OnuDiscIndication* onu_disc_ind = new openolt::OnuDiscIndication;
185 openolt::SerialNumber* serial_number = new openolt::SerialNumber;
186
187 bcmbal_subscriber_terminal_key *key =
188 &(((bcmbal_subscriber_terminal_sub_term_disc*)obj)->key);
189
190 bcmbal_subscriber_terminal_sub_term_disc_data *data =
191 &(((bcmbal_subscriber_terminal_sub_term_disc*)obj)->data);
192
193 bcmbal_serial_number *in_serial_number = &(data->serial_number);
194
195 std::cout << "onu discover indication, intf_id:"
196 << key->intf_id
197 << " serial_number:"
198 << serial_number_to_str(in_serial_number) << std::endl;
199
200 onu_disc_ind->set_intf_id(key->intf_id);
201 serial_number->set_vendor_id(reinterpret_cast<const char *>(in_serial_number->vendor_id), 4);
202 serial_number->set_vendor_specific(reinterpret_cast<const char *>(in_serial_number->vendor_specific), 8);
203 onu_disc_ind->set_allocated_serial_number(serial_number);
204 ind.set_allocated_onu_disc_ind(onu_disc_ind);
205
206 oltIndQ.push(ind);
207
208 return BCM_ERR_OK;
209}
210
211bcmos_errno OnuIndication(bcmbal_obj *obj) {
212 openolt::Indication ind;
213 openolt::OnuIndication* onu_ind = new openolt::OnuIndication;
214 openolt::SerialNumber* serial_number = new openolt::SerialNumber;
215
216 bcmbal_subscriber_terminal_key *key =
217 &(((bcmbal_subscriber_terminal_ind*)obj)->key);
218
219 bcmbal_subscriber_terminal_ind_data *data =
220 &(((bcmbal_subscriber_terminal_ind*)obj)->data);
221
222 bcmbal_serial_number *in_serial_number = &(data->serial_number);
223
224 std::cout << "onu indication, intf_id:"
225 << key->intf_id
226 << " serial_number:"
Nicolas Palpacuer58d252c2018-06-06 11:19:04 -0400227 << serial_number_to_str(in_serial_number)
228 << " oper_state:" << data->oper_status
229 << " admin_state:" << data->admin_state << std::endl;
Shad Ansari01b0e652018-04-05 21:02:53 +0000230
231 onu_ind->set_intf_id(key->intf_id);
232 onu_ind->set_onu_id(key->sub_term_id);
233 serial_number->set_vendor_id(reinterpret_cast<const char *>(in_serial_number->vendor_id), 4);
234 serial_number->set_vendor_specific(reinterpret_cast<const char *>(in_serial_number->vendor_specific), 8);
235 onu_ind->set_allocated_serial_number(serial_number);
nickc063ffd2018-05-22 14:35:28 -0400236 if (data->oper_status == BCMBAL_STATE_UP) {
237 onu_ind->set_oper_state("up");
238 } else {
239 onu_ind->set_oper_state("down");
240 }
241 if (data->admin_state == BCMBAL_STATE_UP) {
242 onu_ind->set_admin_state("up");
243 } else {
244 onu_ind->set_admin_state("down");
245 }
246
Shad Ansari01b0e652018-04-05 21:02:53 +0000247 ind.set_allocated_onu_ind(onu_ind);
248
249 oltIndQ.push(ind);
250 return BCM_ERR_OK;
251}
252
253bcmos_errno OnuOperIndication(bcmbal_obj *obj) {
254 openolt::Indication ind;
nickc063ffd2018-05-22 14:35:28 -0400255 openolt::OnuIndication* onu_ind = new openolt::OnuIndication;
256 openolt::SerialNumber* serial_number = new openolt::SerialNumber;
257
258 bcmbal_subscriber_terminal_key *key =
259 &(((bcmbal_subscriber_terminal_oper_status_change*)obj)->key);
260
261 bcmbal_subscriber_terminal_oper_status_change_data *data =
262 &(((bcmbal_subscriber_terminal_oper_status_change*)obj)->data);
263
264
265 std::cout << "onu oper state indication, intf_id:"
266 << key->intf_id
267 << " onu_id: "
268 << key->sub_term_id
269 << " old oper state: "
270 << data->old_oper_status
271 << " new oper state:"
272 << data->new_oper_status << std::endl;
273
274 onu_ind->set_intf_id(key->intf_id);
275 onu_ind->set_onu_id(key->sub_term_id);
276 const char* zeros4 = "0000";
277 const char* zeros8 = "00000000";
278 serial_number->set_vendor_id(zeros4);
279 serial_number->set_vendor_specific(zeros8);
280 onu_ind->set_allocated_serial_number(serial_number);
281 if (data->new_oper_status == BCMBAL_STATE_UP) {
282 onu_ind->set_oper_state("up");
283 } else {
284 onu_ind->set_oper_state("down");
285 }
286 if (data->admin_state == BCMBAL_STATE_UP) {
287 onu_ind->set_admin_state("up");
288 } else {
289 onu_ind->set_admin_state("down");
290 }
291
292 ind.set_allocated_onu_ind(onu_ind);
293
294 oltIndQ.push(ind);
Shad Ansari01b0e652018-04-05 21:02:53 +0000295 return BCM_ERR_OK;
296}
297
298bcmos_errno OmciIndication(bcmbal_obj *obj) {
299 openolt::Indication ind;
300 openolt::OmciIndication* omci_ind = new openolt::OmciIndication;
Shad Ansari5fe93682018-04-26 05:24:19 +0000301 bcmbal_packet_itu_omci_channel_rx *in =
Shad Ansari01b0e652018-04-05 21:02:53 +0000302 (bcmbal_packet_itu_omci_channel_rx *)obj;
303
304 std::cout << "omci indication" << std::endl;
305
Shad Ansari5fe93682018-04-26 05:24:19 +0000306 omci_ind->set_intf_id(in->key.packet_send_dest.u.itu_omci_channel.intf_id);
307 omci_ind->set_onu_id(in->key.packet_send_dest.u.itu_omci_channel.sub_term_id);
308 omci_ind->set_pkt(in->data.pkt.val, in->data.pkt.len);
Shad Ansari01b0e652018-04-05 21:02:53 +0000309
310 ind.set_allocated_omci_ind(omci_ind);
311 oltIndQ.push(ind);
312
313 return BCM_ERR_OK;
314}
315
Shad Ansari5fe93682018-04-26 05:24:19 +0000316bcmos_errno PacketIndication(bcmbal_obj *obj) {
Shad Ansari01b0e652018-04-05 21:02:53 +0000317 openolt::Indication ind;
Shad Ansari5fe93682018-04-26 05:24:19 +0000318 openolt::PacketIndication* pkt_ind = new openolt::PacketIndication;
319 bcmbal_packet_bearer_channel_rx *in = (bcmbal_packet_bearer_channel_rx *)obj;
320
321 std::cout << "packet indication"
322 << " intf_id:" << in->data.intf_id
323 << " svc_port:" << in->data.svc_port
324 << " flow_id:" << in->data.flow_id
325 << std::endl;
326
327 pkt_ind->set_intf_id(in->data.intf_id);
328 pkt_ind->set_gemport_id(in->data.svc_port);
329 pkt_ind->set_flow_id(in->data.flow_id);
330 pkt_ind->set_pkt(in->data.pkt.val, in->data.pkt.len);
331
332 ind.set_allocated_pkt_ind(pkt_ind);
333 oltIndQ.push(ind);
334
Shad Ansari01b0e652018-04-05 21:02:53 +0000335 return BCM_ERR_OK;
336}
337
338bcmos_errno FlowOperIndication(bcmbal_obj *obj) {
339 openolt::Indication ind;
340 std::cout << "flow oper state indication" << std::endl;
341 return BCM_ERR_OK;
342}
343
344bcmos_errno FlowIndication(bcmbal_obj *obj) {
345 openolt::Indication ind;
346 std::cout << "flow indication" << std::endl;
347 return BCM_ERR_OK;
348}
349
350bcmos_errno TmQIndication(bcmbal_obj *obj) {
351 openolt::Indication ind;
352 std::cout << "traffic mgmt queue indication" << std::endl;
353 return BCM_ERR_OK;
354}
355
356bcmos_errno TmSchedIndication(bcmbal_obj *obj) {
357 openolt::Indication ind;
358 std::cout << "traffic mgmt sheduler indication" << std::endl;
359 return BCM_ERR_OK;
360}
361
362bcmos_errno McastGroupIndication(bcmbal_obj *obj) {
363 openolt::Indication ind;
364 std::cout << "mcast group indication" << std::endl;
365 return BCM_ERR_OK;
366}
367
368Status SubscribeIndication() {
369 bcmbal_cb_cfg cb_cfg = {};
370 uint16_t ind_subgroup;
371
372 if (subscribed) {
373 return Status::OK;
374 }
375
376 cb_cfg.module = BCMOS_MODULE_ID_NONE;
377
378
379 /* OLT device indication */
380 cb_cfg.obj_type = BCMBAL_OBJ_ID_ACCESS_TERMINAL;
381 ind_subgroup = bcmbal_access_terminal_auto_id_ind;
382 cb_cfg.p_subgroup = &ind_subgroup;
383 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OltIndication;
384 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
385 return Status(grpc::StatusCode::INTERNAL, "Olt indication subscribe failed");
386 }
387
388 /* Interface LOS indication */
389 cb_cfg.obj_type = BCMBAL_OBJ_ID_INTERFACE;
390 ind_subgroup = bcmbal_interface_auto_id_los;
391 cb_cfg.p_subgroup = &ind_subgroup;
392 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)LosIndication;
393 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
394 return Status(grpc::StatusCode::INTERNAL, "LOS indication subscribe failed");
395 }
396
397 /* Interface indication */
398 cb_cfg.obj_type = BCMBAL_OBJ_ID_INTERFACE;
399 ind_subgroup = bcmbal_interface_auto_id_ind;
400 cb_cfg.p_subgroup = &ind_subgroup;
401 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)IfIndication;
402 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
403 return Status(grpc::StatusCode::INTERNAL, "Interface indication subscribe failed");
404 }
405
406 /* Interface operational state change indication */
407 cb_cfg.obj_type = BCMBAL_OBJ_ID_INTERFACE;
408 ind_subgroup = bcmbal_interface_auto_id_oper_status_change;
409 cb_cfg.p_subgroup = &ind_subgroup;
410 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)IfOperIndication;
411 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
412 return Status(grpc::StatusCode::INTERNAL, "Interface operations state change indication subscribe failed");
413 }
414
415 /* onu alarm indication */
416 cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
417 ind_subgroup = bcmbal_subscriber_terminal_auto_id_sub_term_alarm;
418 cb_cfg.p_subgroup = &ind_subgroup;
419 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuAlarmIndication;
420 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
421 return Status(grpc::StatusCode::INTERNAL, "onu alarm indication subscribe failed");
422 }
423
424 /* onu dying-gasp indication */
425 cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
426 ind_subgroup = bcmbal_subscriber_terminal_auto_id_dgi;
427 cb_cfg.p_subgroup = &ind_subgroup;
428 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuDyingGaspIndication;
429 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
430 return Status(grpc::StatusCode::INTERNAL, "onu dying-gasp indication subscribe failed");
431 }
432
433 /* onu discovery indication */
434 cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
435 ind_subgroup = bcmbal_subscriber_terminal_auto_id_sub_term_disc;
436 cb_cfg.p_subgroup = &ind_subgroup;
437 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuDiscoveryIndication;
438 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
439 return Status(grpc::StatusCode::INTERNAL, "onu discovery indication subscribe failed");
440 }
441
442 /* onu indication */
443 cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
444 ind_subgroup = bcmbal_subscriber_terminal_auto_id_ind;
445 cb_cfg.p_subgroup = &ind_subgroup;
446 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuIndication;
447 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
448 return Status(grpc::StatusCode::INTERNAL, "onu indication subscribe failed");
449 }
450 /* onu operational state change indication */
451 cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
452 ind_subgroup = bcmbal_subscriber_terminal_auto_id_oper_status_change;
453 cb_cfg.p_subgroup = &ind_subgroup;
454 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuOperIndication;
455 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
456 return Status(grpc::StatusCode::INTERNAL, "onu operational state change indication subscribe failed");
457 }
458
Shad Ansari5fe93682018-04-26 05:24:19 +0000459 /* Packet (bearer) indication */
Shad Ansari01b0e652018-04-05 21:02:53 +0000460 cb_cfg.obj_type = BCMBAL_OBJ_ID_PACKET;
461 ind_subgroup = bcmbal_packet_auto_id_bearer_channel_rx;
462 cb_cfg.p_subgroup = &ind_subgroup;
Shad Ansari5fe93682018-04-26 05:24:19 +0000463 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)PacketIndication;
Shad Ansari01b0e652018-04-05 21:02:53 +0000464 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
Shad Ansari5fe93682018-04-26 05:24:19 +0000465 return Status(grpc::StatusCode::INTERNAL, "Packet indication subscribe failed");
Shad Ansari01b0e652018-04-05 21:02:53 +0000466 }
467
468 /* Flow Operational State Change */
469 cb_cfg.obj_type = BCMBAL_OBJ_ID_FLOW;
470 ind_subgroup = bcmbal_flow_auto_id_oper_status_change;
471 cb_cfg.p_subgroup = &ind_subgroup;
472 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)FlowOperIndication;
473 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
474 return Status(grpc::StatusCode::INTERNAL, "Flow operational state change indication subscribe failed");
475 }
476 /* Flow Indication */
477 cb_cfg.obj_type = BCMBAL_OBJ_ID_FLOW;
478 ind_subgroup = bcmbal_flow_auto_id_ind;
479 cb_cfg.p_subgroup = &ind_subgroup;
480 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)FlowIndication;
481 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
482 return Status(grpc::StatusCode::INTERNAL, "Flow indication subscribe failed");
483 }
484
485 /* TM queue indication */
486 cb_cfg.obj_type = BCMBAL_OBJ_ID_TM_QUEUE;
487 ind_subgroup = bcmbal_tm_queue_auto_id_ind;
488 cb_cfg.p_subgroup = &ind_subgroup;
489 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)TmQIndication;
490 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
491 return Status(grpc::StatusCode::INTERNAL, "Traffic mgmt queue indication subscribe failed");
492 }
493
494 /* TM sched indication */
495 cb_cfg.obj_type = BCMBAL_OBJ_ID_TM_SCHED;
496 ind_subgroup = bcmbal_tm_sched_auto_id_ind;
497 cb_cfg.p_subgroup = &ind_subgroup;
498 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)TmSchedIndication;
499 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
500 return Status(grpc::StatusCode::INTERNAL, "Traffic mgmt queue indication subscribe failed");
501 }
502
503 /* Multicast group indication */
504 cb_cfg.obj_type = BCMBAL_OBJ_ID_GROUP;
505 ind_subgroup = bcmbal_group_auto_id_ind;
506 cb_cfg.p_subgroup = &ind_subgroup;
507 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)McastGroupIndication;
508 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
509 return Status(grpc::StatusCode::INTERNAL, "Multicast group indication subscribe failed");
510 }
511
512 subscribed = true;
513
514 return Status::OK;
515}