blob: 216c09d703b01e6971548b842b8be84734a014ef [file] [log] [blame]
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001/*
2 * Copyright 2020-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 */
16
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000017//Package core provides the utility for onu devices, flows and statistics
18package core
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000019
20import (
21 "context"
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000022 "errors"
23 "fmt"
Holger Hildebrandt24d51952020-05-04 14:03:42 +000024 "strconv"
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000025 "sync"
26 "time"
27
khenaidoo7d3c5582021-08-11 18:09:44 -040028 "github.com/opencord/voltha-openonu-adapter-go/internal/pkg/config"
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000029 "github.com/opencord/voltha-protos/v5/go/openolt"
khenaidoo7d3c5582021-08-11 18:09:44 -040030 "github.com/opencord/voltha-protos/v5/go/tech_profile"
mpagenko1f8e8822021-06-25 14:10:21 +000031
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000032 "github.com/gogo/protobuf/proto"
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000033 "github.com/looplab/fsm"
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +000034 me "github.com/opencord/omci-lib-go/generated"
khenaidoo7d3c5582021-08-11 18:09:44 -040035 "github.com/opencord/voltha-lib-go/v7/pkg/db"
36 "github.com/opencord/voltha-lib-go/v7/pkg/events/eventif"
37 flow "github.com/opencord/voltha-lib-go/v7/pkg/flows"
38 vgrpc "github.com/opencord/voltha-lib-go/v7/pkg/grpc"
39 "github.com/opencord/voltha-lib-go/v7/pkg/log"
Mahir Gunyelcb128ae2021-10-06 09:42:05 -070040 platform "github.com/opencord/voltha-lib-go/v7/pkg/platform"
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000041 almgr "github.com/opencord/voltha-openonu-adapter-go/internal/pkg/almgr"
42 avcfg "github.com/opencord/voltha-openonu-adapter-go/internal/pkg/avcfg"
43 cmn "github.com/opencord/voltha-openonu-adapter-go/internal/pkg/common"
44 mib "github.com/opencord/voltha-openonu-adapter-go/internal/pkg/mib"
45 otst "github.com/opencord/voltha-openonu-adapter-go/internal/pkg/omcitst"
46 pmmgr "github.com/opencord/voltha-openonu-adapter-go/internal/pkg/pmmgr"
47 "github.com/opencord/voltha-openonu-adapter-go/internal/pkg/swupg"
48 uniprt "github.com/opencord/voltha-openonu-adapter-go/internal/pkg/uniprt"
khenaidoo7d3c5582021-08-11 18:09:44 -040049 vc "github.com/opencord/voltha-protos/v5/go/common"
50 "github.com/opencord/voltha-protos/v5/go/extension"
51 ic "github.com/opencord/voltha-protos/v5/go/inter_container"
52 of "github.com/opencord/voltha-protos/v5/go/openflow_13"
53 oop "github.com/opencord/voltha-protos/v5/go/openolt"
54 "github.com/opencord/voltha-protos/v5/go/voltha"
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000055)
56
mpagenko38662d02021-08-11 09:45:19 +000057// Constants for timeouts
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000058const (
mpagenko38662d02021-08-11 09:45:19 +000059 cTimeOutRemoveUpgrade = 1 //for usage in seconds
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000060)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000061
mpagenko1cc3cb42020-07-27 15:24:38 +000062const (
63 // events of Device FSM
64 devEvDeviceInit = "devEvDeviceInit"
65 devEvGrpcConnected = "devEvGrpcConnected"
66 devEvGrpcDisconnected = "devEvGrpcDisconnected"
67 devEvDeviceUpInd = "devEvDeviceUpInd"
68 devEvDeviceDownInd = "devEvDeviceDownInd"
69)
70const (
71 // states of Device FSM
72 devStNull = "devStNull"
73 devStDown = "devStDown"
74 devStInit = "devStInit"
75 devStConnected = "devStConnected"
76 devStUp = "devStUp"
77)
78
Holger Hildebrandt24d51952020-05-04 14:03:42 +000079//Event category and subcategory definitions - same as defiend for OLT in eventmgr.go - should be done more centrally
80const (
Himani Chawla4d908332020-08-31 12:30:20 +053081 pon = voltha.EventSubCategory_PON
82 //olt = voltha.EventSubCategory_OLT
83 //ont = voltha.EventSubCategory_ONT
84 //onu = voltha.EventSubCategory_ONU
85 //nni = voltha.EventSubCategory_NNI
86 //service = voltha.EventCategory_SERVICE
87 //security = voltha.EventCategory_SECURITY
88 equipment = voltha.EventCategory_EQUIPMENT
89 //processing = voltha.EventCategory_PROCESSING
90 //environment = voltha.EventCategory_ENVIRONMENT
91 //communication = voltha.EventCategory_COMMUNICATION
Holger Hildebrandt24d51952020-05-04 14:03:42 +000092)
93
94const (
95 cEventObjectType = "ONU"
96)
97const (
98 cOnuActivatedEvent = "ONU_ACTIVATED"
99)
100
mpagenkof1fc3862021-02-16 10:09:52 +0000101type omciIdleCheckStruct struct {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000102 omciIdleCheckFunc func(*deviceHandler, context.Context, cmn.UsedOmciConfigFsms, string) bool
mpagenkof1fc3862021-02-16 10:09:52 +0000103 omciIdleState string
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000104}
105
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000106var fsmOmciIdleStateFuncMap = map[cmn.UsedOmciConfigFsms]omciIdleCheckStruct{
107 cmn.CUploadFsm: {(*deviceHandler).isFsmInOmciIdleStateDefault, mib.CMibUlFsmIdleState},
108 cmn.CDownloadFsm: {(*deviceHandler).isFsmInOmciIdleStateDefault, mib.CMibDlFsmIdleState},
109 cmn.CUniLockFsm: {(*deviceHandler).isFsmInOmciIdleStateDefault, uniprt.CUniFsmIdleState},
110 cmn.CUniUnLockFsm: {(*deviceHandler).isFsmInOmciIdleStateDefault, uniprt.CUniFsmIdleState},
111 cmn.CAniConfigFsm: {(*deviceHandler).isAniConfigFsmInOmciIdleState, avcfg.CAniFsmIdleState},
112 cmn.CUniVlanConfigFsm: {(*deviceHandler).isUniVlanConfigFsmInOmciIdleState, avcfg.CVlanFsmIdleState},
113 cmn.CL2PmFsm: {(*deviceHandler).isFsmInOmciIdleStateDefault, pmmgr.CL2PmFsmIdleState},
114 cmn.COnuUpgradeFsm: {(*deviceHandler).isFsmInOmciIdleStateDefault, swupg.COnuUpgradeFsmIdleState},
Holger Hildebrandt3a644642020-12-02 09:46:18 +0000115}
116
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000117const (
118 cNoReconciling = iota
119 cOnuConfigReconciling
120 cSkipOnuConfigReconciling
121)
122
Himani Chawla6d2ae152020-09-02 13:11:20 +0530123//deviceHandler will interact with the ONU ? device.
124type deviceHandler struct {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000125 DeviceID string
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000126 DeviceType string
127 adminState string
128 device *voltha.Device
129 logicalDeviceID string
130 ProxyAddressID string
131 ProxyAddressType string
Himani Chawla4d908332020-08-31 12:30:20 +0530132 parentID string
Holger Hildebrandt24d51952020-05-04 14:03:42 +0000133 ponPortNumber uint32
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000134
khenaidoo7d3c5582021-08-11 18:09:44 -0400135 coreClient *vgrpc.Client
136 EventProxy eventif.EventProxy
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000137
Girish Gowdra5a7c4922021-01-22 18:33:41 -0800138 pmConfigs *voltha.PmConfigs
khenaidoo7d3c5582021-08-11 18:09:44 -0400139 config *config.AdapterFlags
Girish Gowdrae09a6202021-01-12 18:10:59 -0800140
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000141 pOpenOnuAc *OpenONUAC
142 pDeviceStateFsm *fsm.FSM
Himani Chawla4d908332020-08-31 12:30:20 +0530143 //pPonPort *voltha.Port
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000144 deviceEntrySet chan bool //channel for DeviceEntry set event
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000145 pOnuOmciDevice *mib.OnuDeviceEntry
146 pOnuTP *avcfg.OnuUniTechProf
147 pOnuMetricsMgr *pmmgr.OnuMetricsManager
148 pAlarmMgr *almgr.OnuAlarmManager
149 pSelfTestHdlr *otst.SelfTestControlBlock
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000150 exitChannel chan int
151 lockDevice sync.RWMutex
152 pOnuIndication *oop.OnuIndication
153 deviceReason uint8
154 mutexDeviceReason sync.RWMutex
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000155 pLockStateFsm *uniprt.LockStateFsm
156 pUnlockStateFsm *uniprt.LockStateFsm
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000157
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000158 //flowMgr *OpenOltFlowMgr
159 //eventMgr *OpenOltEventMgr
160 //resourceMgr *rsrcMgr.OpenOltResourceMgr
161
162 //discOnus sync.Map
163 //onus sync.Map
164 //portStats *OpenOltStatisticsMgr
Holger Hildebrandtff05b682021-03-16 15:02:05 +0000165 collectorIsRunning bool
166 mutexCollectorFlag sync.RWMutex
167 stopCollector chan bool
168 alarmManagerIsRunning bool
169 mutextAlarmManagerFlag sync.RWMutex
170 stopAlarmManager chan bool
171 stopHeartbeatCheck chan bool
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000172 uniEntityMap cmn.OnuUniPortMap
Holger Hildebrandtff05b682021-03-16 15:02:05 +0000173 mutexKvStoreContext sync.Mutex
174 lockVlanConfig sync.RWMutex
mpagenkobc4170a2021-08-17 16:42:10 +0000175 lockVlanAdd sync.RWMutex
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000176 UniVlanConfigFsmMap map[uint8]*avcfg.UniVlanConfigFsm
Holger Hildebrandtff05b682021-03-16 15:02:05 +0000177 lockUpgradeFsm sync.RWMutex
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000178 pOnuUpradeFsm *swupg.OnuUpgradeFsm
Holger Hildebrandtff05b682021-03-16 15:02:05 +0000179 reconciling uint8
180 mutexReconcilingFlag sync.RWMutex
181 chReconcilingFinished chan bool //channel to indicate that reconciling has been finished
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000182 mutexReadyForOmciConfig sync.RWMutex
183 readyForOmciConfig bool
Holger Hildebrandtff05b682021-03-16 15:02:05 +0000184 deletionInProgress bool
185 mutexDeletionInProgressFlag sync.RWMutex
mpagenko38662d02021-08-11 09:45:19 +0000186 pLastUpgradeImageState *voltha.ImageState
187 upgradeFsmChan chan struct{}
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000188}
189
Himani Chawla6d2ae152020-09-02 13:11:20 +0530190//newDeviceHandler creates a new device handler
khenaidoo7d3c5582021-08-11 18:09:44 -0400191func newDeviceHandler(ctx context.Context, cc *vgrpc.Client, ep eventif.EventProxy, device *voltha.Device, adapter *OpenONUAC) *deviceHandler {
Himani Chawla6d2ae152020-09-02 13:11:20 +0530192 var dh deviceHandler
khenaidoo7d3c5582021-08-11 18:09:44 -0400193 dh.coreClient = cc
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000194 dh.EventProxy = ep
khenaidoo7d3c5582021-08-11 18:09:44 -0400195 dh.config = adapter.config
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000196 cloned := (proto.Clone(device)).(*voltha.Device)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000197 dh.DeviceID = cloned.Id
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000198 dh.DeviceType = cloned.Type
199 dh.adminState = "up"
200 dh.device = cloned
201 dh.pOpenOnuAc = adapter
202 dh.exitChannel = make(chan int, 1)
203 dh.lockDevice = sync.RWMutex{}
mpagenko3af1f032020-06-10 08:53:41 +0000204 dh.deviceEntrySet = make(chan bool, 1)
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000205 dh.collectorIsRunning = false
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000206 dh.stopCollector = make(chan bool, 2)
Himani Chawla4c1d4c72021-02-18 12:14:31 +0530207 dh.alarmManagerIsRunning = false
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530208 dh.stopAlarmManager = make(chan bool, 2)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000209 dh.stopHeartbeatCheck = make(chan bool, 2)
210 //dh.metrics = pmmetrics.NewPmMetrics(cloned.Id, pmmetrics.Frequency(150), pmmetrics.FrequencyOverride(false), pmmetrics.Grouped(false), pmmetrics.Metrics(pmNames))
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000211 //TODO initialize the support classes.
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000212 dh.uniEntityMap = make(map[uint32]*cmn.OnuUniPort)
mpagenkof1fc3862021-02-16 10:09:52 +0000213 dh.lockVlanConfig = sync.RWMutex{}
mpagenkobc4170a2021-08-17 16:42:10 +0000214 dh.lockVlanAdd = sync.RWMutex{}
mpagenko80622a52021-02-09 16:53:23 +0000215 dh.lockUpgradeFsm = sync.RWMutex{}
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000216 dh.UniVlanConfigFsmMap = make(map[uint8]*avcfg.UniVlanConfigFsm)
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000217 dh.reconciling = cNoReconciling
Holger Hildebrandtf37b3d72021-02-17 10:25:22 +0000218 dh.chReconcilingFinished = make(chan bool)
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000219 dh.readyForOmciConfig = false
Holger Hildebrandtff05b682021-03-16 15:02:05 +0000220 dh.deletionInProgress = false
mpagenko38662d02021-08-11 09:45:19 +0000221 dh.pLastUpgradeImageState = &voltha.ImageState{
222 DownloadState: voltha.ImageState_DOWNLOAD_UNKNOWN,
223 Reason: voltha.ImageState_UNKNOWN_ERROR,
224 ImageState: voltha.ImageState_IMAGE_UNKNOWN,
225 }
226 dh.upgradeFsmChan = make(chan struct{})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000227
Girish Gowdra5a7c4922021-01-22 18:33:41 -0800228 if dh.device.PmConfigs != nil { // can happen after onu adapter restart
229 dh.pmConfigs = cloned.PmConfigs
230 } /* else {
231 // will be populated when onu_metrics_mananger is initialized.
232 }*/
Girish Gowdrae09a6202021-01-12 18:10:59 -0800233
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000234 // Device related state machine
235 dh.pDeviceStateFsm = fsm.NewFSM(
mpagenko1cc3cb42020-07-27 15:24:38 +0000236 devStNull,
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000237 fsm.Events{
mpagenko1cc3cb42020-07-27 15:24:38 +0000238 {Name: devEvDeviceInit, Src: []string{devStNull, devStDown}, Dst: devStInit},
239 {Name: devEvGrpcConnected, Src: []string{devStInit}, Dst: devStConnected},
240 {Name: devEvGrpcDisconnected, Src: []string{devStConnected, devStDown}, Dst: devStInit},
241 {Name: devEvDeviceUpInd, Src: []string{devStConnected, devStDown}, Dst: devStUp},
242 {Name: devEvDeviceDownInd, Src: []string{devStUp}, Dst: devStDown},
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000243 },
244 fsm.Callbacks{
dbainbri4d3a0dc2020-12-02 00:33:42 +0000245 "before_event": func(e *fsm.Event) { dh.logStateChange(ctx, e) },
246 ("before_" + devEvDeviceInit): func(e *fsm.Event) { dh.doStateInit(ctx, e) },
247 ("after_" + devEvDeviceInit): func(e *fsm.Event) { dh.postInit(ctx, e) },
248 ("before_" + devEvGrpcConnected): func(e *fsm.Event) { dh.doStateConnected(ctx, e) },
249 ("before_" + devEvGrpcDisconnected): func(e *fsm.Event) { dh.doStateInit(ctx, e) },
250 ("after_" + devEvGrpcDisconnected): func(e *fsm.Event) { dh.postInit(ctx, e) },
251 ("before_" + devEvDeviceUpInd): func(e *fsm.Event) { dh.doStateUp(ctx, e) },
252 ("before_" + devEvDeviceDownInd): func(e *fsm.Event) { dh.doStateDown(ctx, e) },
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000253 },
254 )
mpagenkoaf801632020-07-03 10:00:42 +0000255
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000256 return &dh
257}
258
Himani Chawla6d2ae152020-09-02 13:11:20 +0530259// start save the device to the data model
260func (dh *deviceHandler) start(ctx context.Context) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000261 logger.Debugw(ctx, "starting-device-handler", log.Fields{"device": dh.device, "device-id": dh.DeviceID})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000262 // Add the initial device to the local model
dbainbri4d3a0dc2020-12-02 00:33:42 +0000263 logger.Debug(ctx, "device-handler-started")
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000264}
265
Himani Chawla4d908332020-08-31 12:30:20 +0530266/*
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000267// stop stops the device dh. Not much to do for now
Himani Chawla6d2ae152020-09-02 13:11:20 +0530268func (dh *deviceHandler) stop(ctx context.Context) {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000269 logger.Debug("stopping-device-handler")
270 dh.exitChannel <- 1
271}
Himani Chawla4d908332020-08-31 12:30:20 +0530272*/
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000273
274// ##########################################################################################
Himani Chawla6d2ae152020-09-02 13:11:20 +0530275// deviceHandler methods that implement the adapters interface requests ##### begin #########
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000276
Girish Gowdrae0140f02021-02-02 16:55:09 -0800277//adoptOrReconcileDevice adopts the ONU device
Himani Chawla6d2ae152020-09-02 13:11:20 +0530278func (dh *deviceHandler) adoptOrReconcileDevice(ctx context.Context, device *voltha.Device) {
khenaidoo7d3c5582021-08-11 18:09:44 -0400279 logger.Debugw(ctx, "adopt_or_reconcile_device", log.Fields{"device-id": device.Id, "Address": device.GetHostAndPort()})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000280
dbainbri4d3a0dc2020-12-02 00:33:42 +0000281 logger.Debugw(ctx, "Device FSM: ", log.Fields{"state": string(dh.pDeviceStateFsm.Current())})
mpagenko1cc3cb42020-07-27 15:24:38 +0000282 if dh.pDeviceStateFsm.Is(devStNull) {
283 if err := dh.pDeviceStateFsm.Event(devEvDeviceInit); err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000284 logger.Errorw(ctx, "Device FSM: Can't go to state DeviceInit", log.Fields{"err": err})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000285 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000286 logger.Debugw(ctx, "Device FSM: ", log.Fields{"state": string(dh.pDeviceStateFsm.Current())})
Girish Gowdraaf0ad632021-01-27 13:00:01 -0800287 // device.PmConfigs is not nil in cases when adapter restarts. We should not re-set the core again.
288 if device.PmConfigs == nil {
Girish Gowdra5a7c4922021-01-22 18:33:41 -0800289 // Now, set the initial PM configuration for that device
khenaidoo7d3c5582021-08-11 18:09:44 -0400290 if err := dh.updatePMConfigInCore(ctx, dh.pmConfigs); err != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000291 logger.Errorw(ctx, "error updating pm config to core", log.Fields{"device-id": dh.DeviceID, "err": err})
Girish Gowdra5a7c4922021-01-22 18:33:41 -0800292 }
Girish Gowdrae09a6202021-01-12 18:10:59 -0800293 }
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000294 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000295 logger.Debugw(ctx, "AdoptOrReconcileDevice: Agent/device init already done", log.Fields{"device-id": device.Id})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000296 }
297
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000298}
299
khenaidoo7d3c5582021-08-11 18:09:44 -0400300func (dh *deviceHandler) handleOMCIIndication(ctx context.Context, msg *ic.OmciMessage) error {
mpagenko80622a52021-02-09 16:53:23 +0000301 /* msg print moved symmetrically to omci_cc, if wanted here as additional debug, than perhaps only based on additional debug setting!
Himani Chawla26e555c2020-08-31 12:30:20 +0530302 //assuming omci message content is hex coded!
303 // with restricted output of 16(?) bytes would be ...omciMsg.Message[:16]
dbainbri4d3a0dc2020-12-02 00:33:42 +0000304 logger.Debugw(ctx, "inter-adapter-recv-omci", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000305 "device-id": dh.DeviceID, "RxOmciMessage": hex.EncodeToString(omciMsg.Message)})
mpagenko80622a52021-02-09 16:53:23 +0000306 */
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000307 pDevEntry := dh.GetOnuDeviceEntry(ctx, true)
Himani Chawla26e555c2020-08-31 12:30:20 +0530308 if pDevEntry != nil {
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000309 if pDevEntry.PDevOmciCC != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000310 return pDevEntry.PDevOmciCC.ReceiveMessage(log.WithSpanFromContext(context.TODO(), ctx), msg.Message)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000311 }
khenaidoo7d3c5582021-08-11 18:09:44 -0400312 logger.Debugw(ctx, "omciCC not ready to receive omci messages - incoming omci message ignored", log.Fields{"rxMsg": msg.Message})
Himani Chawla26e555c2020-08-31 12:30:20 +0530313 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000314 logger.Errorw(ctx, "No valid OnuDevice -aborting", log.Fields{"device-id": dh.DeviceID})
315 return fmt.Errorf("no valid OnuDevice: %s", dh.DeviceID)
Himani Chawla26e555c2020-08-31 12:30:20 +0530316}
317
khenaidoo7d3c5582021-08-11 18:09:44 -0400318func (dh *deviceHandler) handleTechProfileDownloadRequest(ctx context.Context, techProfMsg *ic.TechProfileDownloadMessage) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000319 logger.Infow(ctx, "tech-profile-download-request", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandt80129db2020-11-23 10:49:32 +0000320
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000321 pDevEntry := dh.GetOnuDeviceEntry(ctx, true)
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000322 if pDevEntry == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000323 logger.Errorw(ctx, "No valid OnuDevice - aborting", log.Fields{"device-id": dh.DeviceID})
324 return fmt.Errorf("no valid OnuDevice: %s", dh.DeviceID)
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000325 }
Himani Chawla26e555c2020-08-31 12:30:20 +0530326 if dh.pOnuTP == nil {
327 //should normally not happen ...
dbainbri4d3a0dc2020-12-02 00:33:42 +0000328 logger.Errorw(ctx, "onuTechProf instance not set up for DLMsg request - ignoring request",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000329 log.Fields{"device-id": dh.DeviceID})
330 return fmt.Errorf("techProfile DLMsg request while onuTechProf instance not setup: %s", dh.DeviceID)
Himani Chawla26e555c2020-08-31 12:30:20 +0530331 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000332 if !dh.IsReadyForOmciConfig() {
333 logger.Errorw(ctx, "TechProf-set rejected: improper device state", log.Fields{"device-id": dh.DeviceID,
334 "device-state": dh.GetDeviceReasonString()})
335 return fmt.Errorf("improper device state %s on device %s", dh.GetDeviceReasonString(), dh.DeviceID)
Himani Chawla26e555c2020-08-31 12:30:20 +0530336 }
mpagenkofc4f56e2020-11-04 17:17:49 +0000337 //previous state test here was just this one, now extended for more states to reject the SetRequest:
338 // at least 'mib-downloaded' should be reached for processing of this specific ONU configuration
339 // if (dh.deviceReason == "stopping-openomci") || (dh.deviceReason == "omci-admin-lock")
Himani Chawla26e555c2020-08-31 12:30:20 +0530340
Himani Chawla26e555c2020-08-31 12:30:20 +0530341 // we have to lock access to TechProfile processing based on different messageType calls or
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000342 // even to fast subsequent calls of the same messageType as well as OnuKVStore processing due
343 // to possible concurrent access by flow processing
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000344 dh.pOnuTP.LockTpProcMutex()
345 defer dh.pOnuTP.UnlockTpProcMutex()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000346
347 if techProfMsg.UniId > 255 {
348 return fmt.Errorf(fmt.Sprintf("received UniId value exceeds range: %d, device-id: %s",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000349 techProfMsg.UniId, dh.DeviceID))
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000350 }
351 uniID := uint8(techProfMsg.UniId)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000352 tpID, err := cmn.GetTpIDFromTpPath(techProfMsg.TpInstancePath)
Girish Gowdra041dcb32020-11-16 16:54:30 -0800353 if err != nil {
Girish Gowdra50e56422021-06-01 16:46:04 -0700354 logger.Errorw(ctx, "error-parsing-tpid-from-tppath", log.Fields{"err": err, "tp-path": techProfMsg.TpInstancePath})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800355 return err
356 }
Girish Gowdra50e56422021-06-01 16:46:04 -0700357 logger.Debugw(ctx, "unmarshal-techprof-msg-body", log.Fields{"uniID": uniID, "tp-path": techProfMsg.TpInstancePath, "tpID": tpID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000358
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000359 if bTpModify := pDevEntry.UpdateOnuUniTpPath(ctx, uniID, uint8(tpID), techProfMsg.TpInstancePath); bTpModify {
Himani Chawla26e555c2020-08-31 12:30:20 +0530360
Girish Gowdra50e56422021-06-01 16:46:04 -0700361 switch tpInst := techProfMsg.TechTpInstance.(type) {
khenaidoo7d3c5582021-08-11 18:09:44 -0400362 case *ic.TechProfileDownloadMessage_TpInstance:
Girish Gowdra50e56422021-06-01 16:46:04 -0700363 logger.Debugw(ctx, "onu-uni-tp-path-modified", log.Fields{"uniID": uniID, "tp-path": techProfMsg.TpInstancePath, "tpID": tpID})
364 // if there has been some change for some uni TechProfilePath
365 //in order to allow concurrent calls to other dh instances we do not wait for execution here
366 //but doing so we can not indicate problems to the caller (who does what with that then?)
367 //by now we just assume straightforward successful execution
368 //TODO!!! Generally: In this scheme it would be good to have some means to indicate
369 // possible problems to the caller later autonomously
Himani Chawla26e555c2020-08-31 12:30:20 +0530370
Girish Gowdra50e56422021-06-01 16:46:04 -0700371 // deadline context to ensure completion of background routines waited for
372 //20200721: 10s proved to be less in 8*8 ONU test on local vbox machine with debug, might be further adapted
373 deadline := time.Now().Add(dh.pOpenOnuAc.maxTimeoutInterAdapterComm) //allowed run time to finish before execution
374 dctx, cancel := context.WithDeadline(context.Background(), deadline)
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000375
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000376 dh.pOnuTP.ResetTpProcessingErrorIndication(uniID, tpID)
Girish Gowdra50e56422021-06-01 16:46:04 -0700377
378 var wg sync.WaitGroup
379 wg.Add(1) // for the 1 go routine to finish
380 // attention: deadline completion check and wg.Done is to be done in both routines
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000381 go dh.pOnuTP.ConfigureUniTp(log.WithSpanFromContext(dctx, ctx), uniID, techProfMsg.TpInstancePath, *tpInst.TpInstance, &wg)
Girish Gowdra50e56422021-06-01 16:46:04 -0700382 dh.waitForCompletion(ctx, cancel, &wg, "TechProfDwld") //wait for background process to finish
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000383 if tpErr := dh.pOnuTP.GetTpProcessingErrorIndication(uniID, tpID); tpErr != nil {
384 logger.Errorw(ctx, "error-processing-tp", log.Fields{"device-id": dh.DeviceID, "err": tpErr, "tp-path": techProfMsg.TpInstancePath})
Girish Gowdra50e56422021-06-01 16:46:04 -0700385 return tpErr
386 }
387 deadline = time.Now().Add(dh.pOpenOnuAc.maxTimeoutInterAdapterComm) //allowed run time to finish before execution
388 dctx2, cancel2 := context.WithDeadline(context.Background(), deadline)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000389 pDevEntry.ResetKvProcessingErrorIndication()
Girish Gowdra50e56422021-06-01 16:46:04 -0700390 wg.Add(1) // for the 1 go routine to finish
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000391 go pDevEntry.UpdateOnuKvStore(log.WithSpanFromContext(dctx2, ctx), &wg)
Girish Gowdra50e56422021-06-01 16:46:04 -0700392 dh.waitForCompletion(ctx, cancel2, &wg, "TechProfDwld") //wait for background process to finish
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000393 if kvErr := pDevEntry.GetKvProcessingErrorIndication(); kvErr != nil {
394 logger.Errorw(ctx, "error-updating-KV", log.Fields{"device-id": dh.DeviceID, "err": kvErr, "tp-path": techProfMsg.TpInstancePath})
Girish Gowdra50e56422021-06-01 16:46:04 -0700395 return kvErr
396 }
397 return nil
398 default:
399 logger.Errorw(ctx, "unsupported-tp-instance-type", log.Fields{"tp-path": techProfMsg.TpInstancePath})
400 return fmt.Errorf("unsupported-tp-instance-type--tp-id-%v", techProfMsg.TpInstancePath)
Mahir Gunyel7f4483a2021-05-06 12:53:43 -0700401 }
Himani Chawla26e555c2020-08-31 12:30:20 +0530402 }
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000403 // no change, nothing really to do - return success
Girish Gowdra50e56422021-06-01 16:46:04 -0700404 logger.Debugw(ctx, "onu-uni-tp-path-not-modified", log.Fields{"uniID": uniID, "tp-path": techProfMsg.TpInstancePath, "tpID": tpID})
Himani Chawla26e555c2020-08-31 12:30:20 +0530405 return nil
406}
407
khenaidoo7d3c5582021-08-11 18:09:44 -0400408func (dh *deviceHandler) handleDeleteGemPortRequest(ctx context.Context, delGemPortMsg *ic.DeleteGemPortMessage) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000409 logger.Infow(ctx, "delete-gem-port-request", log.Fields{"device-id": dh.DeviceID})
Himani Chawla26e555c2020-08-31 12:30:20 +0530410
411 if dh.pOnuTP == nil {
412 //should normally not happen ...
dbainbri4d3a0dc2020-12-02 00:33:42 +0000413 logger.Warnw(ctx, "onuTechProf instance not set up for DelGem request - ignoring request",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000414 log.Fields{"device-id": dh.DeviceID})
415 return fmt.Errorf("techProfile DelGem request while onuTechProf instance not setup: %s", dh.DeviceID)
Himani Chawla26e555c2020-08-31 12:30:20 +0530416 }
Himani Chawla26e555c2020-08-31 12:30:20 +0530417 //compare TECH_PROFILE_DOWNLOAD_REQUEST
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000418 dh.pOnuTP.LockTpProcMutex()
419 defer dh.pOnuTP.UnlockTpProcMutex()
Himani Chawla26e555c2020-08-31 12:30:20 +0530420
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000421 if delGemPortMsg.UniId > 255 {
422 return fmt.Errorf(fmt.Sprintf("received UniId value exceeds range: %d, device-id: %s",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000423 delGemPortMsg.UniId, dh.DeviceID))
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000424 }
425 uniID := uint8(delGemPortMsg.UniId)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000426 tpID, err := cmn.GetTpIDFromTpPath(delGemPortMsg.TpInstancePath)
Girish Gowdra041dcb32020-11-16 16:54:30 -0800427 if err != nil {
Girish Gowdra50e56422021-06-01 16:46:04 -0700428 logger.Errorw(ctx, "error-extracting-tp-id-from-tp-path", log.Fields{"err": err, "tp-path": delGemPortMsg.TpInstancePath})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800429 return err
430 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000431 logger.Infow(ctx, "delete-gem-port-request", log.Fields{"device-id": dh.DeviceID, "uni-id": uniID, "tpID": tpID, "gem": delGemPortMsg.GemPortId})
mpagenkofc4f56e2020-11-04 17:17:49 +0000432 //a removal of some GemPort would never remove the complete TechProfile entry (done on T-Cont)
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000433
Mahir Gunyel9545be22021-07-04 15:53:16 -0700434 return dh.deleteTechProfileResource(ctx, uniID, tpID, delGemPortMsg.TpInstancePath,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000435 avcfg.CResourceGemPort, delGemPortMsg.GemPortId)
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000436
Himani Chawla26e555c2020-08-31 12:30:20 +0530437}
438
khenaidoo7d3c5582021-08-11 18:09:44 -0400439func (dh *deviceHandler) handleDeleteTcontRequest(ctx context.Context, delTcontMsg *ic.DeleteTcontMessage) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000440 logger.Infow(ctx, "delete-tcont-request", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000441
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000442 pDevEntry := dh.GetOnuDeviceEntry(ctx, true)
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000443 if pDevEntry == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000444 logger.Errorw(ctx, "No valid OnuDevice - aborting", log.Fields{"device-id": dh.DeviceID})
445 return fmt.Errorf("no valid OnuDevice: %s", dh.DeviceID)
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000446 }
Himani Chawla26e555c2020-08-31 12:30:20 +0530447 if dh.pOnuTP == nil {
448 //should normally not happen ...
dbainbri4d3a0dc2020-12-02 00:33:42 +0000449 logger.Warnw(ctx, "onuTechProf instance not set up for DelTcont request - ignoring request",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000450 log.Fields{"device-id": dh.DeviceID})
451 return fmt.Errorf("techProfile DelTcont request while onuTechProf instance not setup: %s", dh.DeviceID)
Himani Chawla26e555c2020-08-31 12:30:20 +0530452 }
453
Himani Chawla26e555c2020-08-31 12:30:20 +0530454 //compare TECH_PROFILE_DOWNLOAD_REQUEST
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000455 dh.pOnuTP.LockTpProcMutex()
456 defer dh.pOnuTP.UnlockTpProcMutex()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000457
458 if delTcontMsg.UniId > 255 {
459 return fmt.Errorf(fmt.Sprintf("received UniId value exceeds range: %d, device-id: %s",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000460 delTcontMsg.UniId, dh.DeviceID))
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000461 }
462 uniID := uint8(delTcontMsg.UniId)
Girish Gowdra50e56422021-06-01 16:46:04 -0700463 tpPath := delTcontMsg.TpInstancePath
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000464 tpID, err := cmn.GetTpIDFromTpPath(tpPath)
Girish Gowdra041dcb32020-11-16 16:54:30 -0800465 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000466 logger.Errorw(ctx, "error-extracting-tp-id-from-tp-path", log.Fields{"err": err, "tp-path": tpPath})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800467 return err
468 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000469 logger.Infow(ctx, "delete-tcont-request", log.Fields{"device-id": dh.DeviceID, "uni-id": uniID, "tpID": tpID, "tcont": delTcontMsg.AllocId})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000470
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000471 pDevEntry.FreeTcont(ctx, uint16(delTcontMsg.AllocId))
Himani Chawla26e555c2020-08-31 12:30:20 +0530472
Mahir Gunyel9545be22021-07-04 15:53:16 -0700473 return dh.deleteTechProfileResource(ctx, uniID, tpID, delTcontMsg.TpInstancePath,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000474 avcfg.CResourceTcont, delTcontMsg.AllocId)
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000475
Mahir Gunyel9545be22021-07-04 15:53:16 -0700476}
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000477
Mahir Gunyel9545be22021-07-04 15:53:16 -0700478func (dh *deviceHandler) deleteTechProfileResource(ctx context.Context,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000479 uniID uint8, tpID uint8, pathString string, resource avcfg.ResourceEntry, entryID uint32) error {
480 pDevEntry := dh.GetOnuDeviceEntry(ctx, true)
Mahir Gunyel9545be22021-07-04 15:53:16 -0700481 if pDevEntry == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000482 logger.Errorw(ctx, "No valid OnuDevice - aborting", log.Fields{"device-id": dh.DeviceID})
483 return fmt.Errorf("no valid OnuDevice: %s", dh.DeviceID)
Himani Chawla26e555c2020-08-31 12:30:20 +0530484 }
Mahir Gunyel9545be22021-07-04 15:53:16 -0700485 var resourceName string
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000486 if avcfg.CResourceGemPort == resource {
Mahir Gunyel9545be22021-07-04 15:53:16 -0700487 resourceName = "Gem"
488 } else {
489 resourceName = "Tcont"
490 }
491
492 // deadline context to ensure completion of background routines waited for
493 deadline := time.Now().Add(dh.pOpenOnuAc.maxTimeoutInterAdapterComm) //allowed run time to finish before execution
494 dctx, cancel := context.WithDeadline(context.Background(), deadline)
495
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000496 dh.pOnuTP.ResetTpProcessingErrorIndication(uniID, tpID)
Mahir Gunyel9545be22021-07-04 15:53:16 -0700497
498 var wg sync.WaitGroup
499 wg.Add(1) // for the 1 go routine to finish
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000500 go dh.pOnuTP.DeleteTpResource(log.WithSpanFromContext(dctx, ctx), uniID, tpID, pathString,
Mahir Gunyel9545be22021-07-04 15:53:16 -0700501 resource, entryID, &wg)
502 dh.waitForCompletion(ctx, cancel, &wg, resourceName+"Delete") //wait for background process to finish
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000503 if err := dh.pOnuTP.GetTpProcessingErrorIndication(uniID, tpID); err != nil {
504 logger.Errorw(ctx, err.Error(), log.Fields{"device-id": dh.DeviceID})
Mahir Gunyel9545be22021-07-04 15:53:16 -0700505 return err
506 }
507
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000508 if dh.pOnuTP.IsTechProfileConfigCleared(ctx, uniID, tpID) {
509 logger.Debugw(ctx, "techProfile-config-cleared", log.Fields{"device-id": dh.DeviceID, "uni-id": uniID, "tpID": tpID})
510 if bTpModify := pDevEntry.UpdateOnuUniTpPath(ctx, uniID, tpID, ""); bTpModify {
511 pDevEntry.ResetKvProcessingErrorIndication()
Mahir Gunyel9545be22021-07-04 15:53:16 -0700512 var wg2 sync.WaitGroup
513 dctx2, cancel2 := context.WithDeadline(context.Background(), deadline)
514 wg2.Add(1)
515 // Removal of the gem id mapping represents the removal of the tech profile
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000516 logger.Infow(ctx, "remove-techProfile-indication-in-kv", log.Fields{"device-id": dh.DeviceID, "uni-id": uniID, "tpID": tpID})
517 go pDevEntry.UpdateOnuKvStore(log.WithSpanFromContext(dctx2, ctx), &wg2)
Mahir Gunyel9545be22021-07-04 15:53:16 -0700518 dh.waitForCompletion(ctx, cancel2, &wg2, "TechProfileDeleteOn"+resourceName) //wait for background process to finish
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000519 if err := pDevEntry.GetKvProcessingErrorIndication(); err != nil {
520 logger.Errorw(ctx, err.Error(), log.Fields{"device-id": dh.DeviceID})
Mahir Gunyel9545be22021-07-04 15:53:16 -0700521 return err
522 }
523 }
524 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000525 logger.Debugw(ctx, "delete-tech-profile-resource-completed", log.Fields{"device-id": dh.DeviceID,
Mahir Gunyel9545be22021-07-04 15:53:16 -0700526 "uni-id": uniID, "tpID": tpID, "resource-type": resourceName, "resource-id": entryID})
Himani Chawla26e555c2020-08-31 12:30:20 +0530527 return nil
528}
529
mpagenkodff5dda2020-08-28 11:52:01 +0000530//FlowUpdateIncremental removes and/or adds the flow changes on a given device
dbainbri4d3a0dc2020-12-02 00:33:42 +0000531func (dh *deviceHandler) FlowUpdateIncremental(ctx context.Context,
khenaidoo7d3c5582021-08-11 18:09:44 -0400532 apOfFlowChanges *of.FlowChanges,
533 apOfGroupChanges *of.FlowGroupChanges, apFlowMetaData *voltha.FlowMetadata) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000534 logger.Debugw(ctx, "FlowUpdateIncremental started", log.Fields{"device-id": dh.DeviceID, "metadata": apFlowMetaData})
mpagenko01e726e2020-10-23 09:45:29 +0000535 var retError error = nil
536 //Remove flows (always remove flows first - remove old and add new with same cookie may be part of the same request)
mpagenkodff5dda2020-08-28 11:52:01 +0000537 if apOfFlowChanges.ToRemove != nil {
538 for _, flowItem := range apOfFlowChanges.ToRemove.Items {
mpagenkodff5dda2020-08-28 11:52:01 +0000539 if flowItem.GetCookie() == 0 {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000540 logger.Warnw(ctx, "flow-remove no cookie: ignore and continuing on checking further flows", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000541 "device-id": dh.DeviceID})
542 retError = fmt.Errorf("flow-remove no cookie, device-id %s", dh.DeviceID)
mpagenkodff5dda2020-08-28 11:52:01 +0000543 continue
544 }
545 flowInPort := flow.GetInPort(flowItem)
546 if flowInPort == uint32(of.OfpPortNo_OFPP_INVALID) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000547 logger.Warnw(ctx, "flow-remove inPort invalid: ignore and continuing on checking further flows", log.Fields{"device-id": dh.DeviceID})
548 retError = fmt.Errorf("flow-remove inPort invalid, device-id %s", dh.DeviceID)
mpagenko01e726e2020-10-23 09:45:29 +0000549 continue
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000550 //return fmt.Errorf("flow inPort invalid: %s", dh.DeviceID)
mpagenkodff5dda2020-08-28 11:52:01 +0000551 } else if flowInPort == dh.ponPortNumber {
mpagenko01e726e2020-10-23 09:45:29 +0000552 //this is some downstream flow, not regarded as error, just ignored
dbainbri4d3a0dc2020-12-02 00:33:42 +0000553 logger.Debugw(ctx, "flow-remove for downstream: ignore and continuing on checking further flows", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000554 "device-id": dh.DeviceID, "inPort": flowInPort})
mpagenkodff5dda2020-08-28 11:52:01 +0000555 continue
556 } else {
557 // this is the relevant upstream flow
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000558 var loUniPort *cmn.OnuUniPort
mpagenkodff5dda2020-08-28 11:52:01 +0000559 if uniPort, exist := dh.uniEntityMap[flowInPort]; exist {
560 loUniPort = uniPort
561 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000562 logger.Warnw(ctx, "flow-remove inPort not found in UniPorts: ignore and continuing on checking further flows",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000563 log.Fields{"device-id": dh.DeviceID, "inPort": flowInPort})
mpagenko01e726e2020-10-23 09:45:29 +0000564 retError = fmt.Errorf("flow-remove inPort not found in UniPorts, inPort %d, device-id %s",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000565 flowInPort, dh.DeviceID)
mpagenko01e726e2020-10-23 09:45:29 +0000566 continue
mpagenkodff5dda2020-08-28 11:52:01 +0000567 }
568 flowOutPort := flow.GetOutPort(flowItem)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000569 logger.Debugw(ctx, "flow-remove port indications", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000570 "device-id": dh.DeviceID, "inPort": flowInPort, "outPort": flowOutPort,
571 "uniPortName": loUniPort.Name})
dbainbri4d3a0dc2020-12-02 00:33:42 +0000572 err := dh.removeFlowItemFromUniPort(ctx, flowItem, loUniPort)
mpagenko01e726e2020-10-23 09:45:29 +0000573 //try next flow after processing error
mpagenkodff5dda2020-08-28 11:52:01 +0000574 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000575 logger.Warnw(ctx, "flow-remove processing error: continuing on checking further flows",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000576 log.Fields{"device-id": dh.DeviceID, "error": err})
mpagenko01e726e2020-10-23 09:45:29 +0000577 retError = err
578 continue
579 //return err
580 } else { // if last setting succeeds, overwrite possibly previously set error
581 retError = nil
mpagenkodff5dda2020-08-28 11:52:01 +0000582 }
583 }
584 }
585 }
mpagenko01e726e2020-10-23 09:45:29 +0000586 if apOfFlowChanges.ToAdd != nil {
587 for _, flowItem := range apOfFlowChanges.ToAdd.Items {
588 if flowItem.GetCookie() == 0 {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000589 logger.Debugw(ctx, "incremental flow-add no cookie: ignore and continuing on checking further flows", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000590 "device-id": dh.DeviceID})
591 retError = fmt.Errorf("flow-add no cookie, device-id %s", dh.DeviceID)
mpagenko01e726e2020-10-23 09:45:29 +0000592 continue
593 }
594 flowInPort := flow.GetInPort(flowItem)
595 if flowInPort == uint32(of.OfpPortNo_OFPP_INVALID) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000596 logger.Warnw(ctx, "flow-add inPort invalid: ignore and continuing on checking further flows", log.Fields{"device-id": dh.DeviceID})
597 retError = fmt.Errorf("flow-add inPort invalid, device-id %s", dh.DeviceID)
mpagenko01e726e2020-10-23 09:45:29 +0000598 continue
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000599 //return fmt.Errorf("flow inPort invalid: %s", dh.DeviceID)
mpagenko01e726e2020-10-23 09:45:29 +0000600 } else if flowInPort == dh.ponPortNumber {
601 //this is some downstream flow
dbainbri4d3a0dc2020-12-02 00:33:42 +0000602 logger.Debugw(ctx, "flow-add for downstream: ignore and continuing on checking further flows", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000603 "device-id": dh.DeviceID, "inPort": flowInPort})
mpagenko01e726e2020-10-23 09:45:29 +0000604 continue
605 } else {
606 // this is the relevant upstream flow
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000607 var loUniPort *cmn.OnuUniPort
mpagenko01e726e2020-10-23 09:45:29 +0000608 if uniPort, exist := dh.uniEntityMap[flowInPort]; exist {
609 loUniPort = uniPort
610 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000611 logger.Warnw(ctx, "flow-add inPort not found in UniPorts: ignore and continuing on checking further flows",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000612 log.Fields{"device-id": dh.DeviceID, "inPort": flowInPort})
mpagenko01e726e2020-10-23 09:45:29 +0000613 retError = fmt.Errorf("flow-add inPort not found in UniPorts, inPort %d, device-id %s",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000614 flowInPort, dh.DeviceID)
mpagenko01e726e2020-10-23 09:45:29 +0000615 continue
616 //return fmt.Errorf("flow-parameter inPort %d not found in internal UniPorts", flowInPort)
617 }
mpagenkofc4f56e2020-11-04 17:17:49 +0000618 // let's still assume that we receive the flow-add only in some 'active' device state (as so far observed)
619 // if not, we just throw some error here to have an indication about that, if we really need to support that
620 // then we would need to create some means to activate the internal stored flows
621 // after the device gets active automatically (and still with its dependency to the TechProfile)
622 // for state checking compare also code here: processInterAdapterTechProfileDownloadReqMessage
623 // also abort for the other still possible flows here
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000624 if !dh.IsReadyForOmciConfig() {
625 logger.Errorw(ctx, "flow-add rejected: improper device state", log.Fields{"device-id": dh.DeviceID,
626 "last device-reason": dh.GetDeviceReasonString()})
627 return fmt.Errorf("improper device state on device %s", dh.DeviceID)
mpagenkofc4f56e2020-11-04 17:17:49 +0000628 }
629
mpagenko01e726e2020-10-23 09:45:29 +0000630 flowOutPort := flow.GetOutPort(flowItem)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000631 logger.Debugw(ctx, "flow-add port indications", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000632 "device-id": dh.DeviceID, "inPort": flowInPort, "outPort": flowOutPort,
633 "uniPortName": loUniPort.Name})
ozgecanetsia82b91a62021-05-21 18:54:49 +0300634 err := dh.addFlowItemToUniPort(ctx, flowItem, loUniPort, apFlowMetaData)
mpagenko01e726e2020-10-23 09:45:29 +0000635 //try next flow after processing error
636 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000637 logger.Warnw(ctx, "flow-add processing error: continuing on checking further flows",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000638 log.Fields{"device-id": dh.DeviceID, "error": err})
mpagenko01e726e2020-10-23 09:45:29 +0000639 retError = err
640 continue
641 //return err
642 } else { // if last setting succeeds, overwrite possibly previously set error
643 retError = nil
644 }
645 }
646 }
647 }
648 return retError
mpagenkodff5dda2020-08-28 11:52:01 +0000649}
650
Himani Chawla6d2ae152020-09-02 13:11:20 +0530651//disableDevice locks the ONU and its UNI/VEIP ports (admin lock via OMCI)
mpagenkofc4f56e2020-11-04 17:17:49 +0000652//following are the expected device states after this activity:
653//Device Admin-State : down (on rwCore), Port-State: UNKNOWN, Conn-State: REACHABLE, Reason: omci-admin-lock
654// (Conn-State: REACHABLE might conflict with some previous ONU Down indication - maybe to be resolved later)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000655func (dh *deviceHandler) disableDevice(ctx context.Context, device *voltha.Device) {
656 logger.Debugw(ctx, "disable-device", log.Fields{"device-id": device.Id, "SerialNumber": device.SerialNumber})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000657
mpagenko900ee4b2020-10-12 11:56:34 +0000658 //admin-lock reason can also be used uniquely for setting the DeviceState accordingly
mpagenkofc4f56e2020-11-04 17:17:49 +0000659 //note that disableDevice sequences in some 'ONU active' state may yield also
660 // "tech...delete-success" or "omci-flow-deleted" according to further received requests in the end
mpagenko900ee4b2020-10-12 11:56:34 +0000661 // - inblock state checking to prevent possibly unneeded processing (on command repitition)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000662 if dh.getDeviceReason() != cmn.DrOmciAdminLock {
mpagenkofc4f56e2020-11-04 17:17:49 +0000663 //disable-device shall be just a UNi/ONU-G related admin state setting
664 //all other configurations/FSM's shall not be impacted and shall execute as required by the system
mpagenko900ee4b2020-10-12 11:56:34 +0000665
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000666 if dh.IsReadyForOmciConfig() {
mpagenko01e726e2020-10-23 09:45:29 +0000667 // disable UNI ports/ONU
668 // *** should generate UniDisableStateDone event - used to disable the port(s) on success
669 if dh.pLockStateFsm == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000670 dh.createUniLockFsm(ctx, true, cmn.UniDisableStateDone)
mpagenko01e726e2020-10-23 09:45:29 +0000671 } else { //LockStateFSM already init
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000672 dh.pLockStateFsm.SetSuccessEvent(cmn.UniDisableStateDone)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000673 dh.runUniLockFsm(ctx, true)
mpagenko01e726e2020-10-23 09:45:29 +0000674 }
675 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000676 logger.Debugw(ctx, "DeviceStateUpdate upon disable", log.Fields{"ConnectStatus": voltha.ConnectStatus_REACHABLE,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000677 "OperStatus": voltha.OperStatus_UNKNOWN, "device-id": dh.DeviceID})
khenaidoo7d3c5582021-08-11 18:09:44 -0400678 if err := dh.updateDeviceStateInCore(ctx, &ic.DeviceStateFilter{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000679 DeviceId: dh.DeviceID,
khenaidoo7d3c5582021-08-11 18:09:44 -0400680 ConnStatus: voltha.ConnectStatus_REACHABLE,
681 OperStatus: voltha.OperStatus_UNKNOWN,
682 }); err != nil {
mpagenko01e726e2020-10-23 09:45:29 +0000683 //TODO with VOL-3045/VOL-3046: return the error and stop further processing
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000684 logger.Errorw(ctx, "error-updating-device-state", log.Fields{"device-id": dh.DeviceID, "error": err})
mpagenko01e726e2020-10-23 09:45:29 +0000685 }
mpagenko01e726e2020-10-23 09:45:29 +0000686 // DeviceReason to update acc.to modified py code as per beginning of Sept 2020
Holger Hildebrandt80129db2020-11-23 10:49:32 +0000687
688 //TODO with VOL-3045/VOL-3046: catch and return error, valid for all occurrences in the codebase
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000689 _ = dh.deviceReasonUpdate(ctx, cmn.DrOmciAdminLock, true)
mpagenko3af1f032020-06-10 08:53:41 +0000690 }
ozgecanetsiafce57b12020-05-25 14:39:35 +0300691 }
692}
693
Himani Chawla6d2ae152020-09-02 13:11:20 +0530694//reEnableDevice unlocks the ONU and its UNI/VEIP ports (admin unlock via OMCI)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000695func (dh *deviceHandler) reEnableDevice(ctx context.Context, device *voltha.Device) {
696 logger.Debugw(ctx, "reenable-device", log.Fields{"device-id": device.Id, "SerialNumber": device.SerialNumber})
mpagenko3af1f032020-06-10 08:53:41 +0000697
mpagenkoaa3afe92021-05-21 16:20:58 +0000698 //setting readyForOmciConfig here is just a workaround for BBSIM testing in the sequence
mpagenkofc4f56e2020-11-04 17:17:49 +0000699 // OnuSoftReboot-disable-enable, because BBSIM does not generate a new OnuIndication-Up event after SoftReboot
700 // which is the assumption for real ONU's, where the ready-state is then set according to the following MibUpload/Download
701 // for real ONU's that should have nearly no influence
702 // Note that for real ONU's there is anyway a problematic situation with following sequence:
703 // OnuIndication-Dw (or not active at all) (- disable) - enable: here already the LockFsm may run into timeout (no OmciResponse)
704 // but that anyway is hopefully resolved by some OnuIndication-Up event (maybe to be tested)
705 // one could also argue, that a device-enable should also enable attempts for specific omci configuration
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000706 dh.SetReadyForOmciConfig(true) //needed to allow subsequent flow/techProf config (on BBSIM)
mpagenkofc4f56e2020-11-04 17:17:49 +0000707
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000708 // enable ONU/UNI ports
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000709 // *** should generate cmn.UniEnableStateDone event - used to disable the port(s) on success
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000710 if dh.pUnlockStateFsm == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000711 dh.createUniLockFsm(ctx, false, cmn.UniEnableStateDone)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000712 } else { //UnlockStateFSM already init
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000713 dh.pUnlockStateFsm.SetSuccessEvent(cmn.UniEnableStateDone)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000714 dh.runUniLockFsm(ctx, false)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000715 }
ozgecanetsiafce57b12020-05-25 14:39:35 +0300716}
717
dbainbri4d3a0dc2020-12-02 00:33:42 +0000718func (dh *deviceHandler) reconcileDeviceOnuInd(ctx context.Context) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000719 logger.Debugw(ctx, "reconciling - simulate onu indication", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandtf41a1602020-08-19 09:52:50 +0000720
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000721 pDevEntry := dh.GetOnuDeviceEntry(ctx, true)
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000722 if pDevEntry == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000723 logger.Errorw(ctx, "No valid OnuDevice - aborting", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000724 return
725 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000726 if err := pDevEntry.RestoreDataFromOnuKvStore(log.WithSpanFromContext(context.TODO(), ctx)); err != nil {
mpagenko2418ab02020-11-12 12:58:06 +0000727 if err == fmt.Errorf("no-ONU-data-found") {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000728 logger.Debugw(ctx, "no persistent data found - abort reconciling", log.Fields{"device-id": dh.DeviceID})
mpagenko2418ab02020-11-12 12:58:06 +0000729 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000730 logger.Errorw(ctx, "reconciling - restoring OnuTp-data failed - abort", log.Fields{"err": err, "device-id": dh.DeviceID})
mpagenko2418ab02020-11-12 12:58:06 +0000731 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000732 dh.StopReconciling(ctx, false)
Holger Hildebrandtf41a1602020-08-19 09:52:50 +0000733 return
Holger Hildebrandt9ca8b132020-08-07 14:45:03 +0000734 }
Himani Chawla4d908332020-08-31 12:30:20 +0530735 var onuIndication oop.OnuIndication
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000736 pDevEntry.MutexPersOnuConfig.RLock()
737 onuIndication.IntfId = pDevEntry.SOnuPersistentData.PersIntfID
738 onuIndication.OnuId = pDevEntry.SOnuPersistentData.PersOnuID
739 onuIndication.OperState = pDevEntry.SOnuPersistentData.PersOperState
740 onuIndication.AdminState = pDevEntry.SOnuPersistentData.PersAdminState
741 pDevEntry.MutexPersOnuConfig.RUnlock()
dbainbri4d3a0dc2020-12-02 00:33:42 +0000742 _ = dh.createInterface(ctx, &onuIndication)
Holger Hildebrandtf41a1602020-08-19 09:52:50 +0000743}
744
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000745func (dh *deviceHandler) ReconcileDeviceTechProf(ctx context.Context) {
746 logger.Debugw(ctx, "reconciling - trigger tech profile config", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandtf41a1602020-08-19 09:52:50 +0000747
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000748 pDevEntry := dh.GetOnuDeviceEntry(ctx, true)
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000749 if pDevEntry == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000750 logger.Errorw(ctx, "No valid OnuDevice - aborting", log.Fields{"device-id": dh.DeviceID})
751 if !dh.IsSkipOnuConfigReconciling() {
752 dh.StopReconciling(ctx, false)
Holger Hildebrandt7e9de862021-03-26 14:01:49 +0000753 }
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000754 return
755 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000756 dh.pOnuTP.LockTpProcMutex()
757 defer dh.pOnuTP.UnlockTpProcMutex()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000758
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000759 pDevEntry.MutexPersOnuConfig.RLock()
mpagenko2dc896e2021-08-02 12:03:59 +0000760 persMutexLock := true
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000761 if len(pDevEntry.SOnuPersistentData.PersUniConfig) == 0 {
762 pDevEntry.MutexPersOnuConfig.RUnlock()
dbainbri4d3a0dc2020-12-02 00:33:42 +0000763 logger.Debugw(ctx, "reconciling - no uni-configs have been stored before adapter restart - terminate reconcilement",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000764 log.Fields{"device-id": dh.DeviceID})
765 if !dh.IsSkipOnuConfigReconciling() {
766 dh.StopReconciling(ctx, true)
Holger Hildebrandt7e9de862021-03-26 14:01:49 +0000767 }
Holger Hildebrandt3a644642020-12-02 09:46:18 +0000768 return
769 }
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000770 flowsFound := false
Girish Gowdra50e56422021-06-01 16:46:04 -0700771 techProfsFound := false
772 techProfInstLoadFailed := false
773outerLoop:
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000774 for _, uniData := range pDevEntry.SOnuPersistentData.PersUniConfig {
Holger Hildebrandt3a644642020-12-02 09:46:18 +0000775 //TODO: check for uni-port specific reconcilement in case of multi-uni-port-per-onu-support
776 if len(uniData.PersTpPathMap) == 0 {
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000777 logger.Debugw(ctx, "reconciling - no TPs stored for uniID",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000778 log.Fields{"uni-id": uniData.PersUniID, "device-id": dh.DeviceID})
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000779 continue
Holger Hildebrandt3a644642020-12-02 09:46:18 +0000780 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000781 //release MutexPersOnuConfig before TechProfile (ANIConfig) processing as otherwise the reception of
782 // OMCI frames may get completely stuck due to lock request within IncrementMibDataSync() at OMCI
mpagenko2dc896e2021-08-02 12:03:59 +0000783 // frame reception may also lock the complete OMCI reception processing based on mutexRxSchedMap
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000784 pDevEntry.MutexPersOnuConfig.RUnlock()
mpagenko2dc896e2021-08-02 12:03:59 +0000785 persMutexLock = false
Girish Gowdra50e56422021-06-01 16:46:04 -0700786 techProfsFound = true // set to true if we found TP once for any UNI port
Girish Gowdra041dcb32020-11-16 16:54:30 -0800787 for tpID := range uniData.PersTpPathMap {
Girish Gowdra50e56422021-06-01 16:46:04 -0700788 // Request the TpInstance again from the openolt adapter in case of reconcile
khenaidoo7d3c5582021-08-11 18:09:44 -0400789 iaTechTpInst, err := dh.getTechProfileInstanceFromParentAdapter(ctx,
790 dh.device.ProxyAddress.AdapterEndpoint,
791 &ic.TechProfileInstanceRequestMessage{
792 DeviceId: dh.device.Id,
793 TpInstancePath: uniData.PersTpPathMap[tpID],
794 ParentDeviceId: dh.parentID,
795 ParentPonPort: dh.device.ParentPortNo,
796 OnuId: dh.device.ProxyAddress.OnuId,
797 UniId: uint32(uniData.PersUniID),
798 })
Girish Gowdra50e56422021-06-01 16:46:04 -0700799 if err != nil || iaTechTpInst == nil {
800 logger.Errorw(ctx, "error fetching tp instance",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000801 log.Fields{"tp-id": tpID, "tpPath": uniData.PersTpPathMap[tpID], "uni-id": uniData.PersUniID, "device-id": dh.DeviceID, "err": err})
Girish Gowdra50e56422021-06-01 16:46:04 -0700802 techProfInstLoadFailed = true // stop loading tp instance as soon as we hit failure
803 break outerLoop
804 }
805 var tpInst tech_profile.TechProfileInstance
806 switch techTpInst := iaTechTpInst.TechTpInstance.(type) {
khenaidoo7d3c5582021-08-11 18:09:44 -0400807 case *ic.TechProfileDownloadMessage_TpInstance: // supports only GPON, XGPON, XGS-PON
Girish Gowdra50e56422021-06-01 16:46:04 -0700808 tpInst = *techTpInst.TpInstance
mpagenko2dc896e2021-08-02 12:03:59 +0000809 logger.Debugw(ctx, "received-tp-instance-successfully-after-reconcile", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000810 "tp-id": tpID, "tpPath": uniData.PersTpPathMap[tpID], "uni-id": uniData.PersUniID, "device-id": dh.DeviceID})
Girish Gowdra50e56422021-06-01 16:46:04 -0700811 default: // do not support epon or other tech
mpagenko2dc896e2021-08-02 12:03:59 +0000812 logger.Errorw(ctx, "unsupported-tech-profile", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000813 "tp-id": tpID, "tpPath": uniData.PersTpPathMap[tpID], "uni-id": uniData.PersUniID, "device-id": dh.DeviceID})
Girish Gowdra50e56422021-06-01 16:46:04 -0700814 techProfInstLoadFailed = true // stop loading tp instance as soon as we hit failure
815 break outerLoop
816 }
817
Girish Gowdra041dcb32020-11-16 16:54:30 -0800818 // deadline context to ensure completion of background routines waited for
819 //20200721: 10s proved to be less in 8*8 ONU test on local vbox machine with debug, might be further adapted
820 deadline := time.Now().Add(dh.pOpenOnuAc.maxTimeoutInterAdapterComm) //allowed run time to finish before execution
dbainbri4d3a0dc2020-12-02 00:33:42 +0000821 dctx, cancel := context.WithDeadline(ctx, deadline)
Holger Hildebrandtf41a1602020-08-19 09:52:50 +0000822
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000823 dh.pOnuTP.ResetTpProcessingErrorIndication(uniData.PersUniID, tpID)
Girish Gowdra041dcb32020-11-16 16:54:30 -0800824 var wg sync.WaitGroup
825 wg.Add(1) // for the 1 go routine to finish
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000826 go dh.pOnuTP.ConfigureUniTp(log.WithSpanFromContext(dctx, ctx), uniData.PersUniID, uniData.PersTpPathMap[tpID], tpInst, &wg)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000827 dh.waitForCompletion(ctx, cancel, &wg, "TechProfReconcile") //wait for background process to finish
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000828 if err := dh.pOnuTP.GetTpProcessingErrorIndication(uniData.PersUniID, tpID); err != nil {
829 logger.Errorw(ctx, err.Error(), log.Fields{"device-id": dh.DeviceID})
Girish Gowdra50e56422021-06-01 16:46:04 -0700830 techProfInstLoadFailed = true // stop loading tp instance as soon as we hit failure
831 break outerLoop
Girish Gowdra041dcb32020-11-16 16:54:30 -0800832 }
mpagenko2dc896e2021-08-02 12:03:59 +0000833 } // for all TpPath entries for this UNI
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000834 if len(uniData.PersFlowParams) != 0 {
835 flowsFound = true
Holger Hildebrandt3a644642020-12-02 09:46:18 +0000836 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000837 pDevEntry.MutexPersOnuConfig.RLock() //set protection again for loop test on SOnuPersistentData
mpagenko2dc896e2021-08-02 12:03:59 +0000838 persMutexLock = true
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000839 } // for all UNI entries from SOnuPersistentData
840 if persMutexLock { // if loop was left with MutexPersOnuConfig still set
841 pDevEntry.MutexPersOnuConfig.RUnlock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000842 }
mpagenko2dc896e2021-08-02 12:03:59 +0000843
844 //had to move techProf/flow result evaluation into separate function due to SCA complexity limit
845 dh.updateReconcileStates(ctx, techProfsFound, techProfInstLoadFailed, flowsFound)
846}
847
848func (dh *deviceHandler) updateReconcileStates(ctx context.Context,
849 abTechProfsFound bool, abTechProfInstLoadFailed bool, abFlowsFound bool) {
850 if !abTechProfsFound {
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000851 logger.Debugw(ctx, "reconciling - no TPs have been stored before adapter restart - terminate reconcilement",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000852 log.Fields{"device-id": dh.DeviceID})
853 if !dh.IsSkipOnuConfigReconciling() {
854 dh.StopReconciling(ctx, true)
Holger Hildebrandt7e9de862021-03-26 14:01:49 +0000855 }
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000856 return
857 }
mpagenko2dc896e2021-08-02 12:03:59 +0000858 if abTechProfInstLoadFailed {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000859 dh.SetDeviceReason(cmn.DrTechProfileConfigDownloadFailed)
860 dh.StopReconciling(ctx, false)
Girish Gowdra50e56422021-06-01 16:46:04 -0700861 return
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000862 } else if dh.IsSkipOnuConfigReconciling() {
863 dh.SetDeviceReason(cmn.DrTechProfileConfigDownloadSuccess)
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000864 }
mpagenko2dc896e2021-08-02 12:03:59 +0000865 if !abFlowsFound {
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000866 logger.Debugw(ctx, "reconciling - no flows have been stored before adapter restart - terminate reconcilement",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000867 log.Fields{"device-id": dh.DeviceID})
868 if !dh.IsSkipOnuConfigReconciling() {
869 dh.StopReconciling(ctx, true)
Holger Hildebrandt7e9de862021-03-26 14:01:49 +0000870 }
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000871 }
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000872}
873
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000874func (dh *deviceHandler) ReconcileDeviceFlowConfig(ctx context.Context) {
875 logger.Debugw(ctx, "reconciling - trigger flow config", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000876
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000877 pDevEntry := dh.GetOnuDeviceEntry(ctx, true)
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000878 if pDevEntry == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000879 logger.Errorw(ctx, "No valid OnuDevice - aborting", log.Fields{"device-id": dh.DeviceID})
880 if !dh.IsSkipOnuConfigReconciling() {
881 dh.StopReconciling(ctx, false)
Holger Hildebrandt7e9de862021-03-26 14:01:49 +0000882 }
Holger Hildebrandtf41a1602020-08-19 09:52:50 +0000883 return
884 }
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000885
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000886 pDevEntry.MutexPersOnuConfig.RLock()
887 if len(pDevEntry.SOnuPersistentData.PersUniConfig) == 0 {
888 pDevEntry.MutexPersOnuConfig.RUnlock()
dbainbri4d3a0dc2020-12-02 00:33:42 +0000889 logger.Debugw(ctx, "reconciling - no uni-configs have been stored before adapter restart - terminate reconcilement",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000890 log.Fields{"device-id": dh.DeviceID})
891 if !dh.IsSkipOnuConfigReconciling() {
892 dh.StopReconciling(ctx, true)
Holger Hildebrandt7e9de862021-03-26 14:01:49 +0000893 }
Holger Hildebrandt3a644642020-12-02 09:46:18 +0000894 return
895 }
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000896 flowsFound := false
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000897 for _, uniData := range pDevEntry.SOnuPersistentData.PersUniConfig {
Holger Hildebrandt3a644642020-12-02 09:46:18 +0000898 //TODO: check for uni-port specific reconcilement in case of multi-uni-port-per-onu-support
899 if len(uniData.PersFlowParams) == 0 {
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000900 logger.Debugw(ctx, "reconciling - no flows stored for uniID",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000901 log.Fields{"uni-id": uniData.PersUniID, "device-id": dh.DeviceID})
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000902 continue
903 }
904 if len(uniData.PersTpPathMap) == 0 {
905 logger.Warnw(ctx, "reconciling - flows but no TPs stored for uniID",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000906 log.Fields{"uni-id": uniData.PersUniID, "device-id": dh.DeviceID})
Holger Hildebrandt7e9de862021-03-26 14:01:49 +0000907 // It doesn't make sense to configure any flows if no TPs are available
908 continue
Holger Hildebrandt3a644642020-12-02 09:46:18 +0000909 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000910 //release MutexPersOnuConfig before VlanConfig processing as otherwise the reception of
911 // OMCI frames may get completely stuck due to lock request within IncrementMibDataSync() at OMCI
mpagenko2dc896e2021-08-02 12:03:59 +0000912 // frame reception may also lock the complete OMCI reception processing based on mutexRxSchedMap
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000913 pDevEntry.MutexPersOnuConfig.RUnlock()
mpagenko2dc896e2021-08-02 12:03:59 +0000914
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000915 var uniPort *cmn.OnuUniPort
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000916 var exist bool
Mahir Gunyelcb128ae2021-10-06 09:42:05 -0700917 uniNo := platform.MkUniPortNum(ctx, dh.pOnuIndication.GetIntfId(), dh.pOnuIndication.GetOnuId(), uint32(uniData.PersUniID))
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000918 if uniPort, exist = dh.uniEntityMap[uniNo]; !exist {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000919 logger.Errorw(ctx, "reconciling - OnuUniPort data not found - terminate reconcilement",
920 log.Fields{"uniNo": uniNo, "device-id": dh.DeviceID})
921 if !dh.IsSkipOnuConfigReconciling() {
922 dh.StopReconciling(ctx, false)
Holger Hildebrandt7e9de862021-03-26 14:01:49 +0000923 }
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000924 return
925 }
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000926 flowsFound = true
Andrea Campanellaf66ac6e2021-05-24 17:09:20 +0200927 lastFlowToReconcile := false
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000928 flowsProcessed := 0
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000929 pDevEntry.SetReconcilingFlows(true)
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000930 for _, flowData := range uniData.PersFlowParams {
mpagenko2dc896e2021-08-02 12:03:59 +0000931 logger.Debugw(ctx, "reconciling - add flow with cookie slice", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000932 "device-id": dh.DeviceID, "uni-id": uniData.PersUniID, "cookies": flowData.CookieSlice})
Andrea Campanellaf66ac6e2021-05-24 17:09:20 +0200933 if flowsProcessed == len(uniData.PersFlowParams)-1 {
934 lastFlowToReconcile = true
935 }
mpagenko01e726e2020-10-23 09:45:29 +0000936 //the slice can be passed 'by value' here, - which internally passes its reference copy
mpagenko7d14de12021-07-27 08:31:56 +0000937 dh.lockVlanConfig.Lock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000938 if _, exist = dh.UniVlanConfigFsmMap[uniData.PersUniID]; exist {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000939 if err := dh.UniVlanConfigFsmMap[uniData.PersUniID].SetUniFlowParams(ctx, flowData.VlanRuleParams.TpID,
mpagenko01e726e2020-10-23 09:45:29 +0000940 flowData.CookieSlice, uint16(flowData.VlanRuleParams.MatchVid), uint16(flowData.VlanRuleParams.SetVid),
ozgecanetsia82b91a62021-05-21 18:54:49 +0300941 uint8(flowData.VlanRuleParams.SetPcp), lastFlowToReconcile, flowData.Meter); err != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000942 logger.Errorw(ctx, err.Error(), log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000943 }
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000944 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000945 if err := dh.createVlanFilterFsm(ctx, uniPort, flowData.VlanRuleParams.TpID, flowData.CookieSlice,
mpagenko01e726e2020-10-23 09:45:29 +0000946 uint16(flowData.VlanRuleParams.MatchVid), uint16(flowData.VlanRuleParams.SetVid),
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000947 uint8(flowData.VlanRuleParams.SetPcp), cmn.OmciVlanFilterAddDone, lastFlowToReconcile, flowData.Meter); err != nil {
948 logger.Errorw(ctx, err.Error(), log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000949 }
950 }
mpagenko7d14de12021-07-27 08:31:56 +0000951 dh.lockVlanConfig.Unlock()
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000952 flowsProcessed++
mpagenko2dc896e2021-08-02 12:03:59 +0000953 } //for all flows of this UNI
954 logger.Debugw(ctx, "reconciling - flows processed", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000955 "device-id": dh.DeviceID, "uni-id": uniData.PersUniID, "flowsProcessed": flowsProcessed,
956 "NumUniFlows": dh.UniVlanConfigFsmMap[uniData.PersUniID].NumUniFlows,
957 "ConfiguredUniFlow": dh.UniVlanConfigFsmMap[uniData.PersUniID].ConfiguredUniFlow})
Andrea Campanellaf66ac6e2021-05-24 17:09:20 +0200958 // this can't be used as global finished reconciling flag because
959 // assumes is getting called before the state machines for the last flow is completed,
960 // while this is not guaranteed.
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000961 //dh.SetReconcilingFlows(false)
962 pDevEntry.MutexPersOnuConfig.RLock() //set protection again for loop test on SOnuPersistentData
963 } // for all UNI entries from SOnuPersistentData
964 pDevEntry.MutexPersOnuConfig.RUnlock()
mpagenko2dc896e2021-08-02 12:03:59 +0000965
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000966 if !flowsFound {
967 logger.Debugw(ctx, "reconciling - no flows have been stored before adapter restart - terminate reconcilement",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000968 log.Fields{"device-id": dh.DeviceID})
969 if !dh.IsSkipOnuConfigReconciling() {
970 dh.StopReconciling(ctx, true)
Holger Hildebrandt7e9de862021-03-26 14:01:49 +0000971 }
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000972 return
973 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000974 if dh.IsSkipOnuConfigReconciling() {
975 dh.SetDeviceReason(cmn.DrOmciFlowsPushed)
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000976 }
977}
978
Holger Hildebrandt1b8f4ad2021-03-25 15:53:51 +0000979func (dh *deviceHandler) reconcileEnd(ctx context.Context) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000980 logger.Debugw(ctx, "reconciling - completed!", log.Fields{"device-id": dh.DeviceID})
981 dh.StopReconciling(ctx, true)
Holger Hildebrandt9ca8b132020-08-07 14:45:03 +0000982}
983
dbainbri4d3a0dc2020-12-02 00:33:42 +0000984func (dh *deviceHandler) deleteDevicePersistencyData(ctx context.Context) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000985 logger.Debugw(ctx, "delete device persistency data", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000986
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000987 pDevEntry := dh.GetOnuDeviceEntry(ctx, false)
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000988 if pDevEntry == nil {
mpagenko2418ab02020-11-12 12:58:06 +0000989 //IfDevEntry does not exist here, no problem - no persistent data should have been stored
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000990 logger.Debugw(ctx, "OnuDevice does not exist - nothing to delete", log.Fields{"device-id": dh.DeviceID})
mpagenko2418ab02020-11-12 12:58:06 +0000991 return nil
Holger Hildebrandt9ca8b132020-08-07 14:45:03 +0000992 }
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000993
994 // deadline context to ensure completion of background routines waited for
995 //20200721: 10s proved to be less in 8*8 ONU test on local vbox machine with debug, might be further adapted
Himani Chawlad96df182020-09-28 11:12:02 +0530996 deadline := time.Now().Add(dh.pOpenOnuAc.maxTimeoutInterAdapterComm) //allowed run time to finish before execution
dbainbri4d3a0dc2020-12-02 00:33:42 +0000997 dctx, cancel := context.WithDeadline(ctx, deadline)
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000998
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000999 pDevEntry.ResetKvProcessingErrorIndication()
Holger Hildebrandt47555e72020-09-21 11:07:24 +00001000
1001 var wg sync.WaitGroup
1002 wg.Add(1) // for the 1 go routine to finish
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001003 go pDevEntry.DeleteDataFromOnuKvStore(log.WithSpanFromContext(dctx, ctx), &wg)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001004 dh.waitForCompletion(ctx, cancel, &wg, "DeleteDevice") //wait for background process to finish
Holger Hildebrandt47555e72020-09-21 11:07:24 +00001005
Holger Hildebrandt9ca8b132020-08-07 14:45:03 +00001006 // TODO: further actions - stop metrics and FSMs, remove device ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001007 return pDevEntry.GetKvProcessingErrorIndication()
Holger Hildebrandt9ca8b132020-08-07 14:45:03 +00001008}
1009
mpagenko15ff4a52021-03-02 10:09:20 +00001010//func (dh *deviceHandler) rebootDevice(ctx context.Context, device *voltha.Device) error {
1011// before this change here return like this was used:
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001012// return fmt.Errorf("device-unreachable: %s, %s", dh.DeviceID, device.SerialNumber)
mpagenko15ff4a52021-03-02 10:09:20 +00001013//was and is called in background - error return does not make sense
1014func (dh *deviceHandler) rebootDevice(ctx context.Context, aCheckDeviceState bool, device *voltha.Device) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001015 logger.Infow(ctx, "reboot-device", log.Fields{"device-id": dh.DeviceID, "SerialNumber": dh.device.SerialNumber})
mpagenko15ff4a52021-03-02 10:09:20 +00001016 if aCheckDeviceState && device.ConnectStatus != voltha.ConnectStatus_REACHABLE {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001017 logger.Errorw(ctx, "device-unreachable", log.Fields{"device-id": device.Id, "SerialNumber": device.SerialNumber})
mpagenko15ff4a52021-03-02 10:09:20 +00001018 return
ozgecanetsiae11479f2020-07-06 09:44:47 +03001019 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001020 if err := dh.pOnuOmciDevice.Reboot(log.WithSpanFromContext(context.TODO(), ctx)); err != nil {
Himani Chawla4d908332020-08-31 12:30:20 +05301021 //TODO with VOL-3045/VOL-3046: return the error and stop further processing
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001022 logger.Errorw(ctx, "error-rebooting-device", log.Fields{"device-id": dh.DeviceID, "error": err})
mpagenko15ff4a52021-03-02 10:09:20 +00001023 return
Himani Chawla4d908332020-08-31 12:30:20 +05301024 }
mpagenko01e726e2020-10-23 09:45:29 +00001025
1026 //transfer the possibly modified logical uni port state
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001027 dh.DisableUniPortStateUpdate(ctx)
mpagenko01e726e2020-10-23 09:45:29 +00001028
dbainbri4d3a0dc2020-12-02 00:33:42 +00001029 logger.Debugw(ctx, "call DeviceStateUpdate upon reboot", log.Fields{"ConnectStatus": voltha.ConnectStatus_REACHABLE,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001030 "OperStatus": voltha.OperStatus_DISCOVERED, "device-id": dh.DeviceID})
khenaidoo7d3c5582021-08-11 18:09:44 -04001031 if err := dh.updateDeviceStateInCore(ctx, &ic.DeviceStateFilter{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001032 DeviceId: dh.DeviceID,
khenaidoo7d3c5582021-08-11 18:09:44 -04001033 ConnStatus: voltha.ConnectStatus_REACHABLE,
1034 OperStatus: voltha.OperStatus_DISCOVERED,
1035 }); err != nil {
Holger Hildebrandtf41a1602020-08-19 09:52:50 +00001036 //TODO with VOL-3045/VOL-3046: return the error and stop further processing
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001037 logger.Errorw(ctx, "error-updating-device-state", log.Fields{"device-id": dh.DeviceID, "error": err})
mpagenko15ff4a52021-03-02 10:09:20 +00001038 return
ozgecanetsiae11479f2020-07-06 09:44:47 +03001039 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001040 if err := dh.deviceReasonUpdate(ctx, cmn.DrRebooting, true); err != nil {
mpagenko15ff4a52021-03-02 10:09:20 +00001041 return
ozgecanetsiae11479f2020-07-06 09:44:47 +03001042 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001043 dh.SetReadyForOmciConfig(false)
mpagenko8b07c1b2020-11-26 10:36:31 +00001044 //no specific activity to synchronize any internal FSM to the 'rebooted' state is explicitly done here
1045 // the expectation ids for a real device, that it will be synced with the expected following 'down' indication
1046 // as BBSIM does not support this testing requires explicite disable/enable device calls in which sequence also
1047 // all other FSM's should be synchronized again
ozgecanetsiae11479f2020-07-06 09:44:47 +03001048}
1049
mpagenkoc8bba412021-01-15 15:38:44 +00001050//doOnuSwUpgrade initiates the SW download transfer to the ONU and on success activates the (inactive) image
mpagenko38662d02021-08-11 09:45:19 +00001051// used only for old - R2.7 style - upgrade API
mpagenko80622a52021-02-09 16:53:23 +00001052func (dh *deviceHandler) doOnuSwUpgrade(ctx context.Context, apImageDsc *voltha.ImageDownload,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001053 apDownloadManager *swupg.AdapterDownloadManager) error {
mpagenko80622a52021-02-09 16:53:23 +00001054 logger.Debugw(ctx, "onuSwUpgrade requested", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001055 "device-id": dh.DeviceID, "image-name": (*apImageDsc).Name})
mpagenko80622a52021-02-09 16:53:23 +00001056
1057 var err error
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001058 pDevEntry := dh.GetOnuDeviceEntry(ctx, true)
mpagenko15ff4a52021-03-02 10:09:20 +00001059 if pDevEntry == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001060 logger.Errorw(ctx, "start Onu SW upgrade rejected: no valid OnuDevice", log.Fields{"device-id": dh.DeviceID})
1061 return fmt.Errorf("start Onu SW upgrade rejected: no valid OnuDevice for device-id: %s", dh.DeviceID)
mpagenko15ff4a52021-03-02 10:09:20 +00001062 }
1063
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001064 if dh.IsReadyForOmciConfig() {
mpagenko15ff4a52021-03-02 10:09:20 +00001065 var inactiveImageID uint16
1066 if inactiveImageID, err = pDevEntry.GetInactiveImageMeID(ctx); err == nil {
1067 dh.lockUpgradeFsm.Lock()
1068 defer dh.lockUpgradeFsm.Unlock()
1069 if dh.pOnuUpradeFsm == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001070 err = dh.createOnuUpgradeFsm(ctx, pDevEntry, cmn.OmciOnuSwUpgradeDone)
mpagenko15ff4a52021-03-02 10:09:20 +00001071 if err == nil {
1072 if err = dh.pOnuUpradeFsm.SetDownloadParams(ctx, inactiveImageID, apImageDsc, apDownloadManager); err != nil {
1073 logger.Errorw(ctx, "onu upgrade fsm could not set parameters", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001074 "device-id": dh.DeviceID, "error": err})
mpagenko15ff4a52021-03-02 10:09:20 +00001075 }
1076 } else {
1077 logger.Errorw(ctx, "onu upgrade fsm could not be created", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001078 "device-id": dh.DeviceID, "error": err})
mpagenko80622a52021-02-09 16:53:23 +00001079 }
mpagenko15ff4a52021-03-02 10:09:20 +00001080 } else { //OnuSw upgrade already running - restart (with possible abort of running)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001081 logger.Debugw(ctx, "Onu SW upgrade already running - abort", log.Fields{"device-id": dh.DeviceID})
1082 dh.pOnuUpradeFsm.CancelProcessing(ctx, true, voltha.ImageState_CANCELLED_ON_REQUEST) //complete abort
1083 //no effort spent anymore for the old API to automatically cancel and restart the download
1084 // like done for the new API
1085 logger.Debugw(ctx, "Onu SW upgrade already running - abort", log.Fields{"device-id": dh.DeviceID})
mpagenko38662d02021-08-11 09:45:19 +00001086 dh.pOnuUpradeFsm.CancelProcessing(ctx, true, voltha.ImageState_CANCELLED_ON_REQUEST) //complete abort
1087 //no effort spent anymore for the old API to automatically cancel and restart the download
1088 // like done for the new API
mpagenko80622a52021-02-09 16:53:23 +00001089 }
mpagenko15ff4a52021-03-02 10:09:20 +00001090 } else {
1091 logger.Errorw(ctx, "start Onu SW upgrade rejected: no inactive image", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001092 "device-id": dh.DeviceID, "error": err})
mpagenko80622a52021-02-09 16:53:23 +00001093 }
1094 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001095 logger.Errorw(ctx, "start Onu SW upgrade rejected: no active OMCI connection", log.Fields{"device-id": dh.DeviceID})
1096 err = fmt.Errorf("start Onu SW upgrade rejected: no active OMCI connection for device-id: %s", dh.DeviceID)
mpagenko80622a52021-02-09 16:53:23 +00001097 }
1098 return err
mpagenkoc8bba412021-01-15 15:38:44 +00001099}
1100
mpagenkoc26d4c02021-05-06 14:27:57 +00001101//onuSwUpgradeAfterDownload initiates the SW download transfer to the ONU with activate and commit options
1102// after the OnuImage has been downloaded to the adapter, called in background
1103func (dh *deviceHandler) onuSwUpgradeAfterDownload(ctx context.Context, apImageRequest *voltha.DeviceImageDownloadRequest,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001104 apDownloadManager *swupg.FileDownloadManager, aImageIdentifier string) {
mpagenkoc26d4c02021-05-06 14:27:57 +00001105
1106 var err error
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001107 pDevEntry := dh.GetOnuDeviceEntry(ctx, true)
mpagenkoc26d4c02021-05-06 14:27:57 +00001108 if pDevEntry == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001109 logger.Errorw(ctx, "start Onu SW upgrade rejected: no valid OnuDevice", log.Fields{"device-id": dh.DeviceID})
mpagenkoc26d4c02021-05-06 14:27:57 +00001110 return
1111 }
1112
1113 var inactiveImageID uint16
1114 if inactiveImageID, err = pDevEntry.GetInactiveImageMeID(ctx); err == nil {
1115 logger.Debugw(ctx, "onuSwUpgrade requested", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001116 "device-id": dh.DeviceID, "image-version": apImageRequest.Image.Version, "to onu-image": inactiveImageID})
mpagenko38662d02021-08-11 09:45:19 +00001117
1118 dh.lockUpgradeFsm.RLock()
1119 lopOnuUpradeFsm := dh.pOnuUpradeFsm
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001120 //lockUpgradeFsm must be release before cancellation as this may implicitly request RemoveOnuUpgradeFsm()
mpagenko38662d02021-08-11 09:45:19 +00001121 dh.lockUpgradeFsm.RUnlock()
1122 if lopOnuUpradeFsm != nil {
1123 //OnuSw upgrade already running on this device (e.g. with activate/commit not yet set)
1124 // abort the current processing, running upgrades are always aborted by newer request
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001125 logger.Debugw(ctx, "Onu SW upgrade already running - abort previous activity", log.Fields{"device-id": dh.DeviceID})
mpagenko38662d02021-08-11 09:45:19 +00001126 //flush the remove upgradeFsmChan channel
1127 select {
1128 case <-dh.upgradeFsmChan:
1129 logger.Debug(ctx, "flushed-upgrade-fsm-channel")
1130 default:
mpagenkoc26d4c02021-05-06 14:27:57 +00001131 }
mpagenko38662d02021-08-11 09:45:19 +00001132 lopOnuUpradeFsm.CancelProcessing(ctx, true, voltha.ImageState_CANCELLED_ON_REQUEST) //complete abort
1133 select {
1134 case <-time.After(cTimeOutRemoveUpgrade * time.Second):
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001135 logger.Errorw(ctx, "could not remove Upgrade FSM in time, aborting", log.Fields{"device-id": dh.DeviceID})
mpagenko38662d02021-08-11 09:45:19 +00001136 //should not appear, can't proceed with new upgrade, perhaps operator can retry manually later
1137 return
1138 case <-dh.upgradeFsmChan:
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001139 logger.Debugw(ctx, "recent Upgrade FSM removed, proceed with new request", log.Fields{"device-id": dh.DeviceID})
mpagenko38662d02021-08-11 09:45:19 +00001140 }
mpagenkoc26d4c02021-05-06 14:27:57 +00001141 }
mpagenko38662d02021-08-11 09:45:19 +00001142
1143 //here it can be assumed that no running upgrade processing exists (anymore)
1144 //OmciOnuSwUpgradeDone could be used to create some Kafka event with information on upgrade completion,
1145 // but none yet defined
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001146 err = dh.createOnuUpgradeFsm(ctx, pDevEntry, cmn.OmciOnuSwUpgradeDone)
mpagenko38662d02021-08-11 09:45:19 +00001147 if err == nil {
1148 if err = dh.pOnuUpradeFsm.SetDownloadParamsAfterDownload(ctx, inactiveImageID,
1149 apImageRequest, apDownloadManager, aImageIdentifier); err != nil {
1150 logger.Errorw(ctx, "onu upgrade fsm could not set parameters", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001151 "device-id": dh.DeviceID, "error": err})
mpagenkoc26d4c02021-05-06 14:27:57 +00001152 return
1153 }
mpagenko38662d02021-08-11 09:45:19 +00001154 } else {
1155 logger.Errorw(ctx, "onu upgrade fsm could not be created", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001156 "device-id": dh.DeviceID, "error": err})
mpagenkoc26d4c02021-05-06 14:27:57 +00001157 }
1158 return
1159 }
1160 logger.Errorw(ctx, "start Onu SW upgrade rejected: no inactive image", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001161 "device-id": dh.DeviceID, "error": err})
mpagenkoc26d4c02021-05-06 14:27:57 +00001162}
1163
1164//onuSwActivateRequest ensures activation of the requested image with commit options
mpagenko183647c2021-06-08 15:25:04 +00001165func (dh *deviceHandler) onuSwActivateRequest(ctx context.Context,
1166 aVersion string, aCommitRequest bool) (*voltha.ImageState, error) {
mpagenkoc26d4c02021-05-06 14:27:57 +00001167 var err error
1168 //SW activation for the ONU image may have two use cases, one of them is selected here according to following prioritization:
1169 // 1.) activation of the image for a started upgrade process (in case the running upgrade runs on the requested image)
1170 // 2.) activation of the inactive image
1171
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001172 pDevEntry := dh.GetOnuDeviceEntry(ctx, true)
mpagenkoc26d4c02021-05-06 14:27:57 +00001173 if pDevEntry == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001174 logger.Errorw(ctx, "Onu image activation rejected: no valid OnuDevice", log.Fields{"device-id": dh.DeviceID})
1175 return nil, fmt.Errorf("no valid OnuDevice for device-id: %s", dh.DeviceID)
mpagenkoc26d4c02021-05-06 14:27:57 +00001176 }
1177 dh.lockUpgradeFsm.RLock()
1178 if dh.pOnuUpradeFsm != nil {
1179 dh.lockUpgradeFsm.RUnlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001180 onuVolthaDevice, getErr := dh.getDeviceFromCore(ctx, dh.DeviceID)
mpagenkoc26d4c02021-05-06 14:27:57 +00001181 if getErr != nil || onuVolthaDevice == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001182 logger.Errorw(ctx, "Failed to fetch Onu device for image activation", log.Fields{"device-id": dh.DeviceID, "err": getErr})
1183 return nil, fmt.Errorf("could not fetch device for device-id: %s", dh.DeviceID)
mpagenkoc26d4c02021-05-06 14:27:57 +00001184 }
1185 // use the OnuVendor identification from this device for the internal unique name
1186 imageIdentifier := onuVolthaDevice.VendorId + aVersion //head on vendor ID of the ONU
mpagenko38662d02021-08-11 09:45:19 +00001187 // 1.) check a started upgrade process and relay the activation request to it
mpagenkoc26d4c02021-05-06 14:27:57 +00001188 if err = dh.pOnuUpradeFsm.SetActivationParamsRunning(ctx, imageIdentifier, aCommitRequest); err != nil {
mpagenko183647c2021-06-08 15:25:04 +00001189 //if some ONU upgrade is ongoing we do not accept some explicit ONU image-version related activation
mpagenkoc26d4c02021-05-06 14:27:57 +00001190 logger.Errorw(ctx, "onu upgrade fsm did not accept activation while running", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001191 "device-id": dh.DeviceID, "error": err})
1192 return nil, fmt.Errorf("activation not accepted for this version for device-id: %s", dh.DeviceID)
mpagenkoc26d4c02021-05-06 14:27:57 +00001193 }
mpagenko183647c2021-06-08 15:25:04 +00001194 logger.Debugw(ctx, "image activation acknowledged by onu upgrade processing", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001195 "device-id": dh.DeviceID, "image-id": imageIdentifier})
mpagenko38662d02021-08-11 09:45:19 +00001196 pImageStates := dh.pOnuUpradeFsm.GetImageStates(ctx, "", aVersion)
mpagenko183647c2021-06-08 15:25:04 +00001197 return pImageStates, nil
mpagenkoc26d4c02021-05-06 14:27:57 +00001198 } //else
1199 dh.lockUpgradeFsm.RUnlock()
1200
1201 // 2.) check if requested image-version equals the inactive one and start its activation
1202 // (image version is not [yet] checked - would be possible, but with increased effort ...)
1203 var inactiveImageID uint16
1204 if inactiveImageID, err = pDevEntry.GetInactiveImageMeID(ctx); err != nil || inactiveImageID > 1 {
1205 logger.Errorw(ctx, "get inactive image failed", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001206 "device-id": dh.DeviceID, "err": err, "image-id": inactiveImageID})
1207 return nil, fmt.Errorf("no valid inactive image found for device-id: %s", dh.DeviceID)
mpagenkoc26d4c02021-05-06 14:27:57 +00001208 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001209 err = dh.createOnuUpgradeFsm(ctx, pDevEntry, cmn.OmciOnuSwUpgradeDone)
mpagenkoc26d4c02021-05-06 14:27:57 +00001210 if err == nil {
1211 if err = dh.pOnuUpradeFsm.SetActivationParamsStart(ctx, aVersion,
1212 inactiveImageID, aCommitRequest); err != nil {
1213 logger.Errorw(ctx, "onu upgrade fsm did not accept activation to start", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001214 "device-id": dh.DeviceID, "error": err})
1215 return nil, fmt.Errorf("activation to start from scratch not accepted for device-id: %s", dh.DeviceID)
mpagenkoc26d4c02021-05-06 14:27:57 +00001216 }
1217 logger.Debugw(ctx, "inactive image activation acknowledged by onu upgrade", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001218 "device-id": dh.DeviceID, "image-version": aVersion})
mpagenko38662d02021-08-11 09:45:19 +00001219 pImageStates := dh.pOnuUpradeFsm.GetImageStates(ctx, "", aVersion)
mpagenko183647c2021-06-08 15:25:04 +00001220 return pImageStates, nil
mpagenkoc26d4c02021-05-06 14:27:57 +00001221 } //else
1222 logger.Errorw(ctx, "onu upgrade fsm could not be created", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001223 "device-id": dh.DeviceID, "error": err})
1224 return nil, fmt.Errorf("could not start upgradeFsm for device-id: %s", dh.DeviceID)
mpagenkoc26d4c02021-05-06 14:27:57 +00001225}
1226
1227//onuSwCommitRequest ensures commitment of the requested image
mpagenko183647c2021-06-08 15:25:04 +00001228func (dh *deviceHandler) onuSwCommitRequest(ctx context.Context,
1229 aVersion string) (*voltha.ImageState, error) {
mpagenkoc26d4c02021-05-06 14:27:57 +00001230 var err error
1231 //SW commitment for the ONU image may have two use cases, one of them is selected here according to following prioritization:
1232 // 1.) commitment of the image for a started upgrade process (in case the running upgrade runs on the requested image)
1233 // 2.) commitment of the active image
1234
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001235 pDevEntry := dh.GetOnuDeviceEntry(ctx, true)
mpagenkoc26d4c02021-05-06 14:27:57 +00001236 if pDevEntry == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001237 logger.Errorw(ctx, "Onu image commitment rejected: no valid OnuDevice", log.Fields{"device-id": dh.DeviceID})
1238 return nil, fmt.Errorf("no valid OnuDevice for device-id: %s", dh.DeviceID)
mpagenkoc26d4c02021-05-06 14:27:57 +00001239 }
1240 dh.lockUpgradeFsm.RLock()
1241 if dh.pOnuUpradeFsm != nil {
1242 dh.lockUpgradeFsm.RUnlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001243 onuVolthaDevice, getErr := dh.getDeviceFromCore(ctx, dh.DeviceID)
mpagenkoc26d4c02021-05-06 14:27:57 +00001244 if getErr != nil || onuVolthaDevice == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001245 logger.Errorw(ctx, "Failed to fetch Onu device for image commitment", log.Fields{"device-id": dh.DeviceID, "err": getErr})
1246 return nil, fmt.Errorf("could not fetch device for device-id: %s", dh.DeviceID)
mpagenkoc26d4c02021-05-06 14:27:57 +00001247 }
1248 // use the OnuVendor identification from this device for the internal unique name
1249 imageIdentifier := onuVolthaDevice.VendorId + aVersion //head on vendor ID of the ONU
mpagenko38662d02021-08-11 09:45:19 +00001250 // 1.) check a started upgrade process and relay the commitment request to it
1251 // the running upgrade may be based either on the imageIdentifier (started from download)
1252 // or on the imageVersion (started from pure activation)
1253 if err = dh.pOnuUpradeFsm.SetCommitmentParamsRunning(ctx, imageIdentifier, aVersion); err != nil {
1254 //if some ONU upgrade is ongoing we do not accept some explicit different ONU image-version related commitment
mpagenkoc26d4c02021-05-06 14:27:57 +00001255 logger.Errorw(ctx, "onu upgrade fsm did not accept commitment while running", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001256 "device-id": dh.DeviceID, "error": err})
1257 return nil, fmt.Errorf("commitment not accepted for this version for device-id: %s", dh.DeviceID)
mpagenkoc26d4c02021-05-06 14:27:57 +00001258 }
mpagenko183647c2021-06-08 15:25:04 +00001259 logger.Debugw(ctx, "image commitment acknowledged by onu upgrade processing", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001260 "device-id": dh.DeviceID, "image-id": imageIdentifier})
mpagenko38662d02021-08-11 09:45:19 +00001261 pImageStates := dh.pOnuUpradeFsm.GetImageStates(ctx, "", aVersion)
mpagenko183647c2021-06-08 15:25:04 +00001262 return pImageStates, nil
mpagenkoc26d4c02021-05-06 14:27:57 +00001263 } //else
1264 dh.lockUpgradeFsm.RUnlock()
1265
mpagenko183647c2021-06-08 15:25:04 +00001266 // 2.) use the active image to directly commit
mpagenkoc26d4c02021-05-06 14:27:57 +00001267 var activeImageID uint16
1268 if activeImageID, err = pDevEntry.GetActiveImageMeID(ctx); err != nil || activeImageID > 1 {
1269 logger.Errorw(ctx, "get active image failed", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001270 "device-id": dh.DeviceID, "err": err, "image-id": activeImageID})
1271 return nil, fmt.Errorf("no valid active image found for device-id: %s", dh.DeviceID)
mpagenkoc26d4c02021-05-06 14:27:57 +00001272 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001273 err = dh.createOnuUpgradeFsm(ctx, pDevEntry, cmn.OmciOnuSwUpgradeDone)
mpagenkoc26d4c02021-05-06 14:27:57 +00001274 if err == nil {
1275 if err = dh.pOnuUpradeFsm.SetCommitmentParamsStart(ctx, aVersion, activeImageID); err != nil {
1276 logger.Errorw(ctx, "onu upgrade fsm did not accept commitment to start", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001277 "device-id": dh.DeviceID, "error": err})
1278 return nil, fmt.Errorf("commitment to start from scratch not accepted for device-id: %s", dh.DeviceID)
mpagenkoc26d4c02021-05-06 14:27:57 +00001279 }
1280 logger.Debugw(ctx, "active image commitment acknowledged by onu upgrade", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001281 "device-id": dh.DeviceID, "image-version": aVersion})
mpagenko38662d02021-08-11 09:45:19 +00001282 pImageStates := dh.pOnuUpradeFsm.GetImageStates(ctx, "", aVersion)
mpagenko183647c2021-06-08 15:25:04 +00001283 return pImageStates, nil
mpagenkoc26d4c02021-05-06 14:27:57 +00001284 } //else
1285 logger.Errorw(ctx, "onu upgrade fsm could not be created", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001286 "device-id": dh.DeviceID, "error": err})
1287 return nil, fmt.Errorf("could not start upgradeFsm for device-id: %s", dh.DeviceID)
mpagenkoc26d4c02021-05-06 14:27:57 +00001288}
1289
mpagenkoaa3afe92021-05-21 16:20:58 +00001290func (dh *deviceHandler) requestOnuSwUpgradeState(ctx context.Context, aImageIdentifier string,
mpagenko38662d02021-08-11 09:45:19 +00001291 aVersion string) *voltha.ImageState {
1292 var pImageState *voltha.ImageState
mpagenkoaa3afe92021-05-21 16:20:58 +00001293 dh.lockUpgradeFsm.RLock()
mpagenko38662d02021-08-11 09:45:19 +00001294 defer dh.lockUpgradeFsm.RUnlock()
mpagenkoaa3afe92021-05-21 16:20:58 +00001295 if dh.pOnuUpradeFsm != nil {
mpagenko38662d02021-08-11 09:45:19 +00001296 pImageState = dh.pOnuUpradeFsm.GetImageStates(ctx, aImageIdentifier, aVersion)
1297 } else { //use the last stored ImageState (if the requested Imageversion coincides)
1298 if aVersion == dh.pLastUpgradeImageState.Version {
1299 pImageState = dh.pLastUpgradeImageState
1300 } else { //state request for an image version different from last processed image version
1301 pImageState = &voltha.ImageState{
1302 Version: aVersion,
1303 //we cannot state something concerning this version
1304 DownloadState: voltha.ImageState_DOWNLOAD_UNKNOWN,
1305 Reason: voltha.ImageState_NO_ERROR,
1306 ImageState: voltha.ImageState_IMAGE_UNKNOWN,
1307 }
mpagenkoaa3afe92021-05-21 16:20:58 +00001308 }
1309 }
mpagenko38662d02021-08-11 09:45:19 +00001310 return pImageState
mpagenkoaa3afe92021-05-21 16:20:58 +00001311}
1312
1313func (dh *deviceHandler) cancelOnuSwUpgrade(ctx context.Context, aImageIdentifier string,
1314 aVersion string, pDeviceImageState *voltha.DeviceImageState) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001315 pDeviceImageState.DeviceId = dh.DeviceID
mpagenko7455fd42021-06-10 16:25:55 +00001316 pDeviceImageState.ImageState.Version = aVersion
mpagenkoaa3afe92021-05-21 16:20:58 +00001317 dh.lockUpgradeFsm.RLock()
1318 if dh.pOnuUpradeFsm != nil {
mpagenko45586762021-10-01 08:30:22 +00001319 dh.lockUpgradeFsm.RUnlock()
1320 // so then we cancel the upgrade operation
1321 // but before we still request the actual upgrade states (which should not change with the cancellation)
1322 pImageState := dh.pOnuUpradeFsm.GetImageStates(ctx, aImageIdentifier, aVersion)
1323 pDeviceImageState.ImageState.DownloadState = pImageState.DownloadState
1324 pDeviceImageState.ImageState.Reason = voltha.ImageState_CANCELLED_ON_REQUEST
1325 pDeviceImageState.ImageState.ImageState = pImageState.ImageState
1326 if pImageState.DownloadState != voltha.ImageState_DOWNLOAD_UNKNOWN {
1327 //so here the imageIdentifier or version equals to what is used in the upgrade FSM
mpagenko38662d02021-08-11 09:45:19 +00001328 dh.pOnuUpradeFsm.CancelProcessing(ctx, true, voltha.ImageState_CANCELLED_ON_REQUEST) //complete abort
mpagenko45586762021-10-01 08:30:22 +00001329 } //nothing to cancel (upgrade FSM for different image stays alive)
mpagenkoaa3afe92021-05-21 16:20:58 +00001330 } else {
mpagenko45586762021-10-01 08:30:22 +00001331 dh.lockUpgradeFsm.RUnlock()
mpagenko38662d02021-08-11 09:45:19 +00001332 // if no upgrade is ongoing, nothing is canceled and accordingly the states of the requested image are unknown
1333 // reset also the dh handler LastUpgradeImageState (not relevant anymore/cleared)
1334 (*dh.pLastUpgradeImageState).DownloadState = voltha.ImageState_DOWNLOAD_UNKNOWN
1335 (*dh.pLastUpgradeImageState).Reason = voltha.ImageState_NO_ERROR
1336 (*dh.pLastUpgradeImageState).ImageState = voltha.ImageState_IMAGE_UNKNOWN
1337 (*dh.pLastUpgradeImageState).Version = "" //reset to 'no (relevant) upgrade done' (like initial state)
mpagenkoaa3afe92021-05-21 16:20:58 +00001338 pDeviceImageState.ImageState.DownloadState = voltha.ImageState_DOWNLOAD_UNKNOWN
1339 pDeviceImageState.ImageState.Reason = voltha.ImageState_NO_ERROR
mpagenko38662d02021-08-11 09:45:19 +00001340 pDeviceImageState.ImageState.ImageState = voltha.ImageState_IMAGE_UNKNOWN
1341 //an abort request to a not active upgrade processing can be used to reset the device upgrade states completely
mpagenkoaa3afe92021-05-21 16:20:58 +00001342 }
1343}
1344
Holger Hildebrandtfb402a62021-05-26 14:40:49 +00001345func (dh *deviceHandler) getOnuImages(ctx context.Context) (*voltha.OnuImages, error) {
1346
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001347 var onuImageStatus *swupg.OnuImageStatus
Holger Hildebrandtfb402a62021-05-26 14:40:49 +00001348
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001349 pDevEntry := dh.GetOnuDeviceEntry(ctx, false)
Holger Hildebrandtfb402a62021-05-26 14:40:49 +00001350 if pDevEntry != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001351 onuImageStatus = swupg.NewOnuImageStatus(dh, pDevEntry)
1352 pDevEntry.MutexOnuImageStatus.Lock()
1353 pDevEntry.POnuImageStatus = onuImageStatus
1354 pDevEntry.MutexOnuImageStatus.Unlock()
Holger Hildebrandtfb402a62021-05-26 14:40:49 +00001355
1356 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001357 logger.Errorw(ctx, "No valid OnuDevice - aborting", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandtfb402a62021-05-26 14:40:49 +00001358 return nil, fmt.Errorf("no-valid-OnuDevice-aborting")
1359 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001360 images, err := onuImageStatus.GetOnuImageStatus(ctx)
1361 pDevEntry.MutexOnuImageStatus.Lock()
1362 pDevEntry.POnuImageStatus = nil
1363 pDevEntry.MutexOnuImageStatus.Unlock()
Holger Hildebrandtfb402a62021-05-26 14:40:49 +00001364 return images, err
1365}
1366
Himani Chawla6d2ae152020-09-02 13:11:20 +05301367// deviceHandler methods that implement the adapters interface requests## end #########
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001368// #####################################################################################
1369
1370// ################ to be updated acc. needs of ONU Device ########################
Himani Chawla6d2ae152020-09-02 13:11:20 +05301371// deviceHandler StateMachine related state transition methods ##### begin #########
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001372
dbainbri4d3a0dc2020-12-02 00:33:42 +00001373func (dh *deviceHandler) logStateChange(ctx context.Context, e *fsm.Event) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001374 logger.Debugw(ctx, "Device FSM: ", log.Fields{"event name": string(e.Event), "src state": string(e.Src), "dst state": string(e.Dst), "device-id": dh.DeviceID})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001375}
1376
1377// doStateInit provides the device update to the core
dbainbri4d3a0dc2020-12-02 00:33:42 +00001378func (dh *deviceHandler) doStateInit(ctx context.Context, e *fsm.Event) {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001379
dbainbri4d3a0dc2020-12-02 00:33:42 +00001380 logger.Debug(ctx, "doStateInit-started")
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001381 var err error
1382
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001383 // populate what we know. rest comes later after mib sync
1384 dh.device.Root = false
1385 dh.device.Vendor = "OpenONU"
1386 dh.device.Model = "go"
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001387 dh.device.Reason = cmn.DeviceReasonMap[cmn.DrActivatingOnu]
1388 dh.SetDeviceReason(cmn.DrActivatingOnu)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001389
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001390 dh.logicalDeviceID = dh.DeviceID // really needed - what for ??? //TODO!!!
Holger Hildebrandtf41a1602020-08-19 09:52:50 +00001391
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001392 if !dh.IsReconciling() {
1393 logger.Infow(ctx, "DeviceUpdate", log.Fields{"deviceReason": dh.device.Reason, "device-id": dh.DeviceID})
khenaidoo7d3c5582021-08-11 18:09:44 -04001394 if err := dh.updateDeviceInCore(ctx, dh.device); err != nil {
1395 logger.Errorw(ctx, "device-update-failed", log.Fields{"device-id": dh.device.Id, "error": err})
1396 }
Himani Chawlac07fda02020-12-09 16:21:21 +05301397 //TODO Need to Update Device Reason To CORE as part of device update userstory
Holger Hildebrandtf41a1602020-08-19 09:52:50 +00001398 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001399 logger.Debugw(ctx, "reconciling - don't notify core about DeviceUpdate",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001400 log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandtf41a1602020-08-19 09:52:50 +00001401 }
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001402
Himani Chawla4d908332020-08-31 12:30:20 +05301403 dh.parentID = dh.device.ParentId
Holger Hildebrandt24d51952020-05-04 14:03:42 +00001404 dh.ponPortNumber = dh.device.ParentPortNo
1405
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001406 // store proxy parameters for later communication - assumption: invariant, else they have to be requested dynamically!!
1407 dh.ProxyAddressID = dh.device.ProxyAddress.GetDeviceId()
1408 dh.ProxyAddressType = dh.device.ProxyAddress.GetDeviceType()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001409 logger.Debugw(ctx, "device-updated", log.Fields{"device-id": dh.DeviceID, "proxyAddressID": dh.ProxyAddressID,
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001410 "proxyAddressType": dh.ProxyAddressType, "SNR": dh.device.SerialNumber,
Himani Chawla4d908332020-08-31 12:30:20 +05301411 "ParentId": dh.parentID, "ParentPortNo": dh.ponPortNumber})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001412
1413 /*
1414 self._pon = PonPort.create(self, self._pon_port_number)
1415 self._pon.add_peer(self.parent_id, self._pon_port_number)
1416 self.logger.debug('adding-pon-port-to-agent',
1417 type=self._pon.get_port().type,
1418 admin_state=self._pon.get_port().admin_state,
1419 oper_status=self._pon.get_port().oper_status,
1420 )
1421 */
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001422 if !dh.IsReconciling() {
1423 logger.Debugw(ctx, "adding-pon-port", log.Fields{"device-id": dh.DeviceID, "ponPortNo": dh.ponPortNumber})
Holger Hildebrandtf41a1602020-08-19 09:52:50 +00001424 var ponPortNo uint32 = 1
1425 if dh.ponPortNumber != 0 {
1426 ponPortNo = dh.ponPortNumber
1427 }
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001428
Holger Hildebrandtf41a1602020-08-19 09:52:50 +00001429 pPonPort := &voltha.Port{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001430 DeviceId: dh.DeviceID,
Holger Hildebrandtf41a1602020-08-19 09:52:50 +00001431 PortNo: ponPortNo,
1432 Label: fmt.Sprintf("pon-%d", ponPortNo),
1433 Type: voltha.Port_PON_ONU,
1434 OperStatus: voltha.OperStatus_ACTIVE,
Himani Chawla4d908332020-08-31 12:30:20 +05301435 Peers: []*voltha.Port_PeerPort{{DeviceId: dh.parentID, // Peer device is OLT
Holger Hildebrandtf41a1602020-08-19 09:52:50 +00001436 PortNo: ponPortNo}}, // Peer port is parent's port number
1437 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001438 if err = dh.CreatePortInCore(ctx, pPonPort); err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001439 logger.Fatalf(ctx, "Device FSM: PortCreated-failed-%s", err)
Holger Hildebrandtf41a1602020-08-19 09:52:50 +00001440 e.Cancel(err)
1441 return
1442 }
1443 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001444 logger.Debugw(ctx, "reconciling - pon-port already added", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001445 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001446 logger.Debug(ctx, "doStateInit-done")
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001447}
1448
1449// postInit setups the DeviceEntry for the conerned device
dbainbri4d3a0dc2020-12-02 00:33:42 +00001450func (dh *deviceHandler) postInit(ctx context.Context, e *fsm.Event) {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001451
dbainbri4d3a0dc2020-12-02 00:33:42 +00001452 logger.Debug(ctx, "postInit-started")
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001453 var err error
1454 /*
1455 dh.Client = oop.NewOpenoltClient(dh.clientCon)
1456 dh.pTransitionMap.Handle(ctx, GrpcConnected)
1457 return nil
1458 */
dbainbri4d3a0dc2020-12-02 00:33:42 +00001459 if err = dh.addOnuDeviceEntry(log.WithSpanFromContext(context.TODO(), ctx)); err != nil {
1460 logger.Fatalf(ctx, "Device FSM: addOnuDeviceEntry-failed-%s", err)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001461 e.Cancel(err)
1462 return
1463 }
1464
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001465 if dh.IsReconciling() {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001466 go dh.reconcileDeviceOnuInd(ctx)
Holger Hildebrandtf41a1602020-08-19 09:52:50 +00001467 // reconcilement will be continued after mib download is done
1468 }
Girish Gowdrae09a6202021-01-12 18:10:59 -08001469
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001470 /*
1471 ############################################################################
1472 # Setup Alarm handler
1473 self.events = AdapterEvents(self.core_proxy, device.id, self.logical_device_id,
1474 device.serial_number)
1475 ############################################################################
1476 # Setup PM configuration for this device
1477 # Pass in ONU specific options
1478 kwargs = {
1479 OnuPmMetrics.DEFAULT_FREQUENCY_KEY: OnuPmMetrics.DEFAULT_ONU_COLLECTION_FREQUENCY,
1480 'heartbeat': self.heartbeat,
1481 OnuOmciPmMetrics.OMCI_DEV_KEY: self._onu_omci_device
1482 }
1483 self.logger.debug('create-pm-metrics', device_id=device.id, serial_number=device.serial_number)
1484 self._pm_metrics = OnuPmMetrics(self.events, self.core_proxy, self.device_id,
1485 self.logical_device_id, device.serial_number,
1486 grouped=True, freq_override=False, **kwargs)
1487 pm_config = self._pm_metrics.make_proto()
1488 self._onu_omci_device.set_pm_config(self._pm_metrics.omci_pm.openomci_interval_pm)
1489 self.logger.info("initial-pm-config", device_id=device.id, serial_number=device.serial_number)
1490 yield self.core_proxy.device_pm_config_update(pm_config, init=True)
1491
1492 # Note, ONU ID and UNI intf set in add_uni_port method
1493 self._onu_omci_device.alarm_synchronizer.set_alarm_params(mgr=self.events,
1494 ani_ports=[self._pon])
1495
1496 # Code to Run OMCI Test Action
1497 kwargs_omci_test_action = {
1498 OmciTestRequest.DEFAULT_FREQUENCY_KEY:
1499 OmciTestRequest.DEFAULT_COLLECTION_FREQUENCY
1500 }
1501 serial_number = device.serial_number
1502 self._test_request = OmciTestRequest(self.core_proxy,
1503 self.omci_agent, self.device_id,
1504 AniG, serial_number,
1505 self.logical_device_id,
1506 exclusive=False,
1507 **kwargs_omci_test_action)
1508
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001509 self.Enabled = True
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001510 else:
1511 self.logger.info('onu-already-activated')
1512 */
Girish Gowdrae09a6202021-01-12 18:10:59 -08001513
dbainbri4d3a0dc2020-12-02 00:33:42 +00001514 logger.Debug(ctx, "postInit-done")
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001515}
1516
1517// doStateConnected get the device info and update to voltha core
1518// for comparison of the original method (not that easy to uncomment): compare here:
1519// voltha-openolt-adapter/adaptercore/device_handler.go
1520// -> this one obviously initiates all communication interfaces of the device ...?
dbainbri4d3a0dc2020-12-02 00:33:42 +00001521func (dh *deviceHandler) doStateConnected(ctx context.Context, e *fsm.Event) {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001522
dbainbri4d3a0dc2020-12-02 00:33:42 +00001523 logger.Debug(ctx, "doStateConnected-started")
Himani Chawla4d908332020-08-31 12:30:20 +05301524 err := errors.New("device FSM: function not implemented yet")
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001525 e.Cancel(err)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001526 logger.Debug(ctx, "doStateConnected-done")
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001527}
1528
1529// doStateUp handle the onu up indication and update to voltha core
dbainbri4d3a0dc2020-12-02 00:33:42 +00001530func (dh *deviceHandler) doStateUp(ctx context.Context, e *fsm.Event) {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001531
dbainbri4d3a0dc2020-12-02 00:33:42 +00001532 logger.Debug(ctx, "doStateUp-started")
Himani Chawla4d908332020-08-31 12:30:20 +05301533 err := errors.New("device FSM: function not implemented yet")
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001534 e.Cancel(err)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001535 logger.Debug(ctx, "doStateUp-done")
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001536
1537 /*
1538 // Synchronous call to update device state - this method is run in its own go routine
1539 if err := dh.coreProxy.DeviceStateUpdate(ctx, dh.device.Id, voltha.ConnectStatus_REACHABLE,
1540 voltha.OperStatus_ACTIVE); err != nil {
mpagenko01e726e2020-10-23 09:45:29 +00001541 logger.Errorw("Failed to update device with OLT UP indication", log.Fields{"device-id": dh.device.Id, "error": err})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001542 return err
1543 }
1544 return nil
1545 */
1546}
1547
1548// doStateDown handle the onu down indication
dbainbri4d3a0dc2020-12-02 00:33:42 +00001549func (dh *deviceHandler) doStateDown(ctx context.Context, e *fsm.Event) {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001550
dbainbri4d3a0dc2020-12-02 00:33:42 +00001551 logger.Debug(ctx, "doStateDown-started")
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001552 var err error
1553
Holger Hildebrandt24d51952020-05-04 14:03:42 +00001554 device := dh.device
1555 if device == nil {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001556 /*TODO: needs to handle error scenarios */
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001557 logger.Errorw(ctx, "Failed to fetch handler device", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001558 e.Cancel(err)
1559 return
1560 }
1561
1562 cloned := proto.Clone(device).(*voltha.Device)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001563 logger.Debugw(ctx, "do-state-down", log.Fields{"ClonedDeviceID": cloned.Id})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001564 /*
1565 // Update the all ports state on that device to disable
1566 if er := dh.coreProxy.PortsStateUpdate(ctx, cloned.Id, voltha.OperStatus_UNKNOWN); er != nil {
mpagenko01e726e2020-10-23 09:45:29 +00001567 logger.Errorw("updating-ports-failed", log.Fields{"device-id": device.Id, "error": er})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001568 return er
1569 }
1570
1571 //Update the device oper state and connection status
1572 cloned.OperStatus = voltha.OperStatus_UNKNOWN
1573 cloned.ConnectStatus = common.ConnectStatus_UNREACHABLE
1574 dh.device = cloned
1575
1576 if er := dh.coreProxy.DeviceStateUpdate(ctx, cloned.Id, cloned.ConnectStatus, cloned.OperStatus); er != nil {
mpagenko01e726e2020-10-23 09:45:29 +00001577 logger.Errorw("error-updating-device-state", log.Fields{"device-id": device.Id, "error": er})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001578 return er
1579 }
1580
1581 //get the child device for the parent device
1582 onuDevices, err := dh.coreProxy.GetChildDevices(ctx, dh.device.Id)
1583 if err != nil {
mpagenko01e726e2020-10-23 09:45:29 +00001584 logger.Errorw("failed to get child devices information", log.Fields{"device-id": dh.device.Id, "error": err})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001585 return err
1586 }
1587 for _, onuDevice := range onuDevices.Items {
1588
1589 // Update onu state as down in onu adapter
1590 onuInd := oop.OnuIndication{}
1591 onuInd.OperState = "down"
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001592 er := dh.adapterProxy.SendInterAdapterMessage(ctx, &onuInd, ic.InterAdapterMessageType_ONU_IND_REQUEST,
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001593 "openolt", onuDevice.Type, onuDevice.Id, onuDevice.ProxyAddress.DeviceId, "")
1594 if er != nil {
1595 logger.Errorw("Failed to send inter-adapter-message", log.Fields{"OnuInd": onuInd,
mpagenko01e726e2020-10-23 09:45:29 +00001596 "From Adapter": "openolt", "DevieType": onuDevice.Type, "device-id": onuDevice.Id})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001597 //Do not return here and continue to process other ONUs
1598 }
1599 }
1600 // * Discovered ONUs entries need to be cleared , since after OLT
1601 // is up, it starts sending discovery indications again* /
1602 dh.discOnus = sync.Map{}
mpagenko01e726e2020-10-23 09:45:29 +00001603 logger.Debugw("do-state-down-end", log.Fields{"device-id": device.Id})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001604 return nil
1605 */
Himani Chawla4d908332020-08-31 12:30:20 +05301606 err = errors.New("device FSM: function not implemented yet")
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001607 e.Cancel(err)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001608 logger.Debug(ctx, "doStateDown-done")
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001609}
1610
Himani Chawla6d2ae152020-09-02 13:11:20 +05301611// deviceHandler StateMachine related state transition methods ##### end #########
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001612// #################################################################################
1613
1614// ###################################################
Himani Chawla6d2ae152020-09-02 13:11:20 +05301615// deviceHandler utility methods ##### begin #########
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001616
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001617//GetOnuDeviceEntry gets the ONU device entry and may wait until its value is defined
1618func (dh *deviceHandler) GetOnuDeviceEntry(ctx context.Context, aWait bool) *mib.OnuDeviceEntry {
mpagenko3af1f032020-06-10 08:53:41 +00001619 dh.lockDevice.RLock()
1620 pOnuDeviceEntry := dh.pOnuOmciDevice
1621 if aWait && pOnuDeviceEntry == nil {
1622 //keep the read sema short to allow for subsequent write
1623 dh.lockDevice.RUnlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001624 logger.Debugw(ctx, "Waiting for DeviceEntry to be set ...", log.Fields{"device-id": dh.DeviceID})
mpagenko3af1f032020-06-10 08:53:41 +00001625 // based on concurrent processing the deviceEntry setup may not yet be finished at his point
1626 // so it might be needed to wait here for that event with some timeout
1627 select {
1628 case <-time.After(60 * time.Second): //timer may be discussed ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001629 logger.Errorw(ctx, "No valid DeviceEntry set after maxTime", log.Fields{"device-id": dh.DeviceID})
mpagenko3af1f032020-06-10 08:53:41 +00001630 return nil
1631 case <-dh.deviceEntrySet:
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001632 logger.Debugw(ctx, "devicEntry ready now - continue", log.Fields{"device-id": dh.DeviceID})
mpagenko3af1f032020-06-10 08:53:41 +00001633 // if written now, we can return the written value without sema
1634 return dh.pOnuOmciDevice
1635 }
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001636 }
mpagenko3af1f032020-06-10 08:53:41 +00001637 dh.lockDevice.RUnlock()
1638 return pOnuDeviceEntry
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001639}
1640
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001641//setDeviceHandlerEntries sets the ONU device entry within the handler
1642func (dh *deviceHandler) setDeviceHandlerEntries(apDeviceEntry *mib.OnuDeviceEntry, apOnuTp *avcfg.OnuUniTechProf,
1643 apOnuMetricsMgr *pmmgr.OnuMetricsManager, apOnuAlarmMgr *almgr.OnuAlarmManager, apSelfTestHdlr *otst.SelfTestControlBlock) {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001644 dh.lockDevice.Lock()
1645 defer dh.lockDevice.Unlock()
mpagenkoaf801632020-07-03 10:00:42 +00001646 dh.pOnuOmciDevice = apDeviceEntry
1647 dh.pOnuTP = apOnuTp
Girish Gowdrae09a6202021-01-12 18:10:59 -08001648 dh.pOnuMetricsMgr = apOnuMetricsMgr
Himani Chawlaac1f5ad2021-02-04 21:21:54 +05301649 dh.pAlarmMgr = apOnuAlarmMgr
Girish Gowdra6afb56a2021-04-27 17:47:57 -07001650 dh.pSelfTestHdlr = apSelfTestHdlr
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001651}
1652
Himani Chawla6d2ae152020-09-02 13:11:20 +05301653//addOnuDeviceEntry creates a new ONU device or returns the existing
1654func (dh *deviceHandler) addOnuDeviceEntry(ctx context.Context) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001655 logger.Debugw(ctx, "adding-deviceEntry", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001656
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001657 deviceEntry := dh.GetOnuDeviceEntry(ctx, false)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001658 if deviceEntry == nil {
1659 /* costum_me_map in python code seems always to be None,
1660 we omit that here first (declaration unclear) -> todo at Adapter specialization ...*/
1661 /* also no 'clock' argument - usage open ...*/
1662 /* and no alarm_db yet (oo.alarm_db) */
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001663 deviceEntry = mib.NewOnuDeviceEntry(ctx, dh.coreClient, dh, dh.pOpenOnuAc)
1664 onuTechProfProc := avcfg.NewOnuUniTechProf(ctx, dh, deviceEntry)
1665 onuMetricsMgr := pmmgr.NewOnuMetricsManager(ctx, dh, deviceEntry)
1666 onuAlarmManager := almgr.NewAlarmManager(ctx, dh, deviceEntry)
1667 selfTestHdlr := otst.NewSelfTestMsgHandlerCb(ctx, dh, deviceEntry)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001668 //error treatment possible //TODO!!!
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001669 dh.setDeviceHandlerEntries(deviceEntry, onuTechProfProc, onuMetricsMgr, onuAlarmManager, selfTestHdlr)
mpagenko3af1f032020-06-10 08:53:41 +00001670 // fire deviceEntry ready event to spread to possibly waiting processing
1671 dh.deviceEntrySet <- true
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001672 logger.Debugw(ctx, "onuDeviceEntry-added", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001673 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001674 logger.Debugw(ctx, "onuDeviceEntry-add: Device already exists", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001675 }
1676 // might be updated with some error handling !!!
1677 return nil
1678}
1679
dbainbri4d3a0dc2020-12-02 00:33:42 +00001680func (dh *deviceHandler) createInterface(ctx context.Context, onuind *oop.OnuIndication) error {
1681 logger.Debugw(ctx, "create_interface-started", log.Fields{"OnuId": onuind.GetOnuId(),
Holger Hildebrandt24d51952020-05-04 14:03:42 +00001682 "OnuIntfId": onuind.GetIntfId(), "OnuSerialNumber": onuind.GetSerialNumber()})
1683
1684 dh.pOnuIndication = onuind // let's revise if storing the pointer is sufficient...
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001685
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001686 pDevEntry := dh.GetOnuDeviceEntry(ctx, true)
Holger Hildebrandt3a644642020-12-02 09:46:18 +00001687 if pDevEntry == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001688 logger.Errorw(ctx, "No valid OnuDevice - aborting", log.Fields{"device-id": dh.DeviceID})
1689 return fmt.Errorf("no valid OnuDevice: %s", dh.DeviceID)
Holger Hildebrandt3a644642020-12-02 09:46:18 +00001690 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001691 if !dh.IsReconciling() {
1692 if err := dh.StorePersistentData(ctx); err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001693 logger.Warnw(ctx, "store persistent data error - continue as there will be additional write attempts",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001694 log.Fields{"device-id": dh.DeviceID, "err": err})
Holger Hildebrandt3a644642020-12-02 09:46:18 +00001695 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001696 logger.Debugw(ctx, "call DeviceStateUpdate upon create interface", log.Fields{"ConnectStatus": voltha.ConnectStatus_REACHABLE,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001697 "OperStatus": voltha.OperStatus_ACTIVATING, "device-id": dh.DeviceID})
khenaidoo7d3c5582021-08-11 18:09:44 -04001698
1699 if err := dh.updateDeviceStateInCore(ctx, &ic.DeviceStateFilter{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001700 DeviceId: dh.DeviceID,
khenaidoo7d3c5582021-08-11 18:09:44 -04001701 OperStatus: voltha.OperStatus_ACTIVATING,
1702 ConnStatus: voltha.ConnectStatus_REACHABLE,
1703 }); err != nil {
Holger Hildebrandtf41a1602020-08-19 09:52:50 +00001704 //TODO with VOL-3045/VOL-3046: return the error and stop further processing
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001705 logger.Errorw(ctx, "error-updating-device-state", log.Fields{"device-id": dh.DeviceID, "error": err})
Holger Hildebrandtf41a1602020-08-19 09:52:50 +00001706 }
1707 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001708 logger.Debugw(ctx, "reconciling - don't notify core about DeviceStateUpdate to ACTIVATING",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001709 log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandt3a644642020-12-02 09:46:18 +00001710
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001711 pDevEntry.MutexPersOnuConfig.RLock()
1712 if !pDevEntry.SOnuPersistentData.PersUniUnlockDone {
1713 pDevEntry.MutexPersOnuConfig.RUnlock()
dbainbri4d3a0dc2020-12-02 00:33:42 +00001714 logger.Debugw(ctx, "reconciling - uni-ports were not unlocked before adapter restart - resume with a normal start-up",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001715 log.Fields{"device-id": dh.DeviceID})
1716 dh.StopReconciling(ctx, true)
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001717 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001718 pDevEntry.MutexPersOnuConfig.RUnlock()
Holger Hildebrandt3a644642020-12-02 09:46:18 +00001719 }
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001720 }
Holger Hildebrandt24d51952020-05-04 14:03:42 +00001721 // It does not look to me as if makes sense to work with the real core device here, (not the stored clone)?
1722 // in this code the GetDevice would just make a check if the DeviceID's Device still exists in core
1723 // in python code it looks as the started onu_omci_device might have been updated with some new instance state of the core device
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001724 // but I would not know why, and the go code anyway does not work with the device directly anymore in the mib.OnuDeviceEntry
Holger Hildebrandt24d51952020-05-04 14:03:42 +00001725 // so let's just try to keep it simple ...
1726 /*
dbainbri4d3a0dc2020-12-02 00:33:42 +00001727 device, err := dh.coreProxy.GetDevice(log.WithSpanFromContext(context.TODO(), ctx), dh.device.Id, dh.device.Id)
Holger Hildebrandt24d51952020-05-04 14:03:42 +00001728 if err != nil || device == nil {
1729 //TODO: needs to handle error scenarios
1730 logger.Errorw("Failed to fetch device device at creating If", log.Fields{"err": err})
1731 return errors.New("Voltha Device not found")
1732 }
1733 */
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001734
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001735 if err := pDevEntry.Start(log.WithSpanFromContext(context.TODO(), ctx)); err != nil {
Holger Hildebrandt3a644642020-12-02 09:46:18 +00001736 return err
mpagenko3af1f032020-06-10 08:53:41 +00001737 }
Holger Hildebrandt3a644642020-12-02 09:46:18 +00001738
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001739 _ = dh.deviceReasonUpdate(ctx, cmn.DrStartingOpenomci, !dh.IsReconciling())
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001740
1741 /* this might be a good time for Omci Verify message? */
1742 verifyExec := make(chan bool)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001743 omciVerify := otst.NewOmciTestRequest(log.WithSpanFromContext(context.TODO(), ctx),
mpagenko3af1f032020-06-10 08:53:41 +00001744 dh.device.Id, pDevEntry.PDevOmciCC,
mpagenko900ee4b2020-10-12 11:56:34 +00001745 true, true) //exclusive and allowFailure (anyway not yet checked)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001746 omciVerify.PerformOmciTest(log.WithSpanFromContext(context.TODO(), ctx), verifyExec)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001747
1748 /* give the handler some time here to wait for the OMCi verification result
1749 after Timeout start and try MibUpload FSM anyway
1750 (to prevent stopping on just not supported OMCI verification from ONU) */
1751 select {
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001752 case <-time.After(pDevEntry.PDevOmciCC.GetMaxOmciTimeoutWithRetries() * time.Second):
dbainbri4d3a0dc2020-12-02 00:33:42 +00001753 logger.Warn(ctx, "omci start-verification timed out (continue normal)")
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001754 case testresult := <-verifyExec:
dbainbri4d3a0dc2020-12-02 00:33:42 +00001755 logger.Infow(ctx, "Omci start verification done", log.Fields{"result": testresult})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001756 }
1757
1758 /* In py code it looks earlier (on activate ..)
1759 # Code to Run OMCI Test Action
1760 kwargs_omci_test_action = {
1761 OmciTestRequest.DEFAULT_FREQUENCY_KEY:
1762 OmciTestRequest.DEFAULT_COLLECTION_FREQUENCY
1763 }
1764 serial_number = device.serial_number
1765 self._test_request = OmciTestRequest(self.core_proxy,
1766 self.omci_agent, self.device_id,
1767 AniG, serial_number,
1768 self.logical_device_id,
1769 exclusive=False,
1770 **kwargs_omci_test_action)
1771 ...
1772 # Start test requests after a brief pause
1773 if not self._test_request_started:
1774 self._test_request_started = True
1775 tststart = _STARTUP_RETRY_WAIT * (random.randint(1, 5))
1776 reactor.callLater(tststart, self._test_request.start_collector)
1777
1778 */
1779 /* which is then: in omci_test_request.py : */
1780 /*
1781 def start_collector(self, callback=None):
1782 """
1783 Start the collection loop for an adapter if the frequency > 0
1784
1785 :param callback: (callable) Function to call to collect PM data
1786 """
1787 self.logger.info("starting-pm-collection", device_name=self.name, default_freq=self.default_freq)
1788 if callback is None:
1789 callback = self.perform_test_omci
1790
1791 if self.lc is None:
1792 self.lc = LoopingCall(callback)
1793
1794 if self.default_freq > 0:
1795 self.lc.start(interval=self.default_freq / 10)
1796
1797 def perform_test_omci(self):
1798 """
1799 Perform the initial test request
1800 """
1801 ani_g_entities = self._device.configuration.ani_g_entities
1802 ani_g_entities_ids = list(ani_g_entities.keys()) if ani_g_entities \
1803 is not None else None
1804 self._entity_id = ani_g_entities_ids[0]
1805 self.logger.info('perform-test', entity_class=self._entity_class,
1806 entity_id=self._entity_id)
1807 try:
1808 frame = MEFrame(self._entity_class, self._entity_id, []).test()
1809 result = yield self._device.omci_cc.send(frame)
1810 if not result.fields['omci_message'].fields['success_code']:
1811 self.logger.info('Self-Test Submitted Successfully',
1812 code=result.fields[
1813 'omci_message'].fields['success_code'])
1814 else:
1815 raise TestFailure('Test Failure: {}'.format(
1816 result.fields['omci_message'].fields['success_code']))
1817 except TimeoutError as e:
1818 self.deferred.errback(failure.Failure(e))
1819
1820 except Exception as e:
1821 self.logger.exception('perform-test-Error', e=e,
1822 class_id=self._entity_class,
1823 entity_id=self._entity_id)
1824 self.deferred.errback(failure.Failure(e))
1825
1826 */
1827
1828 // PM related heartbeat??? !!!TODO....
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001829 //self._heartbeat.Enabled = True
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001830
mpagenko1cc3cb42020-07-27 15:24:38 +00001831 /* Note: Even though FSM calls look 'synchronous' here, FSM is running in background with the effect that possible errors
1832 * within the MibUpload are not notified in the OnuIndication response, this might be acceptable here,
1833 * as further OltAdapter processing may rely on the deviceReason event 'MibUploadDone' as a result of the FSM processing
Himani Chawla4d908332020-08-31 12:30:20 +05301834 * otherwise some processing synchronization would be required - cmp. e.g TechProfile processing
mpagenko1cc3cb42020-07-27 15:24:38 +00001835 */
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001836 //call MibUploadFSM - transition up to state UlStInSync
1837 pMibUlFsm := pDevEntry.PMibUploadFsm.PFsm
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +00001838 if pMibUlFsm != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001839 if pMibUlFsm.Is(mib.UlStDisabled) {
1840 if err := pMibUlFsm.Event(mib.UlEvStart); err != nil {
1841 logger.Errorw(ctx, "MibSyncFsm: Can't go to state starting", log.Fields{"device-id": dh.DeviceID, "err": err})
1842 return fmt.Errorf("can't go to state starting: %s", dh.DeviceID)
Himani Chawla4d908332020-08-31 12:30:20 +05301843 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001844 logger.Debugw(ctx, "MibSyncFsm", log.Fields{"state": string(pMibUlFsm.Current())})
Himani Chawla4d908332020-08-31 12:30:20 +05301845 //Determine ONU status and start/re-start MIB Synchronization tasks
1846 //Determine if this ONU has ever synchronized
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001847 if pDevEntry.IsNewOnu() {
1848 if err := pMibUlFsm.Event(mib.UlEvResetMib); err != nil {
1849 logger.Errorw(ctx, "MibSyncFsm: Can't go to state resetting_mib", log.Fields{"device-id": dh.DeviceID, "err": err})
1850 return fmt.Errorf("can't go to state resetting_mib: %s", dh.DeviceID)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001851 }
Himani Chawla4d908332020-08-31 12:30:20 +05301852 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001853 if err := pMibUlFsm.Event(mib.UlEvExamineMds); err != nil {
1854 logger.Errorw(ctx, "MibSyncFsm: Can't go to state examine_mds", log.Fields{"device-id": dh.DeviceID, "err": err})
1855 return fmt.Errorf("can't go to examine_mds: %s", dh.DeviceID)
Himani Chawla4d908332020-08-31 12:30:20 +05301856 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001857 logger.Debugw(ctx, "state of MibSyncFsm", log.Fields{"state": string(pMibUlFsm.Current())})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001858 }
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +00001859 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001860 logger.Errorw(ctx, "wrong state of MibSyncFsm - want: disabled", log.Fields{"have": string(pMibUlFsm.Current()),
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001861 "device-id": dh.DeviceID})
1862 return fmt.Errorf("wrong state of MibSyncFsm: %s", dh.DeviceID)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001863 }
1864 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001865 logger.Errorw(ctx, "MibSyncFsm invalid - cannot be executed!!", log.Fields{"device-id": dh.DeviceID})
1866 return fmt.Errorf("can't execute MibSync: %s", dh.DeviceID)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001867 }
1868 return nil
1869}
1870
dbainbri4d3a0dc2020-12-02 00:33:42 +00001871func (dh *deviceHandler) updateInterface(ctx context.Context, onuind *oop.OnuIndication) error {
mpagenko3af1f032020-06-10 08:53:41 +00001872 //state checking to prevent unneeded processing (eg. on ONU 'unreachable' and 'down')
mpagenkofc4f56e2020-11-04 17:17:49 +00001873 // (but note that the deviceReason may also have changed to e.g. TechProf*Delete_Success in between)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001874 if dh.getDeviceReason() != cmn.DrStoppingOpenomci {
1875 logger.Debugw(ctx, "updateInterface-started - stopping-device", log.Fields{"device-id": dh.DeviceID})
mpagenko2418ab02020-11-12 12:58:06 +00001876
mpagenko900ee4b2020-10-12 11:56:34 +00001877 //stop all running FSM processing - make use of the DH-state as mirrored in the deviceReason
1878 //here no conflict with aborted FSM's should arise as a complete OMCI initialization is assumed on ONU-Up
1879 //but that might change with some simple MDS check on ONU-Up treatment -> attention!!!
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001880 if err := dh.resetFsms(ctx, true); err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001881 logger.Errorw(ctx, "error-updateInterface at FSM stop",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001882 log.Fields{"device-id": dh.DeviceID, "error": err})
mpagenko900ee4b2020-10-12 11:56:34 +00001883 // abort: system behavior is just unstable ...
1884 return err
1885 }
mpagenkoa40e99a2020-11-17 13:50:39 +00001886 //all stored persistent data are not valid anymore (loosing knowledge about the connected ONU)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001887 _ = dh.deleteDevicePersistencyData(ctx) //ignore possible errors here and continue, hope is that data is synchronized with new ONU-Up
mpagenko900ee4b2020-10-12 11:56:34 +00001888
1889 //deviceEntry stop without omciCC reset here, regarding the OMCI_CC still valid for this ONU
1890 // - in contrary to disableDevice - compare with processUniDisableStateDoneEvent
1891 //stop the device entry which resets the attached omciCC
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001892 pDevEntry := dh.GetOnuDeviceEntry(ctx, false)
mpagenko3af1f032020-06-10 08:53:41 +00001893 if pDevEntry == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001894 logger.Errorw(ctx, "No valid OnuDevice -aborting", log.Fields{"device-id": dh.DeviceID})
1895 return fmt.Errorf("no valid OnuDevice: %s", dh.DeviceID)
mpagenko3af1f032020-06-10 08:53:41 +00001896 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001897 _ = pDevEntry.Stop(log.WithSpanFromContext(context.TODO(), ctx), false)
mpagenko3af1f032020-06-10 08:53:41 +00001898
1899 //TODO!!! remove existing traffic profiles
1900 /* from py code, if TP's exist, remove them - not yet implemented
1901 self._tp = dict()
1902 # Let TP download happen again
1903 for uni_id in self._tp_service_specific_task:
1904 self._tp_service_specific_task[uni_id].clear()
1905 for uni_id in self._tech_profile_download_done:
1906 self._tech_profile_download_done[uni_id].clear()
1907 */
1908
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001909 dh.DisableUniPortStateUpdate(ctx)
mpagenko3af1f032020-06-10 08:53:41 +00001910
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001911 dh.SetReadyForOmciConfig(false)
mpagenkofc4f56e2020-11-04 17:17:49 +00001912
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001913 if err := dh.deviceReasonUpdate(ctx, cmn.DrStoppingOpenomci, true); err != nil {
mpagenko3af1f032020-06-10 08:53:41 +00001914 // abort: system behavior is just unstable ...
1915 return err
1916 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001917 logger.Debugw(ctx, "call DeviceStateUpdate upon update interface", log.Fields{"ConnectStatus": voltha.ConnectStatus_UNREACHABLE,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001918 "OperStatus": voltha.OperStatus_DISCOVERED, "device-id": dh.DeviceID})
khenaidoo7d3c5582021-08-11 18:09:44 -04001919 if err := dh.updateDeviceStateInCore(ctx, &ic.DeviceStateFilter{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001920 DeviceId: dh.DeviceID,
khenaidoo7d3c5582021-08-11 18:09:44 -04001921 ConnStatus: voltha.ConnectStatus_UNREACHABLE,
1922 OperStatus: voltha.OperStatus_DISCOVERED,
1923 }); err != nil {
Holger Hildebrandtf41a1602020-08-19 09:52:50 +00001924 //TODO with VOL-3045/VOL-3046: return the error and stop further processing
dbainbri4d3a0dc2020-12-02 00:33:42 +00001925 logger.Errorw(ctx, "error-updating-device-state unreachable-discovered",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001926 log.Fields{"device-id": dh.DeviceID, "error": err})
mpagenko3af1f032020-06-10 08:53:41 +00001927 // abort: system behavior is just unstable ...
1928 return err
1929 }
1930 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001931 logger.Debugw(ctx, "updateInterface - device already stopped", log.Fields{"device-id": dh.DeviceID})
mpagenko3af1f032020-06-10 08:53:41 +00001932 }
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001933 return nil
1934}
1935
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001936func (dh *deviceHandler) resetFsms(ctx context.Context, includingMibSyncFsm bool) error {
mpagenko900ee4b2020-10-12 11:56:34 +00001937 //all possible FSM's are stopped or reset here to ensure their transition to 'disabled'
1938 //it is not sufficient to stop/reset the latest running FSM as done in previous versions
1939 // as after down/up procedures all FSM's might be active/ongoing (in theory)
1940 // and using the stop/reset event should never harm
1941
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001942 pDevEntry := dh.GetOnuDeviceEntry(ctx, false)
mpagenko900ee4b2020-10-12 11:56:34 +00001943 if pDevEntry == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001944 logger.Errorw(ctx, "No valid OnuDevice -aborting", log.Fields{"device-id": dh.DeviceID})
1945 return fmt.Errorf("no valid OnuDevice: %s", dh.DeviceID)
mpagenko900ee4b2020-10-12 11:56:34 +00001946 }
Holger Hildebrandtc8ece362021-05-17 12:01:10 +00001947 if pDevEntry.PDevOmciCC != nil {
mpagenko8cd1bf72021-06-22 10:11:19 +00001948 pDevEntry.PDevOmciCC.CancelRequestMonitoring(ctx)
Holger Hildebrandtc8ece362021-05-17 12:01:10 +00001949 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001950 pDevEntry.MutexOnuImageStatus.RLock()
1951 if pDevEntry.POnuImageStatus != nil {
1952 pDevEntry.POnuImageStatus.CancelProcessing(ctx)
Holger Hildebrandtfb402a62021-05-26 14:40:49 +00001953 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001954 pDevEntry.MutexOnuImageStatus.RUnlock()
mpagenkoaa3afe92021-05-21 16:20:58 +00001955
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001956 if includingMibSyncFsm {
Holger Hildebrandtb4563ab2021-04-14 10:27:20 +00001957 pDevEntry.CancelProcessing(ctx)
mpagenko900ee4b2020-10-12 11:56:34 +00001958 }
1959 //MibDownload may run
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001960 pMibDlFsm := pDevEntry.PMibDownloadFsm.PFsm
mpagenko900ee4b2020-10-12 11:56:34 +00001961 if pMibDlFsm != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001962 _ = pMibDlFsm.Event(mib.DlEvReset)
mpagenko900ee4b2020-10-12 11:56:34 +00001963 }
1964 //port lock/unlock FSM's may be active
1965 if dh.pUnlockStateFsm != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001966 _ = dh.pUnlockStateFsm.PAdaptFsm.PFsm.Event(uniprt.UniEvReset)
mpagenko900ee4b2020-10-12 11:56:34 +00001967 }
1968 if dh.pLockStateFsm != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001969 _ = dh.pLockStateFsm.PAdaptFsm.PFsm.Event(uniprt.UniEvReset)
mpagenko900ee4b2020-10-12 11:56:34 +00001970 }
1971 //techProfile related PonAniConfigFsm FSM may be active
1972 if dh.pOnuTP != nil {
1973 // should always be the case here
1974 // FSM stop maybe encapsulated as OnuTP method - perhaps later in context of module splitting
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001975 if dh.pOnuTP.PAniConfigFsm != nil {
1976 for uniTP := range dh.pOnuTP.PAniConfigFsm {
1977 dh.pOnuTP.PAniConfigFsm[uniTP].CancelProcessing(ctx)
Girish Gowdra041dcb32020-11-16 16:54:30 -08001978 }
mpagenko900ee4b2020-10-12 11:56:34 +00001979 }
1980 for _, uniPort := range dh.uniEntityMap {
mpagenko900ee4b2020-10-12 11:56:34 +00001981 // reset the possibly existing VlanConfigFsm
mpagenkof1fc3862021-02-16 10:09:52 +00001982 dh.lockVlanConfig.RLock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001983 if pVlanFilterFsm, exist := dh.UniVlanConfigFsmMap[uniPort.UniID]; exist {
mpagenko900ee4b2020-10-12 11:56:34 +00001984 //VlanFilterFsm exists and was already started
mpagenko7d6bb022021-03-11 15:07:55 +00001985 dh.lockVlanConfig.RUnlock()
1986 //reset of all Fsm is always accompanied by global persistency data removal
1987 // no need to remove specific data
1988 pVlanFilterFsm.RequestClearPersistency(false)
1989 //ensure the FSM processing is stopped in case waiting for some response
mpagenko73143992021-04-09 15:17:10 +00001990 pVlanFilterFsm.CancelProcessing(ctx)
mpagenkof1fc3862021-02-16 10:09:52 +00001991 } else {
1992 dh.lockVlanConfig.RUnlock()
mpagenko900ee4b2020-10-12 11:56:34 +00001993 }
1994 }
1995 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001996 if dh.GetCollectorIsRunning() {
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001997 // Stop collector routine
1998 dh.stopCollector <- true
1999 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002000 if dh.GetAlarmManagerIsRunning(ctx) {
Himani Chawla4c1d4c72021-02-18 12:14:31 +05302001 dh.stopAlarmManager <- true
2002 }
Girish Gowdra10123c02021-08-30 11:52:06 -07002003 if dh.pSelfTestHdlr.GetSelfTestHandlerIsRunning() {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002004 dh.pSelfTestHdlr.StopSelfTestModule <- true
Girish Gowdra10123c02021-08-30 11:52:06 -07002005 }
Himani Chawla4c1d4c72021-02-18 12:14:31 +05302006
mpagenko80622a52021-02-09 16:53:23 +00002007 //reset a possibly running upgrade FSM
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002008 // (note the Upgrade FSM may stay alive e.g. in state UpgradeStWaitForCommit to endure the ONU reboot)
mpagenko80622a52021-02-09 16:53:23 +00002009 dh.lockUpgradeFsm.RLock()
mpagenko38662d02021-08-11 09:45:19 +00002010 lopOnuUpradeFsm := dh.pOnuUpradeFsm
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002011 //lockUpgradeFsm must be release before cancellation as this may implicitly request RemoveOnuUpgradeFsm()
mpagenko80622a52021-02-09 16:53:23 +00002012 dh.lockUpgradeFsm.RUnlock()
mpagenko38662d02021-08-11 09:45:19 +00002013 if lopOnuUpradeFsm != nil {
2014 lopOnuUpradeFsm.CancelProcessing(ctx, false, voltha.ImageState_CANCELLED_ON_ONU_STATE) //conditional cancel
2015 }
mpagenko80622a52021-02-09 16:53:23 +00002016
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002017 logger.Infow(ctx, "resetFsms done", log.Fields{"device-id": dh.DeviceID})
mpagenko900ee4b2020-10-12 11:56:34 +00002018 return nil
2019}
2020
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002021func (dh *deviceHandler) processMibDatabaseSyncEvent(ctx context.Context, devEvent cmn.OnuDeviceEvent) {
2022 logger.Debugw(ctx, "MibInSync event received, adding uni ports and locking the ONU interfaces", log.Fields{"device-id": dh.DeviceID})
Himani Chawla26e555c2020-08-31 12:30:20 +05302023
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002024 // store persistent data collected during MIB upload processing
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002025 if err := dh.StorePersistentData(ctx); err != nil {
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002026 logger.Warnw(ctx, "store persistent data error - continue as there will be additional write attempts",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002027 log.Fields{"device-id": dh.DeviceID, "err": err})
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002028 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002029 _ = dh.deviceReasonUpdate(ctx, cmn.DrDiscoveryMibsyncComplete, !dh.IsReconciling())
2030 dh.AddAllUniPorts(ctx)
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002031
mpagenkoa40e99a2020-11-17 13:50:39 +00002032 /* 200605: lock processing after initial MIBUpload removed now as the ONU should be in the lock state per default here */
2033 /* 201117: build_dt-berlin-pod-openonugo_1T8GEM_voltha_DT_openonugo_master_test runs into error TC
2034 * 'Test Disable ONUs and OLT Then Delete ONUs and OLT for DT' with Sercom ONU, which obviously needs
2035 * disable/enable toggling here to allow traffic
2036 * but moreover it might be useful for tracking the interface operState changes if this will be implemented,
2037 * like the py comment says:
2038 * # start by locking all the unis till mib sync and initial mib is downloaded
2039 * # this way we can capture the port down/up events when we are ready
2040 */
Himani Chawla26e555c2020-08-31 12:30:20 +05302041
mpagenkoa40e99a2020-11-17 13:50:39 +00002042 // Init Uni Ports to Admin locked state
2043 // *** should generate UniLockStateDone event *****
2044 if dh.pLockStateFsm == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002045 dh.createUniLockFsm(ctx, true, cmn.UniLockStateDone)
mpagenkoa40e99a2020-11-17 13:50:39 +00002046 } else { //LockStateFSM already init
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002047 dh.pLockStateFsm.SetSuccessEvent(cmn.UniLockStateDone)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002048 dh.runUniLockFsm(ctx, true)
mpagenkoa40e99a2020-11-17 13:50:39 +00002049 }
2050}
2051
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002052func (dh *deviceHandler) processUniLockStateDoneEvent(ctx context.Context, devEvent cmn.OnuDeviceEvent) {
2053 logger.Infow(ctx, "UniLockStateDone event: Starting MIB download", log.Fields{"device-id": dh.DeviceID})
Himani Chawla26e555c2020-08-31 12:30:20 +05302054 /* Mib download procedure -
2055 ***** should run over 'downloaded' state and generate MibDownloadDone event *****
2056 */
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002057 pDevEntry := dh.GetOnuDeviceEntry(ctx, false)
Holger Hildebrandt3a644642020-12-02 09:46:18 +00002058 if pDevEntry == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002059 logger.Errorw(ctx, "No valid OnuDevice - aborting", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandt3a644642020-12-02 09:46:18 +00002060 return
2061 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002062 pMibDlFsm := pDevEntry.PMibDownloadFsm.PFsm
Himani Chawla26e555c2020-08-31 12:30:20 +05302063 if pMibDlFsm != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002064 if pMibDlFsm.Is(mib.DlStDisabled) {
2065 if err := pMibDlFsm.Event(mib.DlEvStart); err != nil {
2066 logger.Errorw(ctx, "MibDownloadFsm: Can't go to state starting", log.Fields{"device-id": dh.DeviceID, "err": err})
Himani Chawla26e555c2020-08-31 12:30:20 +05302067 // maybe try a FSM reset and then again ... - TODO!!!
2068 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002069 logger.Debugw(ctx, "MibDownloadFsm", log.Fields{"state": string(pMibDlFsm.Current())})
Himani Chawla26e555c2020-08-31 12:30:20 +05302070 // maybe use more specific states here for the specific download steps ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002071 if err := pMibDlFsm.Event(mib.DlEvCreateGal); err != nil {
2072 logger.Errorw(ctx, "MibDownloadFsm: Can't start CreateGal", log.Fields{"device-id": dh.DeviceID, "err": err})
Himani Chawla26e555c2020-08-31 12:30:20 +05302073 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002074 logger.Debugw(ctx, "state of MibDownloadFsm", log.Fields{"state": string(pMibDlFsm.Current())})
Himani Chawla26e555c2020-08-31 12:30:20 +05302075 //Begin MIB data download (running autonomously)
2076 }
2077 }
2078 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002079 logger.Errorw(ctx, "wrong state of MibDownloadFsm - want: disabled", log.Fields{"have": string(pMibDlFsm.Current()),
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002080 "device-id": dh.DeviceID})
Himani Chawla26e555c2020-08-31 12:30:20 +05302081 // maybe try a FSM reset and then again ... - TODO!!!
2082 }
2083 /***** Mib download started */
2084 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002085 logger.Errorw(ctx, "MibDownloadFsm invalid - cannot be executed!!", log.Fields{"device-id": dh.DeviceID})
Himani Chawla26e555c2020-08-31 12:30:20 +05302086 }
2087}
2088
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002089func (dh *deviceHandler) processMibDownloadDoneEvent(ctx context.Context, devEvent cmn.OnuDeviceEvent) {
2090 logger.Debugw(ctx, "MibDownloadDone event received, unlocking the ONU interfaces", log.Fields{"device-id": dh.DeviceID})
Himani Chawla26e555c2020-08-31 12:30:20 +05302091 //initiate DevStateUpdate
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002092 if !dh.IsReconciling() {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002093 logger.Debugw(ctx, "call DeviceStateUpdate upon mib-download done", log.Fields{"ConnectStatus": voltha.ConnectStatus_REACHABLE,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002094 "OperStatus": voltha.OperStatus_ACTIVE, "device-id": dh.DeviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00002095 //we allow a possible OnuSw image commit only in the normal startup, not at reconciling
2096 // in case of adapter restart connected to an ONU upgrade I would not rely on the image quality
2097 // maybe some 'forced' commitment can be done in this situation from system management (or upgrade restarted)
2098 dh.checkOnOnuImageCommit(ctx)
khenaidoo7d3c5582021-08-11 18:09:44 -04002099 if err := dh.updateDeviceStateInCore(ctx, &ic.DeviceStateFilter{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002100 DeviceId: dh.DeviceID,
khenaidoo7d3c5582021-08-11 18:09:44 -04002101 ConnStatus: voltha.ConnectStatus_REACHABLE,
2102 OperStatus: voltha.OperStatus_ACTIVE,
2103 }); err != nil {
Himani Chawla26e555c2020-08-31 12:30:20 +05302104 //TODO with VOL-3045/VOL-3046: return the error and stop further processing
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002105 logger.Errorw(ctx, "error-updating-device-state", log.Fields{"device-id": dh.DeviceID, "error": err})
Himani Chawla26e555c2020-08-31 12:30:20 +05302106 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002107 logger.Debugw(ctx, "dev state updated to 'Oper.Active'", log.Fields{"device-id": dh.DeviceID})
Himani Chawla26e555c2020-08-31 12:30:20 +05302108 }
2109 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002110 logger.Debugw(ctx, "reconciling - don't notify core about DeviceStateUpdate to ACTIVE",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002111 log.Fields{"device-id": dh.DeviceID})
Himani Chawla26e555c2020-08-31 12:30:20 +05302112 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002113 _ = dh.deviceReasonUpdate(ctx, cmn.DrInitialMibDownloaded, !dh.IsReconciling())
Girish Gowdrae0140f02021-02-02 16:55:09 -08002114
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002115 if !dh.GetCollectorIsRunning() {
Girish Gowdra7b0ee5c2021-03-19 21:48:15 -07002116 // Start PM collector routine
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002117 go dh.StartCollector(ctx)
Girish Gowdra7b0ee5c2021-03-19 21:48:15 -07002118 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002119 if !dh.GetAlarmManagerIsRunning(ctx) {
2120 go dh.StartAlarmManager(ctx)
Girish Gowdra7b0ee5c2021-03-19 21:48:15 -07002121 }
2122
Girish Gowdrae0140f02021-02-02 16:55:09 -08002123 // Initialize classical L2 PM Interval Counters
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002124 if err := dh.pOnuMetricsMgr.PAdaptFsm.PFsm.Event(pmmgr.L2PmEventInit); err != nil {
Girish Gowdrae0140f02021-02-02 16:55:09 -08002125 // There is no way we should be landing here, but if we do then
2126 // there is nothing much we can do about this other than log error
2127 logger.Errorw(ctx, "error starting l2 pm fsm", log.Fields{"device-id": dh.device.Id, "err": err})
2128 }
2129
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002130 dh.SetReadyForOmciConfig(true)
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002131
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002132 pDevEntry := dh.GetOnuDeviceEntry(ctx, false)
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002133 if pDevEntry == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002134 logger.Errorw(ctx, "No valid OnuDevice - aborting", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002135 return
2136 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002137 pDevEntry.MutexPersOnuConfig.RLock()
2138 if dh.IsReconciling() && pDevEntry.SOnuPersistentData.PersUniDisableDone {
2139 pDevEntry.MutexPersOnuConfig.RUnlock()
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002140 logger.Debugw(ctx, "reconciling - uni-ports were disabled by admin before adapter restart - keep the ports locked",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002141 log.Fields{"device-id": dh.DeviceID})
2142 go dh.ReconcileDeviceTechProf(ctx)
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002143 // reconcilement will be continued after ani config is done
2144 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002145 pDevEntry.MutexPersOnuConfig.RUnlock()
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002146 // *** should generate UniUnlockStateDone event *****
2147 if dh.pUnlockStateFsm == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002148 dh.createUniLockFsm(ctx, false, cmn.UniUnlockStateDone)
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002149 } else { //UnlockStateFSM already init
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002150 dh.pUnlockStateFsm.SetSuccessEvent(cmn.UniUnlockStateDone)
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002151 dh.runUniLockFsm(ctx, false)
2152 }
Himani Chawla26e555c2020-08-31 12:30:20 +05302153 }
2154}
2155
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002156func (dh *deviceHandler) processUniUnlockStateDoneEvent(ctx context.Context, devEvent cmn.OnuDeviceEvent) {
2157 dh.EnableUniPortStateUpdate(ctx) //cmp python yield self.enable_ports()
Himani Chawla26e555c2020-08-31 12:30:20 +05302158
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002159 if !dh.IsReconciling() {
2160 logger.Infow(ctx, "UniUnlockStateDone event: Sending OnuUp event", log.Fields{"device-id": dh.DeviceID})
ozgecanetsia2f05ed32021-05-31 17:13:48 +03002161 raisedTs := time.Now().Unix()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002162 go dh.sendOnuOperStateEvent(ctx, voltha.OperStatus_ACTIVE, dh.DeviceID, raisedTs) //cmp python onu_active_event
2163 pDevEntry := dh.GetOnuDeviceEntry(ctx, false)
Holger Hildebrandt3a644642020-12-02 09:46:18 +00002164 if pDevEntry == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002165 logger.Errorw(ctx, "No valid OnuDevice - aborting", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandt3a644642020-12-02 09:46:18 +00002166 return
2167 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002168 pDevEntry.MutexPersOnuConfig.Lock()
2169 pDevEntry.SOnuPersistentData.PersUniUnlockDone = true
2170 pDevEntry.MutexPersOnuConfig.Unlock()
2171 if err := dh.StorePersistentData(ctx); err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002172 logger.Warnw(ctx, "store persistent data error - continue for now as there will be additional write attempts",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002173 log.Fields{"device-id": dh.DeviceID, "err": err})
Holger Hildebrandt3a644642020-12-02 09:46:18 +00002174 }
Himani Chawla26e555c2020-08-31 12:30:20 +05302175 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002176 logger.Debugw(ctx, "reconciling - don't notify core that onu went to active but trigger tech profile config",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002177 log.Fields{"device-id": dh.DeviceID})
2178 go dh.ReconcileDeviceTechProf(ctx)
Holger Hildebrandt47555e72020-09-21 11:07:24 +00002179 // reconcilement will be continued after ani config is done
Himani Chawla26e555c2020-08-31 12:30:20 +05302180 }
2181}
2182
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002183func (dh *deviceHandler) processUniDisableStateDoneEvent(ctx context.Context, devEvent cmn.OnuDeviceEvent) {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002184 logger.Debugw(ctx, "DeviceStateUpdate upon disable", log.Fields{"ConnectStatus": voltha.ConnectStatus_REACHABLE,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002185 "OperStatus": voltha.OperStatus_UNKNOWN, "device-id": dh.DeviceID})
khenaidoo7d3c5582021-08-11 18:09:44 -04002186
2187 if err := dh.updateDeviceStateInCore(ctx, &ic.DeviceStateFilter{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002188 DeviceId: dh.DeviceID,
khenaidoo7d3c5582021-08-11 18:09:44 -04002189 ConnStatus: voltha.ConnectStatus_REACHABLE,
2190 OperStatus: voltha.OperStatus_UNKNOWN,
2191 }); err != nil {
mpagenko900ee4b2020-10-12 11:56:34 +00002192 //TODO with VOL-3045/VOL-3046: return the error and stop further processing
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002193 logger.Errorw(ctx, "error-updating-device-state", log.Fields{"device-id": dh.DeviceID, "error": err})
mpagenko900ee4b2020-10-12 11:56:34 +00002194 }
2195
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002196 logger.Debugw(ctx, "DeviceReasonUpdate upon disable", log.Fields{"reason": cmn.DeviceReasonMap[cmn.DrOmciAdminLock], "device-id": dh.DeviceID})
mpagenko900ee4b2020-10-12 11:56:34 +00002197 // DeviceReason to update acc.to modified py code as per beginning of Sept 2020
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002198 _ = dh.deviceReasonUpdate(ctx, cmn.DrOmciAdminLock, true)
mpagenko900ee4b2020-10-12 11:56:34 +00002199
2200 //transfer the modified logical uni port state
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002201 dh.DisableUniPortStateUpdate(ctx)
Holger Hildebrandt3a644642020-12-02 09:46:18 +00002202
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002203 pDevEntry := dh.GetOnuDeviceEntry(ctx, false)
Holger Hildebrandt3a644642020-12-02 09:46:18 +00002204 if pDevEntry == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002205 logger.Errorw(ctx, "No valid OnuDevice - aborting", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandt3a644642020-12-02 09:46:18 +00002206 return
2207 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002208 pDevEntry.MutexPersOnuConfig.Lock()
2209 pDevEntry.SOnuPersistentData.PersUniDisableDone = true
2210 pDevEntry.MutexPersOnuConfig.Unlock()
2211 if err := dh.StorePersistentData(ctx); err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002212 logger.Warnw(ctx, "store persistent data error - continue for now as there will be additional write attempts",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002213 log.Fields{"device-id": dh.DeviceID, "err": err})
Holger Hildebrandt3a644642020-12-02 09:46:18 +00002214 }
mpagenko900ee4b2020-10-12 11:56:34 +00002215}
2216
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002217func (dh *deviceHandler) processUniEnableStateDoneEvent(ctx context.Context, devEvent cmn.OnuDeviceEvent) {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002218 logger.Debugw(ctx, "DeviceStateUpdate upon re-enable", log.Fields{"ConnectStatus": voltha.ConnectStatus_REACHABLE,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002219 "OperStatus": voltha.OperStatus_ACTIVE, "device-id": dh.DeviceID})
khenaidoo7d3c5582021-08-11 18:09:44 -04002220 if err := dh.updateDeviceStateInCore(ctx, &ic.DeviceStateFilter{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002221 DeviceId: dh.DeviceID,
khenaidoo7d3c5582021-08-11 18:09:44 -04002222 ConnStatus: voltha.ConnectStatus_REACHABLE,
2223 OperStatus: voltha.OperStatus_ACTIVE,
2224 }); err != nil {
mpagenko900ee4b2020-10-12 11:56:34 +00002225 //TODO with VOL-3045/VOL-3046: return the error and stop further processing
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002226 logger.Errorw(ctx, "error-updating-device-state", log.Fields{"device-id": dh.DeviceID, "error": err})
mpagenko900ee4b2020-10-12 11:56:34 +00002227 }
2228
dbainbri4d3a0dc2020-12-02 00:33:42 +00002229 logger.Debugw(ctx, "DeviceReasonUpdate upon re-enable", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002230 "reason": cmn.DeviceReasonMap[cmn.DrOnuReenabled], "device-id": dh.DeviceID})
mpagenko900ee4b2020-10-12 11:56:34 +00002231 // DeviceReason to update acc.to modified py code as per beginning of Sept 2020
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002232 _ = dh.deviceReasonUpdate(ctx, cmn.DrOnuReenabled, true)
mpagenko900ee4b2020-10-12 11:56:34 +00002233
2234 //transfer the modified logical uni port state
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002235 dh.EnableUniPortStateUpdate(ctx)
Holger Hildebrandt3a644642020-12-02 09:46:18 +00002236
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002237 pDevEntry := dh.GetOnuDeviceEntry(ctx, false)
Holger Hildebrandt3a644642020-12-02 09:46:18 +00002238 if pDevEntry == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002239 logger.Errorw(ctx, "No valid OnuDevice - aborting", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandt3a644642020-12-02 09:46:18 +00002240 return
2241 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002242 pDevEntry.MutexPersOnuConfig.Lock()
2243 pDevEntry.SOnuPersistentData.PersUniDisableDone = false
2244 pDevEntry.MutexPersOnuConfig.Unlock()
2245 if err := dh.StorePersistentData(ctx); err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002246 logger.Warnw(ctx, "store persistent data error - continue for now as there will be additional write attempts",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002247 log.Fields{"device-id": dh.DeviceID, "err": err})
Holger Hildebrandt3a644642020-12-02 09:46:18 +00002248 }
mpagenko900ee4b2020-10-12 11:56:34 +00002249}
2250
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002251func (dh *deviceHandler) processOmciAniConfigDoneEvent(ctx context.Context, devEvent cmn.OnuDeviceEvent) {
2252 if devEvent == cmn.OmciAniConfigDone {
2253 logger.Debugw(ctx, "OmciAniConfigDone event received", log.Fields{"device-id": dh.DeviceID})
mpagenkofc4f56e2020-11-04 17:17:49 +00002254 // attention: the device reason update is done based on ONU-UNI-Port related activity
2255 // - which may cause some inconsistency
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002256 if dh.getDeviceReason() != cmn.DrTechProfileConfigDownloadSuccess {
mpagenkofc4f56e2020-11-04 17:17:49 +00002257 // which may be the case from some previous actvity even on this UNI Port (but also other UNI ports)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002258 _ = dh.deviceReasonUpdate(ctx, cmn.DrTechProfileConfigDownloadSuccess, !dh.IsReconciling())
Himani Chawla26e555c2020-08-31 12:30:20 +05302259 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002260 if dh.IsReconciling() {
2261 go dh.ReconcileDeviceFlowConfig(ctx)
mpagenkofc4f56e2020-11-04 17:17:49 +00002262 }
2263 } else { // should be the OmciAniResourceRemoved block
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002264 logger.Debugw(ctx, "OmciAniResourceRemoved event received", log.Fields{"device-id": dh.DeviceID})
mpagenkofc4f56e2020-11-04 17:17:49 +00002265 // attention: the device reason update is done based on ONU-UNI-Port related activity
2266 // - which may cause some inconsistency
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002267 if dh.getDeviceReason() != cmn.DrTechProfileConfigDeleteSuccess {
mpagenkofc4f56e2020-11-04 17:17:49 +00002268 // which may be the case from some previous actvity even on this ONU port (but also other UNI ports)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002269 _ = dh.deviceReasonUpdate(ctx, cmn.DrTechProfileConfigDeleteSuccess, true)
mpagenkofc4f56e2020-11-04 17:17:49 +00002270 }
Holger Hildebrandt47555e72020-09-21 11:07:24 +00002271 }
Himani Chawla26e555c2020-08-31 12:30:20 +05302272}
2273
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002274func (dh *deviceHandler) processOmciVlanFilterDoneEvent(ctx context.Context, aDevEvent cmn.OnuDeviceEvent) {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002275 logger.Debugw(ctx, "OmciVlanFilterDone event received",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002276 log.Fields{"device-id": dh.DeviceID, "event": aDevEvent})
Himani Chawla26e555c2020-08-31 12:30:20 +05302277 // attention: the device reason update is done based on ONU-UNI-Port related activity
2278 // - which may cause some inconsistency
Himani Chawla26e555c2020-08-31 12:30:20 +05302279
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002280 if aDevEvent == cmn.OmciVlanFilterAddDone || aDevEvent == cmn.OmciVlanFilterAddDoneNoKvStore {
2281 if dh.getDeviceReason() != cmn.DrOmciFlowsPushed {
mpagenkofc4f56e2020-11-04 17:17:49 +00002282 // which may be the case from some previous actvity on another UNI Port of the ONU
2283 // or even some previous flow add activity on the same port
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002284 _ = dh.deviceReasonUpdate(ctx, cmn.DrOmciFlowsPushed, !dh.IsReconciling())
2285 if dh.IsReconciling() {
Holger Hildebrandt1b8f4ad2021-03-25 15:53:51 +00002286 go dh.reconcileEnd(ctx)
mpagenkofc4f56e2020-11-04 17:17:49 +00002287 }
2288 }
2289 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002290 if dh.getDeviceReason() != cmn.DrOmciFlowsDeleted {
mpagenkofc4f56e2020-11-04 17:17:49 +00002291 //not relevant for reconcile
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002292 _ = dh.deviceReasonUpdate(ctx, cmn.DrOmciFlowsDeleted, true)
Holger Hildebrandt47555e72020-09-21 11:07:24 +00002293 }
Himani Chawla26e555c2020-08-31 12:30:20 +05302294 }
mpagenkof1fc3862021-02-16 10:09:52 +00002295
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002296 if aDevEvent == cmn.OmciVlanFilterAddDone || aDevEvent == cmn.OmciVlanFilterRemDone {
mpagenkof1fc3862021-02-16 10:09:52 +00002297 //events that request KvStore write
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002298 if err := dh.StorePersistentData(ctx); err != nil {
mpagenkof1fc3862021-02-16 10:09:52 +00002299 logger.Warnw(ctx, "store persistent data error - continue for now as there will be additional write attempts",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002300 log.Fields{"device-id": dh.DeviceID, "err": err})
mpagenkof1fc3862021-02-16 10:09:52 +00002301 }
2302 } else {
2303 logger.Debugw(ctx, "OmciVlanFilter*Done* - write to KvStore not requested",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002304 log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandt10d98192021-01-27 15:29:31 +00002305 }
Himani Chawla26e555c2020-08-31 12:30:20 +05302306}
2307
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002308//DeviceProcStatusUpdate evaluates possible processing events and initiates according next activities
2309func (dh *deviceHandler) DeviceProcStatusUpdate(ctx context.Context, devEvent cmn.OnuDeviceEvent) {
Himani Chawla4d908332020-08-31 12:30:20 +05302310 switch devEvent {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002311 case cmn.MibDatabaseSync:
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00002312 {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002313 dh.processMibDatabaseSyncEvent(ctx, devEvent)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00002314 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002315 case cmn.UniLockStateDone:
mpagenkoa40e99a2020-11-17 13:50:39 +00002316 {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002317 dh.processUniLockStateDoneEvent(ctx, devEvent)
mpagenkoa40e99a2020-11-17 13:50:39 +00002318 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002319 case cmn.MibDownloadDone:
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00002320 {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002321 dh.processMibDownloadDoneEvent(ctx, devEvent)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00002322 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002323 case cmn.UniUnlockStateDone:
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00002324 {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002325 dh.processUniUnlockStateDoneEvent(ctx, devEvent)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00002326 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002327 case cmn.UniEnableStateDone:
mpagenko900ee4b2020-10-12 11:56:34 +00002328 {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002329 dh.processUniEnableStateDoneEvent(ctx, devEvent)
mpagenko900ee4b2020-10-12 11:56:34 +00002330 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002331 case cmn.UniDisableStateDone:
mpagenko900ee4b2020-10-12 11:56:34 +00002332 {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002333 dh.processUniDisableStateDoneEvent(ctx, devEvent)
mpagenko900ee4b2020-10-12 11:56:34 +00002334 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002335 case cmn.OmciAniConfigDone, cmn.OmciAniResourceRemoved:
mpagenko3dbcdd22020-07-22 07:38:45 +00002336 {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002337 dh.processOmciAniConfigDoneEvent(ctx, devEvent)
mpagenko3dbcdd22020-07-22 07:38:45 +00002338 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002339 case cmn.OmciVlanFilterAddDone, cmn.OmciVlanFilterAddDoneNoKvStore, cmn.OmciVlanFilterRemDone, cmn.OmciVlanFilterRemDoneNoKvStore:
mpagenkodff5dda2020-08-28 11:52:01 +00002340 {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002341 dh.processOmciVlanFilterDoneEvent(ctx, devEvent)
mpagenkodff5dda2020-08-28 11:52:01 +00002342 }
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00002343 default:
2344 {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002345 logger.Debugw(ctx, "unhandled-device-event", log.Fields{"device-id": dh.DeviceID, "event": devEvent})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00002346 }
2347 } //switch
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00002348}
2349
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002350func (dh *deviceHandler) addUniPort(ctx context.Context, aUniInstNo uint16, aUniID uint8, aPortType cmn.UniPortType) {
Holger Hildebrandt24d51952020-05-04 14:03:42 +00002351 // parameters are IntfId, OnuId, uniId
Mahir Gunyelcb128ae2021-10-06 09:42:05 -07002352 uniNo := platform.MkUniPortNum(ctx, dh.pOnuIndication.GetIntfId(), dh.pOnuIndication.GetOnuId(),
Himani Chawla4d908332020-08-31 12:30:20 +05302353 uint32(aUniID))
Holger Hildebrandt24d51952020-05-04 14:03:42 +00002354 if _, present := dh.uniEntityMap[uniNo]; present {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002355 logger.Warnw(ctx, "OnuUniPort-add: Port already exists", log.Fields{"for InstanceId": aUniInstNo})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00002356 } else {
Himani Chawla4d908332020-08-31 12:30:20 +05302357 //with arguments aUniID, a_portNo, aPortType
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002358 pUniPort := cmn.NewOnuUniPort(ctx, aUniID, uniNo, aUniInstNo, aPortType)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00002359 if pUniPort == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002360 logger.Warnw(ctx, "OnuUniPort-add: Could not create Port", log.Fields{"for InstanceId": aUniInstNo})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00002361 } else {
Holger Hildebrandt24d51952020-05-04 14:03:42 +00002362 //store UniPort with the System-PortNumber key
2363 dh.uniEntityMap[uniNo] = pUniPort
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002364 if !dh.IsReconciling() {
Holger Hildebrandtf41a1602020-08-19 09:52:50 +00002365 // create announce the UniPort to the core as VOLTHA Port object
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002366 if err := pUniPort.CreateVolthaPort(ctx, dh); err == nil {
2367 logger.Infow(ctx, "OnuUniPort-added", log.Fields{"for PortNo": uniNo})
Holger Hildebrandtf41a1602020-08-19 09:52:50 +00002368 } //error logging already within UniPort method
2369 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002370 logger.Debugw(ctx, "reconciling - OnuUniPort already added", log.Fields{"for PortNo": uniNo, "device-id": dh.DeviceID})
Holger Hildebrandtf41a1602020-08-19 09:52:50 +00002371 }
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00002372 }
2373 }
2374}
Holger Hildebrandt24d51952020-05-04 14:03:42 +00002375
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002376func (dh *deviceHandler) AddAllUniPorts(ctx context.Context) {
2377 pDevEntry := dh.GetOnuDeviceEntry(ctx, false)
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002378 if pDevEntry == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002379 logger.Errorw(ctx, "No valid OnuDevice - aborting", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002380 return
2381 }
2382 i := uint8(0) //UNI Port limit: see MaxUnisPerOnu (by now 16) (OMCI supports max 255 p.b.)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002383 if pptpInstKeys := pDevEntry.GetOnuDB().GetSortedInstKeys(
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002384 ctx, me.PhysicalPathTerminationPointEthernetUniClassID); len(pptpInstKeys) > 0 {
2385 for _, mgmtEntityID := range pptpInstKeys {
2386 logger.Debugw(ctx, "Add PPTPEthUni port for MIB-stored instance:", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002387 "device-id": dh.DeviceID, "PPTPEthUni EntityID": mgmtEntityID})
2388 dh.addUniPort(ctx, mgmtEntityID, i, cmn.UniPPTP)
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002389 i++
2390 }
2391 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002392 logger.Debugw(ctx, "No PPTP instances found", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002393 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002394 if veipInstKeys := pDevEntry.GetOnuDB().GetSortedInstKeys(
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002395 ctx, me.VirtualEthernetInterfacePointClassID); len(veipInstKeys) > 0 {
2396 for _, mgmtEntityID := range veipInstKeys {
2397 logger.Debugw(ctx, "Add VEIP for MIB-stored instance:", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002398 "device-id": dh.DeviceID, "VEIP EntityID": mgmtEntityID})
2399 dh.addUniPort(ctx, mgmtEntityID, i, cmn.UniVEIP)
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002400 i++
2401 }
2402 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002403 logger.Debugw(ctx, "No VEIP instances found", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002404 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002405 if potsInstKeys := pDevEntry.GetOnuDB().GetSortedInstKeys(
ozgecanetsia124d9732021-09-16 14:31:57 +03002406 ctx, me.PhysicalPathTerminationPointPotsUniClassID); len(potsInstKeys) > 0 {
2407 for _, mgmtEntityID := range potsInstKeys {
2408 logger.Debugw(ctx, "Add PPTP Pots UNI for MIB-stored instance:", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002409 "device-id": dh.DeviceID, "PPTP Pots UNI EntityID": mgmtEntityID})
2410 dh.addUniPort(ctx, mgmtEntityID, i, cmn.UniPPTPPots)
ozgecanetsia124d9732021-09-16 14:31:57 +03002411 i++
2412 }
2413 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002414 logger.Debugw(ctx, "No PPTP Pots UNI instances found", log.Fields{"device-id": dh.DeviceID})
ozgecanetsia124d9732021-09-16 14:31:57 +03002415 }
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002416 if i == 0 {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002417 logger.Warnw(ctx, "No UniG instances found", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002418 }
2419}
2420
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002421// EnableUniPortStateUpdate enables UniPortState and update core port state accordingly
2422func (dh *deviceHandler) EnableUniPortStateUpdate(ctx context.Context) {
Holger Hildebrandtbe674422020-05-05 13:05:30 +00002423 // py code was updated 2003xx to activate the real ONU UNI ports per OMCI (VEIP or PPTP)
Himani Chawla4d908332020-08-31 12:30:20 +05302424 // but towards core only the first port active state is signaled
Holger Hildebrandtbe674422020-05-05 13:05:30 +00002425 // with following remark:
2426 // # TODO: for now only support the first UNI given no requirement for multiple uni yet. Also needed to reduce flow
2427 // # load on the core
2428
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002429 // lock_ports(false) as done in py code here is shifted to separate call from device event processing
Holger Hildebrandtbe674422020-05-05 13:05:30 +00002430
Holger Hildebrandt24d51952020-05-04 14:03:42 +00002431 for uniNo, uniPort := range dh.uniEntityMap {
mpagenko3af1f032020-06-10 08:53:41 +00002432 // only if this port is validated for operState transfer
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002433 if (1<<uniPort.UniID)&dh.pOpenOnuAc.config.UniPortMask == (1 << uniPort.UniID) {
2434 logger.Infow(ctx, "OnuUniPort-forced-OperState-ACTIVE", log.Fields{"for PortNo": uniNo, "device-id": dh.DeviceID})
2435 uniPort.SetOperState(vc.OperStatus_ACTIVE)
2436 if !dh.IsReconciling() {
Holger Hildebrandtf41a1602020-08-19 09:52:50 +00002437 //maybe also use getter functions on uniPort - perhaps later ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002438 go func(port *cmn.OnuUniPort) {
khenaidoo7d3c5582021-08-11 18:09:44 -04002439 if err := dh.updatePortStateInCore(ctx, &ic.PortState{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002440 DeviceId: dh.DeviceID,
khenaidoo7d3c5582021-08-11 18:09:44 -04002441 PortType: voltha.Port_ETHERNET_UNI,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002442 PortNo: port.PortNo,
2443 OperStatus: port.OperState,
khenaidoo7d3c5582021-08-11 18:09:44 -04002444 }); err != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002445 logger.Errorw(ctx, "port-state-update-failed", log.Fields{"error": err, "port-no": uniPort.PortNo, "device-id": dh.DeviceID})
khenaidoo7d3c5582021-08-11 18:09:44 -04002446 }
2447 }(uniPort)
Holger Hildebrandtf41a1602020-08-19 09:52:50 +00002448 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002449 logger.Debugw(ctx, "reconciling - don't notify core about PortStateUpdate", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandtf41a1602020-08-19 09:52:50 +00002450 }
mpagenko3af1f032020-06-10 08:53:41 +00002451 }
2452 }
2453}
2454
2455// Disable UniPortState and update core port state accordingly
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002456func (dh *deviceHandler) DisableUniPortStateUpdate(ctx context.Context) {
2457 // compare EnableUniPortStateUpdate() above
mpagenko3af1f032020-06-10 08:53:41 +00002458 // -> use current restriction to operate only on first UNI port as inherited from actual Py code
2459 for uniNo, uniPort := range dh.uniEntityMap {
2460 // only if this port is validated for operState transfer
Matteo Scandolo20d180c2021-06-10 17:20:21 +02002461
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002462 if (1<<uniPort.UniID)&dh.pOpenOnuAc.config.UniPortMask == (1 << uniPort.UniID) {
2463 logger.Infow(ctx, "OnuUniPort-forced-OperState-UNKNOWN", log.Fields{"for PortNo": uniNo, "device-id": dh.DeviceID})
2464 uniPort.SetOperState(vc.OperStatus_UNKNOWN)
2465 if !dh.IsReconciling() {
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002466 //maybe also use getter functions on uniPort - perhaps later ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002467 go func(port *cmn.OnuUniPort) {
khenaidoo7d3c5582021-08-11 18:09:44 -04002468 if err := dh.updatePortStateInCore(ctx, &ic.PortState{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002469 DeviceId: dh.DeviceID,
khenaidoo7d3c5582021-08-11 18:09:44 -04002470 PortType: voltha.Port_ETHERNET_UNI,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002471 PortNo: port.PortNo,
2472 OperStatus: port.OperState,
khenaidoo7d3c5582021-08-11 18:09:44 -04002473 }); err != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002474 logger.Errorw(ctx, "port-state-update-failed", log.Fields{"error": err, "port-no": uniPort.PortNo, "device-id": dh.DeviceID})
khenaidoo7d3c5582021-08-11 18:09:44 -04002475 }
2476 }(uniPort)
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002477 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002478 logger.Debugw(ctx, "reconciling - don't notify core about PortStateUpdate", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandtbe523842021-03-10 10:47:18 +00002479 }
2480
Holger Hildebrandtbe674422020-05-05 13:05:30 +00002481 }
Holger Hildebrandt24d51952020-05-04 14:03:42 +00002482 }
2483}
2484
2485// ONU_Active/Inactive announcement on system KAFKA bus
2486// tried to re-use procedure of oltUpDownIndication from openolt_eventmgr.go with used values from Py code
dbainbri4d3a0dc2020-12-02 00:33:42 +00002487func (dh *deviceHandler) sendOnuOperStateEvent(ctx context.Context, aOperState vc.OperStatus_Types, aDeviceID string, raisedTs int64) {
Holger Hildebrandt24d51952020-05-04 14:03:42 +00002488 var de voltha.DeviceEvent
2489 eventContext := make(map[string]string)
2490 //Populating event context
2491 // assume giving ParentId in GetDevice twice really gives the ParentDevice (there is no GetParentDevice()...)
khenaidoo7d3c5582021-08-11 18:09:44 -04002492 parentDevice, err := dh.getDeviceFromCore(ctx, dh.parentID)
Holger Hildebrandt24d51952020-05-04 14:03:42 +00002493 if err != nil || parentDevice == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002494 logger.Errorw(ctx, "Failed to fetch parent device for OnuEvent",
Himani Chawla4d908332020-08-31 12:30:20 +05302495 log.Fields{"parentID": dh.parentID, "err": err})
Holger Hildebrandt7ec14c42021-05-28 14:21:58 +00002496 return //TODO with VOL-3045: rw-core is unresponsive: report error and/or perform self-initiated onu-reset?
Holger Hildebrandt24d51952020-05-04 14:03:42 +00002497 }
2498 oltSerialNumber := parentDevice.SerialNumber
2499
2500 eventContext["pon-id"] = strconv.FormatUint(uint64(dh.pOnuIndication.IntfId), 10)
2501 eventContext["onu-id"] = strconv.FormatUint(uint64(dh.pOnuIndication.OnuId), 10)
2502 eventContext["serial-number"] = dh.device.SerialNumber
ssiddiqui1221d1a2021-02-15 11:12:51 +05302503 eventContext["olt-serial-number"] = oltSerialNumber
2504 eventContext["device-id"] = aDeviceID
2505 eventContext["registration-id"] = aDeviceID //py: string(device_id)??
ozgecanetsiaf0a76b62021-05-31 17:42:09 +03002506 eventContext["num-of-unis"] = strconv.Itoa(len(dh.uniEntityMap))
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002507 if deviceEntry := dh.GetOnuDeviceEntry(ctx, false); deviceEntry != nil {
2508 deviceEntry.MutexPersOnuConfig.RLock()
2509 eventContext["equipment-id"] = deviceEntry.SOnuPersistentData.PersEquipmentID
2510 deviceEntry.MutexPersOnuConfig.RUnlock()
2511 eventContext["software-version"] = deviceEntry.GetActiveImageVersion(ctx)
2512 deviceEntry.MutexPersOnuConfig.RLock()
2513 eventContext["vendor"] = deviceEntry.SOnuPersistentData.PersVendorID
2514 deviceEntry.MutexPersOnuConfig.RUnlock()
2515 eventContext["inactive-software-version"] = deviceEntry.GetInactiveImageVersion(ctx)
ozgecanetsiaf0a76b62021-05-31 17:42:09 +03002516 logger.Debugw(ctx, "prepare ONU_ACTIVATED event",
2517 log.Fields{"device-id": aDeviceID, "EventContext": eventContext})
2518 } else {
2519 logger.Errorw(ctx, "Failed to fetch device-entry. ONU_ACTIVATED event is not sent",
2520 log.Fields{"device-id": aDeviceID})
2521 return
2522 }
Holger Hildebrandt24d51952020-05-04 14:03:42 +00002523
2524 /* Populating device event body */
2525 de.Context = eventContext
Himani Chawla4d908332020-08-31 12:30:20 +05302526 de.ResourceId = aDeviceID
2527 if aOperState == voltha.OperStatus_ACTIVE {
Holger Hildebrandt24d51952020-05-04 14:03:42 +00002528 de.DeviceEventName = fmt.Sprintf("%s_%s", cOnuActivatedEvent, "RAISE_EVENT")
2529 de.Description = fmt.Sprintf("%s Event - %s - %s",
2530 cEventObjectType, cOnuActivatedEvent, "Raised")
2531 } else {
2532 de.DeviceEventName = fmt.Sprintf("%s_%s", cOnuActivatedEvent, "CLEAR_EVENT")
2533 de.Description = fmt.Sprintf("%s Event - %s - %s",
2534 cEventObjectType, cOnuActivatedEvent, "Cleared")
2535 }
2536 /* Send event to KAFKA */
dbainbri4d3a0dc2020-12-02 00:33:42 +00002537 if err := dh.EventProxy.SendDeviceEvent(ctx, &de, equipment, pon, raisedTs); err != nil {
2538 logger.Warnw(ctx, "could not send ONU_ACTIVATED event",
Himani Chawla4d908332020-08-31 12:30:20 +05302539 log.Fields{"device-id": aDeviceID, "error": err})
Holger Hildebrandt24d51952020-05-04 14:03:42 +00002540 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002541 logger.Debugw(ctx, "ctx, ONU_ACTIVATED event sent to KAFKA",
Himani Chawla4d908332020-08-31 12:30:20 +05302542 log.Fields{"device-id": aDeviceID, "with-EventName": de.DeviceEventName})
Holger Hildebrandt24d51952020-05-04 14:03:42 +00002543}
2544
Himani Chawla4d908332020-08-31 12:30:20 +05302545// createUniLockFsm initializes and runs the UniLock FSM to transfer the OMCI related commands for port lock/unlock
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002546func (dh *deviceHandler) createUniLockFsm(ctx context.Context, aAdminState bool, devEvent cmn.OnuDeviceEvent) {
2547 chLSFsm := make(chan cmn.Message, 2048)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00002548 var sFsmName string
Himani Chawla4d908332020-08-31 12:30:20 +05302549 if aAdminState {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002550 logger.Debugw(ctx, "createLockStateFSM", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00002551 sFsmName = "LockStateFSM"
2552 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002553 logger.Debugw(ctx, "createUnlockStateFSM", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00002554 sFsmName = "UnLockStateFSM"
2555 }
mpagenko3af1f032020-06-10 08:53:41 +00002556
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002557 pDevEntry := dh.GetOnuDeviceEntry(ctx, true)
mpagenko3af1f032020-06-10 08:53:41 +00002558 if pDevEntry == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002559 logger.Errorw(ctx, "No valid OnuDevice -aborting", log.Fields{"device-id": dh.DeviceID})
mpagenko3af1f032020-06-10 08:53:41 +00002560 return
2561 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002562 pLSFsm := uniprt.NewLockStateFsm(ctx, aAdminState, devEvent, sFsmName, dh, pDevEntry, chLSFsm)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00002563 if pLSFsm != nil {
Himani Chawla4d908332020-08-31 12:30:20 +05302564 if aAdminState {
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00002565 dh.pLockStateFsm = pLSFsm
2566 } else {
2567 dh.pUnlockStateFsm = pLSFsm
2568 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002569 dh.runUniLockFsm(ctx, aAdminState)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00002570 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002571 logger.Errorw(ctx, "LockStateFSM could not be created - abort!!", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00002572 }
2573}
2574
2575// runUniLockFsm starts the UniLock FSM to transfer the OMCI related commands for port lock/unlock
dbainbri4d3a0dc2020-12-02 00:33:42 +00002576func (dh *deviceHandler) runUniLockFsm(ctx context.Context, aAdminState bool) {
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00002577 /* Uni Port lock/unlock procedure -
2578 ***** should run via 'adminDone' state and generate the argument requested event *****
2579 */
2580 var pLSStatemachine *fsm.FSM
Himani Chawla4d908332020-08-31 12:30:20 +05302581 if aAdminState {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002582 pLSStatemachine = dh.pLockStateFsm.PAdaptFsm.PFsm
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00002583 //make sure the opposite FSM is not running and if so, terminate it as not relevant anymore
2584 if (dh.pUnlockStateFsm != nil) &&
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002585 (dh.pUnlockStateFsm.PAdaptFsm.PFsm.Current() != uniprt.UniStDisabled) {
2586 _ = dh.pUnlockStateFsm.PAdaptFsm.PFsm.Event(uniprt.UniEvReset)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00002587 }
2588 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002589 pLSStatemachine = dh.pUnlockStateFsm.PAdaptFsm.PFsm
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00002590 //make sure the opposite FSM is not running and if so, terminate it as not relevant anymore
2591 if (dh.pLockStateFsm != nil) &&
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002592 (dh.pLockStateFsm.PAdaptFsm.PFsm.Current() != uniprt.UniStDisabled) {
2593 _ = dh.pLockStateFsm.PAdaptFsm.PFsm.Event(uniprt.UniEvReset)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00002594 }
2595 }
2596 if pLSStatemachine != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002597 if pLSStatemachine.Is(uniprt.UniStDisabled) {
2598 if err := pLSStatemachine.Event(uniprt.UniEvStart); err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002599 logger.Warnw(ctx, "LockStateFSM: can't start", log.Fields{"err": err})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00002600 // maybe try a FSM reset and then again ... - TODO!!!
2601 } else {
2602 /***** LockStateFSM started */
dbainbri4d3a0dc2020-12-02 00:33:42 +00002603 logger.Debugw(ctx, "LockStateFSM started", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002604 "state": pLSStatemachine.Current(), "device-id": dh.DeviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00002605 }
2606 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002607 logger.Warnw(ctx, "wrong state of LockStateFSM - want: disabled", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002608 "have": pLSStatemachine.Current(), "device-id": dh.DeviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00002609 // maybe try a FSM reset and then again ... - TODO!!!
2610 }
2611 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002612 logger.Errorw(ctx, "LockStateFSM StateMachine invalid - cannot be executed!!", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00002613 // maybe try a FSM reset and then again ... - TODO!!!
2614 }
2615}
2616
mpagenko80622a52021-02-09 16:53:23 +00002617// createOnuUpgradeFsm initializes and runs the Onu Software upgrade FSM
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002618func (dh *deviceHandler) createOnuUpgradeFsm(ctx context.Context, apDevEntry *mib.OnuDeviceEntry, aDevEvent cmn.OnuDeviceEvent) error {
mpagenko80622a52021-02-09 16:53:23 +00002619 //in here lockUpgradeFsm is already locked
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002620 chUpgradeFsm := make(chan cmn.Message, 2048)
mpagenko80622a52021-02-09 16:53:23 +00002621 var sFsmName = "OnuSwUpgradeFSM"
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002622 logger.Debugw(ctx, "create OnuSwUpgradeFSM", log.Fields{"device-id": dh.DeviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00002623 if apDevEntry.PDevOmciCC == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002624 logger.Errorw(ctx, "no valid OnuDevice or omciCC - abort", log.Fields{"device-id": dh.DeviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00002625 return fmt.Errorf(fmt.Sprintf("no valid omciCC - abort for device-id: %s", dh.device.Id))
mpagenko80622a52021-02-09 16:53:23 +00002626 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002627 dh.pOnuUpradeFsm = swupg.NewOnuUpgradeFsm(ctx, dh, apDevEntry, apDevEntry.GetOnuDB(), aDevEvent,
mpagenko80622a52021-02-09 16:53:23 +00002628 sFsmName, chUpgradeFsm)
2629 if dh.pOnuUpradeFsm != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002630 pUpgradeStatemachine := dh.pOnuUpradeFsm.PAdaptFsm.PFsm
mpagenko80622a52021-02-09 16:53:23 +00002631 if pUpgradeStatemachine != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002632 if pUpgradeStatemachine.Is(swupg.UpgradeStDisabled) {
2633 if err := pUpgradeStatemachine.Event(swupg.UpgradeEvStart); err != nil {
mpagenko80622a52021-02-09 16:53:23 +00002634 logger.Errorw(ctx, "OnuSwUpgradeFSM: can't start", log.Fields{"err": err})
2635 // maybe try a FSM reset and then again ... - TODO!!!
2636 return fmt.Errorf(fmt.Sprintf("OnuSwUpgradeFSM could not be started for device-id: %s", dh.device.Id))
2637 }
2638 /***** LockStateFSM started */
mpagenko45586762021-10-01 08:30:22 +00002639 //reset the last stored upgrade states (which anyway should be don't care as long as the newly created FSM exists)
2640 (*dh.pLastUpgradeImageState).DownloadState = voltha.ImageState_DOWNLOAD_UNKNOWN
mpagenko38662d02021-08-11 09:45:19 +00002641 (*dh.pLastUpgradeImageState).Reason = voltha.ImageState_NO_ERROR
2642 (*dh.pLastUpgradeImageState).ImageState = voltha.ImageState_IMAGE_UNKNOWN
mpagenko80622a52021-02-09 16:53:23 +00002643 logger.Debugw(ctx, "OnuSwUpgradeFSM started", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002644 "state": pUpgradeStatemachine.Current(), "device-id": dh.DeviceID})
mpagenko80622a52021-02-09 16:53:23 +00002645 } else {
2646 logger.Errorw(ctx, "wrong state of OnuSwUpgradeFSM to start - want: disabled", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002647 "have": pUpgradeStatemachine.Current(), "device-id": dh.DeviceID})
mpagenko80622a52021-02-09 16:53:23 +00002648 // maybe try a FSM reset and then again ... - TODO!!!
2649 return fmt.Errorf(fmt.Sprintf("OnuSwUpgradeFSM could not be started for device-id: %s, wrong internal state", dh.device.Id))
2650 }
2651 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002652 logger.Errorw(ctx, "OnuSwUpgradeFSM internal FSM invalid - cannot be executed!!", log.Fields{"device-id": dh.DeviceID})
mpagenko80622a52021-02-09 16:53:23 +00002653 // maybe try a FSM reset and then again ... - TODO!!!
2654 return fmt.Errorf(fmt.Sprintf("OnuSwUpgradeFSM internal FSM could not be created for device-id: %s", dh.device.Id))
2655 }
2656 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002657 logger.Errorw(ctx, "OnuSwUpgradeFSM could not be created - abort", log.Fields{"device-id": dh.DeviceID})
mpagenko80622a52021-02-09 16:53:23 +00002658 return fmt.Errorf(fmt.Sprintf("OnuSwUpgradeFSM could not be created - abort for device-id: %s", dh.device.Id))
2659 }
2660 return nil
2661}
2662
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002663// RemoveOnuUpgradeFsm clears the Onu Software upgrade FSM
2664func (dh *deviceHandler) RemoveOnuUpgradeFsm(ctx context.Context, apImageState *voltha.ImageState) {
mpagenko80622a52021-02-09 16:53:23 +00002665 logger.Debugw(ctx, "remove OnuSwUpgradeFSM StateMachine", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002666 "device-id": dh.DeviceID})
mpagenko80622a52021-02-09 16:53:23 +00002667 dh.lockUpgradeFsm.Lock()
mpagenko80622a52021-02-09 16:53:23 +00002668 dh.pOnuUpradeFsm = nil //resource clearing is left to garbage collector
mpagenko38662d02021-08-11 09:45:19 +00002669 dh.pLastUpgradeImageState = apImageState
2670 dh.lockUpgradeFsm.Unlock()
2671 //signal upgradeFsm removed using non-blocking channel send
2672 select {
2673 case dh.upgradeFsmChan <- struct{}{}:
2674 default:
2675 logger.Debugw(ctx, "removed-UpgradeFsm signal not send on upgradeFsmChan (no receiver)", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002676 "device-id": dh.DeviceID})
mpagenko38662d02021-08-11 09:45:19 +00002677 }
mpagenko80622a52021-02-09 16:53:23 +00002678}
2679
mpagenko15ff4a52021-03-02 10:09:20 +00002680// checkOnOnuImageCommit verifies if the ONU is in some upgrade state that allows for image commit and if tries to commit
2681func (dh *deviceHandler) checkOnOnuImageCommit(ctx context.Context) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002682 pDevEntry := dh.GetOnuDeviceEntry(ctx, false)
mpagenko15ff4a52021-03-02 10:09:20 +00002683 if pDevEntry == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002684 logger.Errorw(ctx, "No valid OnuDevice -aborting checkOnOnuImageCommit", log.Fields{"device-id": dh.DeviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00002685 return
2686 }
2687
2688 dh.lockUpgradeFsm.RLock()
2689 defer dh.lockUpgradeFsm.RUnlock()
2690 if dh.pOnuUpradeFsm != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002691 pUpgradeStatemachine := dh.pOnuUpradeFsm.PAdaptFsm.PFsm
mpagenko15ff4a52021-03-02 10:09:20 +00002692 if pUpgradeStatemachine != nil {
2693 // commit is only processed in case out upgrade FSM indicates the according state (for automatic commit)
2694 // (some manual forced commit could do without)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002695 UpgradeState := pUpgradeStatemachine.Current()
2696 if (UpgradeState == swupg.UpgradeStWaitForCommit) ||
2697 (UpgradeState == swupg.UpgradeStRequestingActivate) {
2698 // also include UpgradeStRequestingActivate as it may be left in case the ActivateResponse just got lost
mpagenko183647c2021-06-08 15:25:04 +00002699 // here no need to update the upgrade image state to activated as the state will be immediately be set to committing
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002700 if pDevEntry.IsImageToBeCommitted(ctx, dh.pOnuUpradeFsm.InactiveImageMeID) {
mpagenko1f8e8822021-06-25 14:10:21 +00002701 activeImageID, errImg := pDevEntry.GetActiveImageMeID(ctx)
2702 if errImg != nil {
2703 logger.Errorw(ctx, "OnuSwUpgradeFSM abort - could not get active image after reboot",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002704 log.Fields{"device-id": dh.DeviceID})
mpagenko38662d02021-08-11 09:45:19 +00002705 dh.pOnuUpradeFsm.CancelProcessing(ctx, true, voltha.ImageState_CANCELLED_ON_ONU_STATE) //complete abort
mpagenko15ff4a52021-03-02 10:09:20 +00002706 return
2707 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002708 if activeImageID == dh.pOnuUpradeFsm.InactiveImageMeID {
2709 if (UpgradeState == swupg.UpgradeStRequestingActivate) && !dh.pOnuUpradeFsm.GetCommitFlag(ctx) {
mpagenko1f8e8822021-06-25 14:10:21 +00002710 // if FSM was waiting on activateResponse, new image is active, but FSM shall not commit, then:
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002711 if err := pUpgradeStatemachine.Event(swupg.UpgradeEvActivationDone); err != nil {
mpagenko1f8e8822021-06-25 14:10:21 +00002712 logger.Errorw(ctx, "OnuSwUpgradeFSM: can't call activate-done event", log.Fields{"err": err})
2713 return
2714 }
2715 logger.Debugw(ctx, "OnuSwUpgradeFSM activate-done after reboot", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002716 "state": UpgradeState, "device-id": dh.DeviceID})
mpagenko1f8e8822021-06-25 14:10:21 +00002717 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002718 //FSM in waitForCommit or (UpgradeStRequestingActivate [lost ActivateResp] and commit allowed)
2719 if err := pUpgradeStatemachine.Event(swupg.UpgradeEvCommitSw); err != nil {
mpagenko1f8e8822021-06-25 14:10:21 +00002720 logger.Errorw(ctx, "OnuSwUpgradeFSM: can't call commit event", log.Fields{"err": err})
2721 return
2722 }
2723 logger.Debugw(ctx, "OnuSwUpgradeFSM commit image requested", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002724 "state": UpgradeState, "device-id": dh.DeviceID})
mpagenko1f8e8822021-06-25 14:10:21 +00002725 }
2726 } else {
2727 logger.Errorw(ctx, "OnuSwUpgradeFSM waiting to commit/on ActivateResponse, but load did not start with expected image Id",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002728 log.Fields{"device-id": dh.DeviceID})
mpagenko38662d02021-08-11 09:45:19 +00002729 dh.pOnuUpradeFsm.CancelProcessing(ctx, true, voltha.ImageState_CANCELLED_ON_ONU_STATE) //complete abort
mpagenko1f8e8822021-06-25 14:10:21 +00002730 return
2731 }
mpagenko15ff4a52021-03-02 10:09:20 +00002732 } else {
2733 logger.Errorw(ctx, "OnuSwUpgradeFSM waiting to commit, but nothing to commit on ONU - abort upgrade",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002734 log.Fields{"device-id": dh.DeviceID})
mpagenko38662d02021-08-11 09:45:19 +00002735 dh.pOnuUpradeFsm.CancelProcessing(ctx, true, voltha.ImageState_CANCELLED_ON_ONU_STATE) //complete abort
mpagenko15ff4a52021-03-02 10:09:20 +00002736 return
2737 }
mpagenko183647c2021-06-08 15:25:04 +00002738 } else {
2739 //upgrade FSM is active but not waiting for commit: maybe because commit flag is not set
2740 // upgrade FSM is to be informed if the current active image is the one that was used in upgrade for the download
2741 if activeImageID, err := pDevEntry.GetActiveImageMeID(ctx); err == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002742 if dh.pOnuUpradeFsm.InactiveImageMeID == activeImageID {
mpagenko183647c2021-06-08 15:25:04 +00002743 logger.Debugw(ctx, "OnuSwUpgradeFSM image state set to activated", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002744 "state": pUpgradeStatemachine.Current(), "device-id": dh.DeviceID})
mpagenko38662d02021-08-11 09:45:19 +00002745 dh.pOnuUpradeFsm.SetImageStateActive(ctx)
mpagenko183647c2021-06-08 15:25:04 +00002746 }
2747 }
mpagenko15ff4a52021-03-02 10:09:20 +00002748 }
2749 }
2750 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002751 logger.Debugw(ctx, "no ONU image to be committed", log.Fields{"device-id": dh.DeviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00002752 }
2753}
2754
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002755//SetBackend provides a DB backend for the specified path on the existing KV client
2756func (dh *deviceHandler) SetBackend(ctx context.Context, aBasePathKvStore string) *db.Backend {
Matteo Scandolo127c59d2021-01-28 11:31:18 -08002757
2758 logger.Debugw(ctx, "SetKVStoreBackend", log.Fields{"IpTarget": dh.pOpenOnuAc.KVStoreAddress,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002759 "BasePathKvStore": aBasePathKvStore, "device-id": dh.DeviceID})
Girish Gowdra50e56422021-06-01 16:46:04 -07002760 // kvbackend := db.NewBackend(ctx, dh.pOpenOnuAc.KVStoreType, dh.pOpenOnuAc.KVStoreAddress, dh.pOpenOnuAc.KVStoreTimeout, aBasePathKvStore)
mpagenkoaf801632020-07-03 10:00:42 +00002761 kvbackend := &db.Backend{
2762 Client: dh.pOpenOnuAc.kvClient,
2763 StoreType: dh.pOpenOnuAc.KVStoreType,
2764 /* address config update acc. to [VOL-2736] */
Matteo Scandolo127c59d2021-01-28 11:31:18 -08002765 Address: dh.pOpenOnuAc.KVStoreAddress,
mpagenkoaf801632020-07-03 10:00:42 +00002766 Timeout: dh.pOpenOnuAc.KVStoreTimeout,
2767 PathPrefix: aBasePathKvStore}
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00002768
mpagenkoaf801632020-07-03 10:00:42 +00002769 return kvbackend
Holger Hildebrandt24d51952020-05-04 14:03:42 +00002770}
khenaidoo7d3c5582021-08-11 18:09:44 -04002771func (dh *deviceHandler) getFlowOfbFields(ctx context.Context, apFlowItem *of.OfpFlowStats, loMatchVlan *uint16,
Himani Chawla26e555c2020-08-31 12:30:20 +05302772 loAddPcp *uint8, loIPProto *uint32) {
mpagenkodff5dda2020-08-28 11:52:01 +00002773
mpagenkodff5dda2020-08-28 11:52:01 +00002774 for _, field := range flow.GetOfbFields(apFlowItem) {
2775 switch field.Type {
2776 case of.OxmOfbFieldTypes_OFPXMT_OFB_ETH_TYPE:
2777 {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002778 logger.Debugw(ctx, "flow type EthType", log.Fields{"device-id": dh.DeviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002779 "EthType": strconv.FormatInt(int64(field.GetEthType()), 16)})
2780 }
mpagenko01e726e2020-10-23 09:45:29 +00002781 /* TT related temporary workaround - should not be needed anymore
mpagenkodff5dda2020-08-28 11:52:01 +00002782 case of.OxmOfbFieldTypes_OFPXMT_OFB_IP_PROTO:
2783 {
Himani Chawla26e555c2020-08-31 12:30:20 +05302784 *loIPProto = field.GetIpProto()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002785 logger.Debugw("flow type IpProto", log.Fields{"device-id": dh.DeviceID,
Himani Chawla26e555c2020-08-31 12:30:20 +05302786 "IpProto": strconv.FormatInt(int64(*loIPProto), 16)})
2787 if *loIPProto == 2 {
mpagenkodff5dda2020-08-28 11:52:01 +00002788 // some workaround for TT workflow at proto == 2 (IGMP trap) -> ignore the flow
2789 // avoids installing invalid EVTOCD rule
mpagenko01e726e2020-10-23 09:45:29 +00002790 logger.Debugw("flow type IpProto 2: TT workaround: ignore flow",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002791 log.Fields{"device-id": dh.DeviceID})
Himani Chawla26e555c2020-08-31 12:30:20 +05302792 return
mpagenkodff5dda2020-08-28 11:52:01 +00002793 }
2794 }
mpagenko01e726e2020-10-23 09:45:29 +00002795 */
mpagenkodff5dda2020-08-28 11:52:01 +00002796 case of.OxmOfbFieldTypes_OFPXMT_OFB_VLAN_VID:
2797 {
Himani Chawla26e555c2020-08-31 12:30:20 +05302798 *loMatchVlan = uint16(field.GetVlanVid())
mpagenkodff5dda2020-08-28 11:52:01 +00002799 loMatchVlanMask := uint16(field.GetVlanVidMask())
Himani Chawla26e555c2020-08-31 12:30:20 +05302800 if !(*loMatchVlan == uint16(of.OfpVlanId_OFPVID_PRESENT) &&
mpagenkodff5dda2020-08-28 11:52:01 +00002801 loMatchVlanMask == uint16(of.OfpVlanId_OFPVID_PRESENT)) {
Himani Chawla26e555c2020-08-31 12:30:20 +05302802 *loMatchVlan = *loMatchVlan & 0xFFF // not transparent: copy only ID bits
mpagenkodff5dda2020-08-28 11:52:01 +00002803 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002804 logger.Debugw(ctx, "flow field type", log.Fields{"device-id": dh.DeviceID,
Himani Chawla26e555c2020-08-31 12:30:20 +05302805 "VID": strconv.FormatInt(int64(*loMatchVlan), 16)})
mpagenkodff5dda2020-08-28 11:52:01 +00002806 }
2807 case of.OxmOfbFieldTypes_OFPXMT_OFB_VLAN_PCP:
2808 {
Himani Chawla26e555c2020-08-31 12:30:20 +05302809 *loAddPcp = uint8(field.GetVlanPcp())
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002810 logger.Debugw(ctx, "flow field type", log.Fields{"device-id": dh.DeviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002811 "PCP": loAddPcp})
2812 }
2813 case of.OxmOfbFieldTypes_OFPXMT_OFB_UDP_DST:
2814 {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002815 logger.Debugw(ctx, "flow field type", log.Fields{"device-id": dh.DeviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002816 "UDP-DST": strconv.FormatInt(int64(field.GetUdpDst()), 16)})
2817 }
2818 case of.OxmOfbFieldTypes_OFPXMT_OFB_UDP_SRC:
2819 {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002820 logger.Debugw(ctx, "flow field type", log.Fields{"device-id": dh.DeviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002821 "UDP-SRC": strconv.FormatInt(int64(field.GetUdpSrc()), 16)})
2822 }
2823 case of.OxmOfbFieldTypes_OFPXMT_OFB_IPV4_DST:
2824 {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002825 logger.Debugw(ctx, "flow field type", log.Fields{"device-id": dh.DeviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002826 "IPv4-DST": field.GetIpv4Dst()})
2827 }
2828 case of.OxmOfbFieldTypes_OFPXMT_OFB_IPV4_SRC:
2829 {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002830 logger.Debugw(ctx, "flow field type", log.Fields{"device-id": dh.DeviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002831 "IPv4-SRC": field.GetIpv4Src()})
2832 }
2833 case of.OxmOfbFieldTypes_OFPXMT_OFB_METADATA:
2834 {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002835 logger.Debugw(ctx, "flow field type", log.Fields{"device-id": dh.DeviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002836 "Metadata": field.GetTableMetadata()})
2837 }
2838 /*
2839 default:
2840 {
2841 //all other entires ignored
2842 }
2843 */
2844 }
2845 } //for all OfbFields
Himani Chawla26e555c2020-08-31 12:30:20 +05302846}
mpagenkodff5dda2020-08-28 11:52:01 +00002847
khenaidoo7d3c5582021-08-11 18:09:44 -04002848func (dh *deviceHandler) getFlowActions(ctx context.Context, apFlowItem *of.OfpFlowStats, loSetPcp *uint8, loSetVlan *uint16) {
mpagenkodff5dda2020-08-28 11:52:01 +00002849 for _, action := range flow.GetActions(apFlowItem) {
2850 switch action.Type {
2851 /* not used:
2852 case of.OfpActionType_OFPAT_OUTPUT:
2853 {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002854 logger.Debugw("flow action type", log.Fields{"device-id": dh.DeviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002855 "Output": action.GetOutput()})
2856 }
2857 */
2858 case of.OfpActionType_OFPAT_PUSH_VLAN:
2859 {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002860 logger.Debugw(ctx, "flow action type", log.Fields{"device-id": dh.DeviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002861 "PushEthType": strconv.FormatInt(int64(action.GetPush().Ethertype), 16)})
2862 }
2863 case of.OfpActionType_OFPAT_SET_FIELD:
2864 {
2865 pActionSetField := action.GetSetField()
2866 if pActionSetField.Field.OxmClass != of.OfpOxmClass_OFPXMC_OPENFLOW_BASIC {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002867 logger.Warnw(ctx, "flow action SetField invalid OxmClass (ignored)", log.Fields{"device-id": dh.DeviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002868 "OxcmClass": pActionSetField.Field.OxmClass})
2869 }
2870 if pActionSetField.Field.GetOfbField().Type == of.OxmOfbFieldTypes_OFPXMT_OFB_VLAN_VID {
Himani Chawla26e555c2020-08-31 12:30:20 +05302871 *loSetVlan = uint16(pActionSetField.Field.GetOfbField().GetVlanVid())
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002872 logger.Debugw(ctx, "flow Set VLAN from SetField action", log.Fields{"device-id": dh.DeviceID,
Himani Chawla26e555c2020-08-31 12:30:20 +05302873 "SetVlan": strconv.FormatInt(int64(*loSetVlan), 16)})
mpagenkodff5dda2020-08-28 11:52:01 +00002874 } else if pActionSetField.Field.GetOfbField().Type == of.OxmOfbFieldTypes_OFPXMT_OFB_VLAN_PCP {
Himani Chawla26e555c2020-08-31 12:30:20 +05302875 *loSetPcp = uint8(pActionSetField.Field.GetOfbField().GetVlanPcp())
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002876 logger.Debugw(ctx, "flow Set PCP from SetField action", log.Fields{"device-id": dh.DeviceID,
Himani Chawla26e555c2020-08-31 12:30:20 +05302877 "SetPcp": *loSetPcp})
mpagenkodff5dda2020-08-28 11:52:01 +00002878 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002879 logger.Warnw(ctx, "flow action SetField invalid FieldType", log.Fields{"device-id": dh.DeviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002880 "Type": pActionSetField.Field.GetOfbField().Type})
2881 }
2882 }
2883 /*
2884 default:
2885 {
2886 //all other entires ignored
2887 }
2888 */
2889 }
2890 } //for all Actions
Himani Chawla26e555c2020-08-31 12:30:20 +05302891}
2892
2893//addFlowItemToUniPort parses the actual flow item to add it to the UniPort
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002894func (dh *deviceHandler) addFlowItemToUniPort(ctx context.Context, apFlowItem *of.OfpFlowStats, apUniPort *cmn.OnuUniPort,
ozgecanetsia82b91a62021-05-21 18:54:49 +03002895 apFlowMetaData *voltha.FlowMetadata) error {
Himani Chawla26e555c2020-08-31 12:30:20 +05302896 var loSetVlan uint16 = uint16(of.OfpVlanId_OFPVID_NONE) //noValidEntry
2897 var loMatchVlan uint16 = uint16(of.OfpVlanId_OFPVID_PRESENT) //reserved VLANID entry
2898 var loAddPcp, loSetPcp uint8
2899 var loIPProto uint32
2900 /* the TechProfileId is part of the flow Metadata - compare also comment within
2901 * OLT-Adapter:openolt_flowmgr.go
2902 * Metadata 8 bytes:
2903 * Most Significant 2 Bytes = Inner VLAN
2904 * Next 2 Bytes = Tech Profile ID(TPID)
2905 * Least Significant 4 Bytes = Port ID
2906 * Flow Metadata carries Tech-Profile (TP) ID and is mandatory in all
2907 * subscriber related flows.
2908 */
2909
dbainbri4d3a0dc2020-12-02 00:33:42 +00002910 metadata := flow.GetMetadataFromWriteMetadataAction(ctx, apFlowItem)
Himani Chawla26e555c2020-08-31 12:30:20 +05302911 if metadata == 0 {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002912 logger.Debugw(ctx, "flow-add invalid metadata - abort",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002913 log.Fields{"device-id": dh.DeviceID})
2914 return fmt.Errorf("flow-add invalid metadata: %s", dh.DeviceID)
Himani Chawla26e555c2020-08-31 12:30:20 +05302915 }
mpagenko551a4d42020-12-08 18:09:20 +00002916 loTpID := uint8(flow.GetTechProfileIDFromWriteMetaData(ctx, metadata))
mpagenko01e726e2020-10-23 09:45:29 +00002917 loCookie := apFlowItem.GetCookie()
2918 loCookieSlice := []uint64{loCookie}
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002919 logger.Debugw(ctx, "flow-add base indications", log.Fields{"device-id": dh.DeviceID,
mpagenko01e726e2020-10-23 09:45:29 +00002920 "TechProf-Id": loTpID, "cookie": loCookie})
Himani Chawla26e555c2020-08-31 12:30:20 +05302921
dbainbri4d3a0dc2020-12-02 00:33:42 +00002922 dh.getFlowOfbFields(ctx, apFlowItem, &loMatchVlan, &loAddPcp, &loIPProto)
mpagenko01e726e2020-10-23 09:45:29 +00002923 /* TT related temporary workaround - should not be needed anymore
Himani Chawla26e555c2020-08-31 12:30:20 +05302924 if loIPProto == 2 {
2925 // some workaround for TT workflow at proto == 2 (IGMP trap) -> ignore the flow
2926 // avoids installing invalid EVTOCD rule
mpagenko01e726e2020-10-23 09:45:29 +00002927 logger.Debugw("flow-add type IpProto 2: TT workaround: ignore flow",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002928 log.Fields{"device-id": dh.DeviceID})
Himani Chawla26e555c2020-08-31 12:30:20 +05302929 return nil
2930 }
mpagenko01e726e2020-10-23 09:45:29 +00002931 */
dbainbri4d3a0dc2020-12-02 00:33:42 +00002932 dh.getFlowActions(ctx, apFlowItem, &loSetPcp, &loSetVlan)
mpagenkodff5dda2020-08-28 11:52:01 +00002933
2934 if loSetVlan == uint16(of.OfpVlanId_OFPVID_NONE) && loMatchVlan != uint16(of.OfpVlanId_OFPVID_PRESENT) {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002935 logger.Errorw(ctx, "flow-add aborted - SetVlanId undefined, but MatchVid set", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002936 "device-id": dh.DeviceID, "UniPort": apUniPort.PortNo,
mpagenkodff5dda2020-08-28 11:52:01 +00002937 "set_vid": strconv.FormatInt(int64(loSetVlan), 16),
2938 "match_vid": strconv.FormatInt(int64(loMatchVlan), 16)})
2939 //TODO!!: Use DeviceId within the error response to rwCore
2940 // likewise also in other error response cases to calling components as requested in [VOL-3458]
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002941 return fmt.Errorf("flow-add Set/Match VlanId inconsistent: %s", dh.DeviceID)
mpagenkodff5dda2020-08-28 11:52:01 +00002942 }
2943 if loSetVlan == uint16(of.OfpVlanId_OFPVID_NONE) && loMatchVlan == uint16(of.OfpVlanId_OFPVID_PRESENT) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002944 logger.Debugw(ctx, "flow-add vlan-any/copy", log.Fields{"device-id": dh.DeviceID})
mpagenkodff5dda2020-08-28 11:52:01 +00002945 loSetVlan = loMatchVlan //both 'transparent' (copy any)
2946 } else {
2947 //looks like OMCI value 4097 (copyFromOuter - for Uni double tagged) is not supported here
2948 if loSetVlan != uint16(of.OfpVlanId_OFPVID_PRESENT) {
2949 // not set to transparent
Himani Chawla26e555c2020-08-31 12:30:20 +05302950 loSetVlan &= 0x0FFF //mask VID bits as prerequisite for vlanConfigFsm
mpagenkodff5dda2020-08-28 11:52:01 +00002951 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002952 logger.Debugw(ctx, "flow-add vlan-set", log.Fields{"device-id": dh.DeviceID})
mpagenkodff5dda2020-08-28 11:52:01 +00002953 }
mpagenko9a304ea2020-12-16 15:54:01 +00002954
ozgecanetsia82b91a62021-05-21 18:54:49 +03002955 var meter *voltha.OfpMeterConfig
2956 if apFlowMetaData != nil {
2957 meter = apFlowMetaData.Meters[0]
2958 }
mpagenkobc4170a2021-08-17 16:42:10 +00002959 //mutex protection as the update_flow rpc maybe running concurrently for different flows, perhaps also activities
2960 // must be set including the execution of createVlanFilterFsm() to avoid unintended creation of FSM's
2961 // when different rules are requested concurrently for the same uni
2962 // (also vlan persistency data does not support multiple FSM's on the same UNI correctly!)
2963 dh.lockVlanAdd.Lock() //prevent multiple add activities to start in parallel
2964 dh.lockVlanConfig.RLock() //read protection on UniVlanConfigFsmMap (removeFlowItemFromUniPort)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002965 logger.Debugw(ctx, "flow-add got lock", log.Fields{"device-id": dh.DeviceID, "tpID": loTpID, "uniID": apUniPort.UniID})
2966 if _, exist := dh.UniVlanConfigFsmMap[apUniPort.UniID]; exist {
mpagenkobc4170a2021-08-17 16:42:10 +00002967 //SetUniFlowParams() may block on some rule that is suspended-to-add
2968 // in order to allow for according flow removal lockVlanConfig may only be used with RLock here
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002969 err := dh.UniVlanConfigFsmMap[apUniPort.UniID].SetUniFlowParams(ctx, loTpID, loCookieSlice,
ozgecanetsia82b91a62021-05-21 18:54:49 +03002970 loMatchVlan, loSetVlan, loSetPcp, false, meter)
mpagenkobc4170a2021-08-17 16:42:10 +00002971 dh.lockVlanConfig.RUnlock()
2972 dh.lockVlanAdd.Unlock() //re-admit new Add-flow-processing
mpagenkof1fc3862021-02-16 10:09:52 +00002973 return err
mpagenkodff5dda2020-08-28 11:52:01 +00002974 }
mpagenkobc4170a2021-08-17 16:42:10 +00002975 dh.lockVlanConfig.RUnlock()
2976 dh.lockVlanConfig.Lock() //createVlanFilterFsm should always be a non-blocking operation and requires r+w lock
mpagenko7d14de12021-07-27 08:31:56 +00002977 err := dh.createVlanFilterFsm(ctx, apUniPort, loTpID, loCookieSlice,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002978 loMatchVlan, loSetVlan, loSetPcp, cmn.OmciVlanFilterAddDone, false, meter)
mpagenko7d14de12021-07-27 08:31:56 +00002979 dh.lockVlanConfig.Unlock()
mpagenkobc4170a2021-08-17 16:42:10 +00002980 dh.lockVlanAdd.Unlock() //re-admit new Add-flow-processing
mpagenko7d14de12021-07-27 08:31:56 +00002981 return err
mpagenko01e726e2020-10-23 09:45:29 +00002982}
2983
2984//removeFlowItemFromUniPort parses the actual flow item to remove it from the UniPort
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002985func (dh *deviceHandler) removeFlowItemFromUniPort(ctx context.Context, apFlowItem *of.OfpFlowStats, apUniPort *cmn.OnuUniPort) error {
mpagenko01e726e2020-10-23 09:45:29 +00002986 //optimization and assumption: the flow cookie uniquely identifies the flow and with that the internal rule
2987 //hence only the cookie is used here to find the relevant flow and possibly remove the rule
2988 //no extra check is done on the rule parameters
2989 //accordingly the removal is done only once - for the first found flow with that cookie, even though
2990 // at flow creation is not assured, that the same cookie is not configured for different flows - just assumed
2991 //additionally it is assumed here, that removal can only be done for one cookie per flow in a sequence (different
2992 // from addFlow - where at reconcilement multiple cookies per flow ) can be configured in one sequence)
mpagenkofc4f56e2020-11-04 17:17:49 +00002993 // - some possible 'delete-all' sequence would have to be implemented separately (where the cookies are don't care anyway)
mpagenko01e726e2020-10-23 09:45:29 +00002994 loCookie := apFlowItem.GetCookie()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002995 logger.Debugw(ctx, "flow-remove base indications", log.Fields{"device-id": dh.DeviceID, "cookie": loCookie})
mpagenko01e726e2020-10-23 09:45:29 +00002996
2997 /* TT related temporary workaround - should not be needed anymore
2998 for _, field := range flow.GetOfbFields(apFlowItem) {
2999 if field.Type == of.OxmOfbFieldTypes_OFPXMT_OFB_IP_PROTO {
3000 loIPProto := field.GetIpProto()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003001 logger.Debugw(ctx, "flow type IpProto", log.Fields{"device-id": dh.DeviceID,
mpagenko01e726e2020-10-23 09:45:29 +00003002 "IpProto": strconv.FormatInt(int64(loIPProto), 16)})
3003 if loIPProto == 2 {
3004 // some workaround for TT workflow on proto == 2 (IGMP trap) -> the flow was not added, no need to remove
mpagenko551a4d42020-12-08 18:09:20 +00003005 logger.Debugw(ctx, "flow-remove type IpProto 2: TT workaround: ignore flow",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003006 log.Fields{"device-id": dh.DeviceID})
mpagenko01e726e2020-10-23 09:45:29 +00003007 return nil
3008 }
3009 }
3010 } //for all OfbFields
3011 */
3012
mpagenko9a304ea2020-12-16 15:54:01 +00003013 //mutex protection as the update_flow rpc maybe running concurrently for different flows, perhaps also activities
mpagenkof1fc3862021-02-16 10:09:52 +00003014 dh.lockVlanConfig.RLock()
3015 defer dh.lockVlanConfig.RUnlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003016 logger.Debugw(ctx, "flow-remove got RLock", log.Fields{"device-id": dh.DeviceID, "uniID": apUniPort.UniID})
3017 if _, exist := dh.UniVlanConfigFsmMap[apUniPort.UniID]; exist {
3018 return dh.UniVlanConfigFsmMap[apUniPort.UniID].RemoveUniFlowParams(ctx, loCookie)
mpagenko01e726e2020-10-23 09:45:29 +00003019 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00003020 logger.Debugw(ctx, "flow-remove called, but no flow is configured (no VlanConfigFsm, flow already removed) ",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003021 log.Fields{"device-id": dh.DeviceID})
mpagenko01e726e2020-10-23 09:45:29 +00003022 //but as we regard the flow as not existing = removed we respond just ok
mpagenkofc4f56e2020-11-04 17:17:49 +00003023 // and treat the reason accordingly (which in the normal removal procedure is initiated by the FSM)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003024 go dh.DeviceProcStatusUpdate(ctx, cmn.OmciVlanFilterRemDone)
mpagenkofc4f56e2020-11-04 17:17:49 +00003025
mpagenko01e726e2020-10-23 09:45:29 +00003026 return nil
mpagenkodff5dda2020-08-28 11:52:01 +00003027}
3028
Himani Chawla26e555c2020-08-31 12:30:20 +05303029// createVlanFilterFsm initializes and runs the VlanFilter FSM to transfer OMCI related VLAN config
mpagenko9a304ea2020-12-16 15:54:01 +00003030// if this function is called from possibly concurrent processes it must be mutex-protected from the caller!
mpagenko7d14de12021-07-27 08:31:56 +00003031// precondition: dh.lockVlanConfig is locked by the caller!
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003032func (dh *deviceHandler) createVlanFilterFsm(ctx context.Context, apUniPort *cmn.OnuUniPort, aTpID uint8, aCookieSlice []uint64,
3033 aMatchVlan uint16, aSetVlan uint16, aSetPcp uint8, aDevEvent cmn.OnuDeviceEvent, lastFlowToReconcile bool, aMeter *voltha.OfpMeterConfig) error {
3034 chVlanFilterFsm := make(chan cmn.Message, 2048)
mpagenkodff5dda2020-08-28 11:52:01 +00003035
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003036 pDevEntry := dh.GetOnuDeviceEntry(ctx, true)
mpagenkodff5dda2020-08-28 11:52:01 +00003037 if pDevEntry == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003038 logger.Errorw(ctx, "No valid OnuDevice -aborting", log.Fields{"device-id": dh.DeviceID})
3039 return fmt.Errorf("no valid OnuDevice for device-id %x - aborting", dh.DeviceID)
mpagenkodff5dda2020-08-28 11:52:01 +00003040 }
3041
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003042 pVlanFilterFsm := avcfg.NewUniVlanConfigFsm(ctx, dh, pDevEntry, pDevEntry.PDevOmciCC, apUniPort, dh.pOnuTP,
3043 pDevEntry.GetOnuDB(), aTpID, aDevEvent, "UniVlanConfigFsm", chVlanFilterFsm,
ozgecanetsia82b91a62021-05-21 18:54:49 +03003044 dh.pOpenOnuAc.AcceptIncrementalEvto, aCookieSlice, aMatchVlan, aSetVlan, aSetPcp, lastFlowToReconcile, aMeter)
mpagenkodff5dda2020-08-28 11:52:01 +00003045 if pVlanFilterFsm != nil {
mpagenko7d14de12021-07-27 08:31:56 +00003046 //dh.lockVlanConfig is locked (by caller) throughout the state transition to 'starting'
3047 // to prevent unintended (ignored) events to be sent there (from parallel processing)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003048 dh.UniVlanConfigFsmMap[apUniPort.UniID] = pVlanFilterFsm
3049 pVlanFilterStatemachine := pVlanFilterFsm.PAdaptFsm.PFsm
mpagenkodff5dda2020-08-28 11:52:01 +00003050 if pVlanFilterStatemachine != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003051 if pVlanFilterStatemachine.Is(avcfg.VlanStDisabled) {
3052 if err := pVlanFilterStatemachine.Event(avcfg.VlanEvStart); err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00003053 logger.Warnw(ctx, "UniVlanConfigFsm: can't start", log.Fields{"err": err})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003054 return fmt.Errorf("can't start UniVlanConfigFsm for device-id %x", dh.DeviceID)
mpagenkodff5dda2020-08-28 11:52:01 +00003055 }
Himani Chawla26e555c2020-08-31 12:30:20 +05303056 /***** UniVlanConfigFsm started */
dbainbri4d3a0dc2020-12-02 00:33:42 +00003057 logger.Debugw(ctx, "UniVlanConfigFsm started", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003058 "state": pVlanFilterStatemachine.Current(), "device-id": dh.DeviceID,
3059 "UniPort": apUniPort.PortNo})
mpagenkodff5dda2020-08-28 11:52:01 +00003060 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +00003061 logger.Warnw(ctx, "wrong state of UniVlanConfigFsm - want: disabled", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003062 "have": pVlanFilterStatemachine.Current(), "device-id": dh.DeviceID})
3063 return fmt.Errorf("uniVlanConfigFsm not in expected disabled state for device-id %x", dh.DeviceID)
mpagenkodff5dda2020-08-28 11:52:01 +00003064 }
3065 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +00003066 logger.Errorw(ctx, "UniVlanConfigFsm StateMachine invalid - cannot be executed!!", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003067 "device-id": dh.DeviceID})
3068 return fmt.Errorf("uniVlanConfigFsm invalid for device-id %x", dh.DeviceID)
mpagenkodff5dda2020-08-28 11:52:01 +00003069 }
3070 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +00003071 logger.Errorw(ctx, "UniVlanConfigFsm could not be created - abort!!", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003072 "device-id": dh.DeviceID, "UniPort": apUniPort.PortNo})
3073 return fmt.Errorf("uniVlanConfigFsm could not be created for device-id %x", dh.DeviceID)
mpagenkodff5dda2020-08-28 11:52:01 +00003074 }
3075 return nil
3076}
3077
mpagenkofc4f56e2020-11-04 17:17:49 +00003078//VerifyVlanConfigRequest checks on existence of a given uniPort
3079// and starts verification of flow config based on that
mpagenko551a4d42020-12-08 18:09:20 +00003080func (dh *deviceHandler) VerifyVlanConfigRequest(ctx context.Context, aUniID uint8, aTpID uint8) {
mpagenkofc4f56e2020-11-04 17:17:49 +00003081 //ensure that the given uniID is available (configured) in the UniPort class (used for OMCI entities)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003082 var pCurrentUniPort *cmn.OnuUniPort
mpagenkofc4f56e2020-11-04 17:17:49 +00003083 for _, uniPort := range dh.uniEntityMap {
3084 // only if this port is validated for operState transfer
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003085 if uniPort.UniID == uint8(aUniID) {
mpagenkofc4f56e2020-11-04 17:17:49 +00003086 pCurrentUniPort = uniPort
3087 break //found - end search loop
3088 }
3089 }
3090 if pCurrentUniPort == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00003091 logger.Debugw(ctx, "VerifyVlanConfig aborted: requested uniID not found in PortDB",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003092 log.Fields{"device-id": dh.DeviceID, "uni-id": aUniID})
mpagenkofc4f56e2020-11-04 17:17:49 +00003093 return
3094 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003095 dh.VerifyUniVlanConfigRequest(ctx, pCurrentUniPort, aTpID)
mpagenkofc4f56e2020-11-04 17:17:49 +00003096}
3097
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003098//VerifyUniVlanConfigRequest checks on existence of flow configuration and starts it accordingly
3099func (dh *deviceHandler) VerifyUniVlanConfigRequest(ctx context.Context, apUniPort *cmn.OnuUniPort, aTpID uint8) {
mpagenkodff5dda2020-08-28 11:52:01 +00003100 //TODO!! verify and start pending flow configuration
3101 //some pending config request my exist in case the UniVlanConfig FSM was already started - with internal data -
3102 //but execution was set to 'on hold' as first the TechProfile config had to be applied
mpagenkof1fc3862021-02-16 10:09:52 +00003103
3104 dh.lockVlanConfig.RLock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003105 if pVlanFilterFsm, exist := dh.UniVlanConfigFsmMap[apUniPort.UniID]; exist {
mpagenkof1fc3862021-02-16 10:09:52 +00003106 dh.lockVlanConfig.RUnlock()
mpagenkodff5dda2020-08-28 11:52:01 +00003107 //VlanFilterFsm exists and was already started (assumed to wait for TechProfile execution here)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003108 pVlanFilterStatemachine := pVlanFilterFsm.PAdaptFsm.PFsm
mpagenkodff5dda2020-08-28 11:52:01 +00003109 if pVlanFilterStatemachine != nil {
mpagenko551a4d42020-12-08 18:09:20 +00003110 //if this was an event of the TP processing that was waited for in the VlanFilterFsm
3111 if pVlanFilterFsm.GetWaitingTpID() == aTpID {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003112 if pVlanFilterStatemachine.Is(avcfg.VlanStWaitingTechProf) {
3113 if err := pVlanFilterStatemachine.Event(avcfg.VlanEvContinueConfig); err != nil {
mpagenko551a4d42020-12-08 18:09:20 +00003114 logger.Warnw(ctx, "UniVlanConfigFsm: can't continue processing", log.Fields{"err": err,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003115 "device-id": dh.DeviceID, "UniPort": apUniPort.PortNo})
mpagenko551a4d42020-12-08 18:09:20 +00003116 } else {
3117 /***** UniVlanConfigFsm continued */
3118 logger.Debugw(ctx, "UniVlanConfigFsm continued", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003119 "state": pVlanFilterStatemachine.Current(), "device-id": dh.DeviceID,
3120 "UniPort": apUniPort.PortNo})
mpagenko551a4d42020-12-08 18:09:20 +00003121 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003122 } else if pVlanFilterStatemachine.Is(avcfg.VlanStIncrFlowWaitTP) {
3123 if err := pVlanFilterStatemachine.Event(avcfg.VlanEvIncrFlowConfig); err != nil {
mpagenko551a4d42020-12-08 18:09:20 +00003124 logger.Warnw(ctx, "UniVlanConfigFsm: can't continue processing", log.Fields{"err": err,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003125 "device-id": dh.DeviceID, "UniPort": apUniPort.PortNo})
mpagenko551a4d42020-12-08 18:09:20 +00003126 } else {
3127 /***** UniVlanConfigFsm continued */
3128 logger.Debugw(ctx, "UniVlanConfigFsm continued with incremental flow", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003129 "state": pVlanFilterStatemachine.Current(), "device-id": dh.DeviceID,
3130 "UniPort": apUniPort.PortNo})
mpagenko551a4d42020-12-08 18:09:20 +00003131 }
mpagenkodff5dda2020-08-28 11:52:01 +00003132 } else {
mpagenko551a4d42020-12-08 18:09:20 +00003133 logger.Debugw(ctx, "no state of UniVlanConfigFsm to be continued", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003134 "have": pVlanFilterStatemachine.Current(), "device-id": dh.DeviceID,
3135 "UniPort": apUniPort.PortNo})
mpagenkodff5dda2020-08-28 11:52:01 +00003136 }
3137 } else {
mpagenko551a4d42020-12-08 18:09:20 +00003138 logger.Debugw(ctx, "TechProfile Ready event for TpId that was not waited for in the VlanConfigFsm - continue waiting", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003139 "state": pVlanFilterStatemachine.Current(), "device-id": dh.DeviceID,
3140 "UniPort": apUniPort.PortNo, "techprofile-id (done)": aTpID})
mpagenkodff5dda2020-08-28 11:52:01 +00003141 }
3142 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +00003143 logger.Debugw(ctx, "UniVlanConfigFsm StateMachine does not exist, no flow processing", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003144 "device-id": dh.DeviceID, "UniPort": apUniPort.PortNo})
mpagenkodff5dda2020-08-28 11:52:01 +00003145 }
mpagenkof1fc3862021-02-16 10:09:52 +00003146 } else {
3147 dh.lockVlanConfig.RUnlock()
3148 }
mpagenkodff5dda2020-08-28 11:52:01 +00003149}
3150
3151//RemoveVlanFilterFsm deletes the stored pointer to the VlanConfigFsm
3152// intention is to provide this method to be called from VlanConfigFsm itself, when resources (and methods!) are cleaned up
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003153func (dh *deviceHandler) RemoveVlanFilterFsm(ctx context.Context, apUniPort *cmn.OnuUniPort) {
dbainbri4d3a0dc2020-12-02 00:33:42 +00003154 logger.Debugw(ctx, "remove UniVlanConfigFsm StateMachine", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003155 "device-id": dh.DeviceID, "uniPort": apUniPort.PortNo})
mpagenkodff5dda2020-08-28 11:52:01 +00003156 //save to do, even if entry dows not exist
mpagenkof1fc3862021-02-16 10:09:52 +00003157 dh.lockVlanConfig.Lock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003158 delete(dh.UniVlanConfigFsmMap, apUniPort.UniID)
mpagenkof1fc3862021-02-16 10:09:52 +00003159 dh.lockVlanConfig.Unlock()
mpagenkodff5dda2020-08-28 11:52:01 +00003160}
Holger Hildebrandt47555e72020-09-21 11:07:24 +00003161
mpagenkof1fc3862021-02-16 10:09:52 +00003162//startWritingOnuDataToKvStore initiates the KVStore write of ONU persistent data
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003163func (dh *deviceHandler) startWritingOnuDataToKvStore(ctx context.Context, aPDevEntry *mib.OnuDeviceEntry) error {
mpagenkof1fc3862021-02-16 10:09:52 +00003164 dh.mutexKvStoreContext.Lock() //this write routine may (could) be called with the same context,
3165 defer dh.mutexKvStoreContext.Unlock() //this write routine may (could) be called with the same context,
3166 // obviously then parallel processing on the cancel must be avoided
3167 // deadline context to ensure completion of background routines waited for
3168 //20200721: 10s proved to be less in 8*8 ONU test on local vbox machine with debug, might be further adapted
3169 deadline := time.Now().Add(dh.pOpenOnuAc.maxTimeoutInterAdapterComm) //allowed run time to finish before execution
3170 dctx, cancel := context.WithDeadline(context.Background(), deadline)
3171
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003172 aPDevEntry.ResetKvProcessingErrorIndication()
mpagenkof1fc3862021-02-16 10:09:52 +00003173 var wg sync.WaitGroup
3174 wg.Add(1) // for the 1 go routine to finish
3175
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003176 go aPDevEntry.UpdateOnuKvStore(log.WithSpanFromContext(dctx, ctx), &wg)
mpagenkof1fc3862021-02-16 10:09:52 +00003177 dh.waitForCompletion(ctx, cancel, &wg, "UpdateKvStore") //wait for background process to finish
3178
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003179 return aPDevEntry.GetKvProcessingErrorIndication()
mpagenkof1fc3862021-02-16 10:09:52 +00003180}
3181
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003182//StorePersUniFlowConfig updates local storage of OnuUniFlowConfig and writes it into kv-store afterwards to have it
Holger Hildebrandt47555e72020-09-21 11:07:24 +00003183//available for potential reconcilement
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003184func (dh *deviceHandler) StorePersUniFlowConfig(ctx context.Context, aUniID uint8,
3185 aUniVlanFlowParams *[]cmn.UniVlanFlowParams, aWriteToKvStore bool) error {
Holger Hildebrandt47555e72020-09-21 11:07:24 +00003186
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003187 if dh.IsReconciling() {
3188 logger.Debugw(ctx, "reconciling - don't store persistent UniFlowConfig", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +00003189 return nil
3190 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003191 logger.Debugw(ctx, "Store or clear persistent UniFlowConfig", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +00003192
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003193 pDevEntry := dh.GetOnuDeviceEntry(ctx, true)
Holger Hildebrandt47555e72020-09-21 11:07:24 +00003194 if pDevEntry == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003195 logger.Errorw(ctx, "No valid OnuDevice - aborting", log.Fields{"device-id": dh.DeviceID})
3196 return fmt.Errorf("no valid OnuDevice: %s", dh.DeviceID)
Holger Hildebrandt47555e72020-09-21 11:07:24 +00003197 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003198 pDevEntry.UpdateOnuUniFlowConfig(aUniID, aUniVlanFlowParams)
Holger Hildebrandt47555e72020-09-21 11:07:24 +00003199
mpagenkof1fc3862021-02-16 10:09:52 +00003200 if aWriteToKvStore {
3201 return dh.startWritingOnuDataToKvStore(ctx, pDevEntry)
3202 }
3203 return nil
Holger Hildebrandt47555e72020-09-21 11:07:24 +00003204}
3205
dbainbri4d3a0dc2020-12-02 00:33:42 +00003206func (dh *deviceHandler) waitForCompletion(ctx context.Context, cancel context.CancelFunc, wg *sync.WaitGroup, aCallerIdent string) {
Holger Hildebrandt47555e72020-09-21 11:07:24 +00003207 defer cancel() //ensure termination of context (may be pro forma)
3208 wg.Wait()
dbainbri4d3a0dc2020-12-02 00:33:42 +00003209 logger.Debugw(ctx, "WaitGroup processing completed", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003210 "device-id": dh.DeviceID, "called from": aCallerIdent})
Holger Hildebrandt47555e72020-09-21 11:07:24 +00003211}
3212
dbainbri4d3a0dc2020-12-02 00:33:42 +00003213func (dh *deviceHandler) deviceReasonUpdate(ctx context.Context, deviceReason uint8, notifyCore bool) error {
Holger Hildebrandt80129db2020-11-23 10:49:32 +00003214
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003215 dh.SetDeviceReason(deviceReason)
Holger Hildebrandt3a644642020-12-02 09:46:18 +00003216 if notifyCore {
Holger Hildebrandt80129db2020-11-23 10:49:32 +00003217 //TODO with VOL-3045/VOL-3046: return the error and stop further processing at calling position
khenaidoo7d3c5582021-08-11 18:09:44 -04003218 if err := dh.updateDeviceReasonInCore(ctx, &ic.DeviceReason{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003219 DeviceId: dh.DeviceID,
3220 Reason: cmn.DeviceReasonMap[deviceReason],
khenaidoo7d3c5582021-08-11 18:09:44 -04003221 }); err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00003222 logger.Errorf(ctx, "DeviceReasonUpdate error: %s",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003223 log.Fields{"device-id": dh.DeviceID, "error": err}, cmn.DeviceReasonMap[deviceReason])
Holger Hildebrandt80129db2020-11-23 10:49:32 +00003224 return err
3225 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003226 logger.Infof(ctx, "DeviceReasonUpdate success: %s - device-id: %s", cmn.DeviceReasonMap[deviceReason], dh.DeviceID)
Holger Hildebrandt80129db2020-11-23 10:49:32 +00003227 return nil
3228 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003229 logger.Infof(ctx, "Don't notify core about DeviceReasonUpdate: %s - device-id: %s", cmn.DeviceReasonMap[deviceReason], dh.DeviceID)
Holger Hildebrandt3a644642020-12-02 09:46:18 +00003230 return nil
3231}
3232
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003233func (dh *deviceHandler) StorePersistentData(ctx context.Context) error {
3234 pDevEntry := dh.GetOnuDeviceEntry(ctx, true)
Holger Hildebrandt3a644642020-12-02 09:46:18 +00003235 if pDevEntry == nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003236 logger.Warnw(ctx, "No valid OnuDevice", log.Fields{"device-id": dh.DeviceID})
3237 return fmt.Errorf("no valid OnuDevice: %s", dh.DeviceID)
Holger Hildebrandt3a644642020-12-02 09:46:18 +00003238 }
mpagenkof1fc3862021-02-16 10:09:52 +00003239 return dh.startWritingOnuDataToKvStore(ctx, pDevEntry)
Holger Hildebrandt80129db2020-11-23 10:49:32 +00003240}
3241
ozgecanetsiab5000ef2020-11-27 14:38:20 +03003242// getUniPortMEEntityID takes uniPortNo as the input and returns the Entity ID corresponding to this UNI-G ME Instance
ozgecanetsia72e1c9f2021-05-26 17:26:29 +03003243// nolint: unused
ozgecanetsiab5000ef2020-11-27 14:38:20 +03003244func (dh *deviceHandler) getUniPortMEEntityID(uniPortNo uint32) (uint16, error) {
3245 dh.lockDevice.RLock()
3246 defer dh.lockDevice.RUnlock()
3247 if uniPort, ok := dh.uniEntityMap[uniPortNo]; ok {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003248 return uniPort.EntityID, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03003249 }
3250 return 0, errors.New("error-fetching-uni-port")
3251}
Girish Gowdrae09a6202021-01-12 18:10:59 -08003252
3253// updatePmConfig updates the pm metrics config.
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003254func (dh *deviceHandler) updatePmConfig(ctx context.Context, pmConfigs *voltha.PmConfigs) error {
3255 var errorsList []error
3256 logger.Infow(ctx, "update-pm-config", log.Fields{"device-id": dh.device.Id, "new-pm-configs": pmConfigs, "old-pm-config": dh.pmConfigs})
Girish Gowdrae09a6202021-01-12 18:10:59 -08003257
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003258 errorsList = append(dh.handleGlobalPmConfigUpdates(ctx, pmConfigs), errorsList...)
3259 errorsList = append(dh.handleGroupPmConfigUpdates(ctx, pmConfigs), errorsList...)
3260 errorsList = append(dh.handleStandalonePmConfigUpdates(ctx, pmConfigs), errorsList...)
3261
3262 // Note that if more than one pm config field is updated in a given call, it is possible that partial pm config is handled
3263 // successfully.
3264 // TODO: Although it is possible to revert to old config in case of partial failure, the code becomes quite complex. Needs more investigation
3265 // Is it possible the rw-core reverts to old config on partial failure but adapter retains a partial new config?
3266 if len(errorsList) > 0 {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003267 logger.Errorw(ctx, "one-or-more-pm-config-failed", log.Fields{"device-id": dh.DeviceID, "pmConfig": dh.pmConfigs})
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003268 return fmt.Errorf("errors-handling-one-or-more-pm-config, errors:%v", errorsList)
Girish Gowdrae09a6202021-01-12 18:10:59 -08003269 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003270 logger.Infow(ctx, "pm-config-updated", log.Fields{"device-id": dh.DeviceID, "pmConfig": dh.pmConfigs})
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003271 return nil
Girish Gowdrae09a6202021-01-12 18:10:59 -08003272}
3273
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003274func (dh *deviceHandler) handleGlobalPmConfigUpdates(ctx context.Context, pmConfigs *voltha.PmConfigs) []error {
3275 var err error
3276 var errorsList []error
Girish Gowdra36ccf7d2021-02-25 20:42:51 -08003277 logger.Infow(ctx, "handling-global-pm-config-params - start", log.Fields{"device-id": dh.device.Id})
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003278
3279 if pmConfigs.DefaultFreq != dh.pmConfigs.DefaultFreq {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003280 if err = dh.pOnuMetricsMgr.UpdateDefaultFrequency(ctx, pmConfigs); err != nil {
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003281 errorsList = append(errorsList, err)
3282 }
3283 }
Girish Gowdra36ccf7d2021-02-25 20:42:51 -08003284 logger.Infow(ctx, "handling-global-pm-config-params - done", log.Fields{"device-id": dh.device.Id})
mpagenko15ff4a52021-03-02 10:09:20 +00003285
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003286 return errorsList
3287}
3288
3289func (dh *deviceHandler) handleGroupPmConfigUpdates(ctx context.Context, pmConfigs *voltha.PmConfigs) []error {
3290 var err error
3291 var errorsList []error
Girish Gowdra36ccf7d2021-02-25 20:42:51 -08003292 logger.Debugw(ctx, "handling-group-pm-config-params - start", log.Fields{"device-id": dh.device.Id})
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003293 // Check if group metric related config is updated
3294 for _, v := range pmConfigs.Groups {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003295 dh.pOnuMetricsMgr.OnuMetricsManagerLock.RLock()
3296 m, ok := dh.pOnuMetricsMgr.GroupMetricMap[v.GroupName]
3297 dh.pOnuMetricsMgr.OnuMetricsManagerLock.RUnlock()
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003298
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003299 if ok && m.Frequency != v.GroupFreq {
3300 if err = dh.pOnuMetricsMgr.UpdateGroupFreq(ctx, v.GroupName, pmConfigs); err != nil {
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003301 errorsList = append(errorsList, err)
3302 }
3303 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003304 if ok && m.Enabled != v.Enabled {
3305 if err = dh.pOnuMetricsMgr.UpdateGroupSupport(ctx, v.GroupName, pmConfigs); err != nil {
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003306 errorsList = append(errorsList, err)
3307 }
3308 }
3309 }
Girish Gowdra36ccf7d2021-02-25 20:42:51 -08003310 logger.Debugw(ctx, "handling-group-pm-config-params - done", log.Fields{"device-id": dh.device.Id})
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003311 return errorsList
3312}
3313
3314func (dh *deviceHandler) handleStandalonePmConfigUpdates(ctx context.Context, pmConfigs *voltha.PmConfigs) []error {
3315 var err error
3316 var errorsList []error
Girish Gowdra36ccf7d2021-02-25 20:42:51 -08003317 logger.Debugw(ctx, "handling-individual-pm-config-params - start", log.Fields{"device-id": dh.device.Id})
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003318 // Check if standalone metric related config is updated
3319 for _, v := range pmConfigs.Metrics {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003320 dh.pOnuMetricsMgr.OnuMetricsManagerLock.RLock()
3321 m, ok := dh.pOnuMetricsMgr.StandaloneMetricMap[v.Name]
3322 dh.pOnuMetricsMgr.OnuMetricsManagerLock.RUnlock()
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003323
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003324 if ok && m.Frequency != v.SampleFreq {
3325 if err = dh.pOnuMetricsMgr.UpdateMetricFreq(ctx, v.Name, pmConfigs); err != nil {
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003326 errorsList = append(errorsList, err)
3327 }
3328 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003329 if ok && m.Enabled != v.Enabled {
3330 if err = dh.pOnuMetricsMgr.UpdateMetricSupport(ctx, v.Name, pmConfigs); err != nil {
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003331 errorsList = append(errorsList, err)
3332 }
3333 }
3334 }
Girish Gowdra36ccf7d2021-02-25 20:42:51 -08003335 logger.Debugw(ctx, "handling-individual-pm-config-params - done", log.Fields{"device-id": dh.device.Id})
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003336 return errorsList
3337}
3338
3339// nolint: gocyclo
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003340func (dh *deviceHandler) StartCollector(ctx context.Context) {
Girish Gowdrae09a6202021-01-12 18:10:59 -08003341 logger.Debugf(ctx, "startingCollector")
3342
3343 // Start routine to process OMCI GET Responses
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003344 go dh.pOnuMetricsMgr.ProcessOmciMessages(ctx)
Himani Chawla43f95ff2021-06-03 00:24:12 +05303345 // Create Extended Frame PM ME
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003346 go dh.pOnuMetricsMgr.CreateEthernetFrameExtendedPMME(ctx)
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003347 // Initialize the next metric collection time.
3348 // Normally done when the onu_metrics_manager is initialized the first time, but needed again later when ONU is
3349 // reset like onu rebooted.
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003350 dh.pOnuMetricsMgr.InitializeMetricCollectionTime(ctx)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00003351 dh.setCollectorIsRunning(true)
Girish Gowdrae09a6202021-01-12 18:10:59 -08003352 for {
3353 select {
3354 case <-dh.stopCollector:
Holger Hildebrandt10d98192021-01-27 15:29:31 +00003355 dh.setCollectorIsRunning(false)
Girish Gowdrae09a6202021-01-12 18:10:59 -08003356 logger.Debugw(ctx, "stopping-collector-for-onu", log.Fields{"device-id": dh.device.Id})
Girish Gowdrae0140f02021-02-02 16:55:09 -08003357 // Stop the L2 PM FSM
3358 go func() {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003359 if dh.pOnuMetricsMgr.PAdaptFsm != nil && dh.pOnuMetricsMgr.PAdaptFsm.PFsm != nil {
3360 if err := dh.pOnuMetricsMgr.PAdaptFsm.PFsm.Event(pmmgr.L2PmEventStop); err != nil {
3361 logger.Errorw(ctx, "error calling event", log.Fields{"device-id": dh.DeviceID, "err": err})
Girish Gowdrae0140f02021-02-02 16:55:09 -08003362 }
3363 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003364 logger.Errorw(ctx, "metrics manager fsm not initialized", log.Fields{"device-id": dh.DeviceID})
Girish Gowdrae0140f02021-02-02 16:55:09 -08003365 }
3366 }()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003367 if dh.pOnuMetricsMgr.GetOmciProcessingStatus() {
3368 dh.pOnuMetricsMgr.StopProcessingOmciResponses <- true // Stop the OMCI GET response processing routine
Girish Gowdra7b0ee5c2021-03-19 21:48:15 -07003369 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003370 if dh.pOnuMetricsMgr.GetTickGenerationStatus() {
3371 dh.pOnuMetricsMgr.StopTicks <- true
Girish Gowdra7b0ee5c2021-03-19 21:48:15 -07003372 }
Girish Gowdrae0140f02021-02-02 16:55:09 -08003373
Girish Gowdrae09a6202021-01-12 18:10:59 -08003374 return
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003375 case <-time.After(time.Duration(pmmgr.FrequencyGranularity) * time.Second): // Check every FrequencyGranularity to see if it is time for collecting metrics
3376 if !dh.pmConfigs.FreqOverride { // If FreqOverride is false, then NextGlobalMetricCollectionTime applies
3377 // If the current time is eqaul to or greater than the NextGlobalMetricCollectionTime, collect the group and standalone metrics
3378 if time.Now().Equal(dh.pOnuMetricsMgr.NextGlobalMetricCollectionTime) || time.Now().After(dh.pOnuMetricsMgr.NextGlobalMetricCollectionTime) {
3379 go dh.pOnuMetricsMgr.CollectAllGroupAndStandaloneMetrics(ctx)
Girish Gowdraaf0ad632021-01-27 13:00:01 -08003380 // Update the next metric collection time.
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003381 dh.pOnuMetricsMgr.NextGlobalMetricCollectionTime = time.Now().Add(time.Duration(dh.pmConfigs.DefaultFreq) * time.Second)
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003382 }
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003383 } else {
3384 if dh.pmConfigs.Grouped { // metrics are managed as a group
3385 // parse through the group and standalone metrics to see it is time to collect their metrics
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003386 dh.pOnuMetricsMgr.OnuMetricsManagerLock.RLock() // Rlock as we are reading GroupMetricMap and StandaloneMetricMap
Girish Gowdrae09a6202021-01-12 18:10:59 -08003387
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003388 for n, g := range dh.pOnuMetricsMgr.GroupMetricMap {
3389 // If the group is enabled AND (current time is equal to OR after NextCollectionInterval, collect the group metric)
Girish Gowdrae0140f02021-02-02 16:55:09 -08003390 // Since the L2 PM counters are collected in a separate FSM, we should avoid those counters in the check.
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003391 if g.Enabled && !g.IsL2PMCounter && (time.Now().Equal(g.NextCollectionInterval) || time.Now().After(g.NextCollectionInterval)) {
3392 go dh.pOnuMetricsMgr.CollectGroupMetric(ctx, n)
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003393 }
3394 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003395 for n, m := range dh.pOnuMetricsMgr.StandaloneMetricMap {
3396 // If the standalone is enabled AND (current time is equal to OR after NextCollectionInterval, collect the metric)
3397 if m.Enabled && (time.Now().Equal(m.NextCollectionInterval) || time.Now().After(m.NextCollectionInterval)) {
3398 go dh.pOnuMetricsMgr.CollectStandaloneMetric(ctx, n)
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003399 }
3400 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003401 dh.pOnuMetricsMgr.OnuMetricsManagerLock.RUnlock()
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003402
3403 // parse through the group and update the next metric collection time
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003404 dh.pOnuMetricsMgr.OnuMetricsManagerLock.Lock() // Lock as we are writing the next metric collection time
3405 for _, g := range dh.pOnuMetricsMgr.GroupMetricMap {
3406 // If group enabled, and the NextCollectionInterval is old (before or equal to current time), update the next collection time stamp
Girish Gowdrae0140f02021-02-02 16:55:09 -08003407 // Since the L2 PM counters are collected and managed in a separate FSM, we should avoid those counters in the check.
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003408 if g.Enabled && !g.IsL2PMCounter && (g.NextCollectionInterval.Before(time.Now()) || g.NextCollectionInterval.Equal(time.Now())) {
3409 g.NextCollectionInterval = time.Now().Add(time.Duration(g.Frequency) * time.Second)
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003410 }
3411 }
3412 // parse through the standalone metrics and update the next metric collection time
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003413 for _, m := range dh.pOnuMetricsMgr.StandaloneMetricMap {
3414 // If standalone metrics enabled, and the NextCollectionInterval is old (before or equal to current time), update the next collection time stamp
3415 if m.Enabled && (m.NextCollectionInterval.Before(time.Now()) || m.NextCollectionInterval.Equal(time.Now())) {
3416 m.NextCollectionInterval = time.Now().Add(time.Duration(m.Frequency) * time.Second)
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003417 }
3418 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003419 dh.pOnuMetricsMgr.OnuMetricsManagerLock.Unlock()
Girish Gowdra5a7c4922021-01-22 18:33:41 -08003420 } /* else { // metrics are not managed as a group
3421 // TODO: We currently do not have standalone metrics. When available, add code here to fetch the metric.
3422 } */
3423 }
Girish Gowdrae09a6202021-01-12 18:10:59 -08003424 }
3425 }
3426}
kesavandfdf77632021-01-26 23:40:33 -05003427
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003428func (dh *deviceHandler) GetUniPortStatus(ctx context.Context, uniInfo *extension.GetOnuUniInfoRequest) *extension.SingleGetValueResponse {
kesavandfdf77632021-01-26 23:40:33 -05003429
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003430 portStatus := uniprt.NewUniPortStatus(dh, dh.pOnuOmciDevice.PDevOmciCC)
3431 return portStatus.GetUniPortStatus(ctx, uniInfo.UniIndex)
kesavandfdf77632021-01-26 23:40:33 -05003432}
Holger Hildebrandt10d98192021-01-27 15:29:31 +00003433
Himani Chawla43f95ff2021-06-03 00:24:12 +05303434func (dh *deviceHandler) getOnuOMCICounters(ctx context.Context, onuInfo *extension.GetOmciEthernetFrameExtendedPmRequest) *extension.SingleGetValueResponse {
3435 if dh.pOnuMetricsMgr == nil {
3436 return &extension.SingleGetValueResponse{
3437 Response: &extension.GetValueResponse{
3438 Status: extension.GetValueResponse_ERROR,
3439 ErrReason: extension.GetValueResponse_INTERNAL_ERROR,
3440 },
3441 }
3442 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003443 resp := dh.pOnuMetricsMgr.CollectEthernetFrameExtendedPMCounters(ctx)
Himani Chawla43f95ff2021-06-03 00:24:12 +05303444 return resp
3445}
3446
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003447func (dh *deviceHandler) isFsmInOmciIdleState(ctx context.Context, PFsm *fsm.FSM, wantedState string) bool {
3448 if PFsm == nil {
mpagenkof1fc3862021-02-16 10:09:52 +00003449 return true //FSM not active - so there is no activity on omci
Holger Hildebrandt10d98192021-01-27 15:29:31 +00003450 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003451 return PFsm.Current() == wantedState
Holger Hildebrandt10d98192021-01-27 15:29:31 +00003452}
3453
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003454func (dh *deviceHandler) isFsmInOmciIdleStateDefault(ctx context.Context, omciFsm cmn.UsedOmciConfigFsms, wantedState string) bool {
3455 var PFsm *fsm.FSM
mpagenkof1fc3862021-02-16 10:09:52 +00003456 //note/TODO!!: might be that access to all these specific FSM; pointers need a semaphore protection as well, cmp lockUpgradeFsm
3457 switch omciFsm {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003458 case cmn.CUploadFsm:
mpagenkof1fc3862021-02-16 10:09:52 +00003459 {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003460 PFsm = dh.pOnuOmciDevice.PMibUploadFsm.PFsm
mpagenkof1fc3862021-02-16 10:09:52 +00003461 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003462 case cmn.CDownloadFsm:
mpagenkof1fc3862021-02-16 10:09:52 +00003463 {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003464 PFsm = dh.pOnuOmciDevice.PMibDownloadFsm.PFsm
mpagenkof1fc3862021-02-16 10:09:52 +00003465 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003466 case cmn.CUniLockFsm:
mpagenkof1fc3862021-02-16 10:09:52 +00003467 {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003468 PFsm = dh.pLockStateFsm.PAdaptFsm.PFsm
mpagenkof1fc3862021-02-16 10:09:52 +00003469 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003470 case cmn.CUniUnLockFsm:
mpagenkof1fc3862021-02-16 10:09:52 +00003471 {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003472 PFsm = dh.pUnlockStateFsm.PAdaptFsm.PFsm
mpagenkof1fc3862021-02-16 10:09:52 +00003473 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003474 case cmn.CL2PmFsm:
mpagenkof1fc3862021-02-16 10:09:52 +00003475 {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003476 if dh.pOnuMetricsMgr != nil && dh.pOnuMetricsMgr.PAdaptFsm != nil {
3477 PFsm = dh.pOnuMetricsMgr.PAdaptFsm.PFsm
mpagenkof1fc3862021-02-16 10:09:52 +00003478 } else {
3479 return true //FSM not active - so there is no activity on omci
Holger Hildebrandt10d98192021-01-27 15:29:31 +00003480 }
3481 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003482 case cmn.COnuUpgradeFsm:
mpagenko80622a52021-02-09 16:53:23 +00003483 {
3484 dh.lockUpgradeFsm.RLock()
3485 defer dh.lockUpgradeFsm.RUnlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003486 PFsm = dh.pOnuUpradeFsm.PAdaptFsm.PFsm
mpagenko80622a52021-02-09 16:53:23 +00003487 }
mpagenkof1fc3862021-02-16 10:09:52 +00003488 default:
3489 {
3490 logger.Errorw(ctx, "invalid stateMachine selected for idle check", log.Fields{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003491 "device-id": dh.DeviceID, "selectedFsm number": omciFsm})
mpagenkof1fc3862021-02-16 10:09:52 +00003492 return false //logical error in FSM check, do not not indicate 'idle' - we can't be sure
Holger Hildebrandt10d98192021-01-27 15:29:31 +00003493 }
Holger Hildebrandt10d98192021-01-27 15:29:31 +00003494 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003495 return dh.isFsmInOmciIdleState(ctx, PFsm, wantedState)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00003496}
3497
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003498func (dh *deviceHandler) isAniConfigFsmInOmciIdleState(ctx context.Context, omciFsm cmn.UsedOmciConfigFsms, idleState string) bool {
3499 for _, v := range dh.pOnuTP.PAniConfigFsm {
3500 if !dh.isFsmInOmciIdleState(ctx, v.PAdaptFsm.PFsm, idleState) {
Holger Hildebrandt10d98192021-01-27 15:29:31 +00003501 return false
3502 }
3503 }
3504 return true
3505}
3506
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003507func (dh *deviceHandler) isUniVlanConfigFsmInOmciIdleState(ctx context.Context, omciFsm cmn.UsedOmciConfigFsms, idleState string) bool {
mpagenkof1fc3862021-02-16 10:09:52 +00003508 dh.lockVlanConfig.RLock()
3509 defer dh.lockVlanConfig.RUnlock()
3510 for _, v := range dh.UniVlanConfigFsmMap {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003511 if !dh.isFsmInOmciIdleState(ctx, v.PAdaptFsm.PFsm, idleState) {
mpagenkof1fc3862021-02-16 10:09:52 +00003512 return false
3513 }
3514 }
3515 return true //FSM not active - so there is no activity on omci
3516}
3517
3518func (dh *deviceHandler) checkUserServiceExists(ctx context.Context) bool {
3519 dh.lockVlanConfig.RLock()
3520 defer dh.lockVlanConfig.RUnlock()
3521 for _, v := range dh.UniVlanConfigFsmMap {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003522 if v.PAdaptFsm.PFsm != nil {
3523 if v.PAdaptFsm.PFsm.Is(avcfg.CVlanFsmConfiguredState) {
mpagenkof1fc3862021-02-16 10:09:52 +00003524 return true //there is at least one VLAN FSM with some active configuration
3525 }
3526 }
3527 }
3528 return false //there is no VLAN FSM with some active configuration
3529}
3530
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003531func (dh *deviceHandler) CheckAuditStartCondition(ctx context.Context, callingFsm cmn.UsedOmciConfigFsms) bool {
mpagenkof1fc3862021-02-16 10:09:52 +00003532 for fsmName, fsmStruct := range fsmOmciIdleStateFuncMap {
3533 if fsmName != callingFsm && !fsmStruct.omciIdleCheckFunc(dh, ctx, fsmName, fsmStruct.omciIdleState) {
3534 return false
3535 }
3536 }
3537 // a further check is done to identify, if at least some data traffic related configuration exists
3538 // so that a user of this ONU could be 'online' (otherwise it makes no sense to check the MDS [with the intention to keep the user service up])
3539 return dh.checkUserServiceExists(ctx)
3540}
3541
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003542func (dh *deviceHandler) PrepareReconcilingWithActiveAdapter(ctx context.Context) {
Holger Hildebrandt10d98192021-01-27 15:29:31 +00003543 logger.Debugw(ctx, "prepare to reconcile the ONU with adapter using persistency data", log.Fields{"device-id": dh.device.Id})
3544 if err := dh.resetFsms(ctx, false); err != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003545 logger.Errorw(ctx, "reset of FSMs failed!", log.Fields{"device-id": dh.DeviceID, "error": err})
Holger Hildebrandt10d98192021-01-27 15:29:31 +00003546 // TODO: fatal error reset ONU, delete deviceHandler!
3547 return
3548 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003549 dh.uniEntityMap = make(map[uint32]*cmn.OnuUniPort)
3550 dh.StartReconciling(ctx, false)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00003551}
3552
3553func (dh *deviceHandler) setCollectorIsRunning(flagValue bool) {
3554 dh.mutexCollectorFlag.Lock()
3555 dh.collectorIsRunning = flagValue
3556 dh.mutexCollectorFlag.Unlock()
3557}
3558
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003559func (dh *deviceHandler) GetCollectorIsRunning() bool {
Holger Hildebrandt10d98192021-01-27 15:29:31 +00003560 dh.mutexCollectorFlag.RLock()
3561 flagValue := dh.collectorIsRunning
3562 dh.mutexCollectorFlag.RUnlock()
3563 return flagValue
3564}
Himani Chawlaac1f5ad2021-02-04 21:21:54 +05303565
Himani Chawla4c1d4c72021-02-18 12:14:31 +05303566func (dh *deviceHandler) setAlarmManagerIsRunning(flagValue bool) {
3567 dh.mutextAlarmManagerFlag.Lock()
3568 dh.alarmManagerIsRunning = flagValue
3569 dh.mutextAlarmManagerFlag.Unlock()
3570}
3571
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003572func (dh *deviceHandler) GetAlarmManagerIsRunning(ctx context.Context) bool {
Himani Chawla4c1d4c72021-02-18 12:14:31 +05303573 dh.mutextAlarmManagerFlag.RLock()
3574 flagValue := dh.alarmManagerIsRunning
Himani Chawla1472c682021-03-17 17:11:14 +05303575 logger.Debugw(ctx, "alarm-manager-is-running", log.Fields{"flag": dh.alarmManagerIsRunning})
Himani Chawla4c1d4c72021-02-18 12:14:31 +05303576 dh.mutextAlarmManagerFlag.RUnlock()
3577 return flagValue
3578}
3579
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003580func (dh *deviceHandler) StartAlarmManager(ctx context.Context) {
Himani Chawlaac1f5ad2021-02-04 21:21:54 +05303581 logger.Debugf(ctx, "startingAlarmManager")
3582
3583 // Start routine to process OMCI GET Responses
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003584 go dh.pAlarmMgr.StartOMCIAlarmMessageProcessing(ctx)
Himani Chawla4c1d4c72021-02-18 12:14:31 +05303585 dh.setAlarmManagerIsRunning(true)
Himani Chawlaac1f5ad2021-02-04 21:21:54 +05303586 if stop := <-dh.stopAlarmManager; stop {
3587 logger.Debugw(ctx, "stopping-collector-for-onu", log.Fields{"device-id": dh.device.Id})
Himani Chawla4c1d4c72021-02-18 12:14:31 +05303588 dh.setAlarmManagerIsRunning(false)
Himani Chawlad3dac422021-03-13 02:31:31 +05303589 go func() {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003590 if dh.pAlarmMgr.AlarmSyncFsm != nil && dh.pAlarmMgr.AlarmSyncFsm.PFsm != nil {
3591 _ = dh.pAlarmMgr.AlarmSyncFsm.PFsm.Event(almgr.AsEvStop)
Himani Chawla1472c682021-03-17 17:11:14 +05303592 }
Himani Chawlad3dac422021-03-13 02:31:31 +05303593 }()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003594 dh.pAlarmMgr.StopProcessingOmciMessages <- true // Stop the OMCI routines if any(This will stop the fsms also)
3595 dh.pAlarmMgr.StopAlarmAuditTimer <- struct{}{}
Himani Chawla1472c682021-03-17 17:11:14 +05303596 logger.Debugw(ctx, "sent-all-stop-signals-to-alarm-manager", log.Fields{"device-id": dh.device.Id})
Himani Chawlaac1f5ad2021-02-04 21:21:54 +05303597 }
3598}
Holger Hildebrandt38985dc2021-02-18 16:25:20 +00003599
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003600func (dh *deviceHandler) StartReconciling(ctx context.Context, skipOnuConfig bool) {
3601 logger.Debugw(ctx, "start reconciling", log.Fields{"skipOnuConfig": skipOnuConfig, "device-id": dh.DeviceID})
Holger Hildebrandtbe523842021-03-10 10:47:18 +00003602
Maninder7961d722021-06-16 22:10:28 +05303603 connectStatus := voltha.ConnectStatus_UNREACHABLE
3604 operState := voltha.OperStatus_UNKNOWN
3605
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003606 if !dh.IsReconciling() {
Holger Hildebrandtf37b3d72021-02-17 10:25:22 +00003607 go func() {
Holger Hildebrandtbe523842021-03-10 10:47:18 +00003608 logger.Debugw(ctx, "wait for channel signal or timeout",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003609 log.Fields{"timeout": dh.pOpenOnuAc.maxTimeoutReconciling, "device-id": dh.DeviceID})
Holger Hildebrandtf37b3d72021-02-17 10:25:22 +00003610 select {
Holger Hildebrandtb4563ab2021-04-14 10:27:20 +00003611 case success := <-dh.chReconcilingFinished:
3612 if success {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003613 if onuDevEntry := dh.GetOnuDeviceEntry(ctx, true); onuDevEntry == nil {
Maninderb5187552021-03-23 22:23:42 +05303614 logger.Errorw(ctx, "No valid OnuDevice - aborting Core DeviceStateUpdate",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003615 log.Fields{"device-id": dh.DeviceID})
Maninderb5187552021-03-23 22:23:42 +05303616 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003617 if onuDevEntry.SOnuPersistentData.PersOperState == "up" {
Maninderb5187552021-03-23 22:23:42 +05303618 connectStatus = voltha.ConnectStatus_REACHABLE
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003619 if !onuDevEntry.SOnuPersistentData.PersUniDisableDone {
3620 if onuDevEntry.SOnuPersistentData.PersUniUnlockDone {
Maninderb5187552021-03-23 22:23:42 +05303621 operState = voltha.OperStatus_ACTIVE
3622 } else {
3623 operState = voltha.OperStatus_ACTIVATING
3624 }
3625 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003626 } else if onuDevEntry.SOnuPersistentData.PersOperState == "down" ||
3627 onuDevEntry.SOnuPersistentData.PersOperState == "unknown" ||
3628 onuDevEntry.SOnuPersistentData.PersOperState == "" {
Maninderb5187552021-03-23 22:23:42 +05303629 operState = voltha.OperStatus_DISCOVERED
3630 }
3631
3632 logger.Debugw(ctx, "Core DeviceStateUpdate", log.Fields{"connectStatus": connectStatus, "operState": operState})
Maninderb5187552021-03-23 22:23:42 +05303633 }
Holger Hildebrandtb4563ab2021-04-14 10:27:20 +00003634 logger.Debugw(ctx, "reconciling has been finished in time",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003635 log.Fields{"device-id": dh.DeviceID})
khenaidoo7d3c5582021-08-11 18:09:44 -04003636 if err := dh.updateDeviceStateInCore(ctx, &ic.DeviceStateFilter{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003637 DeviceId: dh.DeviceID,
khenaidoo7d3c5582021-08-11 18:09:44 -04003638 ConnStatus: connectStatus,
3639 OperStatus: operState,
3640 }); err != nil {
Maninder7961d722021-06-16 22:10:28 +05303641 logger.Errorw(ctx, "unable to update device state to core",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003642 log.Fields{"device-id": dh.DeviceID, "Err": err})
Maninder7961d722021-06-16 22:10:28 +05303643 }
Holger Hildebrandtb4563ab2021-04-14 10:27:20 +00003644 } else {
Maninderb5187552021-03-23 22:23:42 +05303645 logger.Errorw(ctx, "wait for reconciling aborted",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003646 log.Fields{"device-id": dh.DeviceID})
Maninder7961d722021-06-16 22:10:28 +05303647
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003648 if onuDevEntry := dh.GetOnuDeviceEntry(ctx, true); onuDevEntry == nil {
Maninder7961d722021-06-16 22:10:28 +05303649 logger.Errorw(ctx, "No valid OnuDevice",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003650 log.Fields{"device-id": dh.DeviceID})
3651 } else if onuDevEntry.SOnuPersistentData.PersOperState == "up" {
Maninder7961d722021-06-16 22:10:28 +05303652 connectStatus = voltha.ConnectStatus_REACHABLE
3653 }
3654
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003655 dh.deviceReconcileFailedUpdate(ctx, cmn.DrReconcileCanceled, connectStatus)
Holger Hildebrandtb4563ab2021-04-14 10:27:20 +00003656 }
Holger Hildebrandt38985dc2021-02-18 16:25:20 +00003657 case <-time.After(dh.pOpenOnuAc.maxTimeoutReconciling):
Holger Hildebrandtf37b3d72021-02-17 10:25:22 +00003658 logger.Errorw(ctx, "timeout waiting for reconciling to be finished!",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003659 log.Fields{"device-id": dh.DeviceID})
Maninder7961d722021-06-16 22:10:28 +05303660
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003661 if onuDevEntry := dh.GetOnuDeviceEntry(ctx, true); onuDevEntry == nil {
Maninder7961d722021-06-16 22:10:28 +05303662 logger.Errorw(ctx, "No valid OnuDevice",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003663 log.Fields{"device-id": dh.DeviceID})
3664 } else if onuDevEntry.SOnuPersistentData.PersOperState == "up" {
Maninder7961d722021-06-16 22:10:28 +05303665 connectStatus = voltha.ConnectStatus_REACHABLE
3666 }
3667
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003668 dh.deviceReconcileFailedUpdate(ctx, cmn.DrReconcileMaxTimeout, connectStatus)
Maninder7961d722021-06-16 22:10:28 +05303669
Holger Hildebrandtf37b3d72021-02-17 10:25:22 +00003670 }
3671 dh.mutexReconcilingFlag.Lock()
Holger Hildebrandtbe523842021-03-10 10:47:18 +00003672 dh.reconciling = cNoReconciling
Holger Hildebrandtf37b3d72021-02-17 10:25:22 +00003673 dh.mutexReconcilingFlag.Unlock()
3674 }()
Holger Hildebrandtf37b3d72021-02-17 10:25:22 +00003675 }
Holger Hildebrandtbe523842021-03-10 10:47:18 +00003676 dh.mutexReconcilingFlag.Lock()
3677 if skipOnuConfig {
3678 dh.reconciling = cSkipOnuConfigReconciling
3679 } else {
3680 dh.reconciling = cOnuConfigReconciling
3681 }
3682 dh.mutexReconcilingFlag.Unlock()
Holger Hildebrandtf37b3d72021-02-17 10:25:22 +00003683}
3684
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003685func (dh *deviceHandler) StopReconciling(ctx context.Context, success bool) {
3686 logger.Debugw(ctx, "stop reconciling", log.Fields{"device-id": dh.DeviceID, "success": success})
3687 if dh.IsReconciling() {
Girish Gowdra50e56422021-06-01 16:46:04 -07003688 dh.chReconcilingFinished <- success
Holger Hildebrandtf37b3d72021-02-17 10:25:22 +00003689 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003690 logger.Infow(ctx, "reconciling is not running", log.Fields{"device-id": dh.DeviceID})
Holger Hildebrandtf37b3d72021-02-17 10:25:22 +00003691 }
3692}
3693
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003694func (dh *deviceHandler) IsReconciling() bool {
Holger Hildebrandtf37b3d72021-02-17 10:25:22 +00003695 dh.mutexReconcilingFlag.RLock()
Holger Hildebrandtbe523842021-03-10 10:47:18 +00003696 defer dh.mutexReconcilingFlag.RUnlock()
3697 return dh.reconciling != cNoReconciling
3698}
3699
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003700func (dh *deviceHandler) IsSkipOnuConfigReconciling() bool {
Holger Hildebrandtbe523842021-03-10 10:47:18 +00003701 dh.mutexReconcilingFlag.RLock()
3702 defer dh.mutexReconcilingFlag.RUnlock()
3703 return dh.reconciling == cSkipOnuConfigReconciling
3704}
3705
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003706func (dh *deviceHandler) SetDeviceReason(value uint8) {
Holger Hildebrandtbe523842021-03-10 10:47:18 +00003707 dh.mutexDeviceReason.Lock()
3708 dh.deviceReason = value
3709 dh.mutexDeviceReason.Unlock()
3710}
3711
3712func (dh *deviceHandler) getDeviceReason() uint8 {
3713 dh.mutexDeviceReason.RLock()
3714 value := dh.deviceReason
3715 dh.mutexDeviceReason.RUnlock()
Holger Hildebrandtf37b3d72021-02-17 10:25:22 +00003716 return value
3717}
Holger Hildebrandtbe523842021-03-10 10:47:18 +00003718
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003719func (dh *deviceHandler) GetDeviceReasonString() string {
3720 return cmn.DeviceReasonMap[dh.getDeviceReason()]
Holger Hildebrandtbe523842021-03-10 10:47:18 +00003721}
Holger Hildebrandtb4563ab2021-04-14 10:27:20 +00003722
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003723func (dh *deviceHandler) SetReadyForOmciConfig(flagValue bool) {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00003724 dh.mutexReadyForOmciConfig.Lock()
3725 dh.readyForOmciConfig = flagValue
3726 dh.mutexReadyForOmciConfig.Unlock()
3727}
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003728func (dh *deviceHandler) IsReadyForOmciConfig() bool {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00003729 dh.mutexReadyForOmciConfig.RLock()
3730 flagValue := dh.readyForOmciConfig
3731 dh.mutexReadyForOmciConfig.RUnlock()
3732 return flagValue
3733}
Maninder7961d722021-06-16 22:10:28 +05303734
3735func (dh *deviceHandler) deviceReconcileFailedUpdate(ctx context.Context, deviceReason uint8, connectStatus voltha.ConnectStatus_Types) {
3736 if err := dh.deviceReasonUpdate(ctx, deviceReason, true); err != nil {
3737 logger.Errorw(ctx, "unable to update device reason to core",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003738 log.Fields{"device-id": dh.DeviceID, "Err": err})
Maninder7961d722021-06-16 22:10:28 +05303739 }
3740
3741 logger.Debugw(ctx, "Core DeviceStateUpdate", log.Fields{"connectStatus": connectStatus, "operState": voltha.OperStatus_RECONCILING_FAILED})
khenaidoo7d3c5582021-08-11 18:09:44 -04003742 if err := dh.updateDeviceStateInCore(ctx, &ic.DeviceStateFilter{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003743 DeviceId: dh.DeviceID,
khenaidoo7d3c5582021-08-11 18:09:44 -04003744 ConnStatus: connectStatus,
3745 OperStatus: voltha.OperStatus_RECONCILING_FAILED,
3746 }); err != nil {
Maninder7961d722021-06-16 22:10:28 +05303747 logger.Errorw(ctx, "unable to update device state to core",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003748 log.Fields{"device-id": dh.DeviceID, "Err": err})
Maninder7961d722021-06-16 22:10:28 +05303749 }
3750}
khenaidoo7d3c5582021-08-11 18:09:44 -04003751
3752/*
3753Helper functions to communicate with Core
3754*/
3755
3756func (dh *deviceHandler) getDeviceFromCore(ctx context.Context, deviceID string) (*voltha.Device, error) {
3757 cClient, err := dh.coreClient.GetCoreServiceClient()
3758 if err != nil || cClient == nil {
3759 return nil, err
3760 }
3761 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), dh.config.RPCTimeout)
3762 defer cancel()
3763 logger.Debugw(subCtx, "get-device-from-core", log.Fields{"device-id": deviceID})
3764 return cClient.GetDevice(subCtx, &vc.ID{Id: deviceID})
3765}
3766
3767func (dh *deviceHandler) updateDeviceStateInCore(ctx context.Context, deviceStateFilter *ic.DeviceStateFilter) error {
3768 cClient, err := dh.coreClient.GetCoreServiceClient()
3769 if err != nil || cClient == nil {
3770 return err
3771 }
3772 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), dh.config.RPCTimeout)
3773 defer cancel()
3774 _, err = cClient.DeviceStateUpdate(subCtx, deviceStateFilter)
3775 logger.Debugw(subCtx, "device-updated-in-core", log.Fields{"device-state": deviceStateFilter, "error": err})
3776 return err
3777}
3778
3779func (dh *deviceHandler) updatePMConfigInCore(ctx context.Context, pmConfigs *voltha.PmConfigs) error {
3780 cClient, err := dh.coreClient.GetCoreServiceClient()
3781 if err != nil || cClient == nil {
3782 return err
3783 }
3784 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), dh.config.RPCTimeout)
3785 defer cancel()
3786 _, err = cClient.DevicePMConfigUpdate(subCtx, pmConfigs)
3787 logger.Debugw(subCtx, "pmconfig-updated-in-core", log.Fields{"pm-configs": pmConfigs, "error": err})
3788 return err
3789}
3790
3791func (dh *deviceHandler) updateDeviceInCore(ctx context.Context, device *voltha.Device) error {
3792 cClient, err := dh.coreClient.GetCoreServiceClient()
3793 if err != nil || cClient == nil {
3794 return err
3795 }
3796 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), dh.config.RPCTimeout)
3797 defer cancel()
3798 _, err = cClient.DeviceUpdate(subCtx, device)
3799 logger.Debugw(subCtx, "device-updated-in-core", log.Fields{"device-id": device.Id, "error": err})
3800 return err
3801}
3802
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003803func (dh *deviceHandler) CreatePortInCore(ctx context.Context, port *voltha.Port) error {
khenaidoo7d3c5582021-08-11 18:09:44 -04003804 cClient, err := dh.coreClient.GetCoreServiceClient()
3805 if err != nil || cClient == nil {
3806 return err
3807 }
3808 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), dh.config.RPCTimeout)
3809 defer cancel()
3810 _, err = cClient.PortCreated(subCtx, port)
3811 logger.Debugw(subCtx, "port-created-in-core", log.Fields{"port": port, "error": err})
3812 return err
3813}
3814
3815func (dh *deviceHandler) updatePortStateInCore(ctx context.Context, portState *ic.PortState) error {
3816 cClient, err := dh.coreClient.GetCoreServiceClient()
3817 if err != nil || cClient == nil {
3818 return err
3819 }
3820 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), dh.config.RPCTimeout)
3821 defer cancel()
3822 _, err = cClient.PortStateUpdate(subCtx, portState)
3823 logger.Debugw(subCtx, "port-state-updated-in-core", log.Fields{"port-state": portState, "error": err})
3824 return err
3825}
3826
3827func (dh *deviceHandler) updateDeviceReasonInCore(ctx context.Context, reason *ic.DeviceReason) error {
3828 cClient, err := dh.coreClient.GetCoreServiceClient()
3829 if err != nil || cClient == nil {
3830 return err
3831 }
3832 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), dh.config.RPCTimeout)
3833 defer cancel()
3834 _, err = cClient.DeviceReasonUpdate(subCtx, reason)
3835 logger.Debugw(subCtx, "device-reason-updated-in-core", log.Fields{"reason": reason, "error": err})
3836 return err
3837}
3838
3839/*
3840Helper functions to communicate with parent adapter
3841*/
3842
3843func (dh *deviceHandler) getTechProfileInstanceFromParentAdapter(ctx context.Context, parentEndpoint string,
3844 request *ic.TechProfileInstanceRequestMessage) (*ic.TechProfileDownloadMessage, error) {
3845 pgClient, err := dh.pOpenOnuAc.getParentAdapterServiceClient(parentEndpoint)
3846 if err != nil || pgClient == nil {
3847 return nil, err
3848 }
3849 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), dh.config.MaxTimeoutInterAdapterComm)
3850 defer cancel()
3851 logger.Debugw(subCtx, "get-tech-profile-instance", log.Fields{"request": request, "parent-endpoint": parentEndpoint})
3852 return pgClient.GetTechProfileInstance(subCtx, request)
3853}
3854
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003855func (dh *deviceHandler) SendOMCIRequest(ctx context.Context, parentEndpoint string, request *ic.OmciMessage) error {
khenaidoo7d3c5582021-08-11 18:09:44 -04003856 pgClient, err := dh.pOpenOnuAc.getParentAdapterServiceClient(parentEndpoint)
3857 if err != nil || pgClient == nil {
3858 return err
3859 }
3860 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), dh.config.MaxTimeoutInterAdapterComm)
3861 defer cancel()
3862 logger.Debugw(subCtx, "send-omci-request", log.Fields{"request": request, "parent-endpoint": parentEndpoint})
3863 _, err = pgClient.ProxyOmciRequest(subCtx, request)
3864 if err != nil {
3865 logger.Errorw(ctx, "omci-failure", log.Fields{"request": request, "error": err, "request-parent": request.ParentDeviceId, "request-child": request.ChildDeviceId, "request-proxy": request.ProxyAddress})
3866 }
3867 return err
3868}
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003869
3870// GetDeviceID - TODO: add comment
3871func (dh *deviceHandler) GetDeviceID() string {
3872 return dh.DeviceID
3873}
3874
3875// GetProxyAddressID - TODO: add comment
3876func (dh *deviceHandler) GetProxyAddressID() string {
3877 return dh.device.ProxyAddress.GetDeviceId()
3878}
3879
3880// GetProxyAddressType - TODO: add comment
3881func (dh *deviceHandler) GetProxyAddressType() string {
3882 return dh.device.ProxyAddress.GetDeviceType()
3883}
3884
3885// GetProxyAddress - TODO: add comment
3886func (dh *deviceHandler) GetProxyAddress() *voltha.Device_ProxyAddress {
3887 return dh.device.ProxyAddress
3888}
3889
3890// GetEventProxy - TODO: add comment
3891func (dh *deviceHandler) GetEventProxy() eventif.EventProxy {
3892 return dh.EventProxy
3893}
3894
3895// GetOmciTimeout - TODO: add comment
3896func (dh *deviceHandler) GetOmciTimeout() int {
3897 return dh.pOpenOnuAc.omciTimeout
3898}
3899
3900// GetAlarmAuditInterval - TODO: add comment
3901func (dh *deviceHandler) GetAlarmAuditInterval() time.Duration {
3902 return dh.pOpenOnuAc.alarmAuditInterval
3903}
3904
3905// GetDlToOnuTimeout4M - TODO: add comment
3906func (dh *deviceHandler) GetDlToOnuTimeout4M() time.Duration {
3907 return dh.pOpenOnuAc.dlToOnuTimeout4M
3908}
3909
3910// GetUniEntityMap - TODO: add comment
3911func (dh *deviceHandler) GetUniEntityMap() *cmn.OnuUniPortMap {
3912 return &dh.uniEntityMap
3913}
3914
3915// GetPonPortNumber - TODO: add comment
3916func (dh *deviceHandler) GetPonPortNumber() *uint32 {
3917 return &dh.ponPortNumber
3918}
3919
3920// GetUniVlanConfigFsm - TODO: add comment
3921func (dh *deviceHandler) GetUniVlanConfigFsm(uniID uint8) cmn.IuniVlanConfigFsm {
3922 return dh.UniVlanConfigFsmMap[uniID]
3923}
3924
3925// GetOnuAlarmManager - TODO: add comment
3926func (dh *deviceHandler) GetOnuAlarmManager() cmn.IonuAlarmManager {
3927 return dh.pAlarmMgr
3928}
3929
3930// GetOnuMetricsManager - TODO: add comment
3931func (dh *deviceHandler) GetOnuMetricsManager() cmn.IonuMetricsManager {
3932 return dh.pOnuMetricsMgr
3933}
3934
3935// GetOnuTP - TODO: add comment
3936func (dh *deviceHandler) GetOnuTP() cmn.IonuUniTechProf {
3937 return dh.pOnuTP
3938}
3939
3940// GetBackendPathPrefix - TODO: add comment
3941func (dh *deviceHandler) GetBackendPathPrefix() string {
3942 return dh.pOpenOnuAc.cm.Backend.PathPrefix
3943}
3944
3945// GetOnuIndication - TODO: add comment
3946func (dh *deviceHandler) GetOnuIndication() *openolt.OnuIndication {
3947 return dh.pOnuIndication
3948}
3949
3950// RLockMutexDeletionInProgressFlag - TODO: add comment
3951func (dh *deviceHandler) RLockMutexDeletionInProgressFlag() {
3952 dh.mutexDeletionInProgressFlag.RLock()
3953}
3954
3955// RUnlockMutexDeletionInProgressFlag - TODO: add comment
3956func (dh *deviceHandler) RUnlockMutexDeletionInProgressFlag() {
3957 dh.mutexDeletionInProgressFlag.RUnlock()
3958}
3959
3960// GetDeletionInProgress - TODO: add comment
3961func (dh *deviceHandler) GetDeletionInProgress() bool {
3962 return dh.deletionInProgress
3963}
3964
3965// GetPmConfigs - TODO: add comment
3966func (dh *deviceHandler) GetPmConfigs() *voltha.PmConfigs {
3967 return dh.pmConfigs
3968}
3969
3970// GetDeviceType - TODO: add comment
3971func (dh *deviceHandler) GetDeviceType() string {
3972 return dh.DeviceType
3973}
3974
3975// GetLogicalDeviceID - TODO: add comment
3976func (dh *deviceHandler) GetLogicalDeviceID() string {
3977 return dh.logicalDeviceID
3978}
3979
3980// GetDevice - TODO: add comment
3981func (dh *deviceHandler) GetDevice() *voltha.Device {
3982 return dh.device
3983}
3984
3985// GetMetricsEnabled - TODO: add comment
3986func (dh *deviceHandler) GetMetricsEnabled() bool {
3987 return dh.pOpenOnuAc.MetricsEnabled
3988}
3989
3990// InitPmConfigs - TODO: add comment
3991func (dh *deviceHandler) InitPmConfigs() {
3992 dh.pmConfigs = &voltha.PmConfigs{}
3993}
3994
3995// GetUniPortMask - TODO: add comment
3996func (dh *deviceHandler) GetUniPortMask() int {
3997 return dh.pOpenOnuAc.config.UniPortMask
3998}