blob: 9efc65d96c854158e5fd5e919e86c2e234c997c3 [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
Sridhar Ravindraa9cb0442025-07-21 16:55:05 +0530508 // During reboot, if the adapter restarted while configuring TP or flows, we need to continue with flow configurations now.
509 // Set the mibUpload FSM as success and proceed with flow configs
510 oo.MutexPersOnuConfig.RLock()
511 if oo.SOnuPersistentData.PersRebootInProgress {
512 oo.MutexPersOnuConfig.RUnlock()
513 logger.Debugw(ctx, "Set mib upload as success before proceeding with flow configuration", log.Fields{"device-id": oo.deviceID})
514 go func() {
515 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
516 if oo.baseDeviceHandler.CheckForDeviceTechProf(ctx) {
517 oo.baseDeviceHandler.DeviceFlowConfigOnReboot(ctx)
Holger Hildebrandtb314f442021-11-24 12:03:10 +0000518 }
Sridhar Ravindraa9cb0442025-07-21 16:55:05 +0530519 }()
520 } else {
521 oo.MutexPersOnuConfig.RUnlock()
522 if oo.baseDeviceHandler.ReconcileDeviceTechProf(ctx) {
523 // start go routine with select() on reconciling flow channel before
524 // starting flow reconciling process to prevent loss of any signal
525 syncChannel := make(chan struct{})
526 go func(aSyncChannel chan struct{}) {
527 // In multi-ONU/multi-flow environment stopping reconcilement has to be delayed until
528 // we get a signal that the processing of the last step to rebuild the adapter internal
529 // flow data is finished.
530 expiry := oo.baseDeviceHandler.GetReconcileExpiryVlanConfigAbort()
531 oo.setReconcilingFlows(true)
532 aSyncChannel <- struct{}{}
533 select {
534 case success := <-oo.chReconcilingFlowsFinished:
535 if success {
536 logger.Debugw(ctx, "reconciling flows has been finished in time",
537 log.Fields{"device-id": oo.deviceID})
538 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
539
540 } else {
541 logger.Debugw(ctx, "wait for reconciling flows aborted",
542 log.Fields{"device-id": oo.deviceID})
543 }
544 case <-time.After(expiry):
545 logger.Errorw(ctx, "timeout waiting for reconciling flows to be finished!",
546 log.Fields{"device-id": oo.deviceID, "expiry": expiry})
547 _ = oo.PMibUploadFsm.PFsm.Event(UlEvMismatch)
548 }
549 oo.setReconcilingFlows(false)
550 }(syncChannel)
551 // block further processing until the above Go routine has really started
552 // and is ready to receive values from chReconcilingFlowsFinished
553 <-syncChannel
554 oo.baseDeviceHandler.ReconcileDeviceFlowConfig(ctx)
555 }
Holger Hildebrandtb314f442021-11-24 12:03:10 +0000556 }
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000557 } else {
558 logger.Debugw(ctx, "MibSync FSM",
559 log.Fields{"Getting MIB from template not successful": e.FSM.Current(), "device-id": oo.deviceID})
560 go func() {
561 //switch to reconciling with OMCI config
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000562 _ = oo.PMibUploadFsm.PFsm.Event(UlEvMismatch)
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000563 }()
564 }
565}
566
dbainbri4d3a0dc2020-12-02 00:33:42 +0000567func (oo *OnuDeviceEntry) enterAuditingState(ctx context.Context, e *fsm.Event) {
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000568 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 +0000569 if oo.baseDeviceHandler.CheckAuditStartCondition(ctx, cmn.CUploadFsm) {
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000570 oo.requestMdsValue(ctx)
571 } else {
mpagenkof1fc3862021-02-16 10:09:52 +0000572 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 +0000573 go func() {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000574 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000575 }()
576 }
577}
578
579func (oo *OnuDeviceEntry) enterReAuditingState(ctx context.Context, e *fsm.Event) {
580 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 +0000581 if oo.baseDeviceHandler.CheckAuditStartCondition(ctx, cmn.CUploadFsm) {
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000582 oo.requestMdsValue(ctx)
583 } else {
mpagenkof1fc3862021-02-16 10:09:52 +0000584 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 +0000585 go func() {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000586 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000587 }()
588 }
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000589}
590
dbainbri4d3a0dc2020-12-02 00:33:42 +0000591func (oo *OnuDeviceEntry) enterOutOfSyncState(ctx context.Context, e *fsm.Event) {
592 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start MibReconcile processing in State": e.FSM.Current(), "device-id": oo.deviceID})
593 logger.Debug(ctx, "function not implemented yet")
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000594}
595
dbainbri4d3a0dc2020-12-02 00:33:42 +0000596func (oo *OnuDeviceEntry) processMibSyncMessages(ctx context.Context) {
597 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 -0800598 oo.mutexMibSyncMsgProcessorRunning.Lock()
599 oo.mibSyncMsgProcessorRunning = true
600 oo.mutexMibSyncMsgProcessorRunning.Unlock()
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000601loop:
602 for {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000603 // case <-ctx.Done():
604 // logger.Info("MibSync Msg", log.Fields{"Message handling canceled via context for device-id": onuDeviceEntry.deviceID})
605 // break loop
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000606 message, ok := <-oo.PMibUploadFsm.CommChan
Himani Chawla4d908332020-08-31 12:30:20 +0530607 if !ok {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000608 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 -0800609 oo.mutexMibSyncMsgProcessorRunning.Lock()
610 oo.mibSyncMsgProcessorRunning = false
611 oo.mutexMibSyncMsgProcessorRunning.Unlock()
Himani Chawla4d908332020-08-31 12:30:20 +0530612 break loop
613 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000614 logger.Debugw(ctx, "MibSync Msg", log.Fields{"Received message on ONU MibSyncChan for device-id": oo.deviceID})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000615
Himani Chawla4d908332020-08-31 12:30:20 +0530616 switch message.Type {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000617 case cmn.TestMsg:
618 msg, _ := message.Data.(cmn.TestMessage)
Holger Hildebrandte7cc6092022-02-01 11:37:03 +0000619 if msg.TestMessageVal == cmn.AbortMessageProcessing {
620 logger.Debugw(ctx, "MibSync Msg abort ProcessMsg", log.Fields{"for device-id": oo.deviceID})
Girish Gowdra37c9d912022-02-08 16:24:57 -0800621 oo.mutexMibSyncMsgProcessorRunning.Lock()
622 oo.mibSyncMsgProcessorRunning = false
623 oo.mutexMibSyncMsgProcessorRunning.Unlock()
Holger Hildebrandte7cc6092022-02-01 11:37:03 +0000624 break loop
625 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000626 oo.handleTestMsg(ctx, msg)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000627 case cmn.OMCI:
628 msg, _ := message.Data.(cmn.OmciMessage)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000629 oo.handleOmciMessage(ctx, msg)
Himani Chawla4d908332020-08-31 12:30:20 +0530630 default:
dbainbri4d3a0dc2020-12-02 00:33:42 +0000631 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 +0000632 }
633 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000634 logger.Info(ctx, "MibSync Msg", log.Fields{"Stopped handling of MibSyncChan for device-id": oo.deviceID})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000635 // TODO: only this action?
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000636 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000637}
638
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000639func (oo *OnuDeviceEntry) handleTestMsg(ctx context.Context, msg cmn.TestMessage) {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000640
dbainbri4d3a0dc2020-12-02 00:33:42 +0000641 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 +0000642
643 switch msg.TestMessageVal {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000644 case cmn.LoadMibTemplateFailed:
645 _ = oo.PMibUploadFsm.PFsm.Event(UlEvUploadMib)
646 logger.Debugw(ctx, "MibSync Msg", log.Fields{"state": string(oo.PMibUploadFsm.PFsm.Current())})
647 case cmn.LoadMibTemplateOk:
648 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
649 logger.Debugw(ctx, "MibSync Msg", log.Fields{"state": string(oo.PMibUploadFsm.PFsm.Current())})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000650 default:
dbainbri4d3a0dc2020-12-02 00:33:42 +0000651 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 +0000652 }
653}
654
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000655func (oo *OnuDeviceEntry) handleOmciMibResetResponseMessage(ctx context.Context, msg cmn.OmciMessage) {
656 if oo.PMibUploadFsm.PFsm.Is(UlStResettingMib) {
Himani Chawla4d908332020-08-31 12:30:20 +0530657 msgLayer := (*msg.OmciPacket).Layer(omci.LayerTypeMibResetResponse)
658 if msgLayer != nil {
659 msgObj, msgOk := msgLayer.(*omci.MibResetResponse)
660 if msgOk {
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530661 logger.Infow(ctx, "MibResetResponse Data", log.Fields{"data-fields": msgObj})
Himani Chawla4d908332020-08-31 12:30:20 +0530662 if msgObj.Result == me.Success {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000663 oo.MutexPersOnuConfig.Lock()
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000664 oo.SOnuPersistentData.PersMibDataSyncAdpt = cmn.MdsDefaultMib
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000665 oo.MutexPersOnuConfig.Unlock()
Holger Hildebrandt7e138462023-03-29 12:12:14 +0000666 oo.PDevOmciCC.ResetConfFailMEs()
Himani Chawla4d908332020-08-31 12:30:20 +0530667 // trigger retrieval of VendorId and SerialNumber
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000668 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetVendorAndSerial)
Himani Chawla4d908332020-08-31 12:30:20 +0530669 return
670 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000671 logger.Errorw(ctx, "Omci MibResetResponse Error", log.Fields{"device-id": oo.deviceID, "Error": msgObj.Result})
Himani Chawla4d908332020-08-31 12:30:20 +0530672 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000673 logger.Errorw(ctx, "Omci Msg layer could not be assigned", log.Fields{"device-id": oo.deviceID})
Himani Chawla4d908332020-08-31 12:30:20 +0530674 }
675 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000676 logger.Errorw(ctx, "Omci Msg layer could not be detected", log.Fields{"device-id": oo.deviceID})
Himani Chawla4d908332020-08-31 12:30:20 +0530677 }
678 } else {
mpagenko01499812021-03-25 10:37:12 +0000679 //in case the last request was MdsGetRequest this issue may appear if the ONU was online before and has received the MIB reset
680 // with Sequence number 0x8000 as last request before - so it may still respond to that
681 // 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 +0000682 oo.mutexLastTxParamStruct.Lock()
mpagenko01499812021-03-25 10:37:12 +0000683 if oo.lastTxParamStruct.lastTxMessageType == omci.GetRequestType && oo.lastTxParamStruct.repeatCount == 0 {
684 logger.Debugw(ctx, "MibSync FSM - repeat MdsGetRequest (updated SequenceNumber)", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +0000685 requestedAttributes := me.AttributeValueMap{me.OnuData_MibDataSync: ""}
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000686 _, err := oo.PDevOmciCC.SendGetMe(log.WithSpanFromContext(context.TODO(), ctx),
Holger Hildebrandtd930cb22022-06-17 09:24:50 +0000687 me.OnuDataClassID, cmn.OnuDataMeID, requestedAttributes, oo.baseDeviceHandler.GetOmciTimeout(), true, oo.PMibUploadFsm.CommChan, false)
ozgecanetsiab36ed572021-04-01 10:38:48 +0300688 if err != nil {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000689 oo.mutexLastTxParamStruct.Unlock()
ozgecanetsiab36ed572021-04-01 10:38:48 +0300690 logger.Errorw(ctx, "ONUData get failed, aborting MibSync", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000691 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
ozgecanetsiab36ed572021-04-01 10:38:48 +0300692 return
693 }
mpagenko01499812021-03-25 10:37:12 +0000694 //TODO: needs extra handling of timeouts
695 oo.lastTxParamStruct.repeatCount = 1
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000696 oo.mutexLastTxParamStruct.Unlock()
mpagenko01499812021-03-25 10:37:12 +0000697 return
698 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000699 oo.mutexLastTxParamStruct.Unlock()
mpagenko01499812021-03-25 10:37:12 +0000700 logger.Errorw(ctx, "unexpected MibResetResponse - ignoring", log.Fields{"device-id": oo.deviceID})
701 //perhaps some still lingering message from some prior activity, let's wait for the real response
702 return
Himani Chawla4d908332020-08-31 12:30:20 +0530703 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000704 logger.Info(ctx, "MibSync Msg", log.Fields{"Stopped handling of MibSyncChan for device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000705 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Himani Chawla4d908332020-08-31 12:30:20 +0530706}
707
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000708func (oo *OnuDeviceEntry) handleOmciMibUploadResponseMessage(ctx context.Context, msg cmn.OmciMessage) {
Himani Chawla4d908332020-08-31 12:30:20 +0530709 msgLayer := (*msg.OmciPacket).Layer(omci.LayerTypeMibUploadResponse)
710 if msgLayer == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000711 logger.Errorw(ctx, "Omci Msg layer could not be detected", log.Fields{"device-id": oo.deviceID})
Himani Chawla4d908332020-08-31 12:30:20 +0530712 return
713 }
714 msgObj, msgOk := msgLayer.(*omci.MibUploadResponse)
715 if !msgOk {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000716 logger.Errorw(ctx, "Omci Msg layer could not be assigned", log.Fields{"device-id": oo.deviceID})
Himani Chawla4d908332020-08-31 12:30:20 +0530717 return
718 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000719 logger.Debugw(ctx, "MibUploadResponse Data for:", log.Fields{"device-id": oo.deviceID, "data-fields": msgObj})
Himani Chawla4d908332020-08-31 12:30:20 +0530720 /* to be verified / reworked !!! */
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000721 oo.PDevOmciCC.UploadNoOfCmds = msgObj.NumberOfCommands
722 if oo.PDevOmciCC.UploadSequNo < oo.PDevOmciCC.UploadNoOfCmds {
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000723 _ = oo.PDevOmciCC.SendMibUploadNext(log.WithSpanFromContext(context.TODO(), ctx),
724 oo.baseDeviceHandler.GetOmciTimeout(), true, oo.GetPersIsExtOmciSupported())
mpagenko01499812021-03-25 10:37:12 +0000725 //even though lastTxParameters are currently not used for checking the ResetResponse message we have to ensure
726 // that the lastTxMessageType is correctly set to avoid misinterpreting other responses
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000727 oo.mutexLastTxParamStruct.Lock()
mpagenko01499812021-03-25 10:37:12 +0000728 oo.lastTxParamStruct.lastTxMessageType = omci.MibUploadNextRequestType
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000729 oo.mutexLastTxParamStruct.Unlock()
Himani Chawla4d908332020-08-31 12:30:20 +0530730 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000731 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 +0530732 //TODO right action?
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000733 _ = oo.PMibUploadFsm.PFsm.Event(UlEvTimeout)
Himani Chawla4d908332020-08-31 12:30:20 +0530734 }
735}
736
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000737func (oo *OnuDeviceEntry) handleOmciMibUploadNextResponseMessage(ctx context.Context, msg cmn.OmciMessage) {
Himani Chawla4d908332020-08-31 12:30:20 +0530738 msgLayer := (*msg.OmciPacket).Layer(omci.LayerTypeMibUploadNextResponse)
mpagenko7033f4e2021-11-19 18:04:22 +0000739 if msgLayer != nil {
740 msgObj, msgOk := msgLayer.(*omci.MibUploadNextResponse)
741 if !msgOk {
742 logger.Errorw(ctx, "Omci Msg layer could not be assigned", log.Fields{"device-id": oo.deviceID})
743 return
mpagenko836a1fd2021-11-01 16:12:42 +0000744 }
mpagenko7033f4e2021-11-19 18:04:22 +0000745 meName := msgObj.ReportedME.GetName()
746 meClassID := msgObj.ReportedME.GetClassID()
747 meEntityID := msgObj.ReportedME.GetEntityID()
748
749 logger.Debugw(ctx, "MibUploadNextResponse Data for:", log.Fields{"device-id": oo.deviceID, "meName": meName, "data-fields": msgObj})
750
751 if meName == devdb.CUnknownItuG988ManagedEntity || meName == devdb.CUnknownVendorSpecificManagedEntity {
Holger Hildebrandt39080022022-03-16 10:03:17 +0000752 logger.Debugw(ctx, "MibUploadNextResponse contains unknown ME", log.Fields{"device-id": oo.deviceID,
753 "Me-Name": devdb.UnknownMeOrAttribName(meName), "Me-ClassId": meClassID, "Me-InstId": meEntityID,
mgoudad611f4c2025-10-30 14:49:27 +0530754 "unknown mask": msgObj.ReportedME.GetAttributeMask(), "unknown attributes": msgObj.Payload})
Holger Hildebrandt39080022022-03-16 10:03:17 +0000755 oo.pOnuDB.PutUnknownMeOrAttrib(ctx, devdb.UnknownMeOrAttribName(meName), meClassID, meEntityID,
mgoudad611f4c2025-10-30 14:49:27 +0530756 msgObj.ReportedME.GetAttributeMask(), msgObj.Payload[devdb.CStartUnknownMeAttribsInBaseLayerPayload:])
mpagenko7033f4e2021-11-19 18:04:22 +0000757 } else {
758 //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
759 if unknownAttrLayer := (*msg.OmciPacket).Layer(omci.LayerTypeUnknownAttributes); unknownAttrLayer != nil {
760 logger.Warnw(ctx, "MibUploadNextResponse contains unknown attributes", log.Fields{"device-id": oo.deviceID})
761 if unknownAttributes, ok := unknownAttrLayer.(*omci.UnknownAttributes); ok {
762 // provide a loop over several ME's here already in preparation of OMCI extended message format
763 for _, unknown := range unknownAttributes.Attributes {
764 unknownAttrClassID := unknown.EntityClass // ClassID
765 unknownAttrInst := unknown.EntityInstance // uint16
766 unknownAttrMask := unknown.AttributeMask // ui
767 unknownAttrBlob := unknown.AttributeData // []byte
768 logger.Warnw(ctx, "unknown attributes detected for", log.Fields{"device-id": oo.deviceID,
769 "Me-ClassId": unknownAttrClassID, "Me-InstId": unknownAttrInst, "unknown mask": unknownAttrMask,
770 "unknown attributes": unknownAttrBlob})
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000771 oo.pOnuDB.PutUnknownMeOrAttrib(ctx, devdb.CUnknownAttributesManagedEntity, unknown.EntityClass, unknown.EntityInstance,
772 unknown.AttributeMask, unknown.AttributeData)
mpagenko7033f4e2021-11-19 18:04:22 +0000773 } // for all included ME's with unknown attributes
774 } else {
775 logger.Errorw(ctx, "unknownAttrLayer could not be decoded", log.Fields{"device-id": oo.deviceID})
776 }
777 }
778 oo.pOnuDB.PutMe(ctx, meClassID, meEntityID, msgObj.ReportedME.GetAttributeValueMap())
779 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000780 if msg.OmciMsg.DeviceIdentifier == omci.ExtendedIdent {
781 for _, additionalME := range msgObj.AdditionalMEs {
782 meName := additionalME.GetName()
783 meClassID := additionalME.GetClassID()
784 meEntityID := additionalME.GetEntityID()
785 attributes := additionalME.GetAttributeValueMap()
786
787 if meName == devdb.CUnknownItuG988ManagedEntity || meName == devdb.CUnknownVendorSpecificManagedEntity {
788 attribMask := additionalME.GetAttributeMask()
789 logger.Debugw(ctx, "MibUploadNextResponse AdditionalData contains unknown ME", log.Fields{"device-id": oo.deviceID,
790 "Me-Name": devdb.UnknownMeOrAttribName(meName), "Me-ClassId": meClassID, "Me-InstId": meEntityID,
791 "unknown mask": attribMask})
792
793 attribValues := make([]byte, 0)
794 for key, value := range attributes {
795 if key != cmn.CGenericManagedEntityIDName {
796 data, err := me.InterfaceToOctets(value)
797 if err != nil {
798 logger.Infow(ctx, "MibUploadNextResponse unknown ME AdditionalData attrib - could not decode", log.Fields{"device-id": oo.deviceID, "key": key})
799 } else {
800 attribValues = append(attribValues[:], data[:]...)
801 logger.Debugw(ctx, "MibUploadNextResponse unknown ME AdditionalData attrib", log.Fields{"device-id": oo.deviceID, "attribValues": attribValues, "data": data, "key": key})
802 }
803 }
804 }
805 oo.pOnuDB.PutUnknownMeOrAttrib(ctx, devdb.UnknownMeOrAttribName(meName), meClassID, meEntityID, attribMask, attribValues)
806 } else {
807 logger.Debugw(ctx, "MibUploadNextResponse AdditionalData for:", log.Fields{"device-id": oo.deviceID, "meName": meName, "meEntityID": meEntityID, "attributes": attributes})
808 oo.pOnuDB.PutMe(ctx, meClassID, meEntityID, attributes)
809 }
810 }
811 }
mpagenko7033f4e2021-11-19 18:04:22 +0000812 } else {
813 logger.Errorw(ctx, "Omci Msg layer could not be detected", log.Fields{"device-id": oo.deviceID})
814 //as long as omci-lib does not support decoding of table attribute as 'unknown/unspecified' attribute
815 // we have to verify, if this failure is from table attribute and try to go forward with ignoring the complete message
816 errLayer := (*msg.OmciPacket).Layer(gopacket.LayerTypeDecodeFailure)
817 if failure, decodeOk := errLayer.(*gopacket.DecodeFailure); decodeOk {
818 errMsg := failure.String()
819 if !strings.Contains(strings.ToLower(errMsg), "table decode") {
820 //something still unexected happened, needs deeper investigation - stop complete MIB upload process (timeout)
821 return
822 }
823 logger.Warnw(ctx, "Decode issue on received MibUploadNextResponse frame - found table attribute(s) (message ignored)",
824 log.Fields{"device-id": oo.deviceID, "issue": errMsg})
825 }
Himani Chawla4d908332020-08-31 12:30:20 +0530826 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000827 if oo.PDevOmciCC.UploadSequNo < oo.PDevOmciCC.UploadNoOfCmds {
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000828 _ = oo.PDevOmciCC.SendMibUploadNext(log.WithSpanFromContext(context.TODO(), ctx),
829 oo.baseDeviceHandler.GetOmciTimeout(), true, oo.GetPersIsExtOmciSupported())
mpagenko01499812021-03-25 10:37:12 +0000830 //even though lastTxParameters are currently not used for checking the ResetResponse message we have to ensure
831 // that the lastTxMessageType is correctly set to avoid misinterpreting other responses
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000832 oo.mutexLastTxParamStruct.Lock()
mpagenko01499812021-03-25 10:37:12 +0000833 oo.lastTxParamStruct.lastTxMessageType = omci.MibUploadNextRequestType
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000834 oo.mutexLastTxParamStruct.Unlock()
Himani Chawla4d908332020-08-31 12:30:20 +0530835 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000836 err := oo.createAndPersistMibTemplate(ctx)
Himani Chawla4d908332020-08-31 12:30:20 +0530837 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000838 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 +0530839 }
840
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +0530841 oo.updateOnuSpecificEntries(ctx)
842 logger.Errorw(ctx, "MibSync - Updtaed the ONU Specific MEs ", log.Fields{"device-id": oo.deviceID})
843
844 cmnMEDB, _ := oo.pOpenOnuAc.FetchEntryFromMibDatabaseMap(ctx, oo.mibTemplatePath)
845 cmnMEDB.MIBUploadStatus = devdb.Completed
846 oo.pOnuDB.CommonMeDb.MeDbLock.Unlock()
847 oo.pOpenOnuAc.SetMibTemplatesGenerated(oo.mibTemplatePath, true)
848 oo.pOpenOnuAc.UnlockMutexMibTemplateGenerated()
849
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000850 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Himani Chawla4d908332020-08-31 12:30:20 +0530851 }
852}
853
Girish Gowdra21bbf052022-02-17 16:08:22 -0800854// nolint: gocyclo
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000855func (oo *OnuDeviceEntry) handleOmciGetResponseMessage(ctx context.Context, msg cmn.OmciMessage) error {
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000856 var err error = nil
mpagenko01499812021-03-25 10:37:12 +0000857
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000858 oo.mutexLastTxParamStruct.RLock()
mpagenko01499812021-03-25 10:37:12 +0000859 if oo.lastTxParamStruct.lastTxMessageType != omci.GetRequestType ||
860 oo.lastTxParamStruct.pLastTxMeInstance == nil {
861 //in case the last request was MibReset this issue may appear if the ONU was online before and has received the MDS GetRequest
862 // with Sequence number 0x8000 as last request before - so it may still respond to that
863 // then we may force the ONU to react on the MIB reset with a new message that uses an increased Sequence number
864 if oo.lastTxParamStruct.lastTxMessageType == omci.MibResetRequestType && oo.lastTxParamStruct.repeatCount == 0 {
865 logger.Debugw(ctx, "MibSync FSM - repeat mibReset (updated SequenceNumber)", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000866 _ = oo.PDevOmciCC.SendMibReset(log.WithSpanFromContext(context.TODO(), ctx), oo.baseDeviceHandler.GetOmciTimeout(), true)
mpagenko01499812021-03-25 10:37:12 +0000867 //TODO: needs extra handling of timeouts
868 oo.lastTxParamStruct.repeatCount = 1
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000869 oo.mutexLastTxParamStruct.RUnlock()
mpagenko01499812021-03-25 10:37:12 +0000870 return nil
871 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000872 oo.mutexLastTxParamStruct.RUnlock()
mpagenko01499812021-03-25 10:37:12 +0000873 logger.Warnw(ctx, "unexpected GetResponse - ignoring", log.Fields{"device-id": oo.deviceID})
874 //perhaps some still lingering message from some prior activity, let's wait for the real response
875 return nil
876 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000877 oo.mutexLastTxParamStruct.RUnlock()
Himani Chawla4d908332020-08-31 12:30:20 +0530878 msgLayer := (*msg.OmciPacket).Layer(omci.LayerTypeGetResponse)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000879 if msgLayer == nil {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000880 logger.Errorw(ctx, "omci Msg layer could not be detected for GetResponse - handling of MibSyncChan stopped",
881 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000882 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000883 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 +0000884 }
885 msgObj, msgOk := msgLayer.(*omci.GetResponse)
886 if !msgOk {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000887 logger.Errorw(ctx, "omci Msg layer could not be assigned for GetResponse - handling of MibSyncChan stopped",
888 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000889 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000890 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 +0000891 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000892 logger.Debugw(ctx, "MibSync FSM - GetResponse Data", log.Fields{"device-id": oo.deviceID, "data-fields": msgObj})
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000893 if msgObj.Result == me.Success {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000894 oo.mutexLastTxParamStruct.RLock()
mpagenko01499812021-03-25 10:37:12 +0000895 entityID := oo.lastTxParamStruct.pLastTxMeInstance.GetEntityID()
896 if msgObj.EntityClass == oo.lastTxParamStruct.pLastTxMeInstance.GetClassID() && msgObj.EntityInstance == entityID {
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000897 meAttributes := msgObj.Attributes
mpagenko01499812021-03-25 10:37:12 +0000898 meInstance := oo.lastTxParamStruct.pLastTxMeInstance.GetName()
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000899 logger.Debugf(ctx, "MibSync FSM - GetResponse Data for %s",
900 log.Fields{"device-id": oo.deviceID, "data-fields": msgObj}, meInstance)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000901 switch meInstance {
902 case "OnuG":
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000903 oo.mutexLastTxParamStruct.RUnlock()
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000904 return oo.handleOmciGetResponseOnuG(ctx, meAttributes)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000905 case "Onu2G":
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000906 oo.mutexLastTxParamStruct.RUnlock()
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000907 var equipmentID string
908 if onu2GEquipmentID, ok := meAttributes[me.Onu2G_EquipmentId]; ok {
909 equipmentID = cmn.TrimStringFromMeOctet(onu2GEquipmentID)
910 if equipmentID == "" {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000911 logger.Infow(ctx,
912 "MibSync FSM - optional attribute EquipmentID is empty in Onu2G instance - fill with appropriate value",
913 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000914 equipmentID = cEmptyEquipIDString
915 }
916 } else {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000917 logger.Infow(ctx,
918 "MibSync FSM - optional attribute EquipmentID not present in Onu2G instance - fill with appropriate value",
919 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000920 equipmentID = cNotPresentEquipIDString
921 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000922 oo.MutexPersOnuConfig.Lock()
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000923 oo.SOnuPersistentData.PersEquipmentID = equipmentID
dbainbri4d3a0dc2020-12-02 00:33:42 +0000924 logger.Debugw(ctx, "MibSync FSM - GetResponse Data for Onu2-G - EquipmentId", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000925 "onuDeviceEntry.equipmentID": oo.SOnuPersistentData.PersEquipmentID})
926 oo.MutexPersOnuConfig.Unlock()
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000927
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000928 var omccVersion uint8
929 if onu2GOmccVersion, ok := meAttributes[me.Onu2G_OpticalNetworkUnitManagementAndControlChannelOmccVersion]; ok {
930 oo.MutexPersOnuConfig.Lock()
931 omccVersion = onu2GOmccVersion.(uint8)
932 if _, ok := omccVersionSupportsExtendedOmciFormat[omccVersion]; ok {
933 oo.SOnuPersistentData.PersIsExtOmciSupported = omccVersionSupportsExtendedOmciFormat[omccVersion]
Holger Hildebrandtc572e622022-06-22 09:19:17 +0000934 if oo.SOnuPersistentData.PersIsExtOmciSupported && !oo.baseDeviceHandler.GetExtendedOmciSupportEnabled() {
935 logger.Infow(ctx, "MibSync FSM - ONU supports extended OMCI, but support is disabled in the adapter: reset flag",
936 log.Fields{"device-id": oo.deviceID})
937 oo.SOnuPersistentData.PersIsExtOmciSupported = false
938 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000939 } else {
940 logger.Infow(ctx, "MibSync FSM - unknown OMCC version in Onu2G instance - disable extended OMCI support",
941 log.Fields{"device-id": oo.deviceID})
942 oo.SOnuPersistentData.PersIsExtOmciSupported = false
943 }
944 logger.Debugw(ctx, "MibSync FSM - GetResponse Data for Onu2-G - OMCC version", log.Fields{"device-id": oo.deviceID,
945 "omccVersion": omccVersion, "isExtOmciSupported": oo.SOnuPersistentData.PersIsExtOmciSupported})
946 oo.MutexPersOnuConfig.Unlock()
947 } else {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000948 logger.Errorw(ctx,
949 "MibSync FSM - mandatory attribute OMCC version not present in Onu2G instance - handling of MibSyncChan stopped!",
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000950 log.Fields{"device-id": oo.deviceID})
951 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000952 return fmt.Errorf(
953 "mibSync FSM - mandatory attribute OMCC version not present in Onu2G instance - handling of MibSyncChan stopped: %s",
954 oo.deviceID)
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000955 }
956 oo.MutexPersOnuConfig.RLock()
957 if oo.SOnuPersistentData.PersIsExtOmciSupported {
958 oo.MutexPersOnuConfig.RUnlock()
959 // trigger test of OMCI extended msg format
960 _ = oo.PMibUploadFsm.PFsm.Event(UlEvTestExtOmciSupport)
961 return nil
962 }
963 oo.MutexPersOnuConfig.RUnlock()
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000964 // trigger retrieval of 1st SW-image info
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000965 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetFirstSwVersion)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000966 return nil
967 case "SoftwareImage":
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000968 oo.mutexLastTxParamStruct.RUnlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000969 if entityID > cmn.SecondSwImageMeID {
mpagenko15ff4a52021-03-02 10:09:20 +0000970 logger.Errorw(ctx, "mibSync FSM - Failed to GetResponse Data for SoftwareImage with expected EntityId",
971 log.Fields{"device-id": oo.deviceID, "entity-ID": entityID})
972 return fmt.Errorf("mibSync FSM - SwResponse Data with unexpected EntityId: %s %x",
973 oo.deviceID, entityID)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000974 }
mpagenko15ff4a52021-03-02 10:09:20 +0000975 // need to use function for go lint complexity
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000976 if !oo.HandleSwImageIndications(ctx, entityID, meAttributes) {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000977 logger.Errorw(ctx,
978 "MibSync FSM - Not all mandatory attributes present in in SoftwareImage instance - handling of MibSyncChan stopped!",
979 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000980 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000981 return fmt.Errorf(
982 "mibSync FSM - Not all mandatory attributes present in in SoftwareImage instance - handling of MibSyncChan stopped: %s",
983 oo.deviceID)
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000984 }
mpagenko15ff4a52021-03-02 10:09:20 +0000985 return nil
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000986 case "IpHostConfigData":
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000987 oo.mutexLastTxParamStruct.RUnlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000988 oo.MutexPersOnuConfig.Lock()
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000989 if ipHostConfigMacAddress, ok := meAttributes[me.IpHostConfigData_MacAddress]; ok {
Girish Gowdra21bbf052022-02-17 16:08:22 -0800990 macBytes, _ := me.InterfaceToOctets(ipHostConfigMacAddress)
991 if cmn.OmciMacAddressLen == len(macBytes) {
992 oo.SOnuPersistentData.PersMacAddress = hex.EncodeToString(macBytes[:])
993 logger.Debugw(ctx, "MibSync FSM - GetResponse Data for IpHostConfigData - MacAddress", log.Fields{"device-id": oo.deviceID,
994 "macAddress": oo.SOnuPersistentData.PersMacAddress})
995 } else {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000996 logger.Infow(ctx, "MibSync FSM - MacAddress wrong length - fill macAddress with zeros",
997 log.Fields{"device-id": oo.deviceID, "length": len(macBytes)})
Girish Gowdra21bbf052022-02-17 16:08:22 -0800998 oo.SOnuPersistentData.PersMacAddress = cEmptyMacAddrString
999 }
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001000 } else {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001001 // since ONU creates instances of this ME automatically only when IP host services are available,
1002 // processing continues here despite the error
1003 logger.Infow(ctx, "MibSync FSM - MacAddress attribute not present in IpHostConfigData instance - fill macAddress with zeros",
1004 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001005 oo.SOnuPersistentData.PersMacAddress = cEmptyMacAddrString
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001006 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001007 oo.MutexPersOnuConfig.Unlock()
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001008 // trigger retrieval of mib template
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001009 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetMibTemplate)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001010 return nil
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00001011 case "OnuData":
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001012 oo.mutexLastTxParamStruct.RUnlock()
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +00001013 if onuDataMibDataSync, ok := meAttributes[me.OnuData_MibDataSync]; ok {
1014 oo.checkMdsValue(ctx, onuDataMibDataSync.(uint8))
1015 } else {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001016 logger.Errorw(ctx, "MibSync FSM - MibDataSync attribute not present in OnuData instance - handling of MibSyncChan stopped!",
1017 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +00001018 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001019 return fmt.Errorf("mibSync FSM - VendorId attribute not present in OnuG instance - handling of MibSyncChan stopped: %s",
1020 oo.deviceID)
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +00001021 }
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00001022 return nil
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001023 default:
1024 oo.mutexLastTxParamStruct.RUnlock()
1025 logger.Warnw(ctx, "Unsupported ME name received!",
1026 log.Fields{"ME name": meInstance, "device-id": oo.deviceID})
1027
Himani Chawla4d908332020-08-31 12:30:20 +05301028 }
Matteo Scandolo20ca10c2021-01-21 14:35:45 -08001029 } else {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001030 oo.mutexLastTxParamStruct.RUnlock()
1031 logger.Warnf(ctx, "MibSync FSM - Received GetResponse Data for %s with wrong classID or entityID ",
1032 log.Fields{"device-id": oo.deviceID, "data-fields": msgObj}, msgObj.EntityClass)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001033 }
Himani Chawla4d908332020-08-31 12:30:20 +05301034 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001035 if err = oo.handleOmciGetResponseErrors(ctx, msgObj); err == nil {
Holger Hildebrandt80129db2020-11-23 10:49:32 +00001036 return nil
1037 }
Himani Chawla4d908332020-08-31 12:30:20 +05301038 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001039 logger.Info(ctx, "MibSync Msg", log.Fields{"Stopped handling of MibSyncChan for device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001040 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001041 return err
Himani Chawla4d908332020-08-31 12:30:20 +05301042}
1043
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05301044// HandleSwImageIndications updates onuSwImageIndications with the ONU data just received
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +00001045func (oo *OnuDeviceEntry) HandleSwImageIndications(ctx context.Context, entityID uint16, meAttributes me.AttributeValueMap) bool {
1046
1047 var imageVersion string
1048 var imageIsCommitted, imageIsActive uint8
1049
1050 allMandAttribsPresent := false
1051 if softwareImageIsCommitted, ok := meAttributes[me.SoftwareImage_IsCommitted]; ok {
1052 if softwareImageIsActiveimage, ok := meAttributes[me.SoftwareImage_IsActive]; ok {
1053 if softwareImageVersion, ok := meAttributes[me.SoftwareImage_Version]; ok {
1054 imageVersion = cmn.TrimStringFromMeOctet(softwareImageVersion)
1055 imageIsActive = softwareImageIsActiveimage.(uint8)
1056 imageIsCommitted = softwareImageIsCommitted.(uint8)
1057 allMandAttribsPresent = true
1058 }
1059 }
1060 }
1061 if !allMandAttribsPresent {
1062 logger.Errorw(ctx, "MibSync FSM - Not all mandatory attributes present in SoftwareImage instance - skip processing!", log.Fields{"device-id": oo.deviceID})
1063 return allMandAttribsPresent
1064 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001065 oo.MutexPersOnuConfig.RLock()
mpagenko15ff4a52021-03-02 10:09:20 +00001066 logger.Infow(ctx, "MibSync FSM - GetResponse Data for SoftwareImage",
1067 log.Fields{"device-id": oo.deviceID, "entityID": entityID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001068 "version": imageVersion, "isActive": imageIsActive, "isCommitted": imageIsCommitted, "SNR": oo.SOnuPersistentData.PersSerialNumber})
1069 oo.MutexPersOnuConfig.RUnlock()
1070 if cmn.FirstSwImageMeID == entityID {
mpagenko15ff4a52021-03-02 10:09:20 +00001071 //always accept the state of the first image (2nd image info should not yet be available)
Holger Hildebrandt05011352021-06-15 09:40:24 +00001072 oo.mutexOnuSwImageIndications.Lock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001073 if imageIsActive == cmn.SwIsActive {
1074 oo.onuSwImageIndications.ActiveEntityEntry.EntityID = entityID
1075 oo.onuSwImageIndications.ActiveEntityEntry.Valid = true
1076 oo.onuSwImageIndications.ActiveEntityEntry.Version = imageVersion
1077 oo.onuSwImageIndications.ActiveEntityEntry.IsCommitted = imageIsCommitted
mpagenko59498c12021-03-18 14:15:15 +00001078 //as the SW version indication may stem from some ONU Down/up event
1079 //the complementary image state is to be invalidated
1080 // (state of the second image is always expected afterwards or just invalid)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001081 oo.onuSwImageIndications.InActiveEntityEntry.Valid = false
mpagenko15ff4a52021-03-02 10:09:20 +00001082 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001083 oo.onuSwImageIndications.InActiveEntityEntry.EntityID = entityID
1084 oo.onuSwImageIndications.InActiveEntityEntry.Valid = true
1085 oo.onuSwImageIndications.InActiveEntityEntry.Version = imageVersion
1086 oo.onuSwImageIndications.InActiveEntityEntry.IsCommitted = imageIsCommitted
mpagenko59498c12021-03-18 14:15:15 +00001087 //as the SW version indication may stem form some ONU Down/up event
1088 //the complementary image state is to be invalidated
1089 // (state of the second image is always expected afterwards or just invalid)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001090 oo.onuSwImageIndications.ActiveEntityEntry.Valid = false
mpagenko15ff4a52021-03-02 10:09:20 +00001091 }
Holger Hildebrandt05011352021-06-15 09:40:24 +00001092 oo.mutexOnuSwImageIndications.Unlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001093 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetSecondSwVersion)
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +00001094 return allMandAttribsPresent
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001095 } else if cmn.SecondSwImageMeID == entityID {
mpagenko15ff4a52021-03-02 10:09:20 +00001096 //2nd image info might conflict with first image info, in which case we priorize first image info!
Holger Hildebrandt05011352021-06-15 09:40:24 +00001097 oo.mutexOnuSwImageIndications.Lock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001098 if imageIsActive == cmn.SwIsActive { //2nd image reported to be active
1099 if oo.onuSwImageIndications.ActiveEntityEntry.Valid {
mpagenko15ff4a52021-03-02 10:09:20 +00001100 //conflict exists - state of first image is left active
1101 logger.Warnw(ctx, "mibSync FSM - both ONU images are reported as active - assuming 2nd to be inactive",
1102 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001103 oo.onuSwImageIndications.InActiveEntityEntry.EntityID = entityID
1104 oo.onuSwImageIndications.InActiveEntityEntry.Valid = true ////to indicate that at least something has been reported
1105 oo.onuSwImageIndications.InActiveEntityEntry.Version = imageVersion
1106 oo.onuSwImageIndications.InActiveEntityEntry.IsCommitted = imageIsCommitted
mpagenko15ff4a52021-03-02 10:09:20 +00001107 } else { //first image inactive, this one active
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001108 oo.onuSwImageIndications.ActiveEntityEntry.EntityID = entityID
1109 oo.onuSwImageIndications.ActiveEntityEntry.Valid = true
1110 oo.onuSwImageIndications.ActiveEntityEntry.Version = imageVersion
1111 oo.onuSwImageIndications.ActiveEntityEntry.IsCommitted = imageIsCommitted
mpagenko15ff4a52021-03-02 10:09:20 +00001112 }
1113 } else { //2nd image reported to be inactive
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001114 if oo.onuSwImageIndications.InActiveEntityEntry.Valid {
mpagenko15ff4a52021-03-02 10:09:20 +00001115 //conflict exists - both images inactive - regard it as ONU failure and assume first image to be active
1116 logger.Warnw(ctx, "mibSync FSM - both ONU images are reported as inactive, defining first to be active",
1117 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001118 oo.onuSwImageIndications.ActiveEntityEntry.EntityID = cmn.FirstSwImageMeID
1119 oo.onuSwImageIndications.ActiveEntityEntry.Valid = true //to indicate that at least something has been reported
mpagenko15ff4a52021-03-02 10:09:20 +00001120 //copy active commit/version from the previously stored inactive position
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001121 oo.onuSwImageIndications.ActiveEntityEntry.Version = oo.onuSwImageIndications.InActiveEntityEntry.Version
1122 oo.onuSwImageIndications.ActiveEntityEntry.IsCommitted = oo.onuSwImageIndications.InActiveEntityEntry.IsCommitted
mpagenko15ff4a52021-03-02 10:09:20 +00001123 }
1124 //in any case we indicate (and possibly overwrite) the second image indications as inactive
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001125 oo.onuSwImageIndications.InActiveEntityEntry.EntityID = entityID
1126 oo.onuSwImageIndications.InActiveEntityEntry.Valid = true
1127 oo.onuSwImageIndications.InActiveEntityEntry.Version = imageVersion
1128 oo.onuSwImageIndications.InActiveEntityEntry.IsCommitted = imageIsCommitted
mpagenko15ff4a52021-03-02 10:09:20 +00001129 }
Holger Hildebrandt05011352021-06-15 09:40:24 +00001130 oo.mutexOnuSwImageIndications.Unlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001131 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetMacAddress)
mpagenko15ff4a52021-03-02 10:09:20 +00001132 }
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +00001133 return allMandAttribsPresent
mpagenko15ff4a52021-03-02 10:09:20 +00001134}
1135
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001136func (oo *OnuDeviceEntry) handleOmciMessage(ctx context.Context, msg cmn.OmciMessage) {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001137 logger.Debugw(ctx, "MibSync Msg", log.Fields{"OmciMessage received for device-id": oo.deviceID,
Andrea Campanella6515c582020-10-05 11:25:00 +02001138 "msgType": msg.OmciMsg.MessageType, "msg": msg})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001139 //further analysis could be done here based on msg.OmciMsg.Payload, e.g. verification of error code ...
1140 switch msg.OmciMsg.MessageType {
1141 case omci.MibResetResponseType:
dbainbri4d3a0dc2020-12-02 00:33:42 +00001142 oo.handleOmciMibResetResponseMessage(ctx, msg)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001143
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001144 case omci.MibUploadResponseType:
dbainbri4d3a0dc2020-12-02 00:33:42 +00001145 oo.handleOmciMibUploadResponseMessage(ctx, msg)
Himani Chawla4d908332020-08-31 12:30:20 +05301146
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001147 case omci.MibUploadNextResponseType:
dbainbri4d3a0dc2020-12-02 00:33:42 +00001148 oo.handleOmciMibUploadNextResponseMessage(ctx, msg)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001149
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001150 case omci.GetResponseType:
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001151 //TODO: error handling
dbainbri4d3a0dc2020-12-02 00:33:42 +00001152 _ = oo.handleOmciGetResponseMessage(ctx, msg)
Himani Chawla4d908332020-08-31 12:30:20 +05301153
Andrea Campanella6515c582020-10-05 11:25:00 +02001154 default:
Holger Hildebrandtabfef032022-02-25 12:40:20 +00001155 logger.Warnw(ctx, "Unknown Message Type", log.Fields{"device-id": oo.deviceID, "msgType": msg.OmciMsg.MessageType})
Andrea Campanella6515c582020-10-05 11:25:00 +02001156
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001157 }
1158}
1159
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001160func (oo *OnuDeviceEntry) handleOmciGetResponseOnuG(ctx context.Context, meAttributes me.AttributeValueMap) error {
1161 currentState := oo.PMibUploadFsm.PFsm.Current()
mgoudad611f4c2025-10-30 14:49:27 +05301162 switch currentState {
1163 case UlStGettingVendorAndSerial:
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001164 if onuGVendorID, ok := meAttributes[me.OnuG_VendorId]; ok {
1165 vendorID := cmn.TrimStringFromMeOctet(onuGVendorID)
1166 if vendorID == "" {
1167 logger.Infow(ctx,
1168 "MibSync FSM - mandatory attribute VendorId is empty in OnuG instance - fill with appropriate value",
1169 log.Fields{"device-id": oo.deviceID})
1170 vendorID = cEmptyVendorIDString
1171 }
1172 oo.MutexPersOnuConfig.Lock()
1173 oo.SOnuPersistentData.PersVendorID = vendorID
1174 oo.MutexPersOnuConfig.Unlock()
1175 } else {
1176 logger.Errorw(ctx,
1177 "MibSync FSM - mandatory attribute VendorId not present in OnuG instance - handling of MibSyncChan stopped!",
1178 log.Fields{"device-id": oo.deviceID})
1179 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
1180 return fmt.Errorf(
1181 "mibSync FSM - mandatory attribute VendorId not present in OnuG instance - handling of MibSyncChan stopped: %s",
1182 oo.deviceID)
1183 }
1184 if onuGSerialNumber, ok := meAttributes[me.OnuG_SerialNumber]; ok {
1185 oo.MutexPersOnuConfig.Lock()
1186 snBytes, _ := me.InterfaceToOctets(onuGSerialNumber)
1187 if cmn.OnugSerialNumberLen == len(snBytes) {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +05301188 snVendorPart := string(snBytes[:4])
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001189 snNumberPart := hex.EncodeToString(snBytes[4:])
1190 oo.SOnuPersistentData.PersSerialNumber = snVendorPart + snNumberPart
1191 } else {
1192 logger.Infow(ctx, "MibSync FSM - SerialNumber has wrong length - fill serialNumber with zeros",
1193 log.Fields{"device-id": oo.deviceID, "length": len(snBytes)})
1194 oo.SOnuPersistentData.PersSerialNumber = cEmptySerialNumberString
1195 }
1196 oo.MutexPersOnuConfig.Unlock()
1197 } else {
1198 logger.Errorw(ctx,
1199 "MibSync FSM - mandatory attribute SerialNumber not present in OnuG instance - handling of MibSyncChan stopped!",
1200 log.Fields{"device-id": oo.deviceID})
1201 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
1202 return fmt.Errorf(
1203 "mibSync FSM - mandatory attribute SerialNumber not present in OnuG instance - handling of MibSyncChan stopped: %s",
1204 oo.deviceID)
1205 }
1206 oo.MutexPersOnuConfig.Lock()
1207 logger.Debugw(ctx, "MibSync FSM - GetResponse Data for Onu-G - VendorId/SerialNumber", log.Fields{"device-id": oo.deviceID,
1208 "onuDeviceEntry.vendorID": oo.SOnuPersistentData.PersVendorID,
1209 "onuDeviceEntry.serialNumber": oo.SOnuPersistentData.PersSerialNumber})
1210 oo.MutexPersOnuConfig.Unlock()
1211 // trigger retrieval of Version
1212 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetVersion)
1213 return nil
mgoudad611f4c2025-10-30 14:49:27 +05301214 case UlStGettingVersion:
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001215 if onuGVersion, ok := meAttributes[me.OnuG_Version]; ok {
1216 version := cmn.TrimStringFromMeOctet(onuGVersion)
1217 if version == "" {
1218 logger.Infow(ctx, "MibSync FSM - mandatory attribute Version is empty in OnuG instance - fill with appropriate value",
1219 log.Fields{"device-id": oo.deviceID})
1220 version = cEmptyVersionString
1221 }
1222 oo.MutexPersOnuConfig.Lock()
1223 oo.SOnuPersistentData.PersVersion = version
1224 oo.MutexPersOnuConfig.Unlock()
1225 } else {
1226 logger.Errorw(ctx,
1227 "MibSync FSM - mandatory attribute Version not present in OnuG instance - handling of MibSyncChan stopped!",
1228 log.Fields{"device-id": oo.deviceID})
1229 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
1230 return fmt.Errorf(
1231 "mibSync FSM - mandatory attribute Version not present in OnuG instance - handling of MibSyncChan stopped: %s",
1232 oo.deviceID)
1233 }
1234 oo.MutexPersOnuConfig.Lock()
1235 logger.Debugw(ctx, "MibSync FSM - GetResponse Data for Onu-G - Version", log.Fields{"device-id": oo.deviceID,
1236 "onuDeviceEntry.version": oo.SOnuPersistentData.PersVersion})
1237 oo.MutexPersOnuConfig.Unlock()
1238 // trigger retrieval of EquipmentId and OMCC version
1239 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetEquipIDAndOmcc)
1240 return nil
mgoudad611f4c2025-10-30 14:49:27 +05301241 default:
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001242 logger.Errorw(ctx, "MibSync FSM - wrong state OnuG response processing - handling of MibSyncChan stopped!",
1243 log.Fields{"currentState": currentState, "device-id": oo.deviceID})
1244 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
1245 return fmt.Errorf("mibSync FSM - wrong state OnuG response processing - handling of MibSyncChan stopped: %s",
1246 oo.deviceID)
1247 }
1248}
1249
dbainbri4d3a0dc2020-12-02 00:33:42 +00001250func (oo *OnuDeviceEntry) handleOmciGetResponseErrors(ctx context.Context, msgObj *omci.GetResponse) error {
Holger Hildebrandt80129db2020-11-23 10:49:32 +00001251 var err error = nil
dbainbri4d3a0dc2020-12-02 00:33:42 +00001252 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 +00001253 // Up to now the following erroneous results have been seen for different ONU-types to indicate an unsupported ME
1254 if msgObj.Result == me.UnknownInstance || msgObj.Result == me.UnknownEntity || msgObj.Result == me.ProcessingError || msgObj.Result == me.NotSupported {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001255 oo.mutexLastTxParamStruct.RLock()
1256 if oo.lastTxParamStruct.pLastTxMeInstance != nil {
1257 entityID := oo.lastTxParamStruct.pLastTxMeInstance.GetEntityID()
1258 if msgObj.EntityClass == oo.lastTxParamStruct.pLastTxMeInstance.GetClassID() && msgObj.EntityInstance == entityID {
1259 meInstance := oo.lastTxParamStruct.pLastTxMeInstance.GetName()
1260 switch meInstance {
1261 case "IpHostConfigData":
1262 oo.mutexLastTxParamStruct.RUnlock()
1263 logger.Debugw(ctx, "MibSync FSM - erroneous result for IpHostConfigData received - ONU doesn't support ME - fill macAddress with zeros",
1264 log.Fields{"device-id": oo.deviceID, "data-fields": msgObj})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001265 oo.MutexPersOnuConfig.Lock()
1266 oo.SOnuPersistentData.PersMacAddress = cEmptyMacAddrString
1267 oo.MutexPersOnuConfig.Unlock()
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001268 // trigger retrieval of mib template
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001269 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetMibTemplate)
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001270 return nil
1271 default:
1272 oo.mutexLastTxParamStruct.RUnlock()
1273 logger.Warnf(ctx, "MibSync FSM - erroneous result for %s received - no exceptional treatment defined", log.Fields{"device-id": oo.deviceID, "data-fields": msgObj}, meInstance)
1274 err = fmt.Errorf("erroneous result for %s received - no exceptional treatment defined: %s", meInstance, oo.deviceID)
1275 }
1276 } else {
1277 oo.mutexLastTxParamStruct.RUnlock()
Holger Hildebrandt80129db2020-11-23 10:49:32 +00001278 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001279 } else {
1280 oo.mutexLastTxParamStruct.RUnlock()
1281 logger.Warnw(ctx, "Pointer to last Tx MeInstance is nil!", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt80129db2020-11-23 10:49:32 +00001282 }
1283 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001284 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 +00001285 err = fmt.Errorf("erroneous result in GetResponse Data: %s - %s", msgObj.Result, oo.deviceID)
1286 }
1287 return err
1288}
1289
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001290// IsNewOnu - TODO: add comment
1291func (oo *OnuDeviceEntry) IsNewOnu() bool {
1292 oo.MutexPersOnuConfig.RLock()
1293 defer oo.MutexPersOnuConfig.RUnlock()
1294 return oo.SOnuPersistentData.PersMibLastDbSync == 0
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00001295}
1296
Himani Chawla6d2ae152020-09-02 13:11:20 +05301297func isSupportedClassID(meClassID me.ClassID) bool {
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001298 for _, v := range supportedClassIds {
Himani Chawla4d908332020-08-31 12:30:20 +05301299 if v == meClassID {
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001300 return true
1301 }
1302 }
1303 return false
1304}
1305
dbainbri4d3a0dc2020-12-02 00:33:42 +00001306func (oo *OnuDeviceEntry) mibDbVolatileDict(ctx context.Context) error {
1307 logger.Debug(ctx, "MibVolatileDict- running from default Entry code")
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001308 return errors.New("not_implemented")
1309}
1310
Himani Chawla6d2ae152020-09-02 13:11:20 +05301311// 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 +05301312// 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 +00001313// 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 +00001314func (oo *OnuDeviceEntry) createAndPersistMibTemplate(ctx context.Context) error {
1315 logger.Debugw(ctx, "MibSync - MibTemplate - path name", log.Fields{"path": oo.mibTemplatePath,
Holger Hildebrandt61b24d02020-11-16 13:36:40 +00001316 "device-id": oo.deviceID})
divyadesaibbed37c2020-08-28 13:35:20 +05301317
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301318 //Fetch the MEs dependent on serial number and MAC address and add them to onuSpecific ME DB
1319 //Modify the serial number and MAC address with generic content in the common DB.
1320 knownAttributeMEDb := oo.pOnuDB.CommonMeDb.MeDb
1321 for firstLevelKey, firstLevelValue := range knownAttributeMEDb {
1322 classID := strconv.Itoa(int(firstLevelKey))
Holger Hildebrandt61b24d02020-11-16 13:36:40 +00001323
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301324 for secondLevelKey, secondLevelValue := range firstLevelValue {
1325 switch classID {
1326 case "6", "256":
1327 if _, exists := secondLevelValue["SerialNumber"]; exists {
1328 oo.pOnuDB.PutOnuSpeficMe(ctx, firstLevelKey, secondLevelKey, secondLevelValue)
1329 secondLevelValue["SerialNumber"] = "%SERIAL_NUMBER%"
1330 }
1331 case "134":
1332 if _, exists := secondLevelValue["MacAddress"]; exists {
1333 oo.pOnuDB.PutOnuSpeficMe(ctx, firstLevelKey, secondLevelKey, secondLevelValue)
1334 secondLevelValue["MacAddress"] = "%MAC_ADDRESS%"
1335 }
1336 }
1337 }
1338 }
1339
1340 //Create the MIB Template
Holger Hildebrandt61b24d02020-11-16 13:36:40 +00001341 currentTime := time.Now()
divyadesaibbed37c2020-08-28 13:35:20 +05301342 templateMap := make(map[string]interface{})
Holger Hildebrandt61b24d02020-11-16 13:36:40 +00001343 templateMap["TemplateName"] = oo.mibTemplatePath
divyadesaibbed37c2020-08-28 13:35:20 +05301344 templateMap["TemplateCreated"] = currentTime.Format("2006-01-02 15:04:05.000000")
1345
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301346 firstLevelMap := oo.pOnuDB.CommonMeDb.MeDb
divyadesaibbed37c2020-08-28 13:35:20 +05301347 for firstLevelKey, firstLevelValue := range firstLevelMap {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001348 logger.Debugw(ctx, "MibSync - MibTemplate - firstLevelKey", log.Fields{"firstLevelKey": firstLevelKey})
Himani Chawla26e555c2020-08-31 12:30:20 +05301349 classID := strconv.Itoa(int(firstLevelKey))
divyadesaibbed37c2020-08-28 13:35:20 +05301350
1351 secondLevelMap := make(map[string]interface{})
1352 for secondLevelKey, secondLevelValue := range firstLevelValue {
Holger Hildebrandt8998ed52022-03-23 09:52:37 +00001353 // ManagedEntityId is already key of secondLevelMap - remove this redundant attribute from secondLevelValue
1354 delete(secondLevelValue, cmn.CGenericManagedEntityIDName)
divyadesaibbed37c2020-08-28 13:35:20 +05301355 thirdLevelMap := make(map[string]interface{})
Himani Chawla26e555c2020-08-31 12:30:20 +05301356 entityID := strconv.Itoa(int(secondLevelKey))
divyadesaibbed37c2020-08-28 13:35:20 +05301357 thirdLevelMap["Attributes"] = secondLevelValue
Himani Chawla26e555c2020-08-31 12:30:20 +05301358 secondLevelMap[entityID] = thirdLevelMap
1359 if classID == "6" || classID == "256" {
divyadesaibbed37c2020-08-28 13:35:20 +05301360 forthLevelMap := map[string]interface{}(thirdLevelMap["Attributes"].(me.AttributeValueMap))
1361 delete(forthLevelMap, "SerialNumber")
1362 forthLevelMap["SerialNumber"] = "%SERIAL_NUMBER%"
1363
1364 }
Himani Chawla26e555c2020-08-31 12:30:20 +05301365 if classID == "134" {
divyadesaibbed37c2020-08-28 13:35:20 +05301366 forthLevelMap := map[string]interface{}(thirdLevelMap["Attributes"].(me.AttributeValueMap))
1367 delete(forthLevelMap, "MacAddress")
1368 forthLevelMap["MacAddress"] = "%MAC_ADDRESS%"
1369 }
1370 }
Himani Chawla26e555c2020-08-31 12:30:20 +05301371 templateMap[classID] = secondLevelMap
divyadesaibbed37c2020-08-28 13:35:20 +05301372 }
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301373 unknownMeAndAttribMap := oo.pOnuDB.CommonMeDb.UnknownMeAndAttribDb
Holger Hildebrandt39080022022-03-16 10:03:17 +00001374 for unknownMeAndAttribMapKey := range unknownMeAndAttribMap {
1375 templateMap[string(unknownMeAndAttribMapKey)] = unknownMeAndAttribMap[unknownMeAndAttribMapKey]
Holger Hildebrandtf3c7a182021-11-17 13:42:08 +00001376 }
divyadesaibbed37c2020-08-28 13:35:20 +05301377 mibTemplate, err := json.Marshal(&templateMap)
1378 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001379 logger.Errorw(ctx, "MibSync - MibTemplate - Failed to marshal mibTemplate", log.Fields{"error": err, "device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001380 oo.pOpenOnuAc.SetMibTemplatesGenerated(oo.mibTemplatePath, false)
divyadesaibbed37c2020-08-28 13:35:20 +05301381 return err
1382 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001383 err = oo.mibTemplateKVStore.Put(log.WithSpanFromContext(context.TODO(), ctx), oo.mibTemplatePath, string(mibTemplate))
divyadesaibbed37c2020-08-28 13:35:20 +05301384 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001385 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 +00001386 oo.pOpenOnuAc.SetMibTemplatesGenerated(oo.mibTemplatePath, false)
divyadesaibbed37c2020-08-28 13:35:20 +05301387 return err
1388 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001389 logger.Debugw(ctx, "MibSync - MibTemplate - Stored the template to etcd", log.Fields{"device-id": oo.deviceID})
divyadesaibbed37c2020-08-28 13:35:20 +05301390 return nil
1391}
1392
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00001393func (oo *OnuDeviceEntry) requestMdsValue(ctx context.Context) {
1394 logger.Debugw(ctx, "Request MDS value", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001395 requestedAttributes := me.AttributeValueMap{me.OnuData_MibDataSync: ""}
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001396 meInstance, err := oo.PDevOmciCC.SendGetMe(log.WithSpanFromContext(context.TODO(), ctx),
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001397 me.OnuDataClassID, cmn.OnuDataMeID, requestedAttributes, oo.baseDeviceHandler.GetOmciTimeout(), true,
1398 oo.PMibUploadFsm.CommChan, oo.GetPersIsExtOmciSupported())
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00001399 //accept also nil as (error) return value for writing to LastTx
1400 // - this avoids misinterpretation of new received OMCI messages
ozgecanetsiab36ed572021-04-01 10:38:48 +03001401 if err != nil {
1402 logger.Errorw(ctx, "ONUData get failed, aborting MibSync FSM!", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001403 pMibUlFsm := oo.PMibUploadFsm
ozgecanetsiab36ed572021-04-01 10:38:48 +03001404 if pMibUlFsm != nil {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +05301405 //nolint:unparam
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001406 go func(a_pAFsm *cmn.AdapterFsm) {
1407 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
ozgecanetsiab36ed572021-04-01 10:38:48 +03001408 }(pMibUlFsm)
1409 }
1410 return
1411 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001412 oo.mutexLastTxParamStruct.Lock()
mpagenko01499812021-03-25 10:37:12 +00001413 oo.lastTxParamStruct.lastTxMessageType = omci.GetRequestType
1414 oo.lastTxParamStruct.pLastTxMeInstance = meInstance
1415 oo.lastTxParamStruct.repeatCount = 0
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001416 oo.mutexLastTxParamStruct.Unlock()
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00001417}
1418
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001419func (oo *OnuDeviceEntry) checkMdsValue(ctx context.Context, mibDataSyncOnu uint8) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001420 oo.MutexPersOnuConfig.RLock()
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001421 logger.Debugw(ctx, "MibSync FSM - GetResponse Data for Onu-Data - MibDataSync", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001422 "mibDataSyncOnu": mibDataSyncOnu, "PersMibDataSyncAdpt": oo.SOnuPersistentData.PersMibDataSyncAdpt})
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001423
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001424 mdsValuesAreEqual := oo.SOnuPersistentData.PersMibDataSyncAdpt == mibDataSyncOnu
1425 oo.MutexPersOnuConfig.RUnlock()
1426 if oo.PMibUploadFsm.PFsm.Is(UlStAuditing) {
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001427 if mdsValuesAreEqual {
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001428 logger.Debugw(ctx, "MibSync FSM - mib audit - MDS check ok", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001429 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001430 } else {
1431 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 +00001432 _ = oo.PMibUploadFsm.PFsm.Event(UlEvMismatch)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001433 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001434 } else if oo.PMibUploadFsm.PFsm.Is(UlStReAuditing) {
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001435 if mdsValuesAreEqual {
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001436 logger.Debugw(ctx, "MibSync FSM - mib reaudit - MDS check ok", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001437 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001438 } else {
Holger Hildebrandt80f57762022-02-16 10:03:24 +00001439 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 +00001440 log.Fields{"device-id": oo.deviceID})
1441 oo.SendOnuDeviceEvent(ctx, cmn.OnuMibAuditFailureMds, cmn.OnuMibAuditFailureMdsDesc)
Holger Hildebrandt80f57762022-02-16 10:03:24 +00001442 // To reconcile ONU with active adapter later on, we have to retrieve TP instances from parent adapter.
1443 // In the present use case inconsistencies between TP pathes stored in kv store and TP instances retrieved
1444 // should not occur. Nevertheless, the respective code is inserted to catch the unlikely case.
1445 if !oo.getAllStoredTpInstFromParentAdapter(ctx) {
1446 logger.Debugw(ctx, "MibSync FSM - mib reaudit - inconsistencies between TP pathes stored in kv and parent adapter instances",
1447 log.Fields{"device-id": oo.deviceID})
1448 oo.baseDeviceHandler.SetReconcilingReasonUpdate(true)
1449 go func() {
1450 if err := oo.baseDeviceHandler.StorePersistentData(ctx); err != nil {
1451 logger.Warnw(ctx,
1452 "MibSync FSM - mib reaudit - store persistent data error - continue for now as there will be additional write attempts",
1453 log.Fields{"device-id": oo.deviceID, "err": err})
1454 }
1455 }()
1456 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001457 _ = oo.PMibUploadFsm.PFsm.Event(UlEvMismatch)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001458 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001459 } else if oo.PMibUploadFsm.PFsm.Is(UlStExaminingMds) {
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001460 if mdsValuesAreEqual && mibDataSyncOnu != 0 {
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001461 logger.Debugw(ctx, "MibSync FSM - MDS examination ok", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001462 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001463 } else {
1464 logger.Debugw(ctx, "MibSync FSM - MDS examination failed - new provisioning", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001465 _ = oo.PMibUploadFsm.PFsm.Event(UlEvMismatch)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001466 }
1467 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001468 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 +00001469 }
1470}
mpagenko15ff4a52021-03-02 10:09:20 +00001471
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05301472// GetActiveImageMeID returns the Omci MeId of the active ONU image together with error code for validity
mpagenko15ff4a52021-03-02 10:09:20 +00001473func (oo *OnuDeviceEntry) GetActiveImageMeID(ctx context.Context) (uint16, error) {
Holger Hildebrandt05011352021-06-15 09:40:24 +00001474 oo.mutexOnuSwImageIndications.RLock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001475 if oo.onuSwImageIndications.ActiveEntityEntry.Valid {
1476 value := oo.onuSwImageIndications.ActiveEntityEntry.EntityID
Holger Hildebrandt05011352021-06-15 09:40:24 +00001477 oo.mutexOnuSwImageIndications.RUnlock()
1478 return value, nil
mpagenko15ff4a52021-03-02 10:09:20 +00001479 }
Holger Hildebrandt05011352021-06-15 09:40:24 +00001480 oo.mutexOnuSwImageIndications.RUnlock()
mpagenko15ff4a52021-03-02 10:09:20 +00001481 return 0xFFFF, fmt.Errorf("no valid active image found: %s", oo.deviceID)
1482}
1483
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05301484// GetInactiveImageMeID returns the Omci MeId of the inactive ONU image together with error code for validity
mpagenko15ff4a52021-03-02 10:09:20 +00001485func (oo *OnuDeviceEntry) GetInactiveImageMeID(ctx context.Context) (uint16, error) {
Holger Hildebrandt05011352021-06-15 09:40:24 +00001486 oo.mutexOnuSwImageIndications.RLock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001487 if oo.onuSwImageIndications.InActiveEntityEntry.Valid {
1488 value := oo.onuSwImageIndications.InActiveEntityEntry.EntityID
Holger Hildebrandt05011352021-06-15 09:40:24 +00001489 oo.mutexOnuSwImageIndications.RUnlock()
1490 return value, nil
mpagenko15ff4a52021-03-02 10:09:20 +00001491 }
Holger Hildebrandt05011352021-06-15 09:40:24 +00001492 oo.mutexOnuSwImageIndications.RUnlock()
mpagenko15ff4a52021-03-02 10:09:20 +00001493 return 0xFFFF, fmt.Errorf("no valid inactive image found: %s", oo.deviceID)
1494}
1495
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05301496// IsImageToBeCommitted returns true if the active image is still uncommitted
mpagenko15ff4a52021-03-02 10:09:20 +00001497func (oo *OnuDeviceEntry) IsImageToBeCommitted(ctx context.Context, aImageID uint16) bool {
Holger Hildebrandt05011352021-06-15 09:40:24 +00001498 oo.mutexOnuSwImageIndications.RLock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001499 if oo.onuSwImageIndications.ActiveEntityEntry.Valid {
1500 if oo.onuSwImageIndications.ActiveEntityEntry.EntityID == aImageID {
1501 if oo.onuSwImageIndications.ActiveEntityEntry.IsCommitted == cmn.SwIsUncommitted {
Holger Hildebrandt05011352021-06-15 09:40:24 +00001502 oo.mutexOnuSwImageIndications.RUnlock()
mpagenko15ff4a52021-03-02 10:09:20 +00001503 return true
1504 }
1505 }
1506 }
Holger Hildebrandt05011352021-06-15 09:40:24 +00001507 oo.mutexOnuSwImageIndications.RUnlock()
mpagenko15ff4a52021-03-02 10:09:20 +00001508 return false //all other case are treated as 'nothing to commit
1509}
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001510func (oo *OnuDeviceEntry) getMibFromTemplate(ctx context.Context) bool {
1511
1512 oo.mibTemplatePath = oo.buildMibTemplatePath()
Holger Hildebrandtbdc5f002021-04-19 14:46:21 +00001513 logger.Debugw(ctx, "MibSync FSM - get Mib from template", log.Fields{"path": fmt.Sprintf("%s/%s", cBasePathMibTemplateKvStore, oo.mibTemplatePath),
1514 "device-id": oo.deviceID})
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001515
1516 restoredFromMibTemplate := false
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301517 oo.pOpenOnuAc.LockMutexMibTemplateGenerated()
1518 defer oo.pOpenOnuAc.UnlockMutexMibTemplateGenerated()
1519 if meDbValue, ok := oo.pOpenOnuAc.FetchEntryFromMibDatabaseMap(ctx, oo.mibTemplatePath); ok {
1520 logger.Infow(ctx, "Found MIB common DB Instance , copy and use", log.Fields{"path": oo.mibTemplatePath, "device-id": oo.deviceID})
1521 oo.pOnuDB.CommonMeDb = meDbValue
1522 oo.updateOnuSpecificEntries(ctx)
1523 restoredFromMibTemplate = true
1524 } else {
1525 //Create a common ME MIB Instance as it doesn't prior exists.
1526 Value, err := oo.mibTemplateKVStore.Get(log.WithSpanFromContext(context.TODO(), ctx), oo.mibTemplatePath)
1527 //Unmarshal the MIB template and create the entry in the ONU Common Device DB
1528 if err == nil {
1529 if Value != nil {
1530 oo.processMibTemplate(ctx, Value)
1531 restoredFromMibTemplate = true
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001532 } else {
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301533 logger.Infow(ctx, "No MIB template found", log.Fields{"path": oo.mibTemplatePath, "device-id": oo.deviceID})
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001534 }
1535 } else {
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301536 logger.Errorw(ctx, "Get from kvstore operation failed for path",
1537 log.Fields{"path": oo.mibTemplatePath, "device-id": oo.deviceID})
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001538 }
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301539
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001540 }
1541 return restoredFromMibTemplate
1542}
Holger Hildebrandtb4563ab2021-04-14 10:27:20 +00001543
Holger Hildebrandt80f57762022-02-16 10:03:24 +00001544func (oo *OnuDeviceEntry) getAllStoredTpInstFromParentAdapter(ctx context.Context) bool {
1545
1546 allTpInstPresent := true
1547 oo.MutexPersOnuConfig.Lock()
1548 oo.MutexReconciledTpInstances.Lock()
1549 for indexUni, uniData := range oo.SOnuPersistentData.PersUniConfig {
1550 uniID := uniData.PersUniID
1551 oo.ReconciledTpInstances[uniID] = make(map[uint8]inter_adapter.TechProfileDownloadMessage)
1552 for tpID, tpPath := range uniData.PersTpPathMap {
1553 if tpPath != "" {
mgoudaa797e1c2025-06-24 17:49:42 +05301554 logger.Infow(ctx, "Starting retrieval for TechProfileInstance", log.Fields{
1555 "uniID": uniID, "tpID": tpID, "tpPath": tpPath, "device-id": oo.deviceID,
1556 })
1557 // Attempt the initial call before entering the retry loop
Holger Hildebrandt80f57762022-02-16 10:03:24 +00001558 iaTechTpInst, err := oo.baseDeviceHandler.GetTechProfileInstanceFromParentAdapter(ctx, uniID, tpPath)
mgoudaa797e1c2025-06-24 17:49:42 +05301559 if err != nil {
1560 var ticker *time.Ticker
1561
1562 // Log the initial failure and proceed to the retry mechanism
1563 logger.Warnw(ctx, "Initial TechProfileInstance API call failed, entering retry mechanism", log.Fields{
1564 "tp-id": tpID, "tpPath": tpPath, "uni-id": uniID, "device-id": oo.deviceID, "err": err,
1565 })
1566 // Retry logic
1567 /*
1568 We are retrying here because the OLT adapter may not have been up and reachable
1569 at the time of the initial attempt. This prevents the ONU adapter from fetching
1570 the TechProfile.
1571
1572 This issue might occur when both the ONU and OLT adapters are restarted simultaneously,
1573 causing a temporary mismatch in their availability. The retry logic ensures that
1574 the ONU adapter periodically attempts to fetch the TechProfile, allowing time for the
1575 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
1576 process from failing prematurely due to transient unavailability of the OLT adapter.
1577 */
1578
1579 for tpRetryAttempt := initialRetryAttempt; tpRetryAttempt <= maxRetries; tpRetryAttempt++ {
1580 ticker = time.NewTicker(retryDelay)
1581 select {
1582 case _, ok := <-oo.baseDeviceHandler.GetDeviceDeleteCommChan(ctx):
1583 if !ok {
1584 logger.Warnw(ctx, "Device deletion channel closed - aborting retry", log.Fields{"device-id": oo.deviceID})
1585 ticker.Stop()
1586 return false
1587 }
1588 case <-ticker.C:
1589 iaTechTpInst, err = oo.baseDeviceHandler.GetTechProfileInstanceFromParentAdapter(ctx, uniID, tpPath)
1590 if err != nil {
1591 logger.Warnw(ctx, "TechProfileInstance API will be retried", log.Fields{
1592 "tp-id": tpID, "tpPath": tpPath, "uni-id": uniID,
1593 "device-id": oo.deviceID, "err": err, "retry": tpRetryAttempt,
1594 "totalRetries": maxRetries,
1595 })
1596 continue
1597 }
1598
1599 logger.Info(ctx, "Successfully retrieved TechProfileInstance after retry", log.Fields{
1600 "retry": tpRetryAttempt, "device-id": oo.deviceID,
1601 })
1602 }
1603 if err == nil {
1604 break // Exit the retry loop upon success
1605 }
1606
1607 }
1608 }
Holger Hildebrandt80f57762022-02-16 10:03:24 +00001609 if err == nil && iaTechTpInst != nil {
1610 logger.Debugw(ctx, "reconciling - store Tp instance", log.Fields{"uniID": uniID, "tpID": tpID,
1611 "*iaTechTpInst": iaTechTpInst, "device-id": oo.deviceID})
1612 oo.ReconciledTpInstances[uniID][tpID] = *iaTechTpInst
1613 } else {
1614 // During the absence of the ONU adapter there seem to have been TP specific configurations!
1615 // The no longer available TP and the associated flows must be deleted from the ONU KV store
1616 // and after a MIB reset a new reconciling attempt with OMCI configuration must be started.
1617 allTpInstPresent = false
1618 logger.Infow(ctx, "reconciling - can't get tp instance - delete tp and associated flows",
1619 log.Fields{"tp-id": tpID, "tpPath": tpPath, "uni-id": uniID, "device-id": oo.deviceID, "err": err})
1620 delete(oo.SOnuPersistentData.PersUniConfig[indexUni].PersTpPathMap, tpID)
1621 flowSlice := oo.SOnuPersistentData.PersUniConfig[indexUni].PersFlowParams
1622 for indexFlow, flowData := range flowSlice {
1623 if flowData.VlanRuleParams.TpID == tpID {
1624 if len(flowSlice) == 1 {
1625 flowSlice = []cmn.UniVlanFlowParams{}
1626 } else {
1627 flowSlice = append(flowSlice[:indexFlow], flowSlice[indexFlow+1:]...)
1628 }
1629 oo.SOnuPersistentData.PersUniConfig[indexUni].PersFlowParams = flowSlice
1630 }
1631 }
1632 }
1633 }
1634 }
1635 }
1636 oo.MutexReconciledTpInstances.Unlock()
1637 oo.MutexPersOnuConfig.Unlock()
1638 return allTpInstPresent
1639}
1640
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05301641// CancelProcessing terminates potentially running reconciling processes and stops the FSM
Holger Hildebrandtb4563ab2021-04-14 10:27:20 +00001642func (oo *OnuDeviceEntry) CancelProcessing(ctx context.Context) {
Holger Hildebrandt12609a12022-03-25 13:23:25 +00001643 logger.Debugw(ctx, "CancelProcessing entered", log.Fields{"device-id": oo.deviceID})
mpagenko101ac942021-11-16 15:01:29 +00001644 if oo.isReconcilingFlows() {
Holger Hildebrandtf2fcdd42021-12-15 11:42:19 +00001645 oo.SendChReconcilingFlowsFinished(ctx, false)
Holger Hildebrandtb4563ab2021-04-14 10:27:20 +00001646 }
1647 //the MibSync FSM might be active all the ONU-active time,
1648 // hence it must be stopped unconditionally
Girish Gowdra37c9d912022-02-08 16:24:57 -08001649 oo.mutexMibSyncMsgProcessorRunning.RLock()
1650 defer oo.mutexMibSyncMsgProcessorRunning.RUnlock()
1651 if oo.mibSyncMsgProcessorRunning {
1652 pMibUlFsm := oo.PMibUploadFsm
1653 if pMibUlFsm != nil {
1654 // abort running message processing
1655 fsmAbortMsg := cmn.Message{
1656 Type: cmn.TestMsg,
1657 Data: cmn.TestMessage{
1658 TestMessageVal: cmn.AbortMessageProcessing,
1659 },
1660 }
1661 pMibUlFsm.CommChan <- fsmAbortMsg
1662 _ = pMibUlFsm.PFsm.Event(UlEvStop)
Holger Hildebrandte7cc6092022-02-01 11:37:03 +00001663 }
Holger Hildebrandtb4563ab2021-04-14 10:27:20 +00001664 }
1665}
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301666
1667// Updates Serial Number and MAC Address in the database
1668func (oo *OnuDeviceEntry) updateOnuSpecificEntries(ctx context.Context) {
1669 knownAttributeMEDb := oo.pOnuDB.CommonMeDb.MeDb
1670
1671 for firstLevelKey, firstLevelValue := range knownAttributeMEDb {
1672 classID := strconv.Itoa(int(firstLevelKey))
1673
1674 for secondLevelKey, secondLevelValue := range firstLevelValue {
1675 switch classID {
1676 case "6", "256":
1677 oo.updateAttribute(ctx, "SerialNumber", secondLevelValue, firstLevelKey, secondLevelKey, oo.SOnuPersistentData.PersSerialNumber)
1678 case "134":
1679 oo.updateAttribute(ctx, "MacAddress", secondLevelValue, firstLevelKey, secondLevelKey, oo.SOnuPersistentData.PersMacAddress)
1680 }
1681 }
1682 }
1683}
1684
1685// Updates a specific attribute in the MIB database
1686func (oo *OnuDeviceEntry) updateAttribute(ctx context.Context, attributeName string, attributesMap me.AttributeValueMap, classID me.ClassID, entityID uint16, newValue interface{}) {
1687 if _, exists := attributesMap[attributeName]; exists {
1688 logger.Infow(ctx, "Updating "+attributeName, log.Fields{"classID": strconv.Itoa(int(classID)), "oldValue": attributesMap[attributeName], "newValue": newValue})
1689 attributeCopy := make(me.AttributeValueMap)
1690 for k, v := range attributesMap {
1691 attributeCopy[k] = v
1692 }
1693 attributeCopy[attributeName] = newValue
1694 oo.pOnuDB.PutOnuSpeficMe(ctx, classID, entityID, attributeCopy)
1695 } else {
1696 logger.Warnw(ctx, attributeName+" key not found", log.Fields{"classID": strconv.Itoa(int(classID))})
1697 }
1698}
1699
1700// Processes the MIB template by replacing tokens and unmarshaling it
1701func (oo *OnuDeviceEntry) processMibTemplate(ctx context.Context, value *kvstore.KVPair) {
1702 mibTmpString, _ := kvstore.ToString(value.Value)
1703 mibTmpString2 := strings.ReplaceAll(mibTmpString, "\x00", "")
1704 mibTmpBytes := []byte(mibTmpString2)
1705
1706 logger.Debugf(ctx, "MibSync FSM - Mib template tokens swapped out: %s", mibTmpBytes)
1707
1708 var firstLevelMap map[string]interface{}
1709 if err := json.Unmarshal(mibTmpBytes, &firstLevelMap); err != nil {
1710 logger.Errorw(ctx, "MibSync FSM - Failed to unmarshal template", log.Fields{"error": err, "device-id": oo.deviceID})
1711 return
1712 }
1713
1714 cmnMEDbValue, _ := oo.pOpenOnuAc.CreateEntryAtMibDatabaseMap(ctx, oo.mibTemplatePath)
1715 oo.populateMibDatabase(ctx, cmnMEDbValue, firstLevelMap)
1716 cmnMEDbValue.MIBUploadStatus = devdb.Completed
1717 oo.pOnuDB.CommonMeDb = cmnMEDbValue
1718}
1719
1720// Populates the MIB database with parsed data
1721func (oo *OnuDeviceEntry) populateMibDatabase(ctx context.Context, cmnMEDbValue *devdb.OnuCmnMEDB, firstLevelMap map[string]interface{}) {
1722 cmnMEDbValue.MeDbLock.Lock()
1723 defer cmnMEDbValue.MeDbLock.Unlock()
1724
1725 logger.Infow(ctx, "Populating MIbDatabase with the template information ", log.Fields{"device-id": oo.deviceID})
1726 for firstLevelKey, firstLevelValue := range firstLevelMap {
1727 if uint16ValidNumber, err := strconv.ParseUint(firstLevelKey, 10, 16); err == nil {
1728 meClassID := me.ClassID(uint16ValidNumber)
1729 if isSupportedClassID(meClassID) {
1730 secondLevelMap := firstLevelValue.(map[string]interface{})
1731 for secondLevelKey, secondLevelValue := range secondLevelMap {
1732 if uint16ValidNumber, err := strconv.ParseUint(secondLevelKey, 10, 16); err == nil {
1733 meEntityID := uint16(uint16ValidNumber)
1734 thirdLevelMap := secondLevelValue.(map[string]interface{})
1735 if attributes, exists := thirdLevelMap["Attributes"].(map[string]interface{}); exists {
1736 if _, found := cmnMEDbValue.MeDb[meClassID]; !found {
1737 cmnMEDbValue.MeDb[meClassID] = make(map[uint16]me.AttributeValueMap)
1738 }
1739 if _, found := cmnMEDbValue.MeDb[meClassID][meEntityID]; !found {
1740 cmnMEDbValue.MeDb[meClassID][meEntityID] = make(me.AttributeValueMap)
1741 }
1742 for attrKey, attrValue := range attributes {
1743 cmnMEDbValue.MeDb[meClassID][meEntityID][attrKey] = attrValue
1744 }
1745 }
1746
1747 }
1748 }
1749 }
1750 }
1751 }
1752}