blob: b0ba9641c7ff8d8e7b0754cf45dafb49f7dc5f18 [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"
Nicolas Palpacuera32f4c32018-06-28 12:55:10 -040021#include "translation.h"
Nicolas Palpacuer3cad49d2018-07-02 14:03:24 -040022#include "state.h"
23
Nicolas Palpacuera32f4c32018-06-28 12:55:10 -040024#include <string>
Nicolas Palpacuer3cad49d2018-07-02 14:03:24 -040025
Shad Ansari01b0e652018-04-05 21:02:53 +000026extern "C"
27{
28#include <bcmos_system.h>
29#include <bal_api.h>
30#include <bal_api_end.h>
31}
32
33using grpc::Status;
34
Shad Ansari627b5782018-08-13 22:49:32 +000035extern Queue<openolt::Indication> oltIndQ;
Shad Ansari01b0e652018-04-05 21:02:53 +000036//Queue<openolt::Indication*> oltIndQ;
37
Nicolas Palpacuer3cad49d2018-07-02 14:03:24 -040038
Shad Ansari01b0e652018-04-05 21:02:53 +000039bool subscribed = false;
40
41bcmos_errno OmciIndication(bcmbal_obj *obj);
42
Craig Lutgen88a22ad2018-10-04 12:30:46 -050043std::string bcmbal_to_grpc_intf_type(bcmbal_intf_type intf_type)
44{
45 if (intf_type == BCMBAL_INTF_TYPE_NNI) {
46 return "nni";
47 } else if (intf_type == BCMBAL_INTF_TYPE_PON) {
48 return "pon";
49 }
50 return "unknown";
51}
52
53bcmos_errno OltOperIndication(bcmbal_obj *obj) {
Shad Ansari01b0e652018-04-05 21:02:53 +000054 openolt::Indication ind;
55 openolt::OltIndication* olt_ind = new openolt::OltIndication;
56 Status status;
57
Shad Ansaricb004c52018-05-30 18:07:23 +000058 bcmbal_access_terminal_oper_status_change *acc_term_ind = (bcmbal_access_terminal_oper_status_change *)obj;
Craig Lutgen88a22ad2018-10-04 12:30:46 -050059 std::string admin_state;
60 if (acc_term_ind->data.admin_state == BCMBAL_STATE_UP) {
61 admin_state = "up";
62 } else {
63 admin_state = "down";
64 }
65
Shad Ansaricb004c52018-05-30 18:07:23 +000066 if (acc_term_ind->data.new_oper_status == BCMBAL_STATUS_UP) {
Craig Lutgen88a22ad2018-10-04 12:30:46 -050067 // Determine device capabilities before transitionto acive state
68 ProbeDeviceCapabilities_();
Shad Ansari01b0e652018-04-05 21:02:53 +000069 olt_ind->set_oper_state("up");
70 } else {
71 olt_ind->set_oper_state("down");
72 }
73 ind.set_allocated_olt_ind(olt_ind);
Craig Lutgen88a22ad2018-10-04 12:30:46 -050074
75 BCM_LOG(INFO, openolt_log_id, "Olt oper status indication, admin_state: %s oper_state: %s\n",
76 admin_state.c_str(),
77 olt_ind->oper_state().c_str());
78
Shad Ansari01b0e652018-04-05 21:02:53 +000079 oltIndQ.push(ind);
80
Craig Lutgen88a22ad2018-10-04 12:30:46 -050081 // Enable all PON interfaces.
82 //
83 for (int i = 0; i < NumPonIf_(); i++) {
Shad Ansari01b0e652018-04-05 21:02:53 +000084 status = EnablePonIf_(i);
85 if (!status.ok()) {
86 // FIXME - raise alarm to report error in enabling PON
87 }
88 }
89
90 /* register for omci indication */
91 {
92 bcmbal_cb_cfg cb_cfg = {};
93 uint16_t ind_subgroup;
94
95 cb_cfg.module = BCMOS_MODULE_ID_NONE;
96 cb_cfg.obj_type = BCMBAL_OBJ_ID_PACKET;
97 ind_subgroup = BCMBAL_IND_SUBGROUP(packet, itu_omci_channel_rx);
98 cb_cfg.p_object_key_info = NULL;
99 cb_cfg.p_subgroup = &ind_subgroup;
100 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OmciIndication;
101 bcmbal_subscribe_ind(0, &cb_cfg);
102 }
103
Craig Lutgen88a22ad2018-10-04 12:30:46 -0500104 if (acc_term_ind->data.new_oper_status == BCMBAL_STATUS_UP) {
105 ProbePonIfTechnology_();
106 state.activate();
107 }
108 else {
109 state.deactivate();
110 }
111
Shad Ansari01b0e652018-04-05 21:02:53 +0000112 return BCM_ERR_OK;
113}
114
115bcmos_errno LosIndication(bcmbal_obj *obj) {
116 openolt::Indication ind;
Nicolas Palpacuera32f4c32018-06-28 12:55:10 -0400117 openolt::AlarmIndication* alarm_ind = new openolt::AlarmIndication;
118 openolt::LosIndication* los_ind = new openolt::LosIndication;
119
120 bcmbal_interface_los* bcm_los_ind = (bcmbal_interface_los *) obj;
121 int intf_id = interface_key_to_port_no(bcm_los_ind->key);
122 std::string status = alarm_status_to_string(bcm_los_ind->data.status);
123
Craig Lutgen88a22ad2018-10-04 12:30:46 -0500124 BCM_LOG(INFO, openolt_log_id, "LOS indication : intf_type: %d intf_id: %d port: %d status %s\n",
125 bcm_los_ind->key.intf_type, bcm_los_ind->key.intf_id, intf_id, status.c_str());
Nicolas Palpacuera32f4c32018-06-28 12:55:10 -0400126
127 los_ind->set_intf_id(intf_id);
128 los_ind->set_status(status);
129
130 alarm_ind->set_allocated_los_ind(los_ind);
131 ind.set_allocated_alarm_ind(alarm_ind);
132
133 oltIndQ.push(ind);
Shad Ansari01b0e652018-04-05 21:02:53 +0000134 return BCM_ERR_OK;
135}
136
Shad Ansari01b0e652018-04-05 21:02:53 +0000137bcmos_errno IfOperIndication(bcmbal_obj *obj) {
138 openolt::Indication ind;
139 openolt::IntfOperIndication* intf_oper_ind = new openolt::IntfOperIndication;
Craig Lutgen88a22ad2018-10-04 12:30:46 -0500140 bcmbal_interface_oper_status_change* bcm_if_oper_ind = (bcmbal_interface_oper_status_change *) obj;
Shad Ansari01b0e652018-04-05 21:02:53 +0000141
Craig Lutgen88a22ad2018-10-04 12:30:46 -0500142 intf_oper_ind->set_type(bcmbal_to_grpc_intf_type(bcm_if_oper_ind->key.intf_type));
143 intf_oper_ind->set_intf_id(bcm_if_oper_ind->key.intf_id);
Shad Ansari01b0e652018-04-05 21:02:53 +0000144
Craig Lutgen88a22ad2018-10-04 12:30:46 -0500145 if (bcm_if_oper_ind->data.new_oper_status == BCMBAL_STATUS_UP) {
Shad Ansari01b0e652018-04-05 21:02:53 +0000146 intf_oper_ind->set_oper_state("up");
147 } else {
148 intf_oper_ind->set_oper_state("down");
149 }
150
Craig Lutgen88a22ad2018-10-04 12:30:46 -0500151 BCM_LOG(INFO, openolt_log_id, "intf oper state indication, intf_type %s, intf_id %d, oper_state %d, admin_state %d\n",
152 intf_oper_ind->type().c_str(),
153 bcm_if_oper_ind->key.intf_id,
154 intf_oper_ind->oper_state().c_str(),
155 bcm_if_oper_ind->data.admin_state);
156
Shad Ansari01b0e652018-04-05 21:02:53 +0000157 ind.set_allocated_intf_oper_ind(intf_oper_ind);
158
159 oltIndQ.push(ind);
160 return BCM_ERR_OK;
161}
162
163bcmos_errno OnuAlarmIndication(bcmbal_obj *obj) {
164 openolt::Indication ind;
Nicolas Palpacuerde4325b2018-07-03 11:18:42 -0400165 openolt::AlarmIndication* alarm_ind = new openolt::AlarmIndication;
166 openolt::OnuAlarmIndication* onu_alarm_ind = new openolt::OnuAlarmIndication;
167
168 bcmbal_subscriber_terminal_key *key =
169 &((bcmbal_subscriber_terminal_sub_term_alarm*)obj)->key;
170
171 bcmbal_subscriber_terminal_alarms *alarms =
172 &(((bcmbal_subscriber_terminal_sub_term_alarm*)obj)->data.alarm);
173
Nicolas Palpacuer967438f2018-09-07 14:41:54 -0400174 BCM_LOG(WARNING, openolt_log_id, "onu alarm indication intf_id %d, onu_id %d, alarm: los %d, lob %d, lopc_miss %d, lopc_mic_error %d\n",
175 key->intf_id, key->sub_term_id, alarms->los, alarms->lob, alarms->lopc_miss, alarms->lopc_mic_error);
Nicolas Palpacuerde4325b2018-07-03 11:18:42 -0400176
177 onu_alarm_ind->set_intf_id(key->intf_id);
178 onu_alarm_ind->set_onu_id(key->sub_term_id);
179 onu_alarm_ind->set_los_status(alarm_status_to_string(alarms->los));
180 onu_alarm_ind->set_lob_status(alarm_status_to_string(alarms->lob));
181 onu_alarm_ind->set_lopc_miss_status(alarm_status_to_string(alarms->lopc_miss));
182 onu_alarm_ind->set_lopc_mic_error_status(alarm_status_to_string(alarms->lopc_mic_error));
183
184 alarm_ind->set_allocated_onu_alarm_ind(onu_alarm_ind);
185 ind.set_allocated_alarm_ind(alarm_ind);
186
187 oltIndQ.push(ind);
Shad Ansari01b0e652018-04-05 21:02:53 +0000188 return BCM_ERR_OK;
189}
190
191bcmos_errno OnuDyingGaspIndication(bcmbal_obj *obj) {
192 openolt::Indication ind;
Nicolas Palpacuera32f4c32018-06-28 12:55:10 -0400193 openolt::AlarmIndication* alarm_ind = new openolt::AlarmIndication;
194 openolt::DyingGaspIndication* dg_ind = new openolt::DyingGaspIndication;
nickc063ffd2018-05-22 14:35:28 -0400195
196 bcmbal_subscriber_terminal_key *key =
197 &(((bcmbal_subscriber_terminal_dgi*)obj)->key);
198
199 bcmbal_subscriber_terminal_dgi_data *data =
200 &(((bcmbal_subscriber_terminal_dgi*)obj)->data);
201
202
Nicolas Palpacuer967438f2018-09-07 14:41:54 -0400203 BCM_LOG(WARNING, openolt_log_id, "onu dying-gasp indication, intf_id %d, onu_id %d, alarm %d\n",
204 key->intf_id, key->sub_term_id, data->dgi_status);
nickc063ffd2018-05-22 14:35:28 -0400205
Nicolas Palpacuera32f4c32018-06-28 12:55:10 -0400206 dg_ind->set_intf_id(key->intf_id);
207 dg_ind->set_onu_id(key->sub_term_id);
208 dg_ind->set_status(alarm_status_to_string(data->dgi_status));
nickc063ffd2018-05-22 14:35:28 -0400209
Nicolas Palpacuera32f4c32018-06-28 12:55:10 -0400210 alarm_ind->set_allocated_dying_gasp_ind(dg_ind);
211 ind.set_allocated_alarm_ind(alarm_ind);
nickc063ffd2018-05-22 14:35:28 -0400212
213 oltIndQ.push(ind);
Shad Ansari01b0e652018-04-05 21:02:53 +0000214 return BCM_ERR_OK;
215}
216
217bcmos_errno OnuDiscoveryIndication(bcmbal_cfg *obj) {
218 openolt::Indication ind;
219 openolt::OnuDiscIndication* onu_disc_ind = new openolt::OnuDiscIndication;
220 openolt::SerialNumber* serial_number = new openolt::SerialNumber;
221
222 bcmbal_subscriber_terminal_key *key =
223 &(((bcmbal_subscriber_terminal_sub_term_disc*)obj)->key);
224
225 bcmbal_subscriber_terminal_sub_term_disc_data *data =
226 &(((bcmbal_subscriber_terminal_sub_term_disc*)obj)->data);
227
228 bcmbal_serial_number *in_serial_number = &(data->serial_number);
229
Nicolas Palpacuer967438f2018-09-07 14:41:54 -0400230 BCM_LOG(INFO, openolt_log_id, "onu discover indication, intf_id %d, serial_number %s\n",
Craig Lutgen88a22ad2018-10-04 12:30:46 -0500231 key->intf_id, serial_number_to_str(in_serial_number).c_str());
Shad Ansari01b0e652018-04-05 21:02:53 +0000232
233 onu_disc_ind->set_intf_id(key->intf_id);
234 serial_number->set_vendor_id(reinterpret_cast<const char *>(in_serial_number->vendor_id), 4);
235 serial_number->set_vendor_specific(reinterpret_cast<const char *>(in_serial_number->vendor_specific), 8);
236 onu_disc_ind->set_allocated_serial_number(serial_number);
237 ind.set_allocated_onu_disc_ind(onu_disc_ind);
238
239 oltIndQ.push(ind);
240
241 return BCM_ERR_OK;
242}
243
Shad Ansari01b0e652018-04-05 21:02:53 +0000244bcmos_errno OnuOperIndication(bcmbal_obj *obj) {
245 openolt::Indication ind;
nickc063ffd2018-05-22 14:35:28 -0400246 openolt::OnuIndication* onu_ind = new openolt::OnuIndication;
nickc063ffd2018-05-22 14:35:28 -0400247
248 bcmbal_subscriber_terminal_key *key =
249 &(((bcmbal_subscriber_terminal_oper_status_change*)obj)->key);
250
251 bcmbal_subscriber_terminal_oper_status_change_data *data =
252 &(((bcmbal_subscriber_terminal_oper_status_change*)obj)->data);
253
nickc063ffd2018-05-22 14:35:28 -0400254 onu_ind->set_intf_id(key->intf_id);
255 onu_ind->set_onu_id(key->sub_term_id);
nickc063ffd2018-05-22 14:35:28 -0400256 if (data->new_oper_status == BCMBAL_STATE_UP) {
257 onu_ind->set_oper_state("up");
258 } else {
259 onu_ind->set_oper_state("down");
260 }
261 if (data->admin_state == BCMBAL_STATE_UP) {
262 onu_ind->set_admin_state("up");
263 } else {
264 onu_ind->set_admin_state("down");
265 }
266
267 ind.set_allocated_onu_ind(onu_ind);
268
Craig Lutgen88a22ad2018-10-04 12:30:46 -0500269 BCM_LOG(INFO, openolt_log_id, "onu oper state indication, intf_id %d, onu_id %d, old oper state %d, new oper state %s, admin_state %s\n",
270 key->intf_id, key->sub_term_id, data->old_oper_status, onu_ind->oper_state().c_str(), onu_ind->admin_state().c_str());
271
nickc063ffd2018-05-22 14:35:28 -0400272 oltIndQ.push(ind);
Shad Ansari01b0e652018-04-05 21:02:53 +0000273 return BCM_ERR_OK;
274}
275
276bcmos_errno OmciIndication(bcmbal_obj *obj) {
277 openolt::Indication ind;
278 openolt::OmciIndication* omci_ind = new openolt::OmciIndication;
Shad Ansari5fe93682018-04-26 05:24:19 +0000279 bcmbal_packet_itu_omci_channel_rx *in =
Shad Ansari01b0e652018-04-05 21:02:53 +0000280 (bcmbal_packet_itu_omci_channel_rx *)obj;
281
Nicolas Palpacuer967438f2018-09-07 14:41:54 -0400282 BCM_LOG(DEBUG, omci_log_id, "OMCI indication: intf_id %d, onu_id %d\n",
283 in->key.packet_send_dest.u.itu_omci_channel.intf_id,
284 in->key.packet_send_dest.u.itu_omci_channel.sub_term_id);
Shad Ansari01b0e652018-04-05 21:02:53 +0000285
Shad Ansari5fe93682018-04-26 05:24:19 +0000286 omci_ind->set_intf_id(in->key.packet_send_dest.u.itu_omci_channel.intf_id);
287 omci_ind->set_onu_id(in->key.packet_send_dest.u.itu_omci_channel.sub_term_id);
288 omci_ind->set_pkt(in->data.pkt.val, in->data.pkt.len);
Shad Ansari01b0e652018-04-05 21:02:53 +0000289
290 ind.set_allocated_omci_ind(omci_ind);
291 oltIndQ.push(ind);
292
293 return BCM_ERR_OK;
294}
295
Shad Ansari5fe93682018-04-26 05:24:19 +0000296bcmos_errno PacketIndication(bcmbal_obj *obj) {
Shad Ansari01b0e652018-04-05 21:02:53 +0000297 openolt::Indication ind;
Shad Ansari5fe93682018-04-26 05:24:19 +0000298 openolt::PacketIndication* pkt_ind = new openolt::PacketIndication;
299 bcmbal_packet_bearer_channel_rx *in = (bcmbal_packet_bearer_channel_rx *)obj;
300
Craig Lutgen88a22ad2018-10-04 12:30:46 -0500301 pkt_ind->set_intf_type(bcmbal_to_grpc_intf_type(in->data.intf_type));
Shad Ansari5fe93682018-04-26 05:24:19 +0000302 pkt_ind->set_intf_id(in->data.intf_id);
303 pkt_ind->set_gemport_id(in->data.svc_port);
304 pkt_ind->set_flow_id(in->data.flow_id);
305 pkt_ind->set_pkt(in->data.pkt.val, in->data.pkt.len);
306
307 ind.set_allocated_pkt_ind(pkt_ind);
Craig Lutgen88a22ad2018-10-04 12:30:46 -0500308
309 BCM_LOG(INFO, openolt_log_id, "packet indication, intf_type %s, intf_id %d, svc_port %d, flow_id %d\n",
310 pkt_ind->intf_type().c_str(), in->data.intf_id, in->data.svc_port, in->data.flow_id);
311
Shad Ansari5fe93682018-04-26 05:24:19 +0000312 oltIndQ.push(ind);
313
Shad Ansari01b0e652018-04-05 21:02:53 +0000314 return BCM_ERR_OK;
315}
316
317bcmos_errno FlowOperIndication(bcmbal_obj *obj) {
318 openolt::Indication ind;
Nicolas Palpacuer967438f2018-09-07 14:41:54 -0400319 BCM_LOG(DEBUG, openolt_log_id, "flow oper state indication\n");
Shad Ansari01b0e652018-04-05 21:02:53 +0000320 return BCM_ERR_OK;
321}
322
323bcmos_errno FlowIndication(bcmbal_obj *obj) {
324 openolt::Indication ind;
Nicolas Palpacuer967438f2018-09-07 14:41:54 -0400325 BCM_LOG(DEBUG, openolt_log_id, "flow indication\n");
Shad Ansari01b0e652018-04-05 21:02:53 +0000326 return BCM_ERR_OK;
327}
328
329bcmos_errno TmQIndication(bcmbal_obj *obj) {
330 openolt::Indication ind;
Nicolas Palpacuer967438f2018-09-07 14:41:54 -0400331 BCM_LOG(DEBUG, openolt_log_id, "traffic mgmt queue indication\n");
Shad Ansari01b0e652018-04-05 21:02:53 +0000332 return BCM_ERR_OK;
333}
334
335bcmos_errno TmSchedIndication(bcmbal_obj *obj) {
336 openolt::Indication ind;
Nicolas Palpacuer967438f2018-09-07 14:41:54 -0400337 BCM_LOG(DEBUG, openolt_log_id, "traffic mgmt sheduler indication\n");
Shad Ansari01b0e652018-04-05 21:02:53 +0000338 return BCM_ERR_OK;
339}
340
341bcmos_errno McastGroupIndication(bcmbal_obj *obj) {
342 openolt::Indication ind;
Nicolas Palpacuer967438f2018-09-07 14:41:54 -0400343 BCM_LOG(DEBUG, openolt_log_id, "mcast group indication\n");
Shad Ansari01b0e652018-04-05 21:02:53 +0000344 return BCM_ERR_OK;
345}
346
Nicolas Palpacuerde4325b2018-07-03 11:18:42 -0400347bcmos_errno OnuStartupFailureIndication(bcmbal_obj *obj) {
348 openolt::Indication ind;
349 openolt::AlarmIndication* alarm_ind = new openolt::AlarmIndication;
350 openolt::OnuStartupFailureIndication* sufi_ind = new openolt::OnuStartupFailureIndication;
351
352 bcmbal_subscriber_terminal_key *key =
353 &(((bcmbal_subscriber_terminal_sufi*)obj)->key);
354
355 bcmbal_subscriber_terminal_sufi_data *data =
356 &(((bcmbal_subscriber_terminal_sufi*)obj)->data);
357
Nicolas Palpacuer967438f2018-09-07 14:41:54 -0400358 BCM_LOG(WARNING, openolt_log_id, "onu startup failure indication, intf_id %d, onu_id %d, alarm %d\n",
359 key->intf_id, key->sub_term_id, data->sufi_status);
Nicolas Palpacuerde4325b2018-07-03 11:18:42 -0400360
361 sufi_ind->set_intf_id(key->intf_id);
362 sufi_ind->set_onu_id(key->sub_term_id);
363 sufi_ind->set_status(alarm_status_to_string(data->sufi_status));
364
365 alarm_ind->set_allocated_onu_startup_fail_ind(sufi_ind);
366 ind.set_allocated_alarm_ind(alarm_ind);
367
368 oltIndQ.push(ind);
369 return BCM_ERR_OK;
370}
371
372bcmos_errno OnuSignalDegradeIndication(bcmbal_obj *obj) {
373 openolt::Indication ind;
374 openolt::AlarmIndication* alarm_ind = new openolt::AlarmIndication;
375 openolt::OnuSignalDegradeIndication* sdi_ind = new openolt::OnuSignalDegradeIndication;
376
377 bcmbal_subscriber_terminal_key *key =
378 &(((bcmbal_subscriber_terminal_sdi*)obj)->key);
379
380 bcmbal_subscriber_terminal_sdi_data *data =
381 &(((bcmbal_subscriber_terminal_sdi*)obj)->data);
382
Nicolas Palpacuer967438f2018-09-07 14:41:54 -0400383 BCM_LOG(WARNING, openolt_log_id, "onu signal degrade indication, intf_id %d, onu_id %d, alarm %d, BER %d\n",
384 key->intf_id, key->sub_term_id, data->sdi_status, data->ber);
Nicolas Palpacuerde4325b2018-07-03 11:18:42 -0400385
386 sdi_ind->set_intf_id(key->intf_id);
387 sdi_ind->set_onu_id(key->sub_term_id);
388 sdi_ind->set_status(alarm_status_to_string(data->sdi_status));
389 sdi_ind->set_inverse_bit_error_rate(data->ber);
390
391 alarm_ind->set_allocated_onu_signal_degrade_ind(sdi_ind);
392 ind.set_allocated_alarm_ind(alarm_ind);
393
394 oltIndQ.push(ind);
395 return BCM_ERR_OK;
396}
397
398bcmos_errno OnuDriftOfWindowIndication(bcmbal_obj *obj) {
399 openolt::Indication ind;
400 openolt::AlarmIndication* alarm_ind = new openolt::AlarmIndication;
401 openolt::OnuDriftOfWindowIndication* dowi_ind = new openolt::OnuDriftOfWindowIndication;
402
403 bcmbal_subscriber_terminal_key *key =
404 &(((bcmbal_subscriber_terminal_dowi*)obj)->key);
405
406 bcmbal_subscriber_terminal_dowi_data *data =
407 &(((bcmbal_subscriber_terminal_dowi*)obj)->data);
408
Nicolas Palpacuer967438f2018-09-07 14:41:54 -0400409 BCM_LOG(WARNING, openolt_log_id, "onu drift of window indication, intf_id %d, onu_id %d, alarm %d, drift %d, new_eqd %d\n",
410 key->intf_id, key->sub_term_id, data->dowi_status, data->drift_value, data->new_eqd);
Nicolas Palpacuerde4325b2018-07-03 11:18:42 -0400411
412 dowi_ind->set_intf_id(key->intf_id);
413 dowi_ind->set_onu_id(key->sub_term_id);
414 dowi_ind->set_status(alarm_status_to_string(data->dowi_status));
415 dowi_ind->set_drift(data->drift_value);
416 dowi_ind->set_new_eqd(data->new_eqd);
417
418 alarm_ind->set_allocated_onu_drift_of_window_ind(dowi_ind);
419 ind.set_allocated_alarm_ind(alarm_ind);
420
421 oltIndQ.push(ind);
422 return BCM_ERR_OK;
423}
424
425bcmos_errno OnuLossOfOmciChannelIndication(bcmbal_obj *obj) {
426 openolt::Indication ind;
427 openolt::AlarmIndication* alarm_ind = new openolt::AlarmIndication;
428 openolt::OnuLossOfOmciChannelIndication* looci_ind = new openolt::OnuLossOfOmciChannelIndication;
429
430 bcmbal_subscriber_terminal_key *key =
431 &(((bcmbal_subscriber_terminal_looci*)obj)->key);
432
433 bcmbal_subscriber_terminal_looci_data *data =
434 &(((bcmbal_subscriber_terminal_looci*)obj)->data);
435
Nicolas Palpacuer967438f2018-09-07 14:41:54 -0400436 BCM_LOG(WARNING, openolt_log_id, "onu loss of OMCI channel indication, intf_id %d, onu_id %d, alarm %d\n",
437 key->intf_id, key->sub_term_id, data->looci_status);
Nicolas Palpacuerde4325b2018-07-03 11:18:42 -0400438
439 looci_ind->set_intf_id(key->intf_id);
440 looci_ind->set_onu_id(key->sub_term_id);
441 looci_ind->set_status(alarm_status_to_string(data->looci_status));
442
443 alarm_ind->set_allocated_onu_loss_omci_ind(looci_ind);
444 ind.set_allocated_alarm_ind(alarm_ind);
445
446 oltIndQ.push(ind);
447 return BCM_ERR_OK;
448}
449
450bcmos_errno OnuSignalsFailureIndication(bcmbal_obj *obj) {
451 openolt::Indication ind;
452 openolt::AlarmIndication* alarm_ind = new openolt::AlarmIndication;
453 openolt::OnuSignalsFailureIndication* sfi_ind = new openolt::OnuSignalsFailureIndication;
454
455 bcmbal_subscriber_terminal_key *key =
456 &(((bcmbal_subscriber_terminal_sfi*)obj)->key);
457
458 bcmbal_subscriber_terminal_sfi_data *data =
459 &(((bcmbal_subscriber_terminal_sfi*)obj)->data);
460
Nicolas Palpacuer967438f2018-09-07 14:41:54 -0400461 BCM_LOG(WARNING, openolt_log_id, "onu signals failure indication, intf_id %d, onu_id %d, alarm %d, BER %d\n",
462 key->intf_id, key->sub_term_id, data->sfi_status, data->ber);
Nicolas Palpacuerde4325b2018-07-03 11:18:42 -0400463
464
465 sfi_ind->set_intf_id(key->intf_id);
466 sfi_ind->set_onu_id(key->sub_term_id);
467 sfi_ind->set_status(alarm_status_to_string(data->sfi_status));
468 sfi_ind->set_inverse_bit_error_rate(data->ber);
469
470 alarm_ind->set_allocated_onu_signals_fail_ind(sfi_ind);
471 ind.set_allocated_alarm_ind(alarm_ind);
472
473 oltIndQ.push(ind);
474 return BCM_ERR_OK;
475}
476
477bcmos_errno OnuTransmissionInterferenceWarningIndication(bcmbal_obj *obj) {
478 openolt::Indication ind;
479 openolt::AlarmIndication* alarm_ind = new openolt::AlarmIndication;
480 openolt::OnuTransmissionInterferenceWarning* tiwi_ind = new openolt::OnuTransmissionInterferenceWarning;
481
482 bcmbal_subscriber_terminal_key *key =
483 &(((bcmbal_subscriber_terminal_tiwi*)obj)->key);
484
485 bcmbal_subscriber_terminal_tiwi_data *data =
486 &(((bcmbal_subscriber_terminal_tiwi*)obj)->data);
487
Nicolas Palpacuer967438f2018-09-07 14:41:54 -0400488 BCM_LOG(WARNING, openolt_log_id, "onu transmission interference warning indication, intf_id %d, onu_id %d, alarm %d, drift %d\n",
489 key->intf_id, key->sub_term_id, data->tiwi_status, data->drift_value);
Nicolas Palpacuerde4325b2018-07-03 11:18:42 -0400490
491 tiwi_ind->set_intf_id(key->intf_id);
492 tiwi_ind->set_onu_id(key->sub_term_id);
493 tiwi_ind->set_status(alarm_status_to_string(data->tiwi_status));
494 tiwi_ind->set_drift(data->drift_value);
495
496 alarm_ind->set_allocated_onu_tiwi_ind(tiwi_ind);
497 ind.set_allocated_alarm_ind(alarm_ind);
498
499 oltIndQ.push(ind);
500 return BCM_ERR_OK;
501}
502
503bcmos_errno OnuActivationFailureIndication(bcmbal_obj *obj) {
504 openolt::Indication ind;
505 openolt::AlarmIndication* alarm_ind = new openolt::AlarmIndication;
506 openolt::OnuActivationFailureIndication* activation_fail_ind = new openolt::OnuActivationFailureIndication;
507
508 bcmbal_subscriber_terminal_key *key =
509 &(((bcmbal_subscriber_terminal_sub_term_act_fail*)obj)->key);
510
Nicolas Palpacuer967438f2018-09-07 14:41:54 -0400511 BCM_LOG(WARNING, openolt_log_id, "onu activation failure indication, intf_id %d, onu_id %d\n",
512 key->intf_id, key->sub_term_id);
Nicolas Palpacuerde4325b2018-07-03 11:18:42 -0400513
514
515 activation_fail_ind->set_intf_id(key->intf_id);
516 activation_fail_ind->set_onu_id(key->sub_term_id);
517
518 alarm_ind->set_allocated_onu_activation_fail_ind(activation_fail_ind);
519 ind.set_allocated_alarm_ind(alarm_ind);
520
521 oltIndQ.push(ind);
522 return BCM_ERR_OK;
523}
524
525bcmos_errno OnuProcessingErrorIndication(bcmbal_obj *obj) {
526 openolt::Indication ind;
527 openolt::AlarmIndication* alarm_ind = new openolt::AlarmIndication;
528 openolt::OnuProcessingErrorIndication* onu_proc_error_ind = new openolt::OnuProcessingErrorIndication;
529
530 bcmbal_subscriber_terminal_key *key =
531 &(((bcmbal_subscriber_terminal_processing_error*)obj)->key);
532
Nicolas Palpacuer967438f2018-09-07 14:41:54 -0400533 BCM_LOG(WARNING, openolt_log_id, "onu processing error indication, intf_id %d, onu_id %d\n",
534 key->intf_id, key->sub_term_id);
Nicolas Palpacuerde4325b2018-07-03 11:18:42 -0400535
536
537 onu_proc_error_ind->set_intf_id(key->intf_id);
538 onu_proc_error_ind->set_onu_id(key->sub_term_id);
539
540 alarm_ind->set_allocated_onu_processing_error_ind(onu_proc_error_ind);
541 ind.set_allocated_alarm_ind(alarm_ind);
542
543 oltIndQ.push(ind);
544 return BCM_ERR_OK;
545}
546
Shad Ansari01b0e652018-04-05 21:02:53 +0000547Status SubscribeIndication() {
548 bcmbal_cb_cfg cb_cfg = {};
549 uint16_t ind_subgroup;
550
551 if (subscribed) {
552 return Status::OK;
553 }
554
555 cb_cfg.module = BCMOS_MODULE_ID_NONE;
556
Craig Lutgen88a22ad2018-10-04 12:30:46 -0500557 /* OLT device operational state change indication */
Shad Ansari01b0e652018-04-05 21:02:53 +0000558 cb_cfg.obj_type = BCMBAL_OBJ_ID_ACCESS_TERMINAL;
Shad Ansaricb004c52018-05-30 18:07:23 +0000559 ind_subgroup = bcmbal_access_terminal_auto_id_oper_status_change;
Shad Ansari01b0e652018-04-05 21:02:53 +0000560 cb_cfg.p_subgroup = &ind_subgroup;
Craig Lutgen88a22ad2018-10-04 12:30:46 -0500561 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OltOperIndication;
Shad Ansari01b0e652018-04-05 21:02:53 +0000562 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
Craig Lutgen88a22ad2018-10-04 12:30:46 -0500563 return Status(grpc::StatusCode::INTERNAL, "Olt operations state change indication subscribe failed");
Shad Ansari01b0e652018-04-05 21:02:53 +0000564 }
565
566 /* Interface LOS indication */
567 cb_cfg.obj_type = BCMBAL_OBJ_ID_INTERFACE;
568 ind_subgroup = bcmbal_interface_auto_id_los;
569 cb_cfg.p_subgroup = &ind_subgroup;
570 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)LosIndication;
571 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
572 return Status(grpc::StatusCode::INTERNAL, "LOS indication subscribe failed");
573 }
574
Shad Ansari01b0e652018-04-05 21:02:53 +0000575 /* Interface operational state change indication */
576 cb_cfg.obj_type = BCMBAL_OBJ_ID_INTERFACE;
577 ind_subgroup = bcmbal_interface_auto_id_oper_status_change;
578 cb_cfg.p_subgroup = &ind_subgroup;
579 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)IfOperIndication;
580 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
581 return Status(grpc::StatusCode::INTERNAL, "Interface operations state change indication subscribe failed");
582 }
583
584 /* onu alarm indication */
585 cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
586 ind_subgroup = bcmbal_subscriber_terminal_auto_id_sub_term_alarm;
587 cb_cfg.p_subgroup = &ind_subgroup;
588 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuAlarmIndication;
589 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
590 return Status(grpc::StatusCode::INTERNAL, "onu alarm indication subscribe failed");
591 }
592
593 /* onu dying-gasp indication */
594 cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
595 ind_subgroup = bcmbal_subscriber_terminal_auto_id_dgi;
596 cb_cfg.p_subgroup = &ind_subgroup;
597 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuDyingGaspIndication;
598 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
599 return Status(grpc::StatusCode::INTERNAL, "onu dying-gasp indication subscribe failed");
600 }
601
602 /* onu discovery indication */
603 cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
604 ind_subgroup = bcmbal_subscriber_terminal_auto_id_sub_term_disc;
605 cb_cfg.p_subgroup = &ind_subgroup;
606 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuDiscoveryIndication;
607 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
608 return Status(grpc::StatusCode::INTERNAL, "onu discovery indication subscribe failed");
609 }
610
Shad Ansari01b0e652018-04-05 21:02:53 +0000611 /* onu operational state change indication */
612 cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
613 ind_subgroup = bcmbal_subscriber_terminal_auto_id_oper_status_change;
614 cb_cfg.p_subgroup = &ind_subgroup;
615 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuOperIndication;
616 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
617 return Status(grpc::StatusCode::INTERNAL, "onu operational state change indication subscribe failed");
618 }
619
Shad Ansari5fe93682018-04-26 05:24:19 +0000620 /* Packet (bearer) indication */
Shad Ansari01b0e652018-04-05 21:02:53 +0000621 cb_cfg.obj_type = BCMBAL_OBJ_ID_PACKET;
622 ind_subgroup = bcmbal_packet_auto_id_bearer_channel_rx;
623 cb_cfg.p_subgroup = &ind_subgroup;
Shad Ansari5fe93682018-04-26 05:24:19 +0000624 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)PacketIndication;
Shad Ansari01b0e652018-04-05 21:02:53 +0000625 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
Shad Ansari5fe93682018-04-26 05:24:19 +0000626 return Status(grpc::StatusCode::INTERNAL, "Packet indication subscribe failed");
Shad Ansari01b0e652018-04-05 21:02:53 +0000627 }
628
629 /* Flow Operational State Change */
630 cb_cfg.obj_type = BCMBAL_OBJ_ID_FLOW;
631 ind_subgroup = bcmbal_flow_auto_id_oper_status_change;
632 cb_cfg.p_subgroup = &ind_subgroup;
633 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)FlowOperIndication;
634 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
635 return Status(grpc::StatusCode::INTERNAL, "Flow operational state change indication subscribe failed");
636 }
Shad Ansaricb004c52018-05-30 18:07:23 +0000637#if 0
Shad Ansari01b0e652018-04-05 21:02:53 +0000638 /* Flow Indication */
639 cb_cfg.obj_type = BCMBAL_OBJ_ID_FLOW;
640 ind_subgroup = bcmbal_flow_auto_id_ind;
641 cb_cfg.p_subgroup = &ind_subgroup;
642 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)FlowIndication;
643 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
644 return Status(grpc::StatusCode::INTERNAL, "Flow indication subscribe failed");
645 }
646
647 /* TM queue indication */
648 cb_cfg.obj_type = BCMBAL_OBJ_ID_TM_QUEUE;
649 ind_subgroup = bcmbal_tm_queue_auto_id_ind;
650 cb_cfg.p_subgroup = &ind_subgroup;
651 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)TmQIndication;
652 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
653 return Status(grpc::StatusCode::INTERNAL, "Traffic mgmt queue indication subscribe failed");
654 }
Shad Ansaricb004c52018-05-30 18:07:23 +0000655#endif
Shad Ansari01b0e652018-04-05 21:02:53 +0000656
657 /* TM sched indication */
658 cb_cfg.obj_type = BCMBAL_OBJ_ID_TM_SCHED;
Shad Ansaricb004c52018-05-30 18:07:23 +0000659 ind_subgroup = bcmbal_tm_sched_auto_id_oper_status_change;
Shad Ansari01b0e652018-04-05 21:02:53 +0000660 cb_cfg.p_subgroup = &ind_subgroup;
661 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)TmSchedIndication;
662 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
663 return Status(grpc::StatusCode::INTERNAL, "Traffic mgmt queue indication subscribe failed");
664 }
665
Shad Ansaricb004c52018-05-30 18:07:23 +0000666#if 0
Shad Ansari01b0e652018-04-05 21:02:53 +0000667 /* Multicast group indication */
668 cb_cfg.obj_type = BCMBAL_OBJ_ID_GROUP;
669 ind_subgroup = bcmbal_group_auto_id_ind;
670 cb_cfg.p_subgroup = &ind_subgroup;
671 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)McastGroupIndication;
672 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
673 return Status(grpc::StatusCode::INTERNAL, "Multicast group indication subscribe failed");
674 }
Shad Ansaricb004c52018-05-30 18:07:23 +0000675#endif
Shad Ansari01b0e652018-04-05 21:02:53 +0000676
Nicolas Palpacuerde4325b2018-07-03 11:18:42 -0400677
678 /* ONU startup failure indication */
679 cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
680 ind_subgroup = bcmbal_subscriber_terminal_auto_id_sufi;
681 cb_cfg.p_subgroup = &ind_subgroup;
682 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuStartupFailureIndication;
683 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
684 return Status(grpc::StatusCode::INTERNAL, "onu startup failure indication subscribe failed");
685 }
686
687 /* SDI indication */
688 cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
689 ind_subgroup = bcmbal_subscriber_terminal_auto_id_sdi;
690 cb_cfg.p_subgroup = &ind_subgroup;
691 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuSignalDegradeIndication;
692 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
693 return Status(grpc::StatusCode::INTERNAL, "onu sdi indication subscribe failed");
694 }
695
696 /* DOWI indication */
697 cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
698 ind_subgroup = bcmbal_subscriber_terminal_auto_id_dowi;
699 cb_cfg.p_subgroup = &ind_subgroup;
700 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuDriftOfWindowIndication;
701 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
702 return Status(grpc::StatusCode::INTERNAL, "onu dowi indication subscribe failed");
703 }
704
705 /* LOOCI indication */
706 cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
707 ind_subgroup = bcmbal_subscriber_terminal_auto_id_looci;
708 cb_cfg.p_subgroup = &ind_subgroup;
709 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuLossOfOmciChannelIndication;
710 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
711 return Status(grpc::StatusCode::INTERNAL, "onu looci indication subscribe failed");
712 }
713
714 /* SFI indication */
715 cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
716 ind_subgroup = bcmbal_subscriber_terminal_auto_id_sfi;
717 cb_cfg.p_subgroup = &ind_subgroup;
718 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuSignalsFailureIndication;
719 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
720 return Status(grpc::StatusCode::INTERNAL, "onu sfi indication subscribe failed");
721 }
722
723 /* TIWI indication */
724 cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
725 ind_subgroup = bcmbal_subscriber_terminal_auto_id_tiwi;
726 cb_cfg.p_subgroup = &ind_subgroup;
727 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuTransmissionInterferenceWarningIndication;
728 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
729 return Status(grpc::StatusCode::INTERNAL, "onu tiwi indication subscribe failed");
730 }
731
732 /* TIWI indication */
733 cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
734 ind_subgroup = bcmbal_subscriber_terminal_auto_id_sub_term_act_fail;
735 cb_cfg.p_subgroup = &ind_subgroup;
736 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuActivationFailureIndication;
737 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
738 return Status(grpc::StatusCode::INTERNAL, "onu activation falaire indication subscribe failed");
739 }
740
741 /* ONU processing error indication */
742 cb_cfg.obj_type = BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL;
743 ind_subgroup = bcmbal_subscriber_terminal_auto_id_processing_error;
744 cb_cfg.p_subgroup = &ind_subgroup;
745 cb_cfg.ind_cb_hdlr = (f_bcmbal_ind_handler)OnuProcessingErrorIndication;
746 if (BCM_ERR_OK != bcmbal_subscribe_ind(DEFAULT_ATERM_ID, &cb_cfg)) {
747 return Status(grpc::StatusCode::INTERNAL, "onu processing error indication subscribe failed");
748 }
749
Shad Ansari01b0e652018-04-05 21:02:53 +0000750 subscribed = true;
751
752 return Status::OK;
753}