blob: 036a694220f0bb43aedff69bcb0d90812c9d2db5 [file] [log] [blame]
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001/*
Joey Armstrong89c812c2024-01-12 19:00:20 -05002 * Copyright 2020-2024 Open Networking Foundation (ONF) and the ONF Contributors
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00003 *
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
nikesh.krishnan1ffb8132023-05-23 03:44:13 +053017// Package mib provides the utilities for managing the onu mib
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000018package mib
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000019
20import (
21 "context"
Holger Hildebrandtc54939a2020-06-17 08:14:27 +000022 "encoding/hex"
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000023 "encoding/json"
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000024 "errors"
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000025 "fmt"
26 "strconv"
mpagenko3af1f032020-06-10 08:53:41 +000027 "strings"
Girish Gowdraf7d82d02022-04-26 16:18:35 -070028 "sync"
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000029
30 "github.com/looplab/fsm"
31
divyadesaibbed37c2020-08-28 13:35:20 +053032 "time"
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000033
mpagenko7033f4e2021-11-19 18:04:22 +000034 "github.com/google/gopacket"
mpagenko836a1fd2021-11-01 16:12:42 +000035 "github.com/opencord/omci-lib-go/v2"
36 me "github.com/opencord/omci-lib-go/v2/generated"
khenaidoo7d3c5582021-08-11 18:09:44 -040037 "github.com/opencord/voltha-lib-go/v7/pkg/db/kvstore"
38 "github.com/opencord/voltha-lib-go/v7/pkg/log"
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000039 cmn "github.com/opencord/voltha-openonu-adapter-go/internal/pkg/common"
40 devdb "github.com/opencord/voltha-openonu-adapter-go/internal/pkg/devdb"
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +000041 otst "github.com/opencord/voltha-openonu-adapter-go/internal/pkg/omcitst"
Holger Hildebrandt9afc1582021-11-30 16:10:19 +000042 "github.com/opencord/voltha-protos/v5/go/inter_adapter"
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000043)
44
mpagenko01499812021-03-25 10:37:12 +000045type sLastTxMeParameter struct {
mpagenko01499812021-03-25 10:37:12 +000046 pLastTxMeInstance *me.ManagedEntity
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +053047 lastTxMessageType omci.MessageType
mpagenko01499812021-03-25 10:37:12 +000048 repeatCount uint8
49}
50
mgoudaa797e1c2025-06-24 17:49:42 +053051const (
52 retryDelay = 30 * time.Second
53 maxRetries = 3
54 initialRetryAttempt = 1
55)
56
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000057var supportedClassIds = []me.ClassID{
58 me.CardholderClassID, // 5
59 me.CircuitPackClassID, // 6
60 me.SoftwareImageClassID, // 7
61 me.PhysicalPathTerminationPointEthernetUniClassID, // 11
ozgecanetsia124d9732021-09-16 14:31:57 +030062 me.PhysicalPathTerminationPointPotsUniClassID, // 53
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000063 me.OltGClassID, // 131
64 me.OnuPowerSheddingClassID, // 133
65 me.IpHostConfigDataClassID, // 134
66 me.OnuGClassID, // 256
67 me.Onu2GClassID, // 257
68 me.TContClassID, // 262
69 me.AniGClassID, // 263
70 me.UniGClassID, // 264
71 me.PriorityQueueClassID, // 277
72 me.TrafficSchedulerClassID, // 278
73 me.VirtualEthernetInterfacePointClassID, // 329
74 me.EnhancedSecurityControlClassID, // 332
75 me.OnuDynamicPowerManagementControlClassID, // 336
76 // 347 // definitions for ME "IPv6 host config data" are currently missing in omci-lib-go!
77}
78
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +000079var omccVersionSupportsExtendedOmciFormat = map[uint8]bool{
80 0x80: false,
81 0x81: false,
82 0x82: false,
83 0x83: false,
84 0x84: false,
85 0x85: false,
86 0x86: false,
87 0xA0: false,
88 0xA1: false,
89 0xA2: false,
90 0xA3: false,
91 0x96: true,
92 0xB0: true,
93 0xB1: true,
94 0xB2: true,
95 0xB3: true,
96 0xB4: true,
97}
98
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000099var fsmMsg cmn.TestMessageType
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000100
dbainbri4d3a0dc2020-12-02 00:33:42 +0000101func (oo *OnuDeviceEntry) enterStartingState(ctx context.Context, e *fsm.Event) {
102 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start processing MibSync-msgs in State": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000103 oo.pOnuDB = devdb.NewOnuDeviceDB(log.WithSpanFromContext(context.TODO(), ctx), oo.deviceID)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000104 go oo.processMibSyncMessages(ctx)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000105}
106
dbainbri4d3a0dc2020-12-02 00:33:42 +0000107func (oo *OnuDeviceEntry) enterResettingMibState(ctx context.Context, e *fsm.Event) {
108 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start MibTemplate processing in State": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000109
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000110 if (!oo.IsNewOnu() && !oo.baseDeviceHandler.IsReconciling()) || //use case: re-auditing failed
111 oo.baseDeviceHandler.IsSkipOnuConfigReconciling() { //use case: reconciling without omci-config failed
112 oo.baseDeviceHandler.PrepareReconcilingWithActiveAdapter(ctx)
113 oo.devState = cmn.DeviceStatusInit
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000114 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000115 logger.Debugw(ctx, "MibSync FSM", log.Fields{"send mibReset in State": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000116 oo.mutexLastTxParamStruct.Lock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000117 _ = oo.PDevOmciCC.SendMibReset(log.WithSpanFromContext(context.TODO(), ctx), oo.baseDeviceHandler.GetOmciTimeout(), true)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000118 //TODO: needs to handle timeouts
mpagenko01499812021-03-25 10:37:12 +0000119 //even though lastTxParameters are currently not used for checking the ResetResponse message we have to ensure
120 // that the lastTxMessageType is correctly set to avoid misinterpreting other responses
121 oo.lastTxParamStruct.lastTxMessageType = omci.MibResetRequestType
122 oo.lastTxParamStruct.repeatCount = 0
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000123 oo.mutexLastTxParamStruct.Unlock()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000124}
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000125
dbainbri4d3a0dc2020-12-02 00:33:42 +0000126func (oo *OnuDeviceEntry) enterGettingVendorAndSerialState(ctx context.Context, e *fsm.Event) {
127 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start getting VendorId and SerialNumber in State": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +0000128 requestedAttributes := me.AttributeValueMap{me.OnuG_VendorId: "", me.OnuG_SerialNumber: 0}
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000129 oo.mutexLastTxParamStruct.Lock()
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000130 meInstance, err := oo.PDevOmciCC.SendGetMe(log.WithSpanFromContext(context.TODO(), ctx), me.OnuGClassID, cmn.OnugMeID, requestedAttributes,
Holger Hildebrandtd930cb22022-06-17 09:24:50 +0000131 oo.baseDeviceHandler.GetOmciTimeout(), true, oo.PMibUploadFsm.CommChan, false)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000132 //accept also nil as (error) return value for writing to LastTx
133 // - this avoids misinterpretation of new received OMCI messages
ozgecanetsiab36ed572021-04-01 10:38:48 +0300134 if err != nil {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000135 oo.mutexLastTxParamStruct.Unlock()
ozgecanetsiab36ed572021-04-01 10:38:48 +0300136 logger.Errorw(ctx, "ONU-G get failed, aborting MibSync FSM", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000137 pMibUlFsm := oo.PMibUploadFsm
ozgecanetsiab36ed572021-04-01 10:38:48 +0300138 if pMibUlFsm != nil {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530139 //nolint:unparam
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000140 go func(a_pAFsm *cmn.AdapterFsm) {
141 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
ozgecanetsiab36ed572021-04-01 10:38:48 +0300142 }(pMibUlFsm)
143 }
144 return
145 }
mpagenko01499812021-03-25 10:37:12 +0000146 oo.lastTxParamStruct.lastTxMessageType = omci.GetRequestType
147 oo.lastTxParamStruct.pLastTxMeInstance = meInstance
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000148 oo.mutexLastTxParamStruct.Unlock()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000149}
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000150
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000151func (oo *OnuDeviceEntry) enterGettingVersionState(ctx context.Context, e *fsm.Event) {
152 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start getting Version in State": e.FSM.Current(), "device-id": oo.deviceID})
153 requestedAttributes := me.AttributeValueMap{me.OnuG_Version: ""}
154 oo.mutexLastTxParamStruct.Lock()
155 meInstance, err := oo.PDevOmciCC.SendGetMe(log.WithSpanFromContext(context.TODO(), ctx), me.OnuGClassID, cmn.OnugMeID,
Holger Hildebrandtd930cb22022-06-17 09:24:50 +0000156 requestedAttributes, oo.baseDeviceHandler.GetOmciTimeout(), true, oo.PMibUploadFsm.CommChan, false)
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000157 //accept also nil as (error) return value for writing to LastTx
158 // - this avoids misinterpretation of new received OMCI messages
159 if err != nil {
160 oo.mutexLastTxParamStruct.Unlock()
161 logger.Errorw(ctx, "ONU-G get failed, aborting MibSync FSM", log.Fields{"device-id": oo.deviceID})
162 pMibUlFsm := oo.PMibUploadFsm
163 if pMibUlFsm != nil {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530164 //nolint:unparam
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000165 go func(a_pAFsm *cmn.AdapterFsm) {
166 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
167 }(pMibUlFsm)
168 }
169 return
170 }
171 oo.lastTxParamStruct.lastTxMessageType = omci.GetRequestType
172 oo.lastTxParamStruct.pLastTxMeInstance = meInstance
173 oo.mutexLastTxParamStruct.Unlock()
174}
175
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000176func (oo *OnuDeviceEntry) enterGettingEquipIDAndOmccVersState(ctx context.Context, e *fsm.Event) {
177 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start getting EquipmentId and OMCC version in State": e.FSM.Current(), "device-id": oo.deviceID})
178 requestedAttributes := me.AttributeValueMap{me.Onu2G_EquipmentId: "", me.Onu2G_OpticalNetworkUnitManagementAndControlChannelOmccVersion: 0}
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000179 oo.mutexLastTxParamStruct.Lock()
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000180 meInstance, err := oo.PDevOmciCC.SendGetMe(log.WithSpanFromContext(context.TODO(), ctx), me.Onu2GClassID, cmn.Onu2gMeID, requestedAttributes,
Holger Hildebrandtd930cb22022-06-17 09:24:50 +0000181 oo.baseDeviceHandler.GetOmciTimeout(), true, oo.PMibUploadFsm.CommChan, false)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000182 //accept also nil as (error) return value for writing to LastTx
183 // - this avoids misinterpretation of new received OMCI messages
ozgecanetsiab36ed572021-04-01 10:38:48 +0300184 if err != nil {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000185 oo.mutexLastTxParamStruct.Unlock()
ozgecanetsiab36ed572021-04-01 10:38:48 +0300186 logger.Errorw(ctx, "ONU2-G get failed, aborting MibSync FSM!", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000187 pMibUlFsm := oo.PMibUploadFsm
ozgecanetsiab36ed572021-04-01 10:38:48 +0300188 if pMibUlFsm != nil {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530189 //nolint:unparam
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000190 go func(a_pAFsm *cmn.AdapterFsm) {
191 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
ozgecanetsiab36ed572021-04-01 10:38:48 +0300192 }(pMibUlFsm)
193 }
194 return
195 }
mpagenko01499812021-03-25 10:37:12 +0000196 oo.lastTxParamStruct.lastTxMessageType = omci.GetRequestType
197 oo.lastTxParamStruct.pLastTxMeInstance = meInstance
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000198 oo.mutexLastTxParamStruct.Unlock()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000199}
200
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000201func (oo *OnuDeviceEntry) enterTestingExtOmciSupportState(ctx context.Context, e *fsm.Event) {
202 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start testing extended OMCI msg in State": e.FSM.Current(), "device-id": oo.deviceID})
203 omciVerify := otst.NewOmciTestRequest(log.WithSpanFromContext(context.TODO(), ctx),
204 oo.deviceID, oo.PDevOmciCC, true, true, true)
205 verifyExec := make(chan bool)
206 omciVerify.PerformOmciTest(log.WithSpanFromContext(context.TODO(), ctx), verifyExec)
207
208 // If verification of test message in extended OMCI format fails, reset ONU capability to OMCI baseline format
209 select {
210 case <-time.After(((cmn.CDefaultRetries+1)*otst.CTestRequestOmciTimeout + 1) * time.Second):
211 logger.Warnw(ctx, "testing extended OMCI msg format timed out - reset to baseline format", log.Fields{"device-id": oo.deviceID})
212 oo.MutexPersOnuConfig.Lock()
213 oo.SOnuPersistentData.PersIsExtOmciSupported = false
214 oo.MutexPersOnuConfig.Unlock()
215 case success := <-verifyExec:
216 if success {
217 logger.Debugw(ctx, "testing extended OMCI msg format succeeded", log.Fields{"device-id": oo.deviceID})
218 } else {
219 logger.Warnw(ctx, "testing extended OMCI msg format failed - reset to baseline format", log.Fields{"device-id": oo.deviceID, "result": success})
220 oo.MutexPersOnuConfig.Lock()
221 oo.SOnuPersistentData.PersIsExtOmciSupported = false
222 oo.MutexPersOnuConfig.Unlock()
223 }
224 }
225 pMibUlFsm := oo.PMibUploadFsm
226 if pMibUlFsm != nil {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530227 //nolint:unparam
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000228 go func(a_pAFsm *cmn.AdapterFsm) {
229 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetFirstSwVersion)
230 }(pMibUlFsm)
231 }
232}
233
dbainbri4d3a0dc2020-12-02 00:33:42 +0000234func (oo *OnuDeviceEntry) enterGettingFirstSwVersionState(ctx context.Context, e *fsm.Event) {
235 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start getting IsActive and Version of first SW-image in State": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +0000236 requestedAttributes := me.AttributeValueMap{me.SoftwareImage_IsCommitted: 0, me.SoftwareImage_IsActive: 0, me.SoftwareImage_Version: ""}
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000237 oo.mutexLastTxParamStruct.Lock()
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000238 meInstance, err := oo.PDevOmciCC.SendGetMe(log.WithSpanFromContext(context.TODO(), ctx), me.SoftwareImageClassID, cmn.FirstSwImageMeID, requestedAttributes,
Holger Hildebrandtd930cb22022-06-17 09:24:50 +0000239 oo.baseDeviceHandler.GetOmciTimeout(), true, oo.PMibUploadFsm.CommChan, oo.GetPersIsExtOmciSupported())
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000240 //accept also nil as (error) return value for writing to LastTx
241 // - this avoids misinterpretation of new received OMCI messages
ozgecanetsiab36ed572021-04-01 10:38:48 +0300242 if err != nil {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000243 oo.mutexLastTxParamStruct.Unlock()
ozgecanetsiab36ed572021-04-01 10:38:48 +0300244 logger.Errorw(ctx, "SoftwareImage get failed, aborting MibSync FSM", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000245 pMibUlFsm := oo.PMibUploadFsm
ozgecanetsiab36ed572021-04-01 10:38:48 +0300246 if pMibUlFsm != nil {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530247 //nolint:unparam
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000248 go func(a_pAFsm *cmn.AdapterFsm) {
249 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
ozgecanetsiab36ed572021-04-01 10:38:48 +0300250 }(pMibUlFsm)
251 }
252 return
253 }
mpagenko01499812021-03-25 10:37:12 +0000254 oo.lastTxParamStruct.lastTxMessageType = omci.GetRequestType
255 oo.lastTxParamStruct.pLastTxMeInstance = meInstance
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000256 oo.mutexLastTxParamStruct.Unlock()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000257}
258
dbainbri4d3a0dc2020-12-02 00:33:42 +0000259func (oo *OnuDeviceEntry) enterGettingSecondSwVersionState(ctx context.Context, e *fsm.Event) {
260 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start getting IsActive and Version of second SW-image in State": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +0000261 requestedAttributes := me.AttributeValueMap{me.SoftwareImage_IsCommitted: 0, me.SoftwareImage_IsActive: 0, me.SoftwareImage_Version: ""}
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000262 oo.mutexLastTxParamStruct.Lock()
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000263 meInstance, err := oo.PDevOmciCC.SendGetMe(log.WithSpanFromContext(context.TODO(), ctx), me.SoftwareImageClassID, cmn.SecondSwImageMeID, requestedAttributes,
Holger Hildebrandtd930cb22022-06-17 09:24:50 +0000264 oo.baseDeviceHandler.GetOmciTimeout(), true, oo.PMibUploadFsm.CommChan, oo.GetPersIsExtOmciSupported())
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000265 //accept also nil as (error) return value for writing to LastTx
266 // - this avoids misinterpretation of new received OMCI messages
ozgecanetsiab36ed572021-04-01 10:38:48 +0300267 if err != nil {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000268 oo.mutexLastTxParamStruct.Unlock()
ozgecanetsiab36ed572021-04-01 10:38:48 +0300269 logger.Errorw(ctx, "SoftwareImage get failed, aborting MibSync FSM", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000270 pMibUlFsm := oo.PMibUploadFsm
ozgecanetsiab36ed572021-04-01 10:38:48 +0300271 if pMibUlFsm != nil {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530272 //nolint:unparam
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000273 go func(a_pAFsm *cmn.AdapterFsm) {
274 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
ozgecanetsiab36ed572021-04-01 10:38:48 +0300275 }(pMibUlFsm)
276 }
277 return
278 }
mpagenko01499812021-03-25 10:37:12 +0000279 oo.lastTxParamStruct.lastTxMessageType = omci.GetRequestType
280 oo.lastTxParamStruct.pLastTxMeInstance = meInstance
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000281 oo.mutexLastTxParamStruct.Unlock()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000282}
283
dbainbri4d3a0dc2020-12-02 00:33:42 +0000284func (oo *OnuDeviceEntry) enterGettingMacAddressState(ctx context.Context, e *fsm.Event) {
285 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start getting MacAddress in State": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +0000286 requestedAttributes := me.AttributeValueMap{me.IpHostConfigData_MacAddress: ""}
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000287 oo.mutexLastTxParamStruct.Lock()
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000288 meInstance, err := oo.PDevOmciCC.SendGetMe(log.WithSpanFromContext(context.TODO(), ctx), me.IpHostConfigDataClassID, cmn.IPHostConfigDataMeID, requestedAttributes,
Holger Hildebrandtd930cb22022-06-17 09:24:50 +0000289 oo.baseDeviceHandler.GetOmciTimeout(), true, oo.PMibUploadFsm.CommChan, oo.GetPersIsExtOmciSupported())
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000290 //accept also nil as (error) return value for writing to LastTx
291 // - this avoids misinterpretation of new received OMCI messages
ozgecanetsiab36ed572021-04-01 10:38:48 +0300292 if err != nil {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000293 oo.mutexLastTxParamStruct.Unlock()
ozgecanetsiab36ed572021-04-01 10:38:48 +0300294 logger.Errorw(ctx, "IpHostConfigData get failed, aborting MibSync FSM", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000295 pMibUlFsm := oo.PMibUploadFsm
ozgecanetsiab36ed572021-04-01 10:38:48 +0300296 if pMibUlFsm != nil {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530297 //nolint:unparam
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000298 go func(a_pAFsm *cmn.AdapterFsm) {
299 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
ozgecanetsiab36ed572021-04-01 10:38:48 +0300300 }(pMibUlFsm)
301 }
302 return
303 }
mpagenko01499812021-03-25 10:37:12 +0000304 oo.lastTxParamStruct.lastTxMessageType = omci.GetRequestType
305 oo.lastTxParamStruct.pLastTxMeInstance = meInstance
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000306 oo.mutexLastTxParamStruct.Unlock()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000307}
308
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530309//nolint:unparam
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000310func (oo *OnuDeviceEntry) enterGettingMibTemplateState(ctx context.Context, e *fsm.Event) {
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000311
Holger Hildebrandt05011352021-06-15 09:40:24 +0000312 oo.mutexOnuSwImageIndications.RLock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000313 if oo.onuSwImageIndications.ActiveEntityEntry.Valid {
314 oo.MutexPersOnuConfig.Lock()
315 oo.SOnuPersistentData.PersActiveSwVersion = oo.onuSwImageIndications.ActiveEntityEntry.Version
316 oo.MutexPersOnuConfig.Unlock()
Holger Hildebrandt05011352021-06-15 09:40:24 +0000317 oo.mutexOnuSwImageIndications.RUnlock()
mpagenko15ff4a52021-03-02 10:09:20 +0000318 } else {
Holger Hildebrandt05011352021-06-15 09:40:24 +0000319 oo.mutexOnuSwImageIndications.RUnlock()
mpagenko15ff4a52021-03-02 10:09:20 +0000320 logger.Errorw(ctx, "get-mib-template: no active SW version found, working with empty SW version, which might be untrustworthy",
321 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000322 }
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000323
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +0530324 //create the MIB Template path
325 oo.mibTemplatePath = oo.buildMibTemplatePath()
326
327 if cmnMEDBVal, exist := oo.pOpenOnuAc.FetchEntryFromMibDatabaseMap(ctx, oo.mibTemplatePath); exist {
328 logger.Infow(ctx, "A Common MIB DB Instance exist for this type of ONT", log.Fields{"device-id": oo.deviceID, "mibTemplatePath": oo.mibTemplatePath})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000329 oo.pOpenOnuAc.LockMutexMibTemplateGenerated()
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +0530330 oo.pOnuDB.CommonMeDb = cmnMEDBVal
331
pnalmas8c2f09d2025-01-02 11:30:03 +0530332 //VOL-5406:If the Instance is present but the MIB templates are cleaned up . Check and create one.
333 Value, err := oo.mibTemplateKVStore.Get(log.WithSpanFromContext(context.TODO(), ctx), oo.mibTemplatePath)
334 if err == nil {
335 if Value == nil {
336
337 error := oo.createAndPersistMibTemplate(ctx)
338 if error != nil {
339 logger.Errorw(ctx, "MibSync - MibTemplate - Failed to create and persist the mib template", log.Fields{"error": err, "device-id": oo.deviceID})
340 } else {
341 logger.Infow(ctx, "MIB Template created and stored ", log.Fields{"device-id": oo.deviceID, "mibTemplatePath": oo.mibTemplatePath})
342 }
343 }
344 } else {
345 logger.Errorw(ctx, "MibSync - MibTemplate - Failed to create and persist the mib template", log.Fields{"error": err, "device-id": oo.deviceID})
346 }
347
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +0530348 if cmnMEDBVal.MIBUploadStatus == devdb.Completed {
349 oo.pOnuDB.CommonMeDb.MeDbLock.Lock()
350 oo.updateOnuSpecificEntries(ctx)
351 oo.pOnuDB.CommonMeDb.MeDbLock.Unlock()
352 fsmMsg = cmn.LoadMibTemplateOk
353 } else {
354 logger.Errorw(ctx, "A previous MIB Upload for this type of ONT has failed, request for a MIB UPload", log.Fields{"device-id": oo.deviceID})
355 oo.pOpenOnuAc.ResetEntryFromMibDatabaseMap(ctx, oo.mibTemplatePath)
356 fsmMsg = cmn.LoadMibTemplateFailed
Holger Hildebrandt441a0172020-12-10 13:57:08 +0000357 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000358 oo.pOpenOnuAc.UnlockMutexMibTemplateGenerated()
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +0530359
360 } else {
361 Value, err := oo.mibTemplateKVStore.Get(log.WithSpanFromContext(context.TODO(), ctx), oo.mibTemplatePath)
362 if err == nil && Value != nil {
363 logger.Infow(ctx, "No Common MIB DB instance exist , creating from Template", log.Fields{"device-id": oo.deviceID, "mibTemplatePath": oo.mibTemplatePath})
364 oo.processMibTemplate(ctx, Value)
pnalmasaad81392025-01-03 11:21:19 +0530365 fsmMsg = cmn.LoadMibTemplateOk
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +0530366 } else {
367 logger.Infow(ctx, "Neither Common MIB DB Instance nor MIB template exist for this type of ONT", log.Fields{"device-id": oo.deviceID, "mibTemplatePath": oo.mibTemplatePath})
368 oo.pOpenOnuAc.LockMutexMibTemplateGenerated()
369 cmnMEDBValue, _ := oo.pOpenOnuAc.CreateEntryAtMibDatabaseMap(ctx, oo.mibTemplatePath)
370 oo.pOnuDB.CommonMeDb = cmnMEDBValue
371 oo.pOnuDB.CommonMeDb.MeDbLock.Lock()
372 fsmMsg = cmn.LoadMibTemplateFailed
373
374 }
375
Holger Hildebrandt441a0172020-12-10 13:57:08 +0000376 }
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +0530377
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000378 mibSyncMsg := cmn.Message{
379 Type: cmn.TestMsg,
380 Data: cmn.TestMessage{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000381 TestMessageVal: fsmMsg,
382 },
383 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000384 oo.PMibUploadFsm.CommChan <- mibSyncMsg
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000385}
386
dbainbri4d3a0dc2020-12-02 00:33:42 +0000387func (oo *OnuDeviceEntry) enterUploadingState(ctx context.Context, e *fsm.Event) {
388 logger.Debugw(ctx, "MibSync FSM", log.Fields{"send MibUpload in State": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000389 _ = oo.PDevOmciCC.SendMibUpload(log.WithSpanFromContext(context.TODO(), ctx),
390 oo.baseDeviceHandler.GetOmciTimeout(), true, oo.GetPersIsExtOmciSupported())
mpagenko01499812021-03-25 10:37:12 +0000391 //even though lastTxParameters are currently not used for checking the ResetResponse message we have to ensure
392 // that the lastTxMessageType is correctly set to avoid misinterpreting other responses
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000393 oo.mutexLastTxParamStruct.Lock()
mpagenko01499812021-03-25 10:37:12 +0000394 oo.lastTxParamStruct.lastTxMessageType = omci.MibUploadRequestType
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000395 oo.mutexLastTxParamStruct.Unlock()
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000396}
397
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000398func (oo *OnuDeviceEntry) enterUploadDoneState(ctx context.Context, e *fsm.Event) {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000399 logger.Debugw(ctx, "MibSync FSM", log.Fields{"send notification to core in State": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000400 oo.transferSystemEvent(ctx, cmn.MibDatabaseSync)
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000401 go func() {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000402 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000403 }()
404}
405
406func (oo *OnuDeviceEntry) enterInSyncState(ctx context.Context, e *fsm.Event) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000407 oo.MutexPersOnuConfig.Lock()
408 oo.SOnuPersistentData.PersMibLastDbSync = uint32(time.Now().Unix())
409 oo.MutexPersOnuConfig.Unlock()
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000410 if oo.mibAuditInterval > 0 {
411 logger.Debugw(ctx, "MibSync FSM", log.Fields{"trigger next Audit in State": e.FSM.Current(), "oo.mibAuditInterval": oo.mibAuditInterval, "device-id": oo.deviceID})
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000412 go func() {
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000413 time.Sleep(oo.mibAuditInterval)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000414 if err := oo.PMibUploadFsm.PFsm.Event(UlEvAuditMib); err != nil {
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000415 logger.Debugw(ctx, "MibSyncFsm: Can't go to state auditing", log.Fields{"device-id": oo.deviceID, "err": err})
416 }
417 }()
418 }
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000419}
420
Holger Hildebrandt9afc1582021-11-30 16:10:19 +0000421func (oo *OnuDeviceEntry) enterVerifyingAndStoringTPsState(ctx context.Context, e *fsm.Event) {
422 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start verifying and storing TPs in State": e.FSM.Current(), "device-id": oo.deviceID})
423
Holger Hildebrandt80f57762022-02-16 10:03:24 +0000424 if oo.getAllStoredTpInstFromParentAdapter(ctx) {
Holger Hildebrandt9afc1582021-11-30 16:10:19 +0000425 logger.Debugw(ctx, "MibSync FSM", log.Fields{"reconciling - verifying TPs successful": e.FSM.Current(), "device-id": oo.deviceID})
426 go func() {
427 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
428 }()
429 } else {
430 logger.Debugw(ctx, "MibSync FSM", log.Fields{"reconciling - verifying TPs not successful": e.FSM.Current(), "device-id": oo.deviceID})
431 oo.baseDeviceHandler.SetReconcilingReasonUpdate(true)
432 go func() {
433 if err := oo.baseDeviceHandler.StorePersistentData(ctx); err != nil {
434 logger.Warnw(ctx, "reconciling - store persistent data error - continue for now as there will be additional write attempts",
435 log.Fields{"device-id": oo.deviceID, "err": err})
436 }
437 _ = oo.PMibUploadFsm.PFsm.Event(UlEvMismatch)
438 }()
439 }
440}
441
dbainbri4d3a0dc2020-12-02 00:33:42 +0000442func (oo *OnuDeviceEntry) enterExaminingMdsState(ctx context.Context, e *fsm.Event) {
443 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start GetMds processing in State": e.FSM.Current(), "device-id": oo.deviceID})
Praneeth Kumar Nalmas77ab2f32024-04-17 11:14:27 +0530444 oo.pOpenOnuAc.RLockMutexDeviceHandlersMap()
445 dh, _ := oo.pOpenOnuAc.GetDeviceHandler(oo.deviceID)
446 oo.pOpenOnuAc.RUnlockMutexDeviceHandlersMap()
447 if dh.GetSkipOnuConfigEnabled() {
448 go func() {
449 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
450 }()
451 } else {
452 oo.requestMdsValue(ctx)
453 }
454
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000455}
456
dbainbri4d3a0dc2020-12-02 00:33:42 +0000457func (oo *OnuDeviceEntry) enterResynchronizingState(ctx context.Context, e *fsm.Event) {
458 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start MibResync processing in State": e.FSM.Current(), "device-id": oo.deviceID})
459 logger.Debug(ctx, "function not implemented yet")
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000460 // TODOs:
461 // VOL-3805 - Provide exclusive OMCI channel for one FSM
462 // VOL-3785 - New event notifications and corresponding performance counters for openonu-adapter-go
463 // VOL-3792 - Support periodical audit via mib resync
464 // VOL-3793 - ONU-reconcile handling after adapter restart based on mib resync
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000465}
466
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000467func (oo *OnuDeviceEntry) enterExaminingMdsSuccessState(ctx context.Context, e *fsm.Event) {
468 logger.Debugw(ctx, "MibSync FSM",
469 log.Fields{"Start processing on examining MDS success in State": e.FSM.Current(), "device-id": oo.deviceID})
470
471 if oo.getMibFromTemplate(ctx) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000472 oo.baseDeviceHandler.StartReconciling(ctx, true)
473 oo.baseDeviceHandler.AddAllUniPorts(ctx)
Holger Hildebrandt9afc1582021-11-30 16:10:19 +0000474 _ = oo.baseDeviceHandler.ReasonUpdate(ctx, cmn.DrInitialMibDownloaded, oo.baseDeviceHandler.IsReconcilingReasonUpdate())
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000475 oo.baseDeviceHandler.SetReadyForOmciConfig(true)
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000476
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000477 if !oo.baseDeviceHandler.GetCollectorIsRunning() {
Girish Gowdraf7d82d02022-04-26 16:18:35 -0700478 var waitForOmciProcess sync.WaitGroup
479 waitForOmciProcess.Add(1)
Holger Hildebrandtced74e72021-06-10 14:55:53 +0000480 // Start PM collector routine
Girish Gowdraf7d82d02022-04-26 16:18:35 -0700481 go oo.baseDeviceHandler.StartCollector(ctx, &waitForOmciProcess)
482 waitForOmciProcess.Wait()
Holger Hildebrandtced74e72021-06-10 14:55:53 +0000483 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000484 if !oo.baseDeviceHandler.GetAlarmManagerIsRunning(ctx) {
485 go oo.baseDeviceHandler.StartAlarmManager(ctx)
Holger Hildebrandtced74e72021-06-10 14:55:53 +0000486 }
Girish Gowdrae95687a2021-09-08 16:30:58 -0700487
488 for _, uniPort := range *oo.baseDeviceHandler.GetUniEntityMap() {
489 // only if this port was enabled for use by the operator at startup
490 if (1<<uniPort.UniID)&oo.baseDeviceHandler.GetUniPortMask() == (1 << uniPort.UniID) {
491 if !oo.baseDeviceHandler.GetFlowMonitoringIsRunning(uniPort.UniID) {
492 go oo.baseDeviceHandler.PerOnuFlowHandlerRoutine(uniPort.UniID)
493 }
494 }
495 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000496 oo.MutexPersOnuConfig.RLock()
497 if oo.SOnuPersistentData.PersUniDisableDone {
498 oo.MutexPersOnuConfig.RUnlock()
499 oo.baseDeviceHandler.DisableUniPortStateUpdate(ctx)
Holger Hildebrandt9afc1582021-11-30 16:10:19 +0000500 _ = oo.baseDeviceHandler.ReasonUpdate(ctx, cmn.DrOmciAdminLock, oo.baseDeviceHandler.IsReconcilingReasonUpdate())
Holger Hildebrandtbdc5f002021-04-19 14:46:21 +0000501 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000502 oo.MutexPersOnuConfig.RUnlock()
503 oo.baseDeviceHandler.EnableUniPortStateUpdate(ctx)
Holger Hildebrandtbdc5f002021-04-19 14:46:21 +0000504 }
Holger Hildebrandtb314f442021-11-24 12:03:10 +0000505
506 // no need to reconcile additional data for MibDownloadFsm, LockStateFsm, or UnlockStateFsm
507
508 if oo.baseDeviceHandler.ReconcileDeviceTechProf(ctx) {
509 // start go routine with select() on reconciling flow channel before
510 // starting flow reconciling process to prevent loss of any signal
Holger Hildebrandtf2fcdd42021-12-15 11:42:19 +0000511 syncChannel := make(chan struct{})
512 go func(aSyncChannel chan struct{}) {
Holger Hildebrandtb314f442021-11-24 12:03:10 +0000513 // In multi-ONU/multi-flow environment stopping reconcilement has to be delayed until
514 // we get a signal that the processing of the last step to rebuild the adapter internal
515 // flow data is finished.
516 expiry := oo.baseDeviceHandler.GetReconcileExpiryVlanConfigAbort()
517 oo.setReconcilingFlows(true)
Holger Hildebrandtf2fcdd42021-12-15 11:42:19 +0000518 aSyncChannel <- struct{}{}
Holger Hildebrandtb314f442021-11-24 12:03:10 +0000519 select {
520 case success := <-oo.chReconcilingFlowsFinished:
521 if success {
522 logger.Debugw(ctx, "reconciling flows has been finished in time",
523 log.Fields{"device-id": oo.deviceID})
524 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
525
526 } else {
527 logger.Debugw(ctx, "wait for reconciling flows aborted",
528 log.Fields{"device-id": oo.deviceID})
529 }
530 case <-time.After(expiry):
531 logger.Errorw(ctx, "timeout waiting for reconciling flows to be finished!",
532 log.Fields{"device-id": oo.deviceID, "expiry": expiry})
533 _ = oo.PMibUploadFsm.PFsm.Event(UlEvMismatch)
534 }
535 oo.setReconcilingFlows(false)
Holger Hildebrandtf2fcdd42021-12-15 11:42:19 +0000536 }(syncChannel)
537 // block further processing until the above Go routine has really started
538 // and is ready to receive values from chReconcilingFlowsFinished
539 <-syncChannel
Holger Hildebrandtb314f442021-11-24 12:03:10 +0000540 oo.baseDeviceHandler.ReconcileDeviceFlowConfig(ctx)
541 }
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000542 } else {
543 logger.Debugw(ctx, "MibSync FSM",
544 log.Fields{"Getting MIB from template not successful": e.FSM.Current(), "device-id": oo.deviceID})
545 go func() {
546 //switch to reconciling with OMCI config
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000547 _ = oo.PMibUploadFsm.PFsm.Event(UlEvMismatch)
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000548 }()
549 }
550}
551
dbainbri4d3a0dc2020-12-02 00:33:42 +0000552func (oo *OnuDeviceEntry) enterAuditingState(ctx context.Context, e *fsm.Event) {
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000553 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start MibAudit processing in State": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000554 if oo.baseDeviceHandler.CheckAuditStartCondition(ctx, cmn.CUploadFsm) {
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000555 oo.requestMdsValue(ctx)
556 } else {
mpagenkof1fc3862021-02-16 10:09:52 +0000557 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Configuration is ongoing or missing - skip auditing!": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000558 go func() {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000559 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000560 }()
561 }
562}
563
564func (oo *OnuDeviceEntry) enterReAuditingState(ctx context.Context, e *fsm.Event) {
565 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start retest MdsValue processing in State": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000566 if oo.baseDeviceHandler.CheckAuditStartCondition(ctx, cmn.CUploadFsm) {
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000567 oo.requestMdsValue(ctx)
568 } else {
mpagenkof1fc3862021-02-16 10:09:52 +0000569 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Configuration is ongoing or missing - skip re-auditing!": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000570 go func() {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000571 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000572 }()
573 }
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000574}
575
dbainbri4d3a0dc2020-12-02 00:33:42 +0000576func (oo *OnuDeviceEntry) enterOutOfSyncState(ctx context.Context, e *fsm.Event) {
577 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start MibReconcile processing in State": e.FSM.Current(), "device-id": oo.deviceID})
578 logger.Debug(ctx, "function not implemented yet")
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000579}
580
dbainbri4d3a0dc2020-12-02 00:33:42 +0000581func (oo *OnuDeviceEntry) processMibSyncMessages(ctx context.Context) {
582 logger.Debugw(ctx, "MibSync Msg", log.Fields{"Start routine to process OMCI-messages for device-id": oo.deviceID})
Girish Gowdra37c9d912022-02-08 16:24:57 -0800583 oo.mutexMibSyncMsgProcessorRunning.Lock()
584 oo.mibSyncMsgProcessorRunning = true
585 oo.mutexMibSyncMsgProcessorRunning.Unlock()
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000586loop:
587 for {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000588 // case <-ctx.Done():
589 // logger.Info("MibSync Msg", log.Fields{"Message handling canceled via context for device-id": onuDeviceEntry.deviceID})
590 // break loop
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000591 message, ok := <-oo.PMibUploadFsm.CommChan
Himani Chawla4d908332020-08-31 12:30:20 +0530592 if !ok {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000593 logger.Info(ctx, "MibSync Msg", log.Fields{"Message couldn't be read from channel for device-id": oo.deviceID})
Girish Gowdra37c9d912022-02-08 16:24:57 -0800594 oo.mutexMibSyncMsgProcessorRunning.Lock()
595 oo.mibSyncMsgProcessorRunning = false
596 oo.mutexMibSyncMsgProcessorRunning.Unlock()
Himani Chawla4d908332020-08-31 12:30:20 +0530597 break loop
598 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000599 logger.Debugw(ctx, "MibSync Msg", log.Fields{"Received message on ONU MibSyncChan for device-id": oo.deviceID})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000600
Himani Chawla4d908332020-08-31 12:30:20 +0530601 switch message.Type {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000602 case cmn.TestMsg:
603 msg, _ := message.Data.(cmn.TestMessage)
Holger Hildebrandte7cc6092022-02-01 11:37:03 +0000604 if msg.TestMessageVal == cmn.AbortMessageProcessing {
605 logger.Debugw(ctx, "MibSync Msg abort ProcessMsg", log.Fields{"for device-id": oo.deviceID})
Girish Gowdra37c9d912022-02-08 16:24:57 -0800606 oo.mutexMibSyncMsgProcessorRunning.Lock()
607 oo.mibSyncMsgProcessorRunning = false
608 oo.mutexMibSyncMsgProcessorRunning.Unlock()
Holger Hildebrandte7cc6092022-02-01 11:37:03 +0000609 break loop
610 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000611 oo.handleTestMsg(ctx, msg)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000612 case cmn.OMCI:
613 msg, _ := message.Data.(cmn.OmciMessage)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000614 oo.handleOmciMessage(ctx, msg)
Himani Chawla4d908332020-08-31 12:30:20 +0530615 default:
dbainbri4d3a0dc2020-12-02 00:33:42 +0000616 logger.Warn(ctx, "MibSync Msg", log.Fields{"Unknown message type received for device-id": oo.deviceID, "message.Type": message.Type})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000617 }
618 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000619 logger.Info(ctx, "MibSync Msg", log.Fields{"Stopped handling of MibSyncChan for device-id": oo.deviceID})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000620 // TODO: only this action?
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000621 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000622}
623
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000624func (oo *OnuDeviceEntry) handleTestMsg(ctx context.Context, msg cmn.TestMessage) {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000625
dbainbri4d3a0dc2020-12-02 00:33:42 +0000626 logger.Debugw(ctx, "MibSync Msg", log.Fields{"TestMessage received for device-id": oo.deviceID, "msg.TestMessageVal": msg.TestMessageVal})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000627
628 switch msg.TestMessageVal {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000629 case cmn.LoadMibTemplateFailed:
630 _ = oo.PMibUploadFsm.PFsm.Event(UlEvUploadMib)
631 logger.Debugw(ctx, "MibSync Msg", log.Fields{"state": string(oo.PMibUploadFsm.PFsm.Current())})
632 case cmn.LoadMibTemplateOk:
633 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
634 logger.Debugw(ctx, "MibSync Msg", log.Fields{"state": string(oo.PMibUploadFsm.PFsm.Current())})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000635 default:
dbainbri4d3a0dc2020-12-02 00:33:42 +0000636 logger.Warn(ctx, "MibSync Msg", log.Fields{"Unknown message type received for device-id": oo.deviceID, "msg.TestMessageVal": msg.TestMessageVal})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000637 }
638}
639
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000640func (oo *OnuDeviceEntry) handleOmciMibResetResponseMessage(ctx context.Context, msg cmn.OmciMessage) {
641 if oo.PMibUploadFsm.PFsm.Is(UlStResettingMib) {
Himani Chawla4d908332020-08-31 12:30:20 +0530642 msgLayer := (*msg.OmciPacket).Layer(omci.LayerTypeMibResetResponse)
643 if msgLayer != nil {
644 msgObj, msgOk := msgLayer.(*omci.MibResetResponse)
645 if msgOk {
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530646 logger.Infow(ctx, "MibResetResponse Data", log.Fields{"data-fields": msgObj})
Himani Chawla4d908332020-08-31 12:30:20 +0530647 if msgObj.Result == me.Success {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000648 oo.MutexPersOnuConfig.Lock()
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000649 oo.SOnuPersistentData.PersMibDataSyncAdpt = cmn.MdsDefaultMib
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000650 oo.MutexPersOnuConfig.Unlock()
Holger Hildebrandt7e138462023-03-29 12:12:14 +0000651 oo.PDevOmciCC.ResetConfFailMEs()
Himani Chawla4d908332020-08-31 12:30:20 +0530652 // trigger retrieval of VendorId and SerialNumber
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000653 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetVendorAndSerial)
Himani Chawla4d908332020-08-31 12:30:20 +0530654 return
655 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000656 logger.Errorw(ctx, "Omci MibResetResponse Error", log.Fields{"device-id": oo.deviceID, "Error": msgObj.Result})
Himani Chawla4d908332020-08-31 12:30:20 +0530657 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000658 logger.Errorw(ctx, "Omci Msg layer could not be assigned", log.Fields{"device-id": oo.deviceID})
Himani Chawla4d908332020-08-31 12:30:20 +0530659 }
660 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000661 logger.Errorw(ctx, "Omci Msg layer could not be detected", log.Fields{"device-id": oo.deviceID})
Himani Chawla4d908332020-08-31 12:30:20 +0530662 }
663 } else {
mpagenko01499812021-03-25 10:37:12 +0000664 //in case the last request was MdsGetRequest this issue may appear if the ONU was online before and has received the MIB reset
665 // with Sequence number 0x8000 as last request before - so it may still respond to that
666 // then we may force the ONU to react on the MdsGetRequest with a new message that uses an increased Sequence number
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000667 oo.mutexLastTxParamStruct.Lock()
mpagenko01499812021-03-25 10:37:12 +0000668 if oo.lastTxParamStruct.lastTxMessageType == omci.GetRequestType && oo.lastTxParamStruct.repeatCount == 0 {
669 logger.Debugw(ctx, "MibSync FSM - repeat MdsGetRequest (updated SequenceNumber)", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +0000670 requestedAttributes := me.AttributeValueMap{me.OnuData_MibDataSync: ""}
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000671 _, err := oo.PDevOmciCC.SendGetMe(log.WithSpanFromContext(context.TODO(), ctx),
Holger Hildebrandtd930cb22022-06-17 09:24:50 +0000672 me.OnuDataClassID, cmn.OnuDataMeID, requestedAttributes, oo.baseDeviceHandler.GetOmciTimeout(), true, oo.PMibUploadFsm.CommChan, false)
ozgecanetsiab36ed572021-04-01 10:38:48 +0300673 if err != nil {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000674 oo.mutexLastTxParamStruct.Unlock()
ozgecanetsiab36ed572021-04-01 10:38:48 +0300675 logger.Errorw(ctx, "ONUData get failed, aborting MibSync", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000676 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
ozgecanetsiab36ed572021-04-01 10:38:48 +0300677 return
678 }
mpagenko01499812021-03-25 10:37:12 +0000679 //TODO: needs extra handling of timeouts
680 oo.lastTxParamStruct.repeatCount = 1
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000681 oo.mutexLastTxParamStruct.Unlock()
mpagenko01499812021-03-25 10:37:12 +0000682 return
683 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000684 oo.mutexLastTxParamStruct.Unlock()
mpagenko01499812021-03-25 10:37:12 +0000685 logger.Errorw(ctx, "unexpected MibResetResponse - ignoring", log.Fields{"device-id": oo.deviceID})
686 //perhaps some still lingering message from some prior activity, let's wait for the real response
687 return
Himani Chawla4d908332020-08-31 12:30:20 +0530688 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000689 logger.Info(ctx, "MibSync Msg", log.Fields{"Stopped handling of MibSyncChan for device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000690 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Himani Chawla4d908332020-08-31 12:30:20 +0530691}
692
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000693func (oo *OnuDeviceEntry) handleOmciMibUploadResponseMessage(ctx context.Context, msg cmn.OmciMessage) {
Himani Chawla4d908332020-08-31 12:30:20 +0530694 msgLayer := (*msg.OmciPacket).Layer(omci.LayerTypeMibUploadResponse)
695 if msgLayer == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000696 logger.Errorw(ctx, "Omci Msg layer could not be detected", log.Fields{"device-id": oo.deviceID})
Himani Chawla4d908332020-08-31 12:30:20 +0530697 return
698 }
699 msgObj, msgOk := msgLayer.(*omci.MibUploadResponse)
700 if !msgOk {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000701 logger.Errorw(ctx, "Omci Msg layer could not be assigned", log.Fields{"device-id": oo.deviceID})
Himani Chawla4d908332020-08-31 12:30:20 +0530702 return
703 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000704 logger.Debugw(ctx, "MibUploadResponse Data for:", log.Fields{"device-id": oo.deviceID, "data-fields": msgObj})
Himani Chawla4d908332020-08-31 12:30:20 +0530705 /* to be verified / reworked !!! */
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000706 oo.PDevOmciCC.UploadNoOfCmds = msgObj.NumberOfCommands
707 if oo.PDevOmciCC.UploadSequNo < oo.PDevOmciCC.UploadNoOfCmds {
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000708 _ = oo.PDevOmciCC.SendMibUploadNext(log.WithSpanFromContext(context.TODO(), ctx),
709 oo.baseDeviceHandler.GetOmciTimeout(), true, oo.GetPersIsExtOmciSupported())
mpagenko01499812021-03-25 10:37:12 +0000710 //even though lastTxParameters are currently not used for checking the ResetResponse message we have to ensure
711 // that the lastTxMessageType is correctly set to avoid misinterpreting other responses
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000712 oo.mutexLastTxParamStruct.Lock()
mpagenko01499812021-03-25 10:37:12 +0000713 oo.lastTxParamStruct.lastTxMessageType = omci.MibUploadNextRequestType
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000714 oo.mutexLastTxParamStruct.Unlock()
Himani Chawla4d908332020-08-31 12:30:20 +0530715 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000716 logger.Errorw(ctx, "Invalid number of commands received for:", log.Fields{"device-id": oo.deviceID, "UploadNoOfCmds": oo.PDevOmciCC.UploadNoOfCmds})
Himani Chawla4d908332020-08-31 12:30:20 +0530717 //TODO right action?
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000718 _ = oo.PMibUploadFsm.PFsm.Event(UlEvTimeout)
Himani Chawla4d908332020-08-31 12:30:20 +0530719 }
720}
721
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000722func (oo *OnuDeviceEntry) handleOmciMibUploadNextResponseMessage(ctx context.Context, msg cmn.OmciMessage) {
Himani Chawla4d908332020-08-31 12:30:20 +0530723 msgLayer := (*msg.OmciPacket).Layer(omci.LayerTypeMibUploadNextResponse)
mpagenko7033f4e2021-11-19 18:04:22 +0000724 if msgLayer != nil {
725 msgObj, msgOk := msgLayer.(*omci.MibUploadNextResponse)
726 if !msgOk {
727 logger.Errorw(ctx, "Omci Msg layer could not be assigned", log.Fields{"device-id": oo.deviceID})
728 return
mpagenko836a1fd2021-11-01 16:12:42 +0000729 }
mpagenko7033f4e2021-11-19 18:04:22 +0000730 meName := msgObj.ReportedME.GetName()
731 meClassID := msgObj.ReportedME.GetClassID()
732 meEntityID := msgObj.ReportedME.GetEntityID()
733
734 logger.Debugw(ctx, "MibUploadNextResponse Data for:", log.Fields{"device-id": oo.deviceID, "meName": meName, "data-fields": msgObj})
735
736 if meName == devdb.CUnknownItuG988ManagedEntity || meName == devdb.CUnknownVendorSpecificManagedEntity {
Holger Hildebrandt39080022022-03-16 10:03:17 +0000737 logger.Debugw(ctx, "MibUploadNextResponse contains unknown ME", log.Fields{"device-id": oo.deviceID,
738 "Me-Name": devdb.UnknownMeOrAttribName(meName), "Me-ClassId": meClassID, "Me-InstId": meEntityID,
739 "unknown mask": msgObj.ReportedME.GetAttributeMask(), "unknown attributes": msgObj.BaseLayer.Payload})
740 oo.pOnuDB.PutUnknownMeOrAttrib(ctx, devdb.UnknownMeOrAttribName(meName), meClassID, meEntityID,
741 msgObj.ReportedME.GetAttributeMask(), msgObj.BaseLayer.Payload[devdb.CStartUnknownMeAttribsInBaseLayerPayload:])
mpagenko7033f4e2021-11-19 18:04:22 +0000742 } else {
743 //with relaxed decoding set in the OMCI-LIB we have the chance to detect if there are some unknown attributes appended which we cannot decode
744 if unknownAttrLayer := (*msg.OmciPacket).Layer(omci.LayerTypeUnknownAttributes); unknownAttrLayer != nil {
745 logger.Warnw(ctx, "MibUploadNextResponse contains unknown attributes", log.Fields{"device-id": oo.deviceID})
746 if unknownAttributes, ok := unknownAttrLayer.(*omci.UnknownAttributes); ok {
747 // provide a loop over several ME's here already in preparation of OMCI extended message format
748 for _, unknown := range unknownAttributes.Attributes {
749 unknownAttrClassID := unknown.EntityClass // ClassID
750 unknownAttrInst := unknown.EntityInstance // uint16
751 unknownAttrMask := unknown.AttributeMask // ui
752 unknownAttrBlob := unknown.AttributeData // []byte
753 logger.Warnw(ctx, "unknown attributes detected for", log.Fields{"device-id": oo.deviceID,
754 "Me-ClassId": unknownAttrClassID, "Me-InstId": unknownAttrInst, "unknown mask": unknownAttrMask,
755 "unknown attributes": unknownAttrBlob})
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000756 oo.pOnuDB.PutUnknownMeOrAttrib(ctx, devdb.CUnknownAttributesManagedEntity, unknown.EntityClass, unknown.EntityInstance,
757 unknown.AttributeMask, unknown.AttributeData)
mpagenko7033f4e2021-11-19 18:04:22 +0000758 } // for all included ME's with unknown attributes
759 } else {
760 logger.Errorw(ctx, "unknownAttrLayer could not be decoded", log.Fields{"device-id": oo.deviceID})
761 }
762 }
763 oo.pOnuDB.PutMe(ctx, meClassID, meEntityID, msgObj.ReportedME.GetAttributeValueMap())
764 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000765 if msg.OmciMsg.DeviceIdentifier == omci.ExtendedIdent {
766 for _, additionalME := range msgObj.AdditionalMEs {
767 meName := additionalME.GetName()
768 meClassID := additionalME.GetClassID()
769 meEntityID := additionalME.GetEntityID()
770 attributes := additionalME.GetAttributeValueMap()
771
772 if meName == devdb.CUnknownItuG988ManagedEntity || meName == devdb.CUnknownVendorSpecificManagedEntity {
773 attribMask := additionalME.GetAttributeMask()
774 logger.Debugw(ctx, "MibUploadNextResponse AdditionalData contains unknown ME", log.Fields{"device-id": oo.deviceID,
775 "Me-Name": devdb.UnknownMeOrAttribName(meName), "Me-ClassId": meClassID, "Me-InstId": meEntityID,
776 "unknown mask": attribMask})
777
778 attribValues := make([]byte, 0)
779 for key, value := range attributes {
780 if key != cmn.CGenericManagedEntityIDName {
781 data, err := me.InterfaceToOctets(value)
782 if err != nil {
783 logger.Infow(ctx, "MibUploadNextResponse unknown ME AdditionalData attrib - could not decode", log.Fields{"device-id": oo.deviceID, "key": key})
784 } else {
785 attribValues = append(attribValues[:], data[:]...)
786 logger.Debugw(ctx, "MibUploadNextResponse unknown ME AdditionalData attrib", log.Fields{"device-id": oo.deviceID, "attribValues": attribValues, "data": data, "key": key})
787 }
788 }
789 }
790 oo.pOnuDB.PutUnknownMeOrAttrib(ctx, devdb.UnknownMeOrAttribName(meName), meClassID, meEntityID, attribMask, attribValues)
791 } else {
792 logger.Debugw(ctx, "MibUploadNextResponse AdditionalData for:", log.Fields{"device-id": oo.deviceID, "meName": meName, "meEntityID": meEntityID, "attributes": attributes})
793 oo.pOnuDB.PutMe(ctx, meClassID, meEntityID, attributes)
794 }
795 }
796 }
mpagenko7033f4e2021-11-19 18:04:22 +0000797 } else {
798 logger.Errorw(ctx, "Omci Msg layer could not be detected", log.Fields{"device-id": oo.deviceID})
799 //as long as omci-lib does not support decoding of table attribute as 'unknown/unspecified' attribute
800 // we have to verify, if this failure is from table attribute and try to go forward with ignoring the complete message
801 errLayer := (*msg.OmciPacket).Layer(gopacket.LayerTypeDecodeFailure)
802 if failure, decodeOk := errLayer.(*gopacket.DecodeFailure); decodeOk {
803 errMsg := failure.String()
804 if !strings.Contains(strings.ToLower(errMsg), "table decode") {
805 //something still unexected happened, needs deeper investigation - stop complete MIB upload process (timeout)
806 return
807 }
808 logger.Warnw(ctx, "Decode issue on received MibUploadNextResponse frame - found table attribute(s) (message ignored)",
809 log.Fields{"device-id": oo.deviceID, "issue": errMsg})
810 }
Himani Chawla4d908332020-08-31 12:30:20 +0530811 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000812 if oo.PDevOmciCC.UploadSequNo < oo.PDevOmciCC.UploadNoOfCmds {
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000813 _ = oo.PDevOmciCC.SendMibUploadNext(log.WithSpanFromContext(context.TODO(), ctx),
814 oo.baseDeviceHandler.GetOmciTimeout(), true, oo.GetPersIsExtOmciSupported())
mpagenko01499812021-03-25 10:37:12 +0000815 //even though lastTxParameters are currently not used for checking the ResetResponse message we have to ensure
816 // that the lastTxMessageType is correctly set to avoid misinterpreting other responses
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000817 oo.mutexLastTxParamStruct.Lock()
mpagenko01499812021-03-25 10:37:12 +0000818 oo.lastTxParamStruct.lastTxMessageType = omci.MibUploadNextRequestType
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000819 oo.mutexLastTxParamStruct.Unlock()
Himani Chawla4d908332020-08-31 12:30:20 +0530820 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000821 err := oo.createAndPersistMibTemplate(ctx)
Himani Chawla4d908332020-08-31 12:30:20 +0530822 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000823 logger.Errorw(ctx, "MibSync - MibTemplate - Failed to create and persist the mib template", log.Fields{"error": err, "device-id": oo.deviceID})
Himani Chawla4d908332020-08-31 12:30:20 +0530824 }
825
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +0530826 oo.updateOnuSpecificEntries(ctx)
827 logger.Errorw(ctx, "MibSync - Updtaed the ONU Specific MEs ", log.Fields{"device-id": oo.deviceID})
828
829 cmnMEDB, _ := oo.pOpenOnuAc.FetchEntryFromMibDatabaseMap(ctx, oo.mibTemplatePath)
830 cmnMEDB.MIBUploadStatus = devdb.Completed
831 oo.pOnuDB.CommonMeDb.MeDbLock.Unlock()
832 oo.pOpenOnuAc.SetMibTemplatesGenerated(oo.mibTemplatePath, true)
833 oo.pOpenOnuAc.UnlockMutexMibTemplateGenerated()
834
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000835 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Himani Chawla4d908332020-08-31 12:30:20 +0530836 }
837}
838
Girish Gowdra21bbf052022-02-17 16:08:22 -0800839// nolint: gocyclo
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000840func (oo *OnuDeviceEntry) handleOmciGetResponseMessage(ctx context.Context, msg cmn.OmciMessage) error {
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000841 var err error = nil
mpagenko01499812021-03-25 10:37:12 +0000842
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000843 oo.mutexLastTxParamStruct.RLock()
mpagenko01499812021-03-25 10:37:12 +0000844 if oo.lastTxParamStruct.lastTxMessageType != omci.GetRequestType ||
845 oo.lastTxParamStruct.pLastTxMeInstance == nil {
846 //in case the last request was MibReset this issue may appear if the ONU was online before and has received the MDS GetRequest
847 // with Sequence number 0x8000 as last request before - so it may still respond to that
848 // then we may force the ONU to react on the MIB reset with a new message that uses an increased Sequence number
849 if oo.lastTxParamStruct.lastTxMessageType == omci.MibResetRequestType && oo.lastTxParamStruct.repeatCount == 0 {
850 logger.Debugw(ctx, "MibSync FSM - repeat mibReset (updated SequenceNumber)", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000851 _ = oo.PDevOmciCC.SendMibReset(log.WithSpanFromContext(context.TODO(), ctx), oo.baseDeviceHandler.GetOmciTimeout(), true)
mpagenko01499812021-03-25 10:37:12 +0000852 //TODO: needs extra handling of timeouts
853 oo.lastTxParamStruct.repeatCount = 1
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000854 oo.mutexLastTxParamStruct.RUnlock()
mpagenko01499812021-03-25 10:37:12 +0000855 return nil
856 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000857 oo.mutexLastTxParamStruct.RUnlock()
mpagenko01499812021-03-25 10:37:12 +0000858 logger.Warnw(ctx, "unexpected GetResponse - ignoring", log.Fields{"device-id": oo.deviceID})
859 //perhaps some still lingering message from some prior activity, let's wait for the real response
860 return nil
861 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000862 oo.mutexLastTxParamStruct.RUnlock()
Himani Chawla4d908332020-08-31 12:30:20 +0530863 msgLayer := (*msg.OmciPacket).Layer(omci.LayerTypeGetResponse)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000864 if msgLayer == nil {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000865 logger.Errorw(ctx, "omci Msg layer could not be detected for GetResponse - handling of MibSyncChan stopped",
866 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000867 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000868 return fmt.Errorf("omci Msg layer could not be detected for GetResponse - handling of MibSyncChan stopped: %s", oo.deviceID)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000869 }
870 msgObj, msgOk := msgLayer.(*omci.GetResponse)
871 if !msgOk {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000872 logger.Errorw(ctx, "omci Msg layer could not be assigned for GetResponse - handling of MibSyncChan stopped",
873 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000874 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000875 return fmt.Errorf("omci Msg layer could not be assigned for GetResponse - handling of MibSyncChan stopped: %s", oo.deviceID)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000876 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000877 logger.Debugw(ctx, "MibSync FSM - GetResponse Data", log.Fields{"device-id": oo.deviceID, "data-fields": msgObj})
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000878 if msgObj.Result == me.Success {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000879 oo.mutexLastTxParamStruct.RLock()
mpagenko01499812021-03-25 10:37:12 +0000880 entityID := oo.lastTxParamStruct.pLastTxMeInstance.GetEntityID()
881 if msgObj.EntityClass == oo.lastTxParamStruct.pLastTxMeInstance.GetClassID() && msgObj.EntityInstance == entityID {
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000882 meAttributes := msgObj.Attributes
mpagenko01499812021-03-25 10:37:12 +0000883 meInstance := oo.lastTxParamStruct.pLastTxMeInstance.GetName()
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000884 logger.Debugf(ctx, "MibSync FSM - GetResponse Data for %s",
885 log.Fields{"device-id": oo.deviceID, "data-fields": msgObj}, meInstance)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000886 switch meInstance {
887 case "OnuG":
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000888 oo.mutexLastTxParamStruct.RUnlock()
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000889 return oo.handleOmciGetResponseOnuG(ctx, meAttributes)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000890 case "Onu2G":
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000891 oo.mutexLastTxParamStruct.RUnlock()
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000892 var equipmentID string
893 if onu2GEquipmentID, ok := meAttributes[me.Onu2G_EquipmentId]; ok {
894 equipmentID = cmn.TrimStringFromMeOctet(onu2GEquipmentID)
895 if equipmentID == "" {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000896 logger.Infow(ctx,
897 "MibSync FSM - optional attribute EquipmentID is empty in Onu2G instance - fill with appropriate value",
898 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000899 equipmentID = cEmptyEquipIDString
900 }
901 } else {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000902 logger.Infow(ctx,
903 "MibSync FSM - optional attribute EquipmentID not present in Onu2G instance - fill with appropriate value",
904 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000905 equipmentID = cNotPresentEquipIDString
906 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000907 oo.MutexPersOnuConfig.Lock()
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000908 oo.SOnuPersistentData.PersEquipmentID = equipmentID
dbainbri4d3a0dc2020-12-02 00:33:42 +0000909 logger.Debugw(ctx, "MibSync FSM - GetResponse Data for Onu2-G - EquipmentId", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000910 "onuDeviceEntry.equipmentID": oo.SOnuPersistentData.PersEquipmentID})
911 oo.MutexPersOnuConfig.Unlock()
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000912
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000913 var omccVersion uint8
914 if onu2GOmccVersion, ok := meAttributes[me.Onu2G_OpticalNetworkUnitManagementAndControlChannelOmccVersion]; ok {
915 oo.MutexPersOnuConfig.Lock()
916 omccVersion = onu2GOmccVersion.(uint8)
917 if _, ok := omccVersionSupportsExtendedOmciFormat[omccVersion]; ok {
918 oo.SOnuPersistentData.PersIsExtOmciSupported = omccVersionSupportsExtendedOmciFormat[omccVersion]
Holger Hildebrandtc572e622022-06-22 09:19:17 +0000919 if oo.SOnuPersistentData.PersIsExtOmciSupported && !oo.baseDeviceHandler.GetExtendedOmciSupportEnabled() {
920 logger.Infow(ctx, "MibSync FSM - ONU supports extended OMCI, but support is disabled in the adapter: reset flag",
921 log.Fields{"device-id": oo.deviceID})
922 oo.SOnuPersistentData.PersIsExtOmciSupported = false
923 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000924 } else {
925 logger.Infow(ctx, "MibSync FSM - unknown OMCC version in Onu2G instance - disable extended OMCI support",
926 log.Fields{"device-id": oo.deviceID})
927 oo.SOnuPersistentData.PersIsExtOmciSupported = false
928 }
929 logger.Debugw(ctx, "MibSync FSM - GetResponse Data for Onu2-G - OMCC version", log.Fields{"device-id": oo.deviceID,
930 "omccVersion": omccVersion, "isExtOmciSupported": oo.SOnuPersistentData.PersIsExtOmciSupported})
931 oo.MutexPersOnuConfig.Unlock()
932 } else {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000933 logger.Errorw(ctx,
934 "MibSync FSM - mandatory attribute OMCC version not present in Onu2G instance - handling of MibSyncChan stopped!",
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000935 log.Fields{"device-id": oo.deviceID})
936 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000937 return fmt.Errorf(
938 "mibSync FSM - mandatory attribute OMCC version not present in Onu2G instance - handling of MibSyncChan stopped: %s",
939 oo.deviceID)
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000940 }
941 oo.MutexPersOnuConfig.RLock()
942 if oo.SOnuPersistentData.PersIsExtOmciSupported {
943 oo.MutexPersOnuConfig.RUnlock()
944 // trigger test of OMCI extended msg format
945 _ = oo.PMibUploadFsm.PFsm.Event(UlEvTestExtOmciSupport)
946 return nil
947 }
948 oo.MutexPersOnuConfig.RUnlock()
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000949 // trigger retrieval of 1st SW-image info
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000950 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetFirstSwVersion)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000951 return nil
952 case "SoftwareImage":
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000953 oo.mutexLastTxParamStruct.RUnlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000954 if entityID > cmn.SecondSwImageMeID {
mpagenko15ff4a52021-03-02 10:09:20 +0000955 logger.Errorw(ctx, "mibSync FSM - Failed to GetResponse Data for SoftwareImage with expected EntityId",
956 log.Fields{"device-id": oo.deviceID, "entity-ID": entityID})
957 return fmt.Errorf("mibSync FSM - SwResponse Data with unexpected EntityId: %s %x",
958 oo.deviceID, entityID)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000959 }
mpagenko15ff4a52021-03-02 10:09:20 +0000960 // need to use function for go lint complexity
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000961 if !oo.HandleSwImageIndications(ctx, entityID, meAttributes) {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000962 logger.Errorw(ctx,
963 "MibSync FSM - Not all mandatory attributes present in in SoftwareImage instance - handling of MibSyncChan stopped!",
964 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000965 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000966 return fmt.Errorf(
967 "mibSync FSM - Not all mandatory attributes present in in SoftwareImage instance - handling of MibSyncChan stopped: %s",
968 oo.deviceID)
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000969 }
mpagenko15ff4a52021-03-02 10:09:20 +0000970 return nil
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000971 case "IpHostConfigData":
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000972 oo.mutexLastTxParamStruct.RUnlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000973 oo.MutexPersOnuConfig.Lock()
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000974 if ipHostConfigMacAddress, ok := meAttributes[me.IpHostConfigData_MacAddress]; ok {
Girish Gowdra21bbf052022-02-17 16:08:22 -0800975 macBytes, _ := me.InterfaceToOctets(ipHostConfigMacAddress)
976 if cmn.OmciMacAddressLen == len(macBytes) {
977 oo.SOnuPersistentData.PersMacAddress = hex.EncodeToString(macBytes[:])
978 logger.Debugw(ctx, "MibSync FSM - GetResponse Data for IpHostConfigData - MacAddress", log.Fields{"device-id": oo.deviceID,
979 "macAddress": oo.SOnuPersistentData.PersMacAddress})
980 } else {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000981 logger.Infow(ctx, "MibSync FSM - MacAddress wrong length - fill macAddress with zeros",
982 log.Fields{"device-id": oo.deviceID, "length": len(macBytes)})
Girish Gowdra21bbf052022-02-17 16:08:22 -0800983 oo.SOnuPersistentData.PersMacAddress = cEmptyMacAddrString
984 }
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000985 } else {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000986 // since ONU creates instances of this ME automatically only when IP host services are available,
987 // processing continues here despite the error
988 logger.Infow(ctx, "MibSync FSM - MacAddress attribute not present in IpHostConfigData instance - fill macAddress with zeros",
989 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000990 oo.SOnuPersistentData.PersMacAddress = cEmptyMacAddrString
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000991 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000992 oo.MutexPersOnuConfig.Unlock()
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000993 // trigger retrieval of mib template
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000994 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetMibTemplate)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000995 return nil
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000996 case "OnuData":
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000997 oo.mutexLastTxParamStruct.RUnlock()
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000998 if onuDataMibDataSync, ok := meAttributes[me.OnuData_MibDataSync]; ok {
999 oo.checkMdsValue(ctx, onuDataMibDataSync.(uint8))
1000 } else {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001001 logger.Errorw(ctx, "MibSync FSM - MibDataSync attribute not present in OnuData instance - handling of MibSyncChan stopped!",
1002 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +00001003 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001004 return fmt.Errorf("mibSync FSM - VendorId attribute not present in OnuG instance - handling of MibSyncChan stopped: %s",
1005 oo.deviceID)
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +00001006 }
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00001007 return nil
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001008 default:
1009 oo.mutexLastTxParamStruct.RUnlock()
1010 logger.Warnw(ctx, "Unsupported ME name received!",
1011 log.Fields{"ME name": meInstance, "device-id": oo.deviceID})
1012
Himani Chawla4d908332020-08-31 12:30:20 +05301013 }
Matteo Scandolo20ca10c2021-01-21 14:35:45 -08001014 } else {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001015 oo.mutexLastTxParamStruct.RUnlock()
1016 logger.Warnf(ctx, "MibSync FSM - Received GetResponse Data for %s with wrong classID or entityID ",
1017 log.Fields{"device-id": oo.deviceID, "data-fields": msgObj}, msgObj.EntityClass)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001018 }
Himani Chawla4d908332020-08-31 12:30:20 +05301019 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001020 if err = oo.handleOmciGetResponseErrors(ctx, msgObj); err == nil {
Holger Hildebrandt80129db2020-11-23 10:49:32 +00001021 return nil
1022 }
Himani Chawla4d908332020-08-31 12:30:20 +05301023 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001024 logger.Info(ctx, "MibSync Msg", log.Fields{"Stopped handling of MibSyncChan for device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001025 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001026 return err
Himani Chawla4d908332020-08-31 12:30:20 +05301027}
1028
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05301029// HandleSwImageIndications updates onuSwImageIndications with the ONU data just received
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +00001030func (oo *OnuDeviceEntry) HandleSwImageIndications(ctx context.Context, entityID uint16, meAttributes me.AttributeValueMap) bool {
1031
1032 var imageVersion string
1033 var imageIsCommitted, imageIsActive uint8
1034
1035 allMandAttribsPresent := false
1036 if softwareImageIsCommitted, ok := meAttributes[me.SoftwareImage_IsCommitted]; ok {
1037 if softwareImageIsActiveimage, ok := meAttributes[me.SoftwareImage_IsActive]; ok {
1038 if softwareImageVersion, ok := meAttributes[me.SoftwareImage_Version]; ok {
1039 imageVersion = cmn.TrimStringFromMeOctet(softwareImageVersion)
1040 imageIsActive = softwareImageIsActiveimage.(uint8)
1041 imageIsCommitted = softwareImageIsCommitted.(uint8)
1042 allMandAttribsPresent = true
1043 }
1044 }
1045 }
1046 if !allMandAttribsPresent {
1047 logger.Errorw(ctx, "MibSync FSM - Not all mandatory attributes present in SoftwareImage instance - skip processing!", log.Fields{"device-id": oo.deviceID})
1048 return allMandAttribsPresent
1049 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001050 oo.MutexPersOnuConfig.RLock()
mpagenko15ff4a52021-03-02 10:09:20 +00001051 logger.Infow(ctx, "MibSync FSM - GetResponse Data for SoftwareImage",
1052 log.Fields{"device-id": oo.deviceID, "entityID": entityID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001053 "version": imageVersion, "isActive": imageIsActive, "isCommitted": imageIsCommitted, "SNR": oo.SOnuPersistentData.PersSerialNumber})
1054 oo.MutexPersOnuConfig.RUnlock()
1055 if cmn.FirstSwImageMeID == entityID {
mpagenko15ff4a52021-03-02 10:09:20 +00001056 //always accept the state of the first image (2nd image info should not yet be available)
Holger Hildebrandt05011352021-06-15 09:40:24 +00001057 oo.mutexOnuSwImageIndications.Lock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001058 if imageIsActive == cmn.SwIsActive {
1059 oo.onuSwImageIndications.ActiveEntityEntry.EntityID = entityID
1060 oo.onuSwImageIndications.ActiveEntityEntry.Valid = true
1061 oo.onuSwImageIndications.ActiveEntityEntry.Version = imageVersion
1062 oo.onuSwImageIndications.ActiveEntityEntry.IsCommitted = imageIsCommitted
mpagenko59498c12021-03-18 14:15:15 +00001063 //as the SW version indication may stem from some ONU Down/up event
1064 //the complementary image state is to be invalidated
1065 // (state of the second image is always expected afterwards or just invalid)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001066 oo.onuSwImageIndications.InActiveEntityEntry.Valid = false
mpagenko15ff4a52021-03-02 10:09:20 +00001067 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001068 oo.onuSwImageIndications.InActiveEntityEntry.EntityID = entityID
1069 oo.onuSwImageIndications.InActiveEntityEntry.Valid = true
1070 oo.onuSwImageIndications.InActiveEntityEntry.Version = imageVersion
1071 oo.onuSwImageIndications.InActiveEntityEntry.IsCommitted = imageIsCommitted
mpagenko59498c12021-03-18 14:15:15 +00001072 //as the SW version indication may stem form some ONU Down/up event
1073 //the complementary image state is to be invalidated
1074 // (state of the second image is always expected afterwards or just invalid)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001075 oo.onuSwImageIndications.ActiveEntityEntry.Valid = false
mpagenko15ff4a52021-03-02 10:09:20 +00001076 }
Holger Hildebrandt05011352021-06-15 09:40:24 +00001077 oo.mutexOnuSwImageIndications.Unlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001078 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetSecondSwVersion)
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +00001079 return allMandAttribsPresent
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001080 } else if cmn.SecondSwImageMeID == entityID {
mpagenko15ff4a52021-03-02 10:09:20 +00001081 //2nd image info might conflict with first image info, in which case we priorize first image info!
Holger Hildebrandt05011352021-06-15 09:40:24 +00001082 oo.mutexOnuSwImageIndications.Lock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001083 if imageIsActive == cmn.SwIsActive { //2nd image reported to be active
1084 if oo.onuSwImageIndications.ActiveEntityEntry.Valid {
mpagenko15ff4a52021-03-02 10:09:20 +00001085 //conflict exists - state of first image is left active
1086 logger.Warnw(ctx, "mibSync FSM - both ONU images are reported as active - assuming 2nd to be inactive",
1087 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001088 oo.onuSwImageIndications.InActiveEntityEntry.EntityID = entityID
1089 oo.onuSwImageIndications.InActiveEntityEntry.Valid = true ////to indicate that at least something has been reported
1090 oo.onuSwImageIndications.InActiveEntityEntry.Version = imageVersion
1091 oo.onuSwImageIndications.InActiveEntityEntry.IsCommitted = imageIsCommitted
mpagenko15ff4a52021-03-02 10:09:20 +00001092 } else { //first image inactive, this one active
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001093 oo.onuSwImageIndications.ActiveEntityEntry.EntityID = entityID
1094 oo.onuSwImageIndications.ActiveEntityEntry.Valid = true
1095 oo.onuSwImageIndications.ActiveEntityEntry.Version = imageVersion
1096 oo.onuSwImageIndications.ActiveEntityEntry.IsCommitted = imageIsCommitted
mpagenko15ff4a52021-03-02 10:09:20 +00001097 }
1098 } else { //2nd image reported to be inactive
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001099 if oo.onuSwImageIndications.InActiveEntityEntry.Valid {
mpagenko15ff4a52021-03-02 10:09:20 +00001100 //conflict exists - both images inactive - regard it as ONU failure and assume first image to be active
1101 logger.Warnw(ctx, "mibSync FSM - both ONU images are reported as inactive, defining first to be active",
1102 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001103 oo.onuSwImageIndications.ActiveEntityEntry.EntityID = cmn.FirstSwImageMeID
1104 oo.onuSwImageIndications.ActiveEntityEntry.Valid = true //to indicate that at least something has been reported
mpagenko15ff4a52021-03-02 10:09:20 +00001105 //copy active commit/version from the previously stored inactive position
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001106 oo.onuSwImageIndications.ActiveEntityEntry.Version = oo.onuSwImageIndications.InActiveEntityEntry.Version
1107 oo.onuSwImageIndications.ActiveEntityEntry.IsCommitted = oo.onuSwImageIndications.InActiveEntityEntry.IsCommitted
mpagenko15ff4a52021-03-02 10:09:20 +00001108 }
1109 //in any case we indicate (and possibly overwrite) the second image indications as inactive
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001110 oo.onuSwImageIndications.InActiveEntityEntry.EntityID = entityID
1111 oo.onuSwImageIndications.InActiveEntityEntry.Valid = true
1112 oo.onuSwImageIndications.InActiveEntityEntry.Version = imageVersion
1113 oo.onuSwImageIndications.InActiveEntityEntry.IsCommitted = imageIsCommitted
mpagenko15ff4a52021-03-02 10:09:20 +00001114 }
Holger Hildebrandt05011352021-06-15 09:40:24 +00001115 oo.mutexOnuSwImageIndications.Unlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001116 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetMacAddress)
mpagenko15ff4a52021-03-02 10:09:20 +00001117 }
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +00001118 return allMandAttribsPresent
mpagenko15ff4a52021-03-02 10:09:20 +00001119}
1120
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001121func (oo *OnuDeviceEntry) handleOmciMessage(ctx context.Context, msg cmn.OmciMessage) {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001122 logger.Debugw(ctx, "MibSync Msg", log.Fields{"OmciMessage received for device-id": oo.deviceID,
Andrea Campanella6515c582020-10-05 11:25:00 +02001123 "msgType": msg.OmciMsg.MessageType, "msg": msg})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001124 //further analysis could be done here based on msg.OmciMsg.Payload, e.g. verification of error code ...
1125 switch msg.OmciMsg.MessageType {
1126 case omci.MibResetResponseType:
dbainbri4d3a0dc2020-12-02 00:33:42 +00001127 oo.handleOmciMibResetResponseMessage(ctx, msg)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001128
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001129 case omci.MibUploadResponseType:
dbainbri4d3a0dc2020-12-02 00:33:42 +00001130 oo.handleOmciMibUploadResponseMessage(ctx, msg)
Himani Chawla4d908332020-08-31 12:30:20 +05301131
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001132 case omci.MibUploadNextResponseType:
dbainbri4d3a0dc2020-12-02 00:33:42 +00001133 oo.handleOmciMibUploadNextResponseMessage(ctx, msg)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001134
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001135 case omci.GetResponseType:
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001136 //TODO: error handling
dbainbri4d3a0dc2020-12-02 00:33:42 +00001137 _ = oo.handleOmciGetResponseMessage(ctx, msg)
Himani Chawla4d908332020-08-31 12:30:20 +05301138
Andrea Campanella6515c582020-10-05 11:25:00 +02001139 default:
Holger Hildebrandtabfef032022-02-25 12:40:20 +00001140 logger.Warnw(ctx, "Unknown Message Type", log.Fields{"device-id": oo.deviceID, "msgType": msg.OmciMsg.MessageType})
Andrea Campanella6515c582020-10-05 11:25:00 +02001141
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001142 }
1143}
1144
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001145func (oo *OnuDeviceEntry) handleOmciGetResponseOnuG(ctx context.Context, meAttributes me.AttributeValueMap) error {
1146 currentState := oo.PMibUploadFsm.PFsm.Current()
1147 if currentState == UlStGettingVendorAndSerial {
1148 if onuGVendorID, ok := meAttributes[me.OnuG_VendorId]; ok {
1149 vendorID := cmn.TrimStringFromMeOctet(onuGVendorID)
1150 if vendorID == "" {
1151 logger.Infow(ctx,
1152 "MibSync FSM - mandatory attribute VendorId is empty in OnuG instance - fill with appropriate value",
1153 log.Fields{"device-id": oo.deviceID})
1154 vendorID = cEmptyVendorIDString
1155 }
1156 oo.MutexPersOnuConfig.Lock()
1157 oo.SOnuPersistentData.PersVendorID = vendorID
1158 oo.MutexPersOnuConfig.Unlock()
1159 } else {
1160 logger.Errorw(ctx,
1161 "MibSync FSM - mandatory attribute VendorId not present in OnuG instance - handling of MibSyncChan stopped!",
1162 log.Fields{"device-id": oo.deviceID})
1163 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
1164 return fmt.Errorf(
1165 "mibSync FSM - mandatory attribute VendorId not present in OnuG instance - handling of MibSyncChan stopped: %s",
1166 oo.deviceID)
1167 }
1168 if onuGSerialNumber, ok := meAttributes[me.OnuG_SerialNumber]; ok {
1169 oo.MutexPersOnuConfig.Lock()
1170 snBytes, _ := me.InterfaceToOctets(onuGSerialNumber)
1171 if cmn.OnugSerialNumberLen == len(snBytes) {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +05301172 snVendorPart := string(snBytes[:4])
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001173 snNumberPart := hex.EncodeToString(snBytes[4:])
1174 oo.SOnuPersistentData.PersSerialNumber = snVendorPart + snNumberPart
1175 } else {
1176 logger.Infow(ctx, "MibSync FSM - SerialNumber has wrong length - fill serialNumber with zeros",
1177 log.Fields{"device-id": oo.deviceID, "length": len(snBytes)})
1178 oo.SOnuPersistentData.PersSerialNumber = cEmptySerialNumberString
1179 }
1180 oo.MutexPersOnuConfig.Unlock()
1181 } else {
1182 logger.Errorw(ctx,
1183 "MibSync FSM - mandatory attribute SerialNumber not present in OnuG instance - handling of MibSyncChan stopped!",
1184 log.Fields{"device-id": oo.deviceID})
1185 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
1186 return fmt.Errorf(
1187 "mibSync FSM - mandatory attribute SerialNumber not present in OnuG instance - handling of MibSyncChan stopped: %s",
1188 oo.deviceID)
1189 }
1190 oo.MutexPersOnuConfig.Lock()
1191 logger.Debugw(ctx, "MibSync FSM - GetResponse Data for Onu-G - VendorId/SerialNumber", log.Fields{"device-id": oo.deviceID,
1192 "onuDeviceEntry.vendorID": oo.SOnuPersistentData.PersVendorID,
1193 "onuDeviceEntry.serialNumber": oo.SOnuPersistentData.PersSerialNumber})
1194 oo.MutexPersOnuConfig.Unlock()
1195 // trigger retrieval of Version
1196 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetVersion)
1197 return nil
1198 } else if currentState == UlStGettingVersion {
1199 if onuGVersion, ok := meAttributes[me.OnuG_Version]; ok {
1200 version := cmn.TrimStringFromMeOctet(onuGVersion)
1201 if version == "" {
1202 logger.Infow(ctx, "MibSync FSM - mandatory attribute Version is empty in OnuG instance - fill with appropriate value",
1203 log.Fields{"device-id": oo.deviceID})
1204 version = cEmptyVersionString
1205 }
1206 oo.MutexPersOnuConfig.Lock()
1207 oo.SOnuPersistentData.PersVersion = version
1208 oo.MutexPersOnuConfig.Unlock()
1209 } else {
1210 logger.Errorw(ctx,
1211 "MibSync FSM - mandatory attribute Version not present in OnuG instance - handling of MibSyncChan stopped!",
1212 log.Fields{"device-id": oo.deviceID})
1213 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
1214 return fmt.Errorf(
1215 "mibSync FSM - mandatory attribute Version not present in OnuG instance - handling of MibSyncChan stopped: %s",
1216 oo.deviceID)
1217 }
1218 oo.MutexPersOnuConfig.Lock()
1219 logger.Debugw(ctx, "MibSync FSM - GetResponse Data for Onu-G - Version", log.Fields{"device-id": oo.deviceID,
1220 "onuDeviceEntry.version": oo.SOnuPersistentData.PersVersion})
1221 oo.MutexPersOnuConfig.Unlock()
1222 // trigger retrieval of EquipmentId and OMCC version
1223 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetEquipIDAndOmcc)
1224 return nil
1225 } else {
1226 logger.Errorw(ctx, "MibSync FSM - wrong state OnuG response processing - handling of MibSyncChan stopped!",
1227 log.Fields{"currentState": currentState, "device-id": oo.deviceID})
1228 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
1229 return fmt.Errorf("mibSync FSM - wrong state OnuG response processing - handling of MibSyncChan stopped: %s",
1230 oo.deviceID)
1231 }
1232}
1233
dbainbri4d3a0dc2020-12-02 00:33:42 +00001234func (oo *OnuDeviceEntry) handleOmciGetResponseErrors(ctx context.Context, msgObj *omci.GetResponse) error {
Holger Hildebrandt80129db2020-11-23 10:49:32 +00001235 var err error = nil
dbainbri4d3a0dc2020-12-02 00:33:42 +00001236 logger.Debugf(ctx, "MibSync FSM - erroneous result in GetResponse Data: %s", log.Fields{"device-id": oo.deviceID, "data-fields": msgObj}, msgObj.Result)
Holger Hildebrandt80129db2020-11-23 10:49:32 +00001237 // Up to now the following erroneous results have been seen for different ONU-types to indicate an unsupported ME
1238 if msgObj.Result == me.UnknownInstance || msgObj.Result == me.UnknownEntity || msgObj.Result == me.ProcessingError || msgObj.Result == me.NotSupported {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001239 oo.mutexLastTxParamStruct.RLock()
1240 if oo.lastTxParamStruct.pLastTxMeInstance != nil {
1241 entityID := oo.lastTxParamStruct.pLastTxMeInstance.GetEntityID()
1242 if msgObj.EntityClass == oo.lastTxParamStruct.pLastTxMeInstance.GetClassID() && msgObj.EntityInstance == entityID {
1243 meInstance := oo.lastTxParamStruct.pLastTxMeInstance.GetName()
1244 switch meInstance {
1245 case "IpHostConfigData":
1246 oo.mutexLastTxParamStruct.RUnlock()
1247 logger.Debugw(ctx, "MibSync FSM - erroneous result for IpHostConfigData received - ONU doesn't support ME - fill macAddress with zeros",
1248 log.Fields{"device-id": oo.deviceID, "data-fields": msgObj})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001249 oo.MutexPersOnuConfig.Lock()
1250 oo.SOnuPersistentData.PersMacAddress = cEmptyMacAddrString
1251 oo.MutexPersOnuConfig.Unlock()
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001252 // trigger retrieval of mib template
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001253 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetMibTemplate)
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001254 return nil
1255 default:
1256 oo.mutexLastTxParamStruct.RUnlock()
1257 logger.Warnf(ctx, "MibSync FSM - erroneous result for %s received - no exceptional treatment defined", log.Fields{"device-id": oo.deviceID, "data-fields": msgObj}, meInstance)
1258 err = fmt.Errorf("erroneous result for %s received - no exceptional treatment defined: %s", meInstance, oo.deviceID)
1259 }
1260 } else {
1261 oo.mutexLastTxParamStruct.RUnlock()
Holger Hildebrandt80129db2020-11-23 10:49:32 +00001262 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001263 } else {
1264 oo.mutexLastTxParamStruct.RUnlock()
1265 logger.Warnw(ctx, "Pointer to last Tx MeInstance is nil!", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt80129db2020-11-23 10:49:32 +00001266 }
1267 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001268 logger.Errorf(ctx, "MibSync FSM - erroneous result in GetResponse Data: %s", log.Fields{"device-id": oo.deviceID, "data-fields": msgObj}, msgObj.Result)
Holger Hildebrandt80129db2020-11-23 10:49:32 +00001269 err = fmt.Errorf("erroneous result in GetResponse Data: %s - %s", msgObj.Result, oo.deviceID)
1270 }
1271 return err
1272}
1273
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001274// IsNewOnu - TODO: add comment
1275func (oo *OnuDeviceEntry) IsNewOnu() bool {
1276 oo.MutexPersOnuConfig.RLock()
1277 defer oo.MutexPersOnuConfig.RUnlock()
1278 return oo.SOnuPersistentData.PersMibLastDbSync == 0
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00001279}
1280
Himani Chawla6d2ae152020-09-02 13:11:20 +05301281func isSupportedClassID(meClassID me.ClassID) bool {
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001282 for _, v := range supportedClassIds {
Himani Chawla4d908332020-08-31 12:30:20 +05301283 if v == meClassID {
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001284 return true
1285 }
1286 }
1287 return false
1288}
1289
dbainbri4d3a0dc2020-12-02 00:33:42 +00001290func (oo *OnuDeviceEntry) mibDbVolatileDict(ctx context.Context) error {
1291 logger.Debug(ctx, "MibVolatileDict- running from default Entry code")
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001292 return errors.New("not_implemented")
1293}
1294
Himani Chawla6d2ae152020-09-02 13:11:20 +05301295// createAndPersistMibTemplate method creates a mib template for the device id when operator enables the ONU device for the first time.
divyadesaibbed37c2020-08-28 13:35:20 +05301296// We are creating a placeholder for "SerialNumber" for ME Class ID 6 and 256 and "MacAddress" for ME Class ID 134 in the template
Holger Hildebrandt61b24d02020-11-16 13:36:40 +00001297// and then storing the template into etcd "service/voltha/omci_mibs/go_templates/verdor_id/equipment_id/software_version" path.
dbainbri4d3a0dc2020-12-02 00:33:42 +00001298func (oo *OnuDeviceEntry) createAndPersistMibTemplate(ctx context.Context) error {
1299 logger.Debugw(ctx, "MibSync - MibTemplate - path name", log.Fields{"path": oo.mibTemplatePath,
Holger Hildebrandt61b24d02020-11-16 13:36:40 +00001300 "device-id": oo.deviceID})
divyadesaibbed37c2020-08-28 13:35:20 +05301301
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301302 //Fetch the MEs dependent on serial number and MAC address and add them to onuSpecific ME DB
1303 //Modify the serial number and MAC address with generic content in the common DB.
1304 knownAttributeMEDb := oo.pOnuDB.CommonMeDb.MeDb
1305 for firstLevelKey, firstLevelValue := range knownAttributeMEDb {
1306 classID := strconv.Itoa(int(firstLevelKey))
Holger Hildebrandt61b24d02020-11-16 13:36:40 +00001307
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301308 for secondLevelKey, secondLevelValue := range firstLevelValue {
1309 switch classID {
1310 case "6", "256":
1311 if _, exists := secondLevelValue["SerialNumber"]; exists {
1312 oo.pOnuDB.PutOnuSpeficMe(ctx, firstLevelKey, secondLevelKey, secondLevelValue)
1313 secondLevelValue["SerialNumber"] = "%SERIAL_NUMBER%"
1314 }
1315 case "134":
1316 if _, exists := secondLevelValue["MacAddress"]; exists {
1317 oo.pOnuDB.PutOnuSpeficMe(ctx, firstLevelKey, secondLevelKey, secondLevelValue)
1318 secondLevelValue["MacAddress"] = "%MAC_ADDRESS%"
1319 }
1320 }
1321 }
1322 }
1323
1324 //Create the MIB Template
Holger Hildebrandt61b24d02020-11-16 13:36:40 +00001325 currentTime := time.Now()
divyadesaibbed37c2020-08-28 13:35:20 +05301326 templateMap := make(map[string]interface{})
Holger Hildebrandt61b24d02020-11-16 13:36:40 +00001327 templateMap["TemplateName"] = oo.mibTemplatePath
divyadesaibbed37c2020-08-28 13:35:20 +05301328 templateMap["TemplateCreated"] = currentTime.Format("2006-01-02 15:04:05.000000")
1329
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301330 firstLevelMap := oo.pOnuDB.CommonMeDb.MeDb
divyadesaibbed37c2020-08-28 13:35:20 +05301331 for firstLevelKey, firstLevelValue := range firstLevelMap {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001332 logger.Debugw(ctx, "MibSync - MibTemplate - firstLevelKey", log.Fields{"firstLevelKey": firstLevelKey})
Himani Chawla26e555c2020-08-31 12:30:20 +05301333 classID := strconv.Itoa(int(firstLevelKey))
divyadesaibbed37c2020-08-28 13:35:20 +05301334
1335 secondLevelMap := make(map[string]interface{})
1336 for secondLevelKey, secondLevelValue := range firstLevelValue {
Holger Hildebrandt8998ed52022-03-23 09:52:37 +00001337 // ManagedEntityId is already key of secondLevelMap - remove this redundant attribute from secondLevelValue
1338 delete(secondLevelValue, cmn.CGenericManagedEntityIDName)
divyadesaibbed37c2020-08-28 13:35:20 +05301339 thirdLevelMap := make(map[string]interface{})
Himani Chawla26e555c2020-08-31 12:30:20 +05301340 entityID := strconv.Itoa(int(secondLevelKey))
divyadesaibbed37c2020-08-28 13:35:20 +05301341 thirdLevelMap["Attributes"] = secondLevelValue
Himani Chawla26e555c2020-08-31 12:30:20 +05301342 secondLevelMap[entityID] = thirdLevelMap
1343 if classID == "6" || classID == "256" {
divyadesaibbed37c2020-08-28 13:35:20 +05301344 forthLevelMap := map[string]interface{}(thirdLevelMap["Attributes"].(me.AttributeValueMap))
1345 delete(forthLevelMap, "SerialNumber")
1346 forthLevelMap["SerialNumber"] = "%SERIAL_NUMBER%"
1347
1348 }
Himani Chawla26e555c2020-08-31 12:30:20 +05301349 if classID == "134" {
divyadesaibbed37c2020-08-28 13:35:20 +05301350 forthLevelMap := map[string]interface{}(thirdLevelMap["Attributes"].(me.AttributeValueMap))
1351 delete(forthLevelMap, "MacAddress")
1352 forthLevelMap["MacAddress"] = "%MAC_ADDRESS%"
1353 }
1354 }
Himani Chawla26e555c2020-08-31 12:30:20 +05301355 templateMap[classID] = secondLevelMap
divyadesaibbed37c2020-08-28 13:35:20 +05301356 }
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301357 unknownMeAndAttribMap := oo.pOnuDB.CommonMeDb.UnknownMeAndAttribDb
Holger Hildebrandt39080022022-03-16 10:03:17 +00001358 for unknownMeAndAttribMapKey := range unknownMeAndAttribMap {
1359 templateMap[string(unknownMeAndAttribMapKey)] = unknownMeAndAttribMap[unknownMeAndAttribMapKey]
Holger Hildebrandtf3c7a182021-11-17 13:42:08 +00001360 }
divyadesaibbed37c2020-08-28 13:35:20 +05301361 mibTemplate, err := json.Marshal(&templateMap)
1362 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001363 logger.Errorw(ctx, "MibSync - MibTemplate - Failed to marshal mibTemplate", log.Fields{"error": err, "device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001364 oo.pOpenOnuAc.SetMibTemplatesGenerated(oo.mibTemplatePath, false)
divyadesaibbed37c2020-08-28 13:35:20 +05301365 return err
1366 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001367 err = oo.mibTemplateKVStore.Put(log.WithSpanFromContext(context.TODO(), ctx), oo.mibTemplatePath, string(mibTemplate))
divyadesaibbed37c2020-08-28 13:35:20 +05301368 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001369 logger.Errorw(ctx, "MibSync - MibTemplate - Failed to store template in etcd", log.Fields{"error": err, "device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001370 oo.pOpenOnuAc.SetMibTemplatesGenerated(oo.mibTemplatePath, false)
divyadesaibbed37c2020-08-28 13:35:20 +05301371 return err
1372 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001373 logger.Debugw(ctx, "MibSync - MibTemplate - Stored the template to etcd", log.Fields{"device-id": oo.deviceID})
divyadesaibbed37c2020-08-28 13:35:20 +05301374 return nil
1375}
1376
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00001377func (oo *OnuDeviceEntry) requestMdsValue(ctx context.Context) {
1378 logger.Debugw(ctx, "Request MDS value", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001379 requestedAttributes := me.AttributeValueMap{me.OnuData_MibDataSync: ""}
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001380 meInstance, err := oo.PDevOmciCC.SendGetMe(log.WithSpanFromContext(context.TODO(), ctx),
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001381 me.OnuDataClassID, cmn.OnuDataMeID, requestedAttributes, oo.baseDeviceHandler.GetOmciTimeout(), true,
1382 oo.PMibUploadFsm.CommChan, oo.GetPersIsExtOmciSupported())
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00001383 //accept also nil as (error) return value for writing to LastTx
1384 // - this avoids misinterpretation of new received OMCI messages
ozgecanetsiab36ed572021-04-01 10:38:48 +03001385 if err != nil {
1386 logger.Errorw(ctx, "ONUData get failed, aborting MibSync FSM!", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001387 pMibUlFsm := oo.PMibUploadFsm
ozgecanetsiab36ed572021-04-01 10:38:48 +03001388 if pMibUlFsm != nil {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +05301389 //nolint:unparam
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001390 go func(a_pAFsm *cmn.AdapterFsm) {
1391 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
ozgecanetsiab36ed572021-04-01 10:38:48 +03001392 }(pMibUlFsm)
1393 }
1394 return
1395 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001396 oo.mutexLastTxParamStruct.Lock()
mpagenko01499812021-03-25 10:37:12 +00001397 oo.lastTxParamStruct.lastTxMessageType = omci.GetRequestType
1398 oo.lastTxParamStruct.pLastTxMeInstance = meInstance
1399 oo.lastTxParamStruct.repeatCount = 0
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001400 oo.mutexLastTxParamStruct.Unlock()
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00001401}
1402
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001403func (oo *OnuDeviceEntry) checkMdsValue(ctx context.Context, mibDataSyncOnu uint8) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001404 oo.MutexPersOnuConfig.RLock()
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001405 logger.Debugw(ctx, "MibSync FSM - GetResponse Data for Onu-Data - MibDataSync", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001406 "mibDataSyncOnu": mibDataSyncOnu, "PersMibDataSyncAdpt": oo.SOnuPersistentData.PersMibDataSyncAdpt})
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001407
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001408 mdsValuesAreEqual := oo.SOnuPersistentData.PersMibDataSyncAdpt == mibDataSyncOnu
1409 oo.MutexPersOnuConfig.RUnlock()
1410 if oo.PMibUploadFsm.PFsm.Is(UlStAuditing) {
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001411 if mdsValuesAreEqual {
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001412 logger.Debugw(ctx, "MibSync FSM - mib audit - MDS check ok", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001413 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001414 } else {
1415 logger.Warnw(ctx, "MibSync FSM - mib audit - MDS check failed for the first time!", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001416 _ = oo.PMibUploadFsm.PFsm.Event(UlEvMismatch)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001417 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001418 } else if oo.PMibUploadFsm.PFsm.Is(UlStReAuditing) {
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001419 if mdsValuesAreEqual {
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001420 logger.Debugw(ctx, "MibSync FSM - mib reaudit - MDS check ok", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001421 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001422 } else {
Holger Hildebrandt80f57762022-02-16 10:03:24 +00001423 logger.Errorw(ctx, "MibSync FSM - mib reaudit - MDS check failed for the second time - send ONU device event and reconcile!",
Holger Hildebrandtc56febd2022-02-09 13:23:30 +00001424 log.Fields{"device-id": oo.deviceID})
1425 oo.SendOnuDeviceEvent(ctx, cmn.OnuMibAuditFailureMds, cmn.OnuMibAuditFailureMdsDesc)
Holger Hildebrandt80f57762022-02-16 10:03:24 +00001426 // To reconcile ONU with active adapter later on, we have to retrieve TP instances from parent adapter.
1427 // In the present use case inconsistencies between TP pathes stored in kv store and TP instances retrieved
1428 // should not occur. Nevertheless, the respective code is inserted to catch the unlikely case.
1429 if !oo.getAllStoredTpInstFromParentAdapter(ctx) {
1430 logger.Debugw(ctx, "MibSync FSM - mib reaudit - inconsistencies between TP pathes stored in kv and parent adapter instances",
1431 log.Fields{"device-id": oo.deviceID})
1432 oo.baseDeviceHandler.SetReconcilingReasonUpdate(true)
1433 go func() {
1434 if err := oo.baseDeviceHandler.StorePersistentData(ctx); err != nil {
1435 logger.Warnw(ctx,
1436 "MibSync FSM - mib reaudit - store persistent data error - continue for now as there will be additional write attempts",
1437 log.Fields{"device-id": oo.deviceID, "err": err})
1438 }
1439 }()
1440 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001441 _ = oo.PMibUploadFsm.PFsm.Event(UlEvMismatch)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001442 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001443 } else if oo.PMibUploadFsm.PFsm.Is(UlStExaminingMds) {
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001444 if mdsValuesAreEqual && mibDataSyncOnu != 0 {
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001445 logger.Debugw(ctx, "MibSync FSM - MDS examination ok", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001446 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001447 } else {
1448 logger.Debugw(ctx, "MibSync FSM - MDS examination failed - new provisioning", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001449 _ = oo.PMibUploadFsm.PFsm.Event(UlEvMismatch)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001450 }
1451 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001452 logger.Warnw(ctx, "wrong state for MDS evaluation!", log.Fields{"state": oo.PMibUploadFsm.PFsm.Current(), "device-id": oo.deviceID})
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001453 }
1454}
mpagenko15ff4a52021-03-02 10:09:20 +00001455
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05301456// GetActiveImageMeID returns the Omci MeId of the active ONU image together with error code for validity
mpagenko15ff4a52021-03-02 10:09:20 +00001457func (oo *OnuDeviceEntry) GetActiveImageMeID(ctx context.Context) (uint16, error) {
Holger Hildebrandt05011352021-06-15 09:40:24 +00001458 oo.mutexOnuSwImageIndications.RLock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001459 if oo.onuSwImageIndications.ActiveEntityEntry.Valid {
1460 value := oo.onuSwImageIndications.ActiveEntityEntry.EntityID
Holger Hildebrandt05011352021-06-15 09:40:24 +00001461 oo.mutexOnuSwImageIndications.RUnlock()
1462 return value, nil
mpagenko15ff4a52021-03-02 10:09:20 +00001463 }
Holger Hildebrandt05011352021-06-15 09:40:24 +00001464 oo.mutexOnuSwImageIndications.RUnlock()
mpagenko15ff4a52021-03-02 10:09:20 +00001465 return 0xFFFF, fmt.Errorf("no valid active image found: %s", oo.deviceID)
1466}
1467
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05301468// GetInactiveImageMeID returns the Omci MeId of the inactive ONU image together with error code for validity
mpagenko15ff4a52021-03-02 10:09:20 +00001469func (oo *OnuDeviceEntry) GetInactiveImageMeID(ctx context.Context) (uint16, error) {
Holger Hildebrandt05011352021-06-15 09:40:24 +00001470 oo.mutexOnuSwImageIndications.RLock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001471 if oo.onuSwImageIndications.InActiveEntityEntry.Valid {
1472 value := oo.onuSwImageIndications.InActiveEntityEntry.EntityID
Holger Hildebrandt05011352021-06-15 09:40:24 +00001473 oo.mutexOnuSwImageIndications.RUnlock()
1474 return value, nil
mpagenko15ff4a52021-03-02 10:09:20 +00001475 }
Holger Hildebrandt05011352021-06-15 09:40:24 +00001476 oo.mutexOnuSwImageIndications.RUnlock()
mpagenko15ff4a52021-03-02 10:09:20 +00001477 return 0xFFFF, fmt.Errorf("no valid inactive image found: %s", oo.deviceID)
1478}
1479
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05301480// IsImageToBeCommitted returns true if the active image is still uncommitted
mpagenko15ff4a52021-03-02 10:09:20 +00001481func (oo *OnuDeviceEntry) IsImageToBeCommitted(ctx context.Context, aImageID uint16) bool {
Holger Hildebrandt05011352021-06-15 09:40:24 +00001482 oo.mutexOnuSwImageIndications.RLock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001483 if oo.onuSwImageIndications.ActiveEntityEntry.Valid {
1484 if oo.onuSwImageIndications.ActiveEntityEntry.EntityID == aImageID {
1485 if oo.onuSwImageIndications.ActiveEntityEntry.IsCommitted == cmn.SwIsUncommitted {
Holger Hildebrandt05011352021-06-15 09:40:24 +00001486 oo.mutexOnuSwImageIndications.RUnlock()
mpagenko15ff4a52021-03-02 10:09:20 +00001487 return true
1488 }
1489 }
1490 }
Holger Hildebrandt05011352021-06-15 09:40:24 +00001491 oo.mutexOnuSwImageIndications.RUnlock()
mpagenko15ff4a52021-03-02 10:09:20 +00001492 return false //all other case are treated as 'nothing to commit
1493}
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001494func (oo *OnuDeviceEntry) getMibFromTemplate(ctx context.Context) bool {
1495
1496 oo.mibTemplatePath = oo.buildMibTemplatePath()
Holger Hildebrandtbdc5f002021-04-19 14:46:21 +00001497 logger.Debugw(ctx, "MibSync FSM - get Mib from template", log.Fields{"path": fmt.Sprintf("%s/%s", cBasePathMibTemplateKvStore, oo.mibTemplatePath),
1498 "device-id": oo.deviceID})
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001499
1500 restoredFromMibTemplate := false
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301501 oo.pOpenOnuAc.LockMutexMibTemplateGenerated()
1502 defer oo.pOpenOnuAc.UnlockMutexMibTemplateGenerated()
1503 if meDbValue, ok := oo.pOpenOnuAc.FetchEntryFromMibDatabaseMap(ctx, oo.mibTemplatePath); ok {
1504 logger.Infow(ctx, "Found MIB common DB Instance , copy and use", log.Fields{"path": oo.mibTemplatePath, "device-id": oo.deviceID})
1505 oo.pOnuDB.CommonMeDb = meDbValue
1506 oo.updateOnuSpecificEntries(ctx)
1507 restoredFromMibTemplate = true
1508 } else {
1509 //Create a common ME MIB Instance as it doesn't prior exists.
1510 Value, err := oo.mibTemplateKVStore.Get(log.WithSpanFromContext(context.TODO(), ctx), oo.mibTemplatePath)
1511 //Unmarshal the MIB template and create the entry in the ONU Common Device DB
1512 if err == nil {
1513 if Value != nil {
1514 oo.processMibTemplate(ctx, Value)
1515 restoredFromMibTemplate = true
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001516 } else {
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301517 logger.Infow(ctx, "No MIB template found", log.Fields{"path": oo.mibTemplatePath, "device-id": oo.deviceID})
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001518 }
1519 } else {
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301520 logger.Errorw(ctx, "Get from kvstore operation failed for path",
1521 log.Fields{"path": oo.mibTemplatePath, "device-id": oo.deviceID})
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001522 }
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301523
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001524 }
1525 return restoredFromMibTemplate
1526}
Holger Hildebrandtb4563ab2021-04-14 10:27:20 +00001527
Holger Hildebrandt80f57762022-02-16 10:03:24 +00001528func (oo *OnuDeviceEntry) getAllStoredTpInstFromParentAdapter(ctx context.Context) bool {
1529
1530 allTpInstPresent := true
1531 oo.MutexPersOnuConfig.Lock()
1532 oo.MutexReconciledTpInstances.Lock()
1533 for indexUni, uniData := range oo.SOnuPersistentData.PersUniConfig {
1534 uniID := uniData.PersUniID
1535 oo.ReconciledTpInstances[uniID] = make(map[uint8]inter_adapter.TechProfileDownloadMessage)
1536 for tpID, tpPath := range uniData.PersTpPathMap {
1537 if tpPath != "" {
mgoudaa797e1c2025-06-24 17:49:42 +05301538 logger.Infow(ctx, "Starting retrieval for TechProfileInstance", log.Fields{
1539 "uniID": uniID, "tpID": tpID, "tpPath": tpPath, "device-id": oo.deviceID,
1540 })
1541 // Attempt the initial call before entering the retry loop
Holger Hildebrandt80f57762022-02-16 10:03:24 +00001542 iaTechTpInst, err := oo.baseDeviceHandler.GetTechProfileInstanceFromParentAdapter(ctx, uniID, tpPath)
mgoudaa797e1c2025-06-24 17:49:42 +05301543 if err != nil {
1544 var ticker *time.Ticker
1545
1546 // Log the initial failure and proceed to the retry mechanism
1547 logger.Warnw(ctx, "Initial TechProfileInstance API call failed, entering retry mechanism", log.Fields{
1548 "tp-id": tpID, "tpPath": tpPath, "uni-id": uniID, "device-id": oo.deviceID, "err": err,
1549 })
1550 // Retry logic
1551 /*
1552 We are retrying here because the OLT adapter may not have been up and reachable
1553 at the time of the initial attempt. This prevents the ONU adapter from fetching
1554 the TechProfile.
1555
1556 This issue might occur when both the ONU and OLT adapters are restarted simultaneously,
1557 causing a temporary mismatch in their availability. The retry logic ensures that
1558 the ONU adapter periodically attempts to fetch the TechProfile, allowing time for the
1559 OLT adapter to come up and become operational,and once the OLT adaptor is up with this retry attempts we can fetch the tech profile.This helps prevent the reconciliation
1560 process from failing prematurely due to transient unavailability of the OLT adapter.
1561 */
1562
1563 for tpRetryAttempt := initialRetryAttempt; tpRetryAttempt <= maxRetries; tpRetryAttempt++ {
1564 ticker = time.NewTicker(retryDelay)
1565 select {
1566 case _, ok := <-oo.baseDeviceHandler.GetDeviceDeleteCommChan(ctx):
1567 if !ok {
1568 logger.Warnw(ctx, "Device deletion channel closed - aborting retry", log.Fields{"device-id": oo.deviceID})
1569 ticker.Stop()
1570 return false
1571 }
1572 case <-ticker.C:
1573 iaTechTpInst, err = oo.baseDeviceHandler.GetTechProfileInstanceFromParentAdapter(ctx, uniID, tpPath)
1574 if err != nil {
1575 logger.Warnw(ctx, "TechProfileInstance API will be retried", log.Fields{
1576 "tp-id": tpID, "tpPath": tpPath, "uni-id": uniID,
1577 "device-id": oo.deviceID, "err": err, "retry": tpRetryAttempt,
1578 "totalRetries": maxRetries,
1579 })
1580 continue
1581 }
1582
1583 logger.Info(ctx, "Successfully retrieved TechProfileInstance after retry", log.Fields{
1584 "retry": tpRetryAttempt, "device-id": oo.deviceID,
1585 })
1586 }
1587 if err == nil {
1588 break // Exit the retry loop upon success
1589 }
1590
1591 }
1592 }
Holger Hildebrandt80f57762022-02-16 10:03:24 +00001593 if err == nil && iaTechTpInst != nil {
1594 logger.Debugw(ctx, "reconciling - store Tp instance", log.Fields{"uniID": uniID, "tpID": tpID,
1595 "*iaTechTpInst": iaTechTpInst, "device-id": oo.deviceID})
1596 oo.ReconciledTpInstances[uniID][tpID] = *iaTechTpInst
1597 } else {
1598 // During the absence of the ONU adapter there seem to have been TP specific configurations!
1599 // The no longer available TP and the associated flows must be deleted from the ONU KV store
1600 // and after a MIB reset a new reconciling attempt with OMCI configuration must be started.
1601 allTpInstPresent = false
1602 logger.Infow(ctx, "reconciling - can't get tp instance - delete tp and associated flows",
1603 log.Fields{"tp-id": tpID, "tpPath": tpPath, "uni-id": uniID, "device-id": oo.deviceID, "err": err})
1604 delete(oo.SOnuPersistentData.PersUniConfig[indexUni].PersTpPathMap, tpID)
1605 flowSlice := oo.SOnuPersistentData.PersUniConfig[indexUni].PersFlowParams
1606 for indexFlow, flowData := range flowSlice {
1607 if flowData.VlanRuleParams.TpID == tpID {
1608 if len(flowSlice) == 1 {
1609 flowSlice = []cmn.UniVlanFlowParams{}
1610 } else {
1611 flowSlice = append(flowSlice[:indexFlow], flowSlice[indexFlow+1:]...)
1612 }
1613 oo.SOnuPersistentData.PersUniConfig[indexUni].PersFlowParams = flowSlice
1614 }
1615 }
1616 }
1617 }
1618 }
1619 }
1620 oo.MutexReconciledTpInstances.Unlock()
1621 oo.MutexPersOnuConfig.Unlock()
1622 return allTpInstPresent
1623}
1624
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05301625// CancelProcessing terminates potentially running reconciling processes and stops the FSM
Holger Hildebrandtb4563ab2021-04-14 10:27:20 +00001626func (oo *OnuDeviceEntry) CancelProcessing(ctx context.Context) {
Holger Hildebrandt12609a12022-03-25 13:23:25 +00001627 logger.Debugw(ctx, "CancelProcessing entered", log.Fields{"device-id": oo.deviceID})
mpagenko101ac942021-11-16 15:01:29 +00001628 if oo.isReconcilingFlows() {
Holger Hildebrandtf2fcdd42021-12-15 11:42:19 +00001629 oo.SendChReconcilingFlowsFinished(ctx, false)
Holger Hildebrandtb4563ab2021-04-14 10:27:20 +00001630 }
1631 //the MibSync FSM might be active all the ONU-active time,
1632 // hence it must be stopped unconditionally
Girish Gowdra37c9d912022-02-08 16:24:57 -08001633 oo.mutexMibSyncMsgProcessorRunning.RLock()
1634 defer oo.mutexMibSyncMsgProcessorRunning.RUnlock()
1635 if oo.mibSyncMsgProcessorRunning {
1636 pMibUlFsm := oo.PMibUploadFsm
1637 if pMibUlFsm != nil {
1638 // abort running message processing
1639 fsmAbortMsg := cmn.Message{
1640 Type: cmn.TestMsg,
1641 Data: cmn.TestMessage{
1642 TestMessageVal: cmn.AbortMessageProcessing,
1643 },
1644 }
1645 pMibUlFsm.CommChan <- fsmAbortMsg
1646 _ = pMibUlFsm.PFsm.Event(UlEvStop)
Holger Hildebrandte7cc6092022-02-01 11:37:03 +00001647 }
Holger Hildebrandtb4563ab2021-04-14 10:27:20 +00001648 }
1649}
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301650
1651// Updates Serial Number and MAC Address in the database
1652func (oo *OnuDeviceEntry) updateOnuSpecificEntries(ctx context.Context) {
1653 knownAttributeMEDb := oo.pOnuDB.CommonMeDb.MeDb
1654
1655 for firstLevelKey, firstLevelValue := range knownAttributeMEDb {
1656 classID := strconv.Itoa(int(firstLevelKey))
1657
1658 for secondLevelKey, secondLevelValue := range firstLevelValue {
1659 switch classID {
1660 case "6", "256":
1661 oo.updateAttribute(ctx, "SerialNumber", secondLevelValue, firstLevelKey, secondLevelKey, oo.SOnuPersistentData.PersSerialNumber)
1662 case "134":
1663 oo.updateAttribute(ctx, "MacAddress", secondLevelValue, firstLevelKey, secondLevelKey, oo.SOnuPersistentData.PersMacAddress)
1664 }
1665 }
1666 }
1667}
1668
1669// Updates a specific attribute in the MIB database
1670func (oo *OnuDeviceEntry) updateAttribute(ctx context.Context, attributeName string, attributesMap me.AttributeValueMap, classID me.ClassID, entityID uint16, newValue interface{}) {
1671 if _, exists := attributesMap[attributeName]; exists {
1672 logger.Infow(ctx, "Updating "+attributeName, log.Fields{"classID": strconv.Itoa(int(classID)), "oldValue": attributesMap[attributeName], "newValue": newValue})
1673 attributeCopy := make(me.AttributeValueMap)
1674 for k, v := range attributesMap {
1675 attributeCopy[k] = v
1676 }
1677 attributeCopy[attributeName] = newValue
1678 oo.pOnuDB.PutOnuSpeficMe(ctx, classID, entityID, attributeCopy)
1679 } else {
1680 logger.Warnw(ctx, attributeName+" key not found", log.Fields{"classID": strconv.Itoa(int(classID))})
1681 }
1682}
1683
1684// Processes the MIB template by replacing tokens and unmarshaling it
1685func (oo *OnuDeviceEntry) processMibTemplate(ctx context.Context, value *kvstore.KVPair) {
1686 mibTmpString, _ := kvstore.ToString(value.Value)
1687 mibTmpString2 := strings.ReplaceAll(mibTmpString, "\x00", "")
1688 mibTmpBytes := []byte(mibTmpString2)
1689
1690 logger.Debugf(ctx, "MibSync FSM - Mib template tokens swapped out: %s", mibTmpBytes)
1691
1692 var firstLevelMap map[string]interface{}
1693 if err := json.Unmarshal(mibTmpBytes, &firstLevelMap); err != nil {
1694 logger.Errorw(ctx, "MibSync FSM - Failed to unmarshal template", log.Fields{"error": err, "device-id": oo.deviceID})
1695 return
1696 }
1697
1698 cmnMEDbValue, _ := oo.pOpenOnuAc.CreateEntryAtMibDatabaseMap(ctx, oo.mibTemplatePath)
1699 oo.populateMibDatabase(ctx, cmnMEDbValue, firstLevelMap)
1700 cmnMEDbValue.MIBUploadStatus = devdb.Completed
1701 oo.pOnuDB.CommonMeDb = cmnMEDbValue
1702}
1703
1704// Populates the MIB database with parsed data
1705func (oo *OnuDeviceEntry) populateMibDatabase(ctx context.Context, cmnMEDbValue *devdb.OnuCmnMEDB, firstLevelMap map[string]interface{}) {
1706 cmnMEDbValue.MeDbLock.Lock()
1707 defer cmnMEDbValue.MeDbLock.Unlock()
1708
1709 logger.Infow(ctx, "Populating MIbDatabase with the template information ", log.Fields{"device-id": oo.deviceID})
1710 for firstLevelKey, firstLevelValue := range firstLevelMap {
1711 if uint16ValidNumber, err := strconv.ParseUint(firstLevelKey, 10, 16); err == nil {
1712 meClassID := me.ClassID(uint16ValidNumber)
1713 if isSupportedClassID(meClassID) {
1714 secondLevelMap := firstLevelValue.(map[string]interface{})
1715 for secondLevelKey, secondLevelValue := range secondLevelMap {
1716 if uint16ValidNumber, err := strconv.ParseUint(secondLevelKey, 10, 16); err == nil {
1717 meEntityID := uint16(uint16ValidNumber)
1718 thirdLevelMap := secondLevelValue.(map[string]interface{})
1719 if attributes, exists := thirdLevelMap["Attributes"].(map[string]interface{}); exists {
1720 if _, found := cmnMEDbValue.MeDb[meClassID]; !found {
1721 cmnMEDbValue.MeDb[meClassID] = make(map[uint16]me.AttributeValueMap)
1722 }
1723 if _, found := cmnMEDbValue.MeDb[meClassID][meEntityID]; !found {
1724 cmnMEDbValue.MeDb[meClassID][meEntityID] = make(me.AttributeValueMap)
1725 }
1726 for attrKey, attrValue := range attributes {
1727 cmnMEDbValue.MeDb[meClassID][meEntityID][attrKey] = attrValue
1728 }
1729 }
1730
1731 }
1732 }
1733 }
1734 }
1735 }
1736}