blob: fa21e6856766ba454e436200903e5dda51118d1c [file] [log] [blame]
Holger Hildebrandtfa074992020-03-27 15:42:06 +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 Hildebrandt0f9b88d2020-04-20 13:33:25 +000017//Package adaptercoreonu provides the utility for onu devices, flows and statistics
18package adaptercoreonu
Holger Hildebrandtfa074992020-03-27 15:42:06 +000019
20import (
21 "context"
Holger Hildebrandt47555e72020-09-21 11:07:24 +000022 "encoding/json"
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000023 "errors"
Holger Hildebrandt47555e72020-09-21 11:07:24 +000024 "fmt"
25 "sync"
Holger Hildebrandt2ff21f12020-08-13 14:38:02 +000026 "time"
27
ozgecanetsiae11479f2020-07-06 09:44:47 +030028 "github.com/opencord/omci-lib-go"
29 me "github.com/opencord/omci-lib-go/generated"
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000030
Holger Hildebrandtfa074992020-03-27 15:42:06 +000031 //"sync"
32 //"time"
33
34 "github.com/looplab/fsm"
dbainbri4d3a0dc2020-12-02 00:33:42 +000035 "github.com/opencord/voltha-lib-go/v4/pkg/adapters/adapterif"
36 "github.com/opencord/voltha-lib-go/v4/pkg/db"
37 "github.com/opencord/voltha-lib-go/v4/pkg/db/kvstore"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000038
dbainbri4d3a0dc2020-12-02 00:33:42 +000039 //"github.com/opencord/voltha-lib-go/v4/pkg/kafka"
40 "github.com/opencord/voltha-lib-go/v4/pkg/log"
41 //ic "github.com/opencord/voltha-protos/v4/go/inter_container"
42 //"github.com/opencord/voltha-protos/v4/go/openflow_13"
43 //"github.com/opencord/voltha-protos/v4/go/voltha"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000044)
45
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000046const (
mpagenko1cc3cb42020-07-27 15:24:38 +000047 // events of MibUpload FSM
48 ulEvStart = "ulEvStart"
49 ulEvResetMib = "ulEvResetMib"
50 ulEvGetVendorAndSerial = "ulEvGetVendorAndSerial"
Himani Chawla4d908332020-08-31 12:30:20 +053051 ulEvGetEquipmentID = "ulEvGetEquipmentId"
mpagenko1cc3cb42020-07-27 15:24:38 +000052 ulEvGetFirstSwVersion = "ulEvGetFirstSwVersion"
53 ulEvGetSecondSwVersion = "ulEvGetSecondSwVersion"
54 ulEvGetMacAddress = "ulEvGetMacAddress"
55 ulEvGetMibTemplate = "ulEvGetMibTemplate"
56 ulEvUploadMib = "ulEvUploadMib"
57 ulEvExamineMds = "ulEvExamineMds"
58 ulEvSuccess = "ulEvSuccess"
59 ulEvMismatch = "ulEvMismatch"
60 ulEvAuditMib = "ulEvAuditMib"
61 ulEvForceResync = "ulEvForceResync"
62 ulEvDiffsFound = "ulEvDiffsFound"
63 ulEvTimeout = "ulEvTimeout"
64 ulEvStop = "ulEvStop"
65)
66const (
67 // states of MibUpload FSM
68 ulStDisabled = "ulStDisabled"
69 ulStStarting = "ulStStarting"
70 ulStResettingMib = "ulStResettingMib"
71 ulStGettingVendorAndSerial = "ulStGettingVendorAndSerial"
Himani Chawla4d908332020-08-31 12:30:20 +053072 ulStGettingEquipmentID = "ulStGettingEquipmentID"
mpagenko1cc3cb42020-07-27 15:24:38 +000073 ulStGettingFirstSwVersion = "ulStGettingFirstSwVersion"
74 ulStGettingSecondSwVersion = "ulStGettingSecondSwVersion"
75 ulStGettingMacAddress = "ulStGettingMacAddress"
76 ulStGettingMibTemplate = "ulStGettingMibTemplate"
77 ulStUploading = "ulStUploading"
Holger Hildebrandt10d98192021-01-27 15:29:31 +000078 ulStUploadDone = "ulStUploadDone"
mpagenko1cc3cb42020-07-27 15:24:38 +000079 ulStInSync = "ulStInSync"
80 ulStExaminingMds = "ulStExaminingMds"
81 ulStResynchronizing = "ulStResynchronizing"
Holger Hildebrandtbe523842021-03-10 10:47:18 +000082 ulStExaminingMdsSuccess = "ulStExaminingMdsSuccess"
mpagenko1cc3cb42020-07-27 15:24:38 +000083 ulStAuditing = "ulStAuditing"
Holger Hildebrandt10d98192021-01-27 15:29:31 +000084 ulStReAuditing = "ulStReAuditing"
mpagenko1cc3cb42020-07-27 15:24:38 +000085 ulStOutOfSync = "ulStOutOfSync"
86)
Holger Hildebrandt10d98192021-01-27 15:29:31 +000087const cMibUlFsmIdleState = ulStInSync
mpagenko1cc3cb42020-07-27 15:24:38 +000088
89const (
90 // events of MibDownload FSM
91 dlEvStart = "dlEvStart"
92 dlEvCreateGal = "dlEvCreateGal"
93 dlEvRxGalResp = "dlEvRxGalResp"
94 dlEvRxOnu2gResp = "dlEvRxOnu2gResp"
95 dlEvRxBridgeResp = "dlEvRxBridgeResp"
96 dlEvTimeoutSimple = "dlEvTimeoutSimple"
97 dlEvTimeoutBridge = "dlEvTimeoutBridge"
98 dlEvReset = "dlEvReset"
99 dlEvRestart = "dlEvRestart"
100)
101const (
102 // states of MibDownload FSM
103 dlStDisabled = "dlStDisabled"
104 dlStStarting = "dlStStarting"
105 dlStCreatingGal = "dlStCreatingGal"
106 dlStSettingOnu2g = "dlStSettingOnu2g"
107 dlStBridgeInit = "dlStBridgeInit"
108 dlStDownloaded = "dlStDownloaded"
109 dlStResetting = "dlStResetting"
110)
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000111const cMibDlFsmIdleState = dlStDisabled
mpagenko1cc3cb42020-07-27 15:24:38 +0000112
113const (
Matteo Scandolof1f39a72020-11-24 12:08:11 -0800114 // NOTE that this hardcoded to service/voltha as the MIB template is shared across stacks
Holger Hildebrandt2ff21f12020-08-13 14:38:02 +0000115 cBasePathMibTemplateKvStore = "service/voltha/omci_mibs/go_templates"
mpagenkoaf801632020-07-03 10:00:42 +0000116 cSuffixMibTemplateKvStore = "%s/%s/%s"
Matteo Scandolof1f39a72020-11-24 12:08:11 -0800117 cBasePathOnuKVStore = "%s/openonu"
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000118)
119
Himani Chawla6d2ae152020-09-02 13:11:20 +0530120// OnuDeviceEvent - event of interest to Device Adapters and OpenOMCI State Machines
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000121type OnuDeviceEvent int
122
123const (
124 // Events of interest to Device Adapters and OpenOMCI State Machines
Himani Chawla6d2ae152020-09-02 13:11:20 +0530125
126 // DeviceStatusInit - default start state
mpagenkofc4f56e2020-11-04 17:17:49 +0000127 DeviceStatusInit OnuDeviceEvent = iota
Himani Chawla6d2ae152020-09-02 13:11:20 +0530128 // MibDatabaseSync - MIB database sync (upload done)
mpagenkofc4f56e2020-11-04 17:17:49 +0000129 MibDatabaseSync
Himani Chawla6d2ae152020-09-02 13:11:20 +0530130 // OmciCapabilitiesDone - OMCI ME and message type capabilities known
mpagenkofc4f56e2020-11-04 17:17:49 +0000131 OmciCapabilitiesDone
Himani Chawla6d2ae152020-09-02 13:11:20 +0530132 // MibDownloadDone - // MIB download done
mpagenkofc4f56e2020-11-04 17:17:49 +0000133 MibDownloadDone
Himani Chawla6d2ae152020-09-02 13:11:20 +0530134 // UniLockStateDone - Uni ports admin set to lock
mpagenkofc4f56e2020-11-04 17:17:49 +0000135 UniLockStateDone
Himani Chawla6d2ae152020-09-02 13:11:20 +0530136 // UniUnlockStateDone - Uni ports admin set to unlock
mpagenkofc4f56e2020-11-04 17:17:49 +0000137 UniUnlockStateDone
mpagenko900ee4b2020-10-12 11:56:34 +0000138 // UniDisableStateDone - Uni ports admin set to lock based on device disable
mpagenkofc4f56e2020-11-04 17:17:49 +0000139 UniDisableStateDone
mpagenko900ee4b2020-10-12 11:56:34 +0000140 // UniEnableStateDone - Uni ports admin set to unlock based on device re-enable
mpagenkofc4f56e2020-11-04 17:17:49 +0000141 UniEnableStateDone
Himani Chawla6d2ae152020-09-02 13:11:20 +0530142 // PortLinkUp - Port link state change
mpagenkofc4f56e2020-11-04 17:17:49 +0000143 PortLinkUp
Himani Chawla6d2ae152020-09-02 13:11:20 +0530144 // PortLinkDw - Port link state change
mpagenkofc4f56e2020-11-04 17:17:49 +0000145 PortLinkDw
Himani Chawla6d2ae152020-09-02 13:11:20 +0530146 // OmciAniConfigDone - AniSide config according to TechProfile done
mpagenkofc4f56e2020-11-04 17:17:49 +0000147 OmciAniConfigDone
148 // OmciAniResourceRemoved - AniSide TechProfile related resource (Gem/TCont) removed
149 OmciAniResourceRemoved // needs to be the successor of OmciAniConfigDone!
mpagenkof1fc3862021-02-16 10:09:52 +0000150 // OmciVlanFilterAddDone - Omci Vlan config done according to flow-add with request to write kvStore
mpagenkofc4f56e2020-11-04 17:17:49 +0000151 OmciVlanFilterAddDone
mpagenkof1fc3862021-02-16 10:09:52 +0000152 // OmciVlanFilterAddDoneNoKvStore - Omci Vlan config done according to flow-add without writing kvStore
153 OmciVlanFilterAddDoneNoKvStore // needs to be the successor of OmciVlanFilterAddDone!
154 // OmciVlanFilterRemDone - Omci Vlan config done according to flow-remove with request to write kvStore
155 OmciVlanFilterRemDone // needs to be the successor of OmciVlanFilterAddDoneNoKvStore!
156 // OmciVlanFilterRemDoneNoKvStore - Omci Vlan config done according to flow-remove without writing kvStore
157 OmciVlanFilterRemDoneNoKvStore // needs to be the successor of OmciVlanFilterRemDone!
mpagenko80622a52021-02-09 16:53:23 +0000158 // OmciOnuSwUpgradeDone - SoftwareUpgrade to ONU finished
159 OmciOnuSwUpgradeDone
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000160 // Add other events here as needed (alarms separate???)
161)
162
163type activityDescr struct {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000164 databaseClass func(context.Context) error
Himani Chawla4d908332020-08-31 12:30:20 +0530165 //advertiseEvents bool
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000166 auditInterval time.Duration
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000167 //tasks map[string]func() error
168}
Himani Chawla6d2ae152020-09-02 13:11:20 +0530169
170// OmciDeviceFsms - FSM event mapping to database class and time to wait between audits
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000171type OmciDeviceFsms map[string]activityDescr
172
Himani Chawla6d2ae152020-09-02 13:11:20 +0530173// AdapterFsm - Adapter FSM details including channel, event and device
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000174type AdapterFsm struct {
175 fsmName string
176 deviceID string
177 commChan chan Message
178 pFsm *fsm.FSM
179}
180
Himani Chawla6d2ae152020-09-02 13:11:20 +0530181//NewAdapterFsm - FSM details including event, device and channel.
182func NewAdapterFsm(aName string, aDeviceID string, aCommChannel chan Message) *AdapterFsm {
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000183 aFsm := &AdapterFsm{
Himani Chawla6d2ae152020-09-02 13:11:20 +0530184 fsmName: aName,
185 deviceID: aDeviceID,
186 commChan: aCommChannel,
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000187 }
188 return aFsm
189}
190
191//Start starts (logs) the omci agent
dbainbri4d3a0dc2020-12-02 00:33:42 +0000192func (oo *AdapterFsm) logFsmStateChange(ctx context.Context, e *fsm.Event) {
193 logger.Debugw(ctx, "FSM state change", log.Fields{"device-id": oo.deviceID, "FSM name": oo.fsmName,
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000194 "event name": string(e.Event), "src state": string(e.Src), "dst state": string(e.Dst)})
195}
196
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000197//OntDeviceEntry structure holds information about the attached FSM'as and their communication
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000198
199const (
Himani Chawla6d2ae152020-09-02 13:11:20 +0530200 firstSwImageMeID = 0
201 secondSwImageMeID = 1
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000202)
mpagenko15ff4a52021-03-02 10:09:20 +0000203const ( //definitions as per G.988 softwareImage::IsCommitted
204 swIsUncommitted = 0
205 swIsCommitted = 1
206)
207const ( //definitions as per G.988 softwareImage::IsActive
208 //swIsInactive = 0 not yet used
209 swIsActive = 1
210)
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000211const onuDataMeID = 0
Himani Chawla6d2ae152020-09-02 13:11:20 +0530212const onugMeID = 0
213const onu2gMeID = 0
214const ipHostConfigDataMeID = 1
215const onugSerialNumberLen = 8
216const omciMacAddressLen = 6
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000217
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000218const cEmptyMacAddrString = "000000000000"
219const cEmptySerialNumberString = "0000000000000000"
220
mpagenko15ff4a52021-03-02 10:09:20 +0000221type sEntrySwImageIndication struct {
222 valid bool
223 entityID uint16
224 version string
225 isCommitted uint8
226}
227type sSwImageIndications struct {
228 activeEntityEntry sEntrySwImageIndication
229 inactiveEntityEntry sEntrySwImageIndication
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000230}
231
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000232type uniPersConfig struct {
233 PersUniID uint8 `json:"uni_id"`
Girish Gowdra041dcb32020-11-16 16:54:30 -0800234 PersTpPathMap map[uint8]string `json:"PersTpPathMap"` // tp-id to tp-path map
235 PersFlowParams []uniVlanFlowParams `json:"flow_params"` //as defined in omci_ani_config.go
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000236}
237
238type onuPersistentData struct {
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000239 PersOnuID uint32 `json:"onu_id"`
240 PersIntfID uint32 `json:"intf_id"`
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000241 PersSerialNumber string `json:"serial_number"`
242 PersMacAddress string `json:"mac_address"`
243 PersVendorID string `json:"vendor_id"`
244 PersEquipmentID string `json:"equipment_id"`
245 PersActiveSwVersion string `json:"active_sw_version"`
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000246 PersAdminState string `json:"admin_state"`
247 PersOperState string `json:"oper_state"`
248 PersUniUnlockDone bool `json:"uni_unlock_done"`
249 PersUniDisableDone bool `json:"uni_disable_done"`
250 PersMibAuditInterval time.Duration `json:"mib_audit_interval"`
251 PersMibLastDbSync uint32 `json:"mib_last_db_sync"`
252 PersMibDataSyncAdpt uint8 `json:"mib_data_sync_adpt"`
253 PersUniConfig []uniPersConfig `json:"uni_config"`
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000254}
255
Himani Chawla6d2ae152020-09-02 13:11:20 +0530256// OnuDeviceEntry - ONU device info and FSM events.
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000257type OnuDeviceEntry struct {
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000258 deviceID string
259 baseDeviceHandler *deviceHandler
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000260 pOpenOnuAc *OpenONUAC
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000261 coreProxy adapterif.CoreProxy
262 adapterProxy adapterif.AdapterProxy
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000263 PDevOmciCC *omciCC
264 pOnuDB *onuDeviceDB
265 mibTemplateKVStore *db.Backend
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000266 persUniConfigMutex sync.RWMutex
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000267 sOnuPersistentData onuPersistentData
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000268 mibTemplatePath string
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000269 onuKVStoreMutex sync.RWMutex
270 onuKVStore *db.Backend
271 onuKVStorePath string
272 onuKVStoreprocResult error //error indication of processing
273 chOnuKvProcessingStep chan uint8
mpagenko15ff4a52021-03-02 10:09:20 +0000274 onuSwImageIndications sSwImageIndications
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000275 //lockDeviceEntries sync.RWMutex
dbainbri4d3a0dc2020-12-02 00:33:42 +0000276 mibDbClass func(context.Context) error
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000277 supportedFsms OmciDeviceFsms
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000278 devState OnuDeviceEvent
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000279 // Audit and MDS
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000280 mibAuditInterval time.Duration
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000281 // TODO: periodical mib resync will be implemented with story VOL-3792
282 //mibNextDbResync uint32
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000283
284 // for mibUpload
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000285 pMibUploadFsm *AdapterFsm //could be handled dynamically and more general as pAdapterFsm - perhaps later
286 // for mibDownload
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000287 pMibDownloadFsm *AdapterFsm //could be handled dynamically and more general as pAdapterFsm - perhaps later
288 //remark: general usage of pAdapterFsm would require generalization of commChan usage and internal event setting
289 // within the FSM event procedures
ozgecanetsiae11479f2020-07-06 09:44:47 +0300290 omciMessageReceived chan bool //seperate channel needed by DownloadFsm
291 omciRebootMessageReceivedChannel chan Message // channel needed by Reboot request
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000292}
293
Himani Chawla6d2ae152020-09-02 13:11:20 +0530294//newOnuDeviceEntry returns a new instance of a OnuDeviceEntry
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000295//mib_db (as well as not inluded alarm_db not really used in this code? VERIFY!!)
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000296func newOnuDeviceEntry(ctx context.Context, dh *deviceHandler) *OnuDeviceEntry {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000297 logger.Debugw(ctx, "init-onuDeviceEntry", log.Fields{"device-id": dh.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000298 var onuDeviceEntry OnuDeviceEntry
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000299 onuDeviceEntry.deviceID = dh.deviceID
300 onuDeviceEntry.baseDeviceHandler = dh
301 onuDeviceEntry.pOpenOnuAc = dh.pOpenOnuAc
302 onuDeviceEntry.coreProxy = dh.coreProxy
303 onuDeviceEntry.adapterProxy = dh.AdapterProxy
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000304 onuDeviceEntry.devState = DeviceStatusInit
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000305 onuDeviceEntry.sOnuPersistentData.PersUniConfig = make([]uniPersConfig, 0)
306 onuDeviceEntry.chOnuKvProcessingStep = make(chan uint8)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300307 onuDeviceEntry.omciRebootMessageReceivedChannel = make(chan Message, 2048)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000308 //openomciagent.lockDeviceHandlersMap = sync.RWMutex{}
309 //OMCI related databases are on a per-agent basis. State machines and tasks
310 //are per ONU Vendor
311 //
312 // MIB Synchronization Database - possible overloading from arguments
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000313 if dh.pOpenOnuAc.pSupportedFsms != nil {
314 onuDeviceEntry.supportedFsms = *dh.pOpenOnuAc.pSupportedFsms
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000315 } else {
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000316 // This branch is currently not used and is for potential future usage of alternative MIB Sync FSMs only!
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000317 //var mibSyncFsm = NewMibSynchronizer()
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000318 // use some internal defaults, if not defined from outside
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000319 onuDeviceEntry.supportedFsms = OmciDeviceFsms{
320 "mib-synchronizer": {
321 //mibSyncFsm, // Implements the MIB synchronization state machine
Himani Chawla6d2ae152020-09-02 13:11:20 +0530322 onuDeviceEntry.mibDbVolatileDict, // Implements volatile ME MIB database
Himani Chawla4d908332020-08-31 12:30:20 +0530323 //true, // Advertise events on OpenOMCI event bus
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000324 dh.pOpenOnuAc.mibAuditInterval, // Time to wait between MIB audits. 0 to disable audits.
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000325 // map[string]func() error{
326 // "mib-upload": onuDeviceEntry.MibUploadTask,
327 // "mib-template": onuDeviceEntry.MibTemplateTask,
328 // "get-mds": onuDeviceEntry.GetMdsTask,
329 // "mib-audit": onuDeviceEntry.GetMdsTask,
330 // "mib-resync": onuDeviceEntry.MibResyncTask,
331 // "mib-reconcile": onuDeviceEntry.MibReconcileTask,
332 // },
333 },
334 }
335 }
336 onuDeviceEntry.mibDbClass = onuDeviceEntry.supportedFsms["mib-synchronizer"].databaseClass
dbainbri4d3a0dc2020-12-02 00:33:42 +0000337 logger.Debug(ctx, "access2mibDbClass")
338 go onuDeviceEntry.mibDbClass(ctx)
Holger Hildebrandtf37b3d72021-02-17 10:25:22 +0000339 if !dh.isReconciling() {
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000340 onuDeviceEntry.mibAuditInterval = onuDeviceEntry.supportedFsms["mib-synchronizer"].auditInterval
341 onuDeviceEntry.sOnuPersistentData.PersMibAuditInterval = onuDeviceEntry.mibAuditInterval
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000342 } else {
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000343 logger.Debugw(ctx, "reconciling - take audit interval from persistent data", log.Fields{"device-id": dh.deviceID})
344 // TODO: This is a preparation for VOL-VOL-3811 to preserve config history in case of
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000345 // vendor- or deviceID-specific configurations via voltctl-commands
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000346 onuDeviceEntry.mibAuditInterval = onuDeviceEntry.sOnuPersistentData.PersMibAuditInterval
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000347 }
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000348 logger.Debugw(ctx, "MibAudit is set to", log.Fields{"Interval": onuDeviceEntry.mibAuditInterval})
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000349 // TODO: periodical mib resync will be implemented with story VOL-3792
350 //onuDeviceEntry.mibNextDbResync = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000351
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000352 // Omci related Mib upload sync state machine
353 mibUploadChan := make(chan Message, 2048)
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000354 onuDeviceEntry.pMibUploadFsm = NewAdapterFsm("MibUpload", dh.deviceID, mibUploadChan)
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000355 onuDeviceEntry.pMibUploadFsm.pFsm = fsm.NewFSM(
mpagenko1cc3cb42020-07-27 15:24:38 +0000356 ulStDisabled,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000357 fsm.Events{
358
mpagenko1cc3cb42020-07-27 15:24:38 +0000359 {Name: ulEvStart, Src: []string{ulStDisabled}, Dst: ulStStarting},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000360
mpagenko1cc3cb42020-07-27 15:24:38 +0000361 {Name: ulEvResetMib, Src: []string{ulStStarting}, Dst: ulStResettingMib},
362 {Name: ulEvGetVendorAndSerial, Src: []string{ulStResettingMib}, Dst: ulStGettingVendorAndSerial},
Himani Chawla4d908332020-08-31 12:30:20 +0530363 {Name: ulEvGetEquipmentID, Src: []string{ulStGettingVendorAndSerial}, Dst: ulStGettingEquipmentID},
364 {Name: ulEvGetFirstSwVersion, Src: []string{ulStGettingEquipmentID}, Dst: ulStGettingFirstSwVersion},
mpagenko1cc3cb42020-07-27 15:24:38 +0000365 {Name: ulEvGetSecondSwVersion, Src: []string{ulStGettingFirstSwVersion}, Dst: ulStGettingSecondSwVersion},
366 {Name: ulEvGetMacAddress, Src: []string{ulStGettingSecondSwVersion}, Dst: ulStGettingMacAddress},
367 {Name: ulEvGetMibTemplate, Src: []string{ulStGettingMacAddress}, Dst: ulStGettingMibTemplate},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000368
mpagenko1cc3cb42020-07-27 15:24:38 +0000369 {Name: ulEvUploadMib, Src: []string{ulStGettingMibTemplate}, Dst: ulStUploading},
370 {Name: ulEvExamineMds, Src: []string{ulStStarting}, Dst: ulStExaminingMds},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000371
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000372 {Name: ulEvSuccess, Src: []string{ulStGettingMibTemplate}, Dst: ulStUploadDone},
373 {Name: ulEvSuccess, Src: []string{ulStUploading}, Dst: ulStUploadDone},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000374
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000375 {Name: ulEvSuccess, Src: []string{ulStUploadDone}, Dst: ulStInSync},
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000376 //{Name: ulEvSuccess, Src: []string{ulStExaminingMds}, Dst: ulStInSync},
377 {Name: ulEvSuccess, Src: []string{ulStExaminingMds}, Dst: ulStExaminingMdsSuccess},
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000378 // TODO: As long as mib-resynchronizing is not implemented, failed MDS-examination triggers
379 // mib-reset and new provisioning at this point
380 //{Name: ulEvMismatch, Src: []string{ulStExaminingMds}, Dst: ulStResynchronizing},
381 {Name: ulEvMismatch, Src: []string{ulStExaminingMds}, Dst: ulStResettingMib},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000382
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000383 {Name: ulEvSuccess, Src: []string{ulStExaminingMdsSuccess}, Dst: ulStInSync},
384 {Name: ulEvMismatch, Src: []string{ulStExaminingMdsSuccess}, Dst: ulStResettingMib},
385
mpagenko1cc3cb42020-07-27 15:24:38 +0000386 {Name: ulEvAuditMib, Src: []string{ulStInSync}, Dst: ulStAuditing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000387
mpagenko1cc3cb42020-07-27 15:24:38 +0000388 {Name: ulEvSuccess, Src: []string{ulStOutOfSync}, Dst: ulStInSync},
389 {Name: ulEvAuditMib, Src: []string{ulStOutOfSync}, Dst: ulStAuditing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000390
mpagenko1cc3cb42020-07-27 15:24:38 +0000391 {Name: ulEvSuccess, Src: []string{ulStAuditing}, Dst: ulStInSync},
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000392 {Name: ulEvMismatch, Src: []string{ulStAuditing}, Dst: ulStReAuditing},
mpagenko1cc3cb42020-07-27 15:24:38 +0000393 {Name: ulEvForceResync, Src: []string{ulStAuditing}, Dst: ulStResynchronizing},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000394
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000395 {Name: ulEvSuccess, Src: []string{ulStReAuditing}, Dst: ulStInSync},
396 {Name: ulEvMismatch, Src: []string{ulStReAuditing}, Dst: ulStResettingMib},
397
mpagenko1cc3cb42020-07-27 15:24:38 +0000398 {Name: ulEvSuccess, Src: []string{ulStResynchronizing}, Dst: ulStInSync},
399 {Name: ulEvDiffsFound, Src: []string{ulStResynchronizing}, Dst: ulStOutOfSync},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000400
Himani Chawla4d908332020-08-31 12:30:20 +0530401 {Name: ulEvTimeout, Src: []string{ulStResettingMib, ulStGettingVendorAndSerial, ulStGettingEquipmentID, ulStGettingFirstSwVersion,
mpagenko1cc3cb42020-07-27 15:24:38 +0000402 ulStGettingSecondSwVersion, ulStGettingMacAddress, ulStGettingMibTemplate, ulStUploading, ulStResynchronizing, ulStExaminingMds,
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000403 ulStUploadDone, ulStInSync, ulStOutOfSync, ulStAuditing, ulStReAuditing}, Dst: ulStStarting},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000404
Himani Chawla4d908332020-08-31 12:30:20 +0530405 {Name: ulEvStop, Src: []string{ulStStarting, ulStResettingMib, ulStGettingVendorAndSerial, ulStGettingEquipmentID, ulStGettingFirstSwVersion,
mpagenko1cc3cb42020-07-27 15:24:38 +0000406 ulStGettingSecondSwVersion, ulStGettingMacAddress, ulStGettingMibTemplate, ulStUploading, ulStResynchronizing, ulStExaminingMds,
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000407 ulStUploadDone, ulStInSync, ulStOutOfSync, ulStAuditing, ulStReAuditing}, Dst: ulStDisabled},
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000408 },
409
410 fsm.Callbacks{
dbainbri4d3a0dc2020-12-02 00:33:42 +0000411 "enter_state": func(e *fsm.Event) { onuDeviceEntry.pMibUploadFsm.logFsmStateChange(ctx, e) },
412 "enter_" + ulStStarting: func(e *fsm.Event) { onuDeviceEntry.enterStartingState(ctx, e) },
413 "enter_" + ulStResettingMib: func(e *fsm.Event) { onuDeviceEntry.enterResettingMibState(ctx, e) },
414 "enter_" + ulStGettingVendorAndSerial: func(e *fsm.Event) { onuDeviceEntry.enterGettingVendorAndSerialState(ctx, e) },
415 "enter_" + ulStGettingEquipmentID: func(e *fsm.Event) { onuDeviceEntry.enterGettingEquipmentIDState(ctx, e) },
416 "enter_" + ulStGettingFirstSwVersion: func(e *fsm.Event) { onuDeviceEntry.enterGettingFirstSwVersionState(ctx, e) },
417 "enter_" + ulStGettingSecondSwVersion: func(e *fsm.Event) { onuDeviceEntry.enterGettingSecondSwVersionState(ctx, e) },
418 "enter_" + ulStGettingMacAddress: func(e *fsm.Event) { onuDeviceEntry.enterGettingMacAddressState(ctx, e) },
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000419 "enter_" + ulStGettingMibTemplate: func(e *fsm.Event) { onuDeviceEntry.enterGettingMibTemplateState(ctx, e) },
dbainbri4d3a0dc2020-12-02 00:33:42 +0000420 "enter_" + ulStUploading: func(e *fsm.Event) { onuDeviceEntry.enterUploadingState(ctx, e) },
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000421 "enter_" + ulStUploadDone: func(e *fsm.Event) { onuDeviceEntry.enterUploadDoneState(ctx, e) },
dbainbri4d3a0dc2020-12-02 00:33:42 +0000422 "enter_" + ulStExaminingMds: func(e *fsm.Event) { onuDeviceEntry.enterExaminingMdsState(ctx, e) },
423 "enter_" + ulStResynchronizing: func(e *fsm.Event) { onuDeviceEntry.enterResynchronizingState(ctx, e) },
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000424 "enter_" + ulStExaminingMdsSuccess: func(e *fsm.Event) { onuDeviceEntry.enterExaminingMdsSuccessState(ctx, e) },
dbainbri4d3a0dc2020-12-02 00:33:42 +0000425 "enter_" + ulStAuditing: func(e *fsm.Event) { onuDeviceEntry.enterAuditingState(ctx, e) },
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000426 "enter_" + ulStReAuditing: func(e *fsm.Event) { onuDeviceEntry.enterReAuditingState(ctx, e) },
dbainbri4d3a0dc2020-12-02 00:33:42 +0000427 "enter_" + ulStOutOfSync: func(e *fsm.Event) { onuDeviceEntry.enterOutOfSyncState(ctx, e) },
428 "enter_" + ulStInSync: func(e *fsm.Event) { onuDeviceEntry.enterInSyncState(ctx, e) },
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000429 },
430 )
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000431 // Omci related Mib download state machine
432 mibDownloadChan := make(chan Message, 2048)
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000433 onuDeviceEntry.pMibDownloadFsm = NewAdapterFsm("MibDownload", dh.deviceID, mibDownloadChan)
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000434 onuDeviceEntry.pMibDownloadFsm.pFsm = fsm.NewFSM(
mpagenko1cc3cb42020-07-27 15:24:38 +0000435 dlStDisabled,
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000436 fsm.Events{
437
mpagenko1cc3cb42020-07-27 15:24:38 +0000438 {Name: dlEvStart, Src: []string{dlStDisabled}, Dst: dlStStarting},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000439
mpagenko1cc3cb42020-07-27 15:24:38 +0000440 {Name: dlEvCreateGal, Src: []string{dlStStarting}, Dst: dlStCreatingGal},
441 {Name: dlEvRxGalResp, Src: []string{dlStCreatingGal}, Dst: dlStSettingOnu2g},
442 {Name: dlEvRxOnu2gResp, Src: []string{dlStSettingOnu2g}, Dst: dlStBridgeInit},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000443 // the bridge state is used for multi ME config for alle UNI related ports
444 // maybe such could be reflected in the state machine as well (port number parametrized)
445 // but that looks not straightforward here - so we keep it simple here for the beginning(?)
mpagenko1cc3cb42020-07-27 15:24:38 +0000446 {Name: dlEvRxBridgeResp, Src: []string{dlStBridgeInit}, Dst: dlStDownloaded},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000447
mpagenko1cc3cb42020-07-27 15:24:38 +0000448 {Name: dlEvTimeoutSimple, Src: []string{dlStCreatingGal, dlStSettingOnu2g}, Dst: dlStStarting},
449 {Name: dlEvTimeoutBridge, Src: []string{dlStBridgeInit}, Dst: dlStStarting},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000450
mpagenko1cc3cb42020-07-27 15:24:38 +0000451 {Name: dlEvReset, Src: []string{dlStStarting, dlStCreatingGal, dlStSettingOnu2g,
452 dlStBridgeInit, dlStDownloaded}, Dst: dlStResetting},
453 // exceptional treatment for all states except dlStResetting
454 {Name: dlEvRestart, Src: []string{dlStStarting, dlStCreatingGal, dlStSettingOnu2g,
455 dlStBridgeInit, dlStDownloaded, dlStResetting}, Dst: dlStDisabled},
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000456 },
457
458 fsm.Callbacks{
dbainbri4d3a0dc2020-12-02 00:33:42 +0000459 "enter_state": func(e *fsm.Event) { onuDeviceEntry.pMibDownloadFsm.logFsmStateChange(ctx, e) },
460 "enter_" + dlStStarting: func(e *fsm.Event) { onuDeviceEntry.enterDLStartingState(ctx, e) },
461 "enter_" + dlStCreatingGal: func(e *fsm.Event) { onuDeviceEntry.enterCreatingGalState(ctx, e) },
462 "enter_" + dlStSettingOnu2g: func(e *fsm.Event) { onuDeviceEntry.enterSettingOnu2gState(ctx, e) },
463 "enter_" + dlStBridgeInit: func(e *fsm.Event) { onuDeviceEntry.enterBridgeInitState(ctx, e) },
464 "enter_" + dlStDownloaded: func(e *fsm.Event) { onuDeviceEntry.enterDownloadedState(ctx, e) },
465 "enter_" + dlStResetting: func(e *fsm.Event) { onuDeviceEntry.enterResettingState(ctx, e) },
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000466 },
467 )
468 if onuDeviceEntry.pMibDownloadFsm == nil || onuDeviceEntry.pMibDownloadFsm.pFsm == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000469 logger.Errorw(ctx, "MibDownloadFsm could not be instantiated", log.Fields{"device-id": dh.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +0000470 // TODO some specific error treatment - or waiting for crash ?
Holger Hildebrandt9ac0d0f2020-05-13 11:22:02 +0000471 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000472
dbainbri4d3a0dc2020-12-02 00:33:42 +0000473 onuDeviceEntry.mibTemplateKVStore = onuDeviceEntry.baseDeviceHandler.setBackend(ctx, cBasePathMibTemplateKvStore)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000474 if onuDeviceEntry.mibTemplateKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000475 logger.Errorw(ctx, "Can't access mibTemplateKVStore - no backend connection to service",
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000476 log.Fields{"device-id": dh.deviceID, "service": cBasePathMibTemplateKvStore})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000477 }
478
479 onuDeviceEntry.onuKVStorePath = onuDeviceEntry.deviceID
Matteo Scandolof1f39a72020-11-24 12:08:11 -0800480 baseKvStorePath := fmt.Sprintf(cBasePathOnuKVStore, dh.pOpenOnuAc.cm.Backend.PathPrefix)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000481 onuDeviceEntry.onuKVStore = onuDeviceEntry.baseDeviceHandler.setBackend(ctx, baseKvStorePath)
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000482 if onuDeviceEntry.onuKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000483 logger.Errorw(ctx, "Can't access onuKVStore - no backend connection to service",
Matteo Scandolof1f39a72020-11-24 12:08:11 -0800484 log.Fields{"device-id": dh.deviceID, "service": baseKvStorePath})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000485 }
486
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000487 // Alarm Synchronization Database
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530488
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000489 //self._alarm_db = None
490 //self._alarm_database_cls = support_classes['alarm-synchronizer']['database']
491 return &onuDeviceEntry
492}
493
Himani Chawla6d2ae152020-09-02 13:11:20 +0530494//start starts (logs) the omci agent
495func (oo *OnuDeviceEntry) start(ctx context.Context) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000496 logger.Debugw(ctx, "OnuDeviceEntry-starting", log.Fields{"for device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000497 if oo.PDevOmciCC == nil {
mpagenko900ee4b2020-10-12 11:56:34 +0000498 oo.PDevOmciCC = newOmciCC(ctx, oo, oo.deviceID, oo.baseDeviceHandler,
499 oo.coreProxy, oo.adapterProxy)
500 if oo.PDevOmciCC == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000501 logger.Errorw(ctx, "Could not create devOmciCc - abort", log.Fields{"for device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000502 return fmt.Errorf("could not create devOmciCc %s", oo.deviceID)
503 }
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000504 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000505 return nil
506}
507
mpagenko900ee4b2020-10-12 11:56:34 +0000508//stop stops/resets the omciCC
509func (oo *OnuDeviceEntry) stop(ctx context.Context, abResetOmciCC bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000510 logger.Debugw(ctx, "OnuDeviceEntry-stopping", log.Fields{"for device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000511 if abResetOmciCC && (oo.PDevOmciCC != nil) {
512 _ = oo.PDevOmciCC.stop(ctx)
513 }
514 //to allow for all event notifications again when re-using the device and omciCC
515 oo.devState = DeviceStatusInit
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000516 return nil
517}
518
Himani Chawla6d2ae152020-09-02 13:11:20 +0530519func (oo *OnuDeviceEntry) reboot(ctx context.Context) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000520 logger.Debugw(ctx, "OnuDeviceEntry-rebooting", log.Fields{"for device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000521 if oo.PDevOmciCC != nil {
522 if err := oo.PDevOmciCC.sendReboot(ctx, ConstDefaultOmciTimeout, true, oo.omciRebootMessageReceivedChannel); err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000523 logger.Errorw(ctx, "onu didn't reboot", log.Fields{"for device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000524 return err
525 }
ozgecanetsiae11479f2020-07-06 09:44:47 +0300526 }
ozgecanetsiae11479f2020-07-06 09:44:47 +0300527 return nil
528}
529
dbainbri4d3a0dc2020-12-02 00:33:42 +0000530func (oo *OnuDeviceEntry) waitForRebootResponse(ctx context.Context, responseChannel chan Message) error {
ozgecanetsiae11479f2020-07-06 09:44:47 +0300531 select {
532 case <-time.After(3 * time.Second): //3s was detected to be to less in 8*8 bbsim test with debug Info/Debug
dbainbri4d3a0dc2020-12-02 00:33:42 +0000533 logger.Warnw(ctx, "Reboot timeout", log.Fields{"for device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200534 return fmt.Errorf("rebootTimeout")
ozgecanetsiae11479f2020-07-06 09:44:47 +0300535 case data := <-responseChannel:
536 switch data.Data.(OmciMessage).OmciMsg.MessageType {
537 case omci.RebootResponseType:
538 {
539 msgLayer := (*data.Data.(OmciMessage).OmciPacket).Layer(omci.LayerTypeRebootResponse)
540 if msgLayer == nil {
Andrea Campanella6515c582020-10-05 11:25:00 +0200541 return fmt.Errorf("omci Msg layer could not be detected for RebootResponseType")
ozgecanetsiae11479f2020-07-06 09:44:47 +0300542 }
Andrea Campanellabef4e542020-10-22 11:01:28 +0200543 msgObj, msgOk := msgLayer.(*omci.RebootResponse)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300544 if !msgOk {
Andrea Campanella6515c582020-10-05 11:25:00 +0200545 return fmt.Errorf("omci Msg layer could not be assigned for RebootResponseType %s", oo.deviceID)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300546 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000547 logger.Debugw(ctx, "RebootResponse data", log.Fields{"device-id": oo.deviceID, "data-fields": msgObj})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300548 if msgObj.Result != me.Success {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000549 logger.Errorw(ctx, "Omci RebootResponse result error", log.Fields{"device-id": oo.deviceID, "Error": msgObj.Result})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300550 // possibly force FSM into abort or ignore some errors for some messages? store error for mgmt display?
Andrea Campanellabef4e542020-10-22 11:01:28 +0200551 return fmt.Errorf("omci RebootResponse result error indication %s for device %s",
Andrea Campanella6515c582020-10-05 11:25:00 +0200552 msgObj.Result, oo.deviceID)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300553 }
554 return nil
555 }
556 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000557 logger.Warnw(ctx, "Reboot response message type error", log.Fields{"for device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200558 return fmt.Errorf("unexpected OmciResponse type received %s", oo.deviceID)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300559 }
560}
561
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000562//Relay the InSync message via Handler to Rw core - Status update
dbainbri4d3a0dc2020-12-02 00:33:42 +0000563func (oo *OnuDeviceEntry) transferSystemEvent(ctx context.Context, devEvent OnuDeviceEvent) {
564 logger.Debugw(ctx, "relaying system-event", log.Fields{"Event": devEvent})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000565 // decouple the handler transfer from further processing here
566 // TODO!!! check if really no synch is required within the system e.g. to ensure following steps ..
Himani Chawla26e555c2020-08-31 12:30:20 +0530567 if devEvent == MibDatabaseSync {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000568 if oo.devState < MibDatabaseSync { //devState has not been synced yet
569 oo.devState = MibDatabaseSync
dbainbri4d3a0dc2020-12-02 00:33:42 +0000570 go oo.baseDeviceHandler.deviceProcStatusUpdate(ctx, devEvent)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000571 //TODO!!! device control: next step: start MIB capability verification from here ?!!!
572 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000573 logger.Debugw(ctx, "mibinsync-event in some already synced state - ignored", log.Fields{"state": oo.devState})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000574 }
Himani Chawla26e555c2020-08-31 12:30:20 +0530575 } else if devEvent == MibDownloadDone {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000576 if oo.devState < MibDownloadDone { //devState has not been synced yet
577 oo.devState = MibDownloadDone
dbainbri4d3a0dc2020-12-02 00:33:42 +0000578 go oo.baseDeviceHandler.deviceProcStatusUpdate(ctx, devEvent)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000579 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000580 logger.Debugw(ctx, "mibdownloaddone-event was already seen - ignored", log.Fields{"state": oo.devState})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000581 }
582 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000583 logger.Warnw(ctx, "device-event not yet handled", log.Fields{"state": devEvent})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000584 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000585}
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000586
587func (oo *OnuDeviceEntry) restoreDataFromOnuKvStore(ctx context.Context) error {
588 if oo.onuKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000589 logger.Debugw(ctx, "onuKVStore not set - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000590 return fmt.Errorf(fmt.Sprintf("onuKVStore-not-set-abort-%s", oo.deviceID))
591 }
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000592 oo.persUniConfigMutex.Lock()
593 defer oo.persUniConfigMutex.Unlock()
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000594 oo.sOnuPersistentData =
595 onuPersistentData{0, 0, "", "", "", "", "", "", "", false, false, oo.mibAuditInterval, 0, 0, make([]uniPersConfig, 0)}
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000596 oo.onuKVStoreMutex.RLock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000597 Value, err := oo.onuKVStore.Get(ctx, oo.onuKVStorePath)
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000598 oo.onuKVStoreMutex.RUnlock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000599 if err == nil {
600 if Value != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000601 logger.Debugw(ctx, "ONU-data read",
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000602 log.Fields{"Key": Value.Key, "device-id": oo.deviceID})
603 tmpBytes, _ := kvstore.ToByte(Value.Value)
604
605 if err = json.Unmarshal(tmpBytes, &oo.sOnuPersistentData); err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000606 logger.Errorw(ctx, "unable to unmarshal ONU-data", log.Fields{"error": err, "device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000607 return fmt.Errorf(fmt.Sprintf("unable-to-unmarshal-ONU-data-%s", oo.deviceID))
608 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000609 logger.Debugw(ctx, "ONU-data", log.Fields{"sOnuPersistentData": oo.sOnuPersistentData,
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000610 "device-id": oo.deviceID})
611 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000612 logger.Debugw(ctx, "no ONU-data found", log.Fields{"path": oo.onuKVStorePath, "device-id": oo.deviceID})
mpagenko2418ab02020-11-12 12:58:06 +0000613 return fmt.Errorf("no-ONU-data-found")
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000614 }
615 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000616 logger.Errorw(ctx, "unable to read from KVstore", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000617 return fmt.Errorf(fmt.Sprintf("unable-to-read-from-KVstore-%s", oo.deviceID))
618 }
619 return nil
620}
621
622func (oo *OnuDeviceEntry) deleteDataFromOnuKvStore(ctx context.Context, wg *sync.WaitGroup) {
623 defer wg.Done()
624
625 if oo.onuKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000626 logger.Debugw(ctx, "onuKVStore not set - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000627 oo.onuKVStoreprocResult = errors.New("onu-data delete aborted: onuKVStore not set")
628 return
629 }
630 var processingStep uint8 = 1 // used to synchronize the different processing steps with chOnuKvProcessingStep
631 go oo.deletePersistentData(ctx, processingStep)
632 if !oo.waitForTimeoutOrCompletion(ctx, oo.chOnuKvProcessingStep, processingStep) {
633 //timeout or error detected
dbainbri4d3a0dc2020-12-02 00:33:42 +0000634 logger.Debugw(ctx, "ONU-data not deleted - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000635 oo.onuKVStoreprocResult = errors.New("onu-data delete aborted: during kv-access")
636 return
637 }
638}
639
640func (oo *OnuDeviceEntry) deletePersistentData(ctx context.Context, aProcessingStep uint8) {
641
dbainbri4d3a0dc2020-12-02 00:33:42 +0000642 logger.Debugw(ctx, "delete and clear internal persistency data", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000643
644 oo.persUniConfigMutex.Lock()
645 defer oo.persUniConfigMutex.Unlock()
646
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000647 oo.sOnuPersistentData.PersUniConfig = nil //releasing all UniConfig entries to garbage collector default entry
648 oo.sOnuPersistentData =
649 onuPersistentData{0, 0, "", "", "", "", "", "", "", false, false, oo.mibAuditInterval, 0, 0, make([]uniPersConfig, 0)}
dbainbri4d3a0dc2020-12-02 00:33:42 +0000650 logger.Debugw(ctx, "delete ONU-data from KVStore", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000651 oo.onuKVStoreMutex.Lock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000652 err := oo.onuKVStore.Delete(ctx, oo.onuKVStorePath)
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000653 oo.onuKVStoreMutex.Unlock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000654 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000655 logger.Errorw(ctx, "unable to delete in KVstore", log.Fields{"device-id": oo.deviceID, "err": err})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000656 oo.chOnuKvProcessingStep <- 0 //error indication
657 return
658 }
659 oo.chOnuKvProcessingStep <- aProcessingStep //done
660}
661
662func (oo *OnuDeviceEntry) updateOnuKvStore(ctx context.Context, wg *sync.WaitGroup) {
663 defer wg.Done()
664
665 if oo.onuKVStore == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000666 logger.Debugw(ctx, "onuKVStore not set - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000667 oo.onuKVStoreprocResult = errors.New("onu-data update aborted: onuKVStore not set")
668 return
669 }
670 var processingStep uint8 = 1 // used to synchronize the different processing steps with chOnuKvProcessingStep
671 go oo.storeDataInOnuKvStore(ctx, processingStep)
672 if !oo.waitForTimeoutOrCompletion(ctx, oo.chOnuKvProcessingStep, processingStep) {
673 //timeout or error detected
dbainbri4d3a0dc2020-12-02 00:33:42 +0000674 logger.Debugw(ctx, "ONU-data not written - abort", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000675 oo.onuKVStoreprocResult = errors.New("onu-data update aborted: during writing process")
676 return
677 }
678}
679
680func (oo *OnuDeviceEntry) storeDataInOnuKvStore(ctx context.Context, aProcessingStep uint8) {
681
682 //assign values which are not already present when newOnuDeviceEntry() is called
683 oo.sOnuPersistentData.PersOnuID = oo.baseDeviceHandler.pOnuIndication.OnuId
684 oo.sOnuPersistentData.PersIntfID = oo.baseDeviceHandler.pOnuIndication.IntfId
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000685 //TODO: verify usage of these values during restart UC
Holger Hildebrandt3a644642020-12-02 09:46:18 +0000686 oo.sOnuPersistentData.PersAdminState = oo.baseDeviceHandler.pOnuIndication.AdminState
687 oo.sOnuPersistentData.PersOperState = oo.baseDeviceHandler.pOnuIndication.OperState
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000688
689 oo.persUniConfigMutex.RLock()
690 defer oo.persUniConfigMutex.RUnlock()
dbainbri4d3a0dc2020-12-02 00:33:42 +0000691 logger.Debugw(ctx, "Update ONU-data in KVStore", log.Fields{"device-id": oo.deviceID, "sOnuPersistentData": oo.sOnuPersistentData})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000692
693 Value, err := json.Marshal(oo.sOnuPersistentData)
694 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000695 logger.Errorw(ctx, "unable to marshal ONU-data", log.Fields{"sOnuPersistentData": oo.sOnuPersistentData,
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000696 "device-id": oo.deviceID, "err": err})
697 oo.chOnuKvProcessingStep <- 0 //error indication
698 return
699 }
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000700 oo.onuKVStoreMutex.Lock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000701 err = oo.onuKVStore.Put(ctx, oo.onuKVStorePath, Value)
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000702 oo.onuKVStoreMutex.Unlock()
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000703 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000704 logger.Errorw(ctx, "unable to write ONU-data into KVstore", log.Fields{"device-id": oo.deviceID, "err": err})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000705 oo.chOnuKvProcessingStep <- 0 //error indication
706 return
707 }
708 oo.chOnuKvProcessingStep <- aProcessingStep //done
709}
710
dbainbri4d3a0dc2020-12-02 00:33:42 +0000711func (oo *OnuDeviceEntry) updateOnuUniTpPath(ctx context.Context, aUniID uint8, aTpID uint8, aPathString string) bool {
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000712 /* within some specific InterAdapter processing request write/read access to data is ensured to be sequentially,
713 as also the complete sequence is ensured to 'run to completion' before some new request is accepted
714 no specific concurrency protection to sOnuPersistentData is required here
715 */
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000716 oo.persUniConfigMutex.Lock()
717 defer oo.persUniConfigMutex.Unlock()
718
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000719 for k, v := range oo.sOnuPersistentData.PersUniConfig {
720 if v.PersUniID == aUniID {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000721 logger.Debugw(ctx, "PersUniConfig-entry already exists", log.Fields{"device-id": oo.deviceID, "uniID": aUniID})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800722 existingPath, ok := oo.sOnuPersistentData.PersUniConfig[k].PersTpPathMap[aTpID]
723 if !ok {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000724 logger.Debugw(ctx, "tp-does-not-exist--to-be-created-afresh", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "tpID": aTpID, "path": aPathString})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800725 }
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000726 if existingPath != aPathString {
727 if aPathString == "" {
728 //existing entry to be deleted
dbainbri4d3a0dc2020-12-02 00:33:42 +0000729 logger.Debugw(ctx, "UniTp delete path value", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800730 oo.sOnuPersistentData.PersUniConfig[k].PersTpPathMap[aTpID] = ""
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000731 } else {
732 //existing entry to be modified
dbainbri4d3a0dc2020-12-02 00:33:42 +0000733 logger.Debugw(ctx, "UniTp modify path value", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800734 oo.sOnuPersistentData.PersUniConfig[k].PersTpPathMap[aTpID] = aPathString
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000735 }
736 return true
737 }
738 //entry already exists
mpagenkofc4f56e2020-11-04 17:17:49 +0000739 if aPathString == "" {
740 //no active TechProfile
dbainbri4d3a0dc2020-12-02 00:33:42 +0000741 logger.Debugw(ctx, "UniTp path has already been removed - no AniSide config to be removed", log.Fields{
mpagenkofc4f56e2020-11-04 17:17:49 +0000742 "device-id": oo.deviceID, "uniID": aUniID})
743 // attention 201105: this block is at the moment entered for each of subsequent GemPortDeletes and TContDelete
744 // as the path is already cleared with the first GemPort - this will probably change with the upcoming real
745 // TechProfile removal (still TODO), but anyway the reasonUpdate initiated here should not harm overall behavior
dbainbri4d3a0dc2020-12-02 00:33:42 +0000746 go oo.baseDeviceHandler.deviceProcStatusUpdate(ctx, OmciAniResourceRemoved)
mpagenkofc4f56e2020-11-04 17:17:49 +0000747 // no flow config pending on 'remove' so far
748 } else {
749 //the given TechProfile already exists and is assumed to be active - update devReason as if the config has been done here
750 //was needed e.g. in voltha POD Tests:Validate authentication on a disabled ONU
751 // (as here the TechProfile has not been removed with the disable-device before the new enable-device)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000752 logger.Debugw(ctx, "UniTp path already exists - TechProfile supposed to be active", log.Fields{
mpagenkofc4f56e2020-11-04 17:17:49 +0000753 "device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
754 //no deviceReason update (deviceProcStatusUpdate) here to ensure 'omci_flows_pushed' state within disable/enable procedure of ATT scenario
755 // (during which the flows are removed/re-assigned but the techProf is left active)
756 //and as the TechProfile is regarded as active we have to verify, if some flow configuration still waits on it
757 // (should not be the case, but should not harm or be more robust ...)
mpagenko2418ab02020-11-12 12:58:06 +0000758 // and to be sure, that for some reason the corresponding TpDelete was lost somewhere in history
759 // we also reset a possibly outstanding delete request - repeated TpConfig is regarded as valid for waiting flow config
760 if oo.baseDeviceHandler.pOnuTP != nil {
Girish Gowdra041dcb32020-11-16 16:54:30 -0800761 oo.baseDeviceHandler.pOnuTP.setProfileToDelete(aUniID, aTpID, false)
mpagenko2418ab02020-11-12 12:58:06 +0000762 }
mpagenko551a4d42020-12-08 18:09:20 +0000763 go oo.baseDeviceHandler.VerifyVlanConfigRequest(ctx, aUniID, aTpID)
mpagenkofc4f56e2020-11-04 17:17:49 +0000764 }
765 return false //indicate 'no change' - nothing more to do, TechProf inter-adapter message is return with success anyway here
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000766 }
767 }
768 //no entry exists for uniId
769
770 if aPathString == "" {
771 //delete request in non-existing state , accept as no change
dbainbri4d3a0dc2020-12-02 00:33:42 +0000772 logger.Debugw(ctx, "UniTp path already removed", log.Fields{"device-id": oo.deviceID, "uniID": aUniID})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000773 return false
774 }
775 //new entry to be created
dbainbri4d3a0dc2020-12-02 00:33:42 +0000776 logger.Debugw(ctx, "New UniTp path set", log.Fields{"device-id": oo.deviceID, "uniID": aUniID, "path": aPathString})
Girish Gowdra041dcb32020-11-16 16:54:30 -0800777 perSubTpPathMap := make(map[uint8]string)
778 perSubTpPathMap[aTpID] = aPathString
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000779 oo.sOnuPersistentData.PersUniConfig =
Girish Gowdra041dcb32020-11-16 16:54:30 -0800780 append(oo.sOnuPersistentData.PersUniConfig, uniPersConfig{PersUniID: aUniID, PersTpPathMap: perSubTpPathMap, PersFlowParams: make([]uniVlanFlowParams, 0)})
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000781 return true
782}
783
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000784func (oo *OnuDeviceEntry) updateOnuUniFlowConfig(aUniID uint8, aUniVlanFlowParams *[]uniVlanFlowParams) {
785
Holger Hildebrandtdaf0f722021-02-12 11:50:30 +0000786 oo.persUniConfigMutex.Lock()
787 defer oo.persUniConfigMutex.Unlock()
788
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000789 for k, v := range oo.sOnuPersistentData.PersUniConfig {
790 if v.PersUniID == aUniID {
791 oo.sOnuPersistentData.PersUniConfig[k].PersFlowParams = make([]uniVlanFlowParams, len(*aUniVlanFlowParams))
792 copy(oo.sOnuPersistentData.PersUniConfig[k].PersFlowParams, *aUniVlanFlowParams)
793 return
794 }
795 }
796 //flow update was faster than tp-config - create PersUniConfig-entry
Girish Gowdra041dcb32020-11-16 16:54:30 -0800797 tmpConfig := uniPersConfig{PersUniID: aUniID, PersTpPathMap: make(map[uint8]string), PersFlowParams: make([]uniVlanFlowParams, len(*aUniVlanFlowParams))}
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000798 copy(tmpConfig.PersFlowParams, *aUniVlanFlowParams)
799 oo.sOnuPersistentData.PersUniConfig = append(oo.sOnuPersistentData.PersUniConfig, tmpConfig)
800}
801
802func (oo *OnuDeviceEntry) waitForTimeoutOrCompletion(
803 ctx context.Context, aChOnuProcessingStep <-chan uint8, aProcessingStep uint8) bool {
804 select {
805 case <-ctx.Done():
dbainbri4d3a0dc2020-12-02 00:33:42 +0000806 logger.Warnw(ctx, "processing not completed in-time!",
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000807 log.Fields{"device-id": oo.deviceID, "error": ctx.Err()})
808 return false
809 case rxStep := <-aChOnuProcessingStep:
810 if rxStep == aProcessingStep {
811 return true
812 }
813 //all other values are not accepted - including 0 for error indication
dbainbri4d3a0dc2020-12-02 00:33:42 +0000814 logger.Warnw(ctx, "Invalid processing step received: abort!",
Holger Hildebrandt47555e72020-09-21 11:07:24 +0000815 log.Fields{"device-id": oo.deviceID,
816 "wantedStep": aProcessingStep, "haveStep": rxStep})
817 return false
818 }
819}
820
821func (oo *OnuDeviceEntry) resetKvProcessingErrorIndication() {
822 oo.onuKVStoreprocResult = nil
823}
824func (oo *OnuDeviceEntry) getKvProcessingErrorIndication() error {
825 return oo.onuKVStoreprocResult
826}
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000827func (oo *OnuDeviceEntry) incrementMibDataSync(ctx context.Context) {
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000828 if oo.sOnuPersistentData.PersMibDataSyncAdpt < 255 {
829 oo.sOnuPersistentData.PersMibDataSyncAdpt++
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000830 } else {
831 // per G.984 and G.988 overflow starts over at 1 given 0 is reserved for reset
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000832 oo.sOnuPersistentData.PersMibDataSyncAdpt = 1
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000833 }
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000834 logger.Debugf(ctx, "mibDataSync updated - mds: %d - device-id: %s", oo.sOnuPersistentData.PersMibDataSyncAdpt, oo.deviceID)
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000835}
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000836
837func (oo *OnuDeviceEntry) buildMibTemplatePath() string {
838 return fmt.Sprintf(cSuffixMibTemplateKvStore, oo.sOnuPersistentData.PersVendorID, oo.sOnuPersistentData.PersEquipmentID, oo.sOnuPersistentData.PersActiveSwVersion)
839}