blob: 26c0cbef0d2b7ddc1d4f83f20bfca35043308e4e [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)
bseenivab7e2ab32026-01-30 19:34:38 +0530356 oo.pOnuDB.CommonMeDb.MeDbLock.Lock()
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +0530357 fsmMsg = cmn.LoadMibTemplateFailed
Holger Hildebrandt441a0172020-12-10 13:57:08 +0000358 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000359 oo.pOpenOnuAc.UnlockMutexMibTemplateGenerated()
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +0530360
361 } else {
362 Value, err := oo.mibTemplateKVStore.Get(log.WithSpanFromContext(context.TODO(), ctx), oo.mibTemplatePath)
363 if err == nil && Value != nil {
364 logger.Infow(ctx, "No Common MIB DB instance exist , creating from Template", log.Fields{"device-id": oo.deviceID, "mibTemplatePath": oo.mibTemplatePath})
365 oo.processMibTemplate(ctx, Value)
pnalmasaad81392025-01-03 11:21:19 +0530366 fsmMsg = cmn.LoadMibTemplateOk
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +0530367 } else {
368 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})
369 oo.pOpenOnuAc.LockMutexMibTemplateGenerated()
370 cmnMEDBValue, _ := oo.pOpenOnuAc.CreateEntryAtMibDatabaseMap(ctx, oo.mibTemplatePath)
371 oo.pOnuDB.CommonMeDb = cmnMEDBValue
372 oo.pOnuDB.CommonMeDb.MeDbLock.Lock()
373 fsmMsg = cmn.LoadMibTemplateFailed
374
375 }
376
Holger Hildebrandt441a0172020-12-10 13:57:08 +0000377 }
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +0530378
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000379 mibSyncMsg := cmn.Message{
380 Type: cmn.TestMsg,
381 Data: cmn.TestMessage{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000382 TestMessageVal: fsmMsg,
383 },
384 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000385 oo.PMibUploadFsm.CommChan <- mibSyncMsg
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000386}
387
dbainbri4d3a0dc2020-12-02 00:33:42 +0000388func (oo *OnuDeviceEntry) enterUploadingState(ctx context.Context, e *fsm.Event) {
389 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 +0000390 _ = oo.PDevOmciCC.SendMibUpload(log.WithSpanFromContext(context.TODO(), ctx),
391 oo.baseDeviceHandler.GetOmciTimeout(), true, oo.GetPersIsExtOmciSupported())
mpagenko01499812021-03-25 10:37:12 +0000392 //even though lastTxParameters are currently not used for checking the ResetResponse message we have to ensure
393 // that the lastTxMessageType is correctly set to avoid misinterpreting other responses
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000394 oo.mutexLastTxParamStruct.Lock()
mpagenko01499812021-03-25 10:37:12 +0000395 oo.lastTxParamStruct.lastTxMessageType = omci.MibUploadRequestType
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000396 oo.mutexLastTxParamStruct.Unlock()
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000397}
398
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000399func (oo *OnuDeviceEntry) enterUploadDoneState(ctx context.Context, e *fsm.Event) {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000400 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 +0000401 oo.transferSystemEvent(ctx, cmn.MibDatabaseSync)
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000402 go func() {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000403 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000404 }()
405}
406
407func (oo *OnuDeviceEntry) enterInSyncState(ctx context.Context, e *fsm.Event) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000408 oo.MutexPersOnuConfig.Lock()
409 oo.SOnuPersistentData.PersMibLastDbSync = uint32(time.Now().Unix())
410 oo.MutexPersOnuConfig.Unlock()
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000411 if oo.mibAuditInterval > 0 {
412 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 +0000413 go func() {
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000414 time.Sleep(oo.mibAuditInterval)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000415 if err := oo.PMibUploadFsm.PFsm.Event(UlEvAuditMib); err != nil {
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000416 logger.Debugw(ctx, "MibSyncFsm: Can't go to state auditing", log.Fields{"device-id": oo.deviceID, "err": err})
417 }
418 }()
419 }
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000420}
421
Holger Hildebrandt9afc1582021-11-30 16:10:19 +0000422func (oo *OnuDeviceEntry) enterVerifyingAndStoringTPsState(ctx context.Context, e *fsm.Event) {
423 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start verifying and storing TPs in State": e.FSM.Current(), "device-id": oo.deviceID})
424
Holger Hildebrandt80f57762022-02-16 10:03:24 +0000425 if oo.getAllStoredTpInstFromParentAdapter(ctx) {
Holger Hildebrandt9afc1582021-11-30 16:10:19 +0000426 logger.Debugw(ctx, "MibSync FSM", log.Fields{"reconciling - verifying TPs successful": e.FSM.Current(), "device-id": oo.deviceID})
427 go func() {
428 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
429 }()
430 } else {
431 logger.Debugw(ctx, "MibSync FSM", log.Fields{"reconciling - verifying TPs not successful": e.FSM.Current(), "device-id": oo.deviceID})
432 oo.baseDeviceHandler.SetReconcilingReasonUpdate(true)
433 go func() {
434 if err := oo.baseDeviceHandler.StorePersistentData(ctx); err != nil {
435 logger.Warnw(ctx, "reconciling - store persistent data error - continue for now as there will be additional write attempts",
436 log.Fields{"device-id": oo.deviceID, "err": err})
437 }
438 _ = oo.PMibUploadFsm.PFsm.Event(UlEvMismatch)
439 }()
440 }
441}
442
dbainbri4d3a0dc2020-12-02 00:33:42 +0000443func (oo *OnuDeviceEntry) enterExaminingMdsState(ctx context.Context, e *fsm.Event) {
444 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 +0530445 oo.pOpenOnuAc.RLockMutexDeviceHandlersMap()
446 dh, _ := oo.pOpenOnuAc.GetDeviceHandler(oo.deviceID)
447 oo.pOpenOnuAc.RUnlockMutexDeviceHandlersMap()
448 if dh.GetSkipOnuConfigEnabled() {
449 go func() {
450 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
451 }()
452 } else {
453 oo.requestMdsValue(ctx)
454 }
455
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000456}
457
dbainbri4d3a0dc2020-12-02 00:33:42 +0000458func (oo *OnuDeviceEntry) enterResynchronizingState(ctx context.Context, e *fsm.Event) {
459 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start MibResync processing in State": e.FSM.Current(), "device-id": oo.deviceID})
460 logger.Debug(ctx, "function not implemented yet")
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000461 // TODOs:
462 // VOL-3805 - Provide exclusive OMCI channel for one FSM
463 // VOL-3785 - New event notifications and corresponding performance counters for openonu-adapter-go
464 // VOL-3792 - Support periodical audit via mib resync
465 // VOL-3793 - ONU-reconcile handling after adapter restart based on mib resync
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000466}
467
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000468func (oo *OnuDeviceEntry) enterExaminingMdsSuccessState(ctx context.Context, e *fsm.Event) {
469 logger.Debugw(ctx, "MibSync FSM",
470 log.Fields{"Start processing on examining MDS success in State": e.FSM.Current(), "device-id": oo.deviceID})
471
472 if oo.getMibFromTemplate(ctx) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000473 oo.baseDeviceHandler.StartReconciling(ctx, true)
474 oo.baseDeviceHandler.AddAllUniPorts(ctx)
Holger Hildebrandt9afc1582021-11-30 16:10:19 +0000475 _ = oo.baseDeviceHandler.ReasonUpdate(ctx, cmn.DrInitialMibDownloaded, oo.baseDeviceHandler.IsReconcilingReasonUpdate())
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000476 oo.baseDeviceHandler.SetReadyForOmciConfig(true)
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000477
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000478 if !oo.baseDeviceHandler.GetCollectorIsRunning() {
Girish Gowdraf7d82d02022-04-26 16:18:35 -0700479 var waitForOmciProcess sync.WaitGroup
480 waitForOmciProcess.Add(1)
Holger Hildebrandtced74e72021-06-10 14:55:53 +0000481 // Start PM collector routine
Girish Gowdraf7d82d02022-04-26 16:18:35 -0700482 go oo.baseDeviceHandler.StartCollector(ctx, &waitForOmciProcess)
483 waitForOmciProcess.Wait()
Holger Hildebrandtced74e72021-06-10 14:55:53 +0000484 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000485 if !oo.baseDeviceHandler.GetAlarmManagerIsRunning(ctx) {
486 go oo.baseDeviceHandler.StartAlarmManager(ctx)
Holger Hildebrandtced74e72021-06-10 14:55:53 +0000487 }
Girish Gowdrae95687a2021-09-08 16:30:58 -0700488
489 for _, uniPort := range *oo.baseDeviceHandler.GetUniEntityMap() {
490 // only if this port was enabled for use by the operator at startup
491 if (1<<uniPort.UniID)&oo.baseDeviceHandler.GetUniPortMask() == (1 << uniPort.UniID) {
492 if !oo.baseDeviceHandler.GetFlowMonitoringIsRunning(uniPort.UniID) {
493 go oo.baseDeviceHandler.PerOnuFlowHandlerRoutine(uniPort.UniID)
494 }
495 }
496 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000497 oo.MutexPersOnuConfig.RLock()
498 if oo.SOnuPersistentData.PersUniDisableDone {
499 oo.MutexPersOnuConfig.RUnlock()
500 oo.baseDeviceHandler.DisableUniPortStateUpdate(ctx)
Holger Hildebrandt9afc1582021-11-30 16:10:19 +0000501 _ = oo.baseDeviceHandler.ReasonUpdate(ctx, cmn.DrOmciAdminLock, oo.baseDeviceHandler.IsReconcilingReasonUpdate())
Holger Hildebrandtbdc5f002021-04-19 14:46:21 +0000502 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000503 oo.MutexPersOnuConfig.RUnlock()
504 oo.baseDeviceHandler.EnableUniPortStateUpdate(ctx)
Holger Hildebrandtbdc5f002021-04-19 14:46:21 +0000505 }
Holger Hildebrandtb314f442021-11-24 12:03:10 +0000506
507 // no need to reconcile additional data for MibDownloadFsm, LockStateFsm, or UnlockStateFsm
508
Sridhar Ravindraa9cb0442025-07-21 16:55:05 +0530509 // During reboot, if the adapter restarted while configuring TP or flows, we need to continue with flow configurations now.
510 // Set the mibUpload FSM as success and proceed with flow configs
511 oo.MutexPersOnuConfig.RLock()
512 if oo.SOnuPersistentData.PersRebootInProgress {
513 oo.MutexPersOnuConfig.RUnlock()
514 logger.Debugw(ctx, "Set mib upload as success before proceeding with flow configuration", log.Fields{"device-id": oo.deviceID})
515 go func() {
516 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
517 if oo.baseDeviceHandler.CheckForDeviceTechProf(ctx) {
518 oo.baseDeviceHandler.DeviceFlowConfigOnReboot(ctx)
Holger Hildebrandtb314f442021-11-24 12:03:10 +0000519 }
Sridhar Ravindraa9cb0442025-07-21 16:55:05 +0530520 }()
521 } else {
522 oo.MutexPersOnuConfig.RUnlock()
523 if oo.baseDeviceHandler.ReconcileDeviceTechProf(ctx) {
524 // start go routine with select() on reconciling flow channel before
525 // starting flow reconciling process to prevent loss of any signal
526 syncChannel := make(chan struct{})
527 go func(aSyncChannel chan struct{}) {
528 // In multi-ONU/multi-flow environment stopping reconcilement has to be delayed until
529 // we get a signal that the processing of the last step to rebuild the adapter internal
530 // flow data is finished.
531 expiry := oo.baseDeviceHandler.GetReconcileExpiryVlanConfigAbort()
532 oo.setReconcilingFlows(true)
533 aSyncChannel <- struct{}{}
534 select {
535 case success := <-oo.chReconcilingFlowsFinished:
536 if success {
537 logger.Debugw(ctx, "reconciling flows has been finished in time",
538 log.Fields{"device-id": oo.deviceID})
539 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
540
541 } else {
542 logger.Debugw(ctx, "wait for reconciling flows aborted",
543 log.Fields{"device-id": oo.deviceID})
544 }
545 case <-time.After(expiry):
546 logger.Errorw(ctx, "timeout waiting for reconciling flows to be finished!",
547 log.Fields{"device-id": oo.deviceID, "expiry": expiry})
548 _ = oo.PMibUploadFsm.PFsm.Event(UlEvMismatch)
549 }
550 oo.setReconcilingFlows(false)
551 }(syncChannel)
552 // block further processing until the above Go routine has really started
553 // and is ready to receive values from chReconcilingFlowsFinished
554 <-syncChannel
555 oo.baseDeviceHandler.ReconcileDeviceFlowConfig(ctx)
556 }
Holger Hildebrandtb314f442021-11-24 12:03:10 +0000557 }
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000558 } else {
559 logger.Debugw(ctx, "MibSync FSM",
560 log.Fields{"Getting MIB from template not successful": e.FSM.Current(), "device-id": oo.deviceID})
561 go func() {
562 //switch to reconciling with OMCI config
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000563 _ = oo.PMibUploadFsm.PFsm.Event(UlEvMismatch)
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000564 }()
565 }
566}
567
dbainbri4d3a0dc2020-12-02 00:33:42 +0000568func (oo *OnuDeviceEntry) enterAuditingState(ctx context.Context, e *fsm.Event) {
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000569 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 +0000570 if oo.baseDeviceHandler.CheckAuditStartCondition(ctx, cmn.CUploadFsm) {
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000571 oo.requestMdsValue(ctx)
572 } else {
mpagenkof1fc3862021-02-16 10:09:52 +0000573 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 +0000574 go func() {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000575 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000576 }()
577 }
578}
579
580func (oo *OnuDeviceEntry) enterReAuditingState(ctx context.Context, e *fsm.Event) {
581 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 +0000582 if oo.baseDeviceHandler.CheckAuditStartCondition(ctx, cmn.CUploadFsm) {
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000583 oo.requestMdsValue(ctx)
584 } else {
mpagenkof1fc3862021-02-16 10:09:52 +0000585 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 +0000586 go func() {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000587 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000588 }()
589 }
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000590}
591
dbainbri4d3a0dc2020-12-02 00:33:42 +0000592func (oo *OnuDeviceEntry) enterOutOfSyncState(ctx context.Context, e *fsm.Event) {
593 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start MibReconcile processing in State": e.FSM.Current(), "device-id": oo.deviceID})
594 logger.Debug(ctx, "function not implemented yet")
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000595}
596
dbainbri4d3a0dc2020-12-02 00:33:42 +0000597func (oo *OnuDeviceEntry) processMibSyncMessages(ctx context.Context) {
598 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 -0800599 oo.mutexMibSyncMsgProcessorRunning.Lock()
600 oo.mibSyncMsgProcessorRunning = true
601 oo.mutexMibSyncMsgProcessorRunning.Unlock()
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000602loop:
603 for {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000604 // case <-ctx.Done():
605 // logger.Info("MibSync Msg", log.Fields{"Message handling canceled via context for device-id": onuDeviceEntry.deviceID})
606 // break loop
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000607 message, ok := <-oo.PMibUploadFsm.CommChan
Himani Chawla4d908332020-08-31 12:30:20 +0530608 if !ok {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000609 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 -0800610 oo.mutexMibSyncMsgProcessorRunning.Lock()
611 oo.mibSyncMsgProcessorRunning = false
612 oo.mutexMibSyncMsgProcessorRunning.Unlock()
Himani Chawla4d908332020-08-31 12:30:20 +0530613 break loop
614 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000615 logger.Debugw(ctx, "MibSync Msg", log.Fields{"Received message on ONU MibSyncChan for device-id": oo.deviceID})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000616
Himani Chawla4d908332020-08-31 12:30:20 +0530617 switch message.Type {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000618 case cmn.TestMsg:
619 msg, _ := message.Data.(cmn.TestMessage)
Holger Hildebrandte7cc6092022-02-01 11:37:03 +0000620 if msg.TestMessageVal == cmn.AbortMessageProcessing {
621 logger.Debugw(ctx, "MibSync Msg abort ProcessMsg", log.Fields{"for device-id": oo.deviceID})
Girish Gowdra37c9d912022-02-08 16:24:57 -0800622 oo.mutexMibSyncMsgProcessorRunning.Lock()
623 oo.mibSyncMsgProcessorRunning = false
624 oo.mutexMibSyncMsgProcessorRunning.Unlock()
Holger Hildebrandte7cc6092022-02-01 11:37:03 +0000625 break loop
626 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000627 oo.handleTestMsg(ctx, msg)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000628 case cmn.OMCI:
629 msg, _ := message.Data.(cmn.OmciMessage)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000630 oo.handleOmciMessage(ctx, msg)
Himani Chawla4d908332020-08-31 12:30:20 +0530631 default:
dbainbri4d3a0dc2020-12-02 00:33:42 +0000632 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 +0000633 }
634 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000635 logger.Info(ctx, "MibSync Msg", log.Fields{"Stopped handling of MibSyncChan for device-id": oo.deviceID})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000636 // TODO: only this action?
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000637 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000638}
639
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000640func (oo *OnuDeviceEntry) handleTestMsg(ctx context.Context, msg cmn.TestMessage) {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000641
dbainbri4d3a0dc2020-12-02 00:33:42 +0000642 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 +0000643
644 switch msg.TestMessageVal {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000645 case cmn.LoadMibTemplateFailed:
646 _ = oo.PMibUploadFsm.PFsm.Event(UlEvUploadMib)
647 logger.Debugw(ctx, "MibSync Msg", log.Fields{"state": string(oo.PMibUploadFsm.PFsm.Current())})
648 case cmn.LoadMibTemplateOk:
649 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
650 logger.Debugw(ctx, "MibSync Msg", log.Fields{"state": string(oo.PMibUploadFsm.PFsm.Current())})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000651 default:
dbainbri4d3a0dc2020-12-02 00:33:42 +0000652 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 +0000653 }
654}
655
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000656func (oo *OnuDeviceEntry) handleOmciMibResetResponseMessage(ctx context.Context, msg cmn.OmciMessage) {
657 if oo.PMibUploadFsm.PFsm.Is(UlStResettingMib) {
Himani Chawla4d908332020-08-31 12:30:20 +0530658 msgLayer := (*msg.OmciPacket).Layer(omci.LayerTypeMibResetResponse)
659 if msgLayer != nil {
660 msgObj, msgOk := msgLayer.(*omci.MibResetResponse)
661 if msgOk {
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530662 logger.Infow(ctx, "MibResetResponse Data", log.Fields{"data-fields": msgObj})
Himani Chawla4d908332020-08-31 12:30:20 +0530663 if msgObj.Result == me.Success {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000664 oo.MutexPersOnuConfig.Lock()
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000665 oo.SOnuPersistentData.PersMibDataSyncAdpt = cmn.MdsDefaultMib
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000666 oo.MutexPersOnuConfig.Unlock()
Holger Hildebrandt7e138462023-03-29 12:12:14 +0000667 oo.PDevOmciCC.ResetConfFailMEs()
Himani Chawla4d908332020-08-31 12:30:20 +0530668 // trigger retrieval of VendorId and SerialNumber
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000669 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetVendorAndSerial)
Himani Chawla4d908332020-08-31 12:30:20 +0530670 return
671 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000672 logger.Errorw(ctx, "Omci MibResetResponse Error", log.Fields{"device-id": oo.deviceID, "Error": msgObj.Result})
Himani Chawla4d908332020-08-31 12:30:20 +0530673 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000674 logger.Errorw(ctx, "Omci Msg layer could not be assigned", log.Fields{"device-id": oo.deviceID})
Himani Chawla4d908332020-08-31 12:30:20 +0530675 }
676 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000677 logger.Errorw(ctx, "Omci Msg layer could not be detected", log.Fields{"device-id": oo.deviceID})
Himani Chawla4d908332020-08-31 12:30:20 +0530678 }
679 } else {
mpagenko01499812021-03-25 10:37:12 +0000680 //in case the last request was MdsGetRequest this issue may appear if the ONU was online before and has received the MIB reset
681 // with Sequence number 0x8000 as last request before - so it may still respond to that
682 // 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 +0000683 oo.mutexLastTxParamStruct.Lock()
mpagenko01499812021-03-25 10:37:12 +0000684 if oo.lastTxParamStruct.lastTxMessageType == omci.GetRequestType && oo.lastTxParamStruct.repeatCount == 0 {
685 logger.Debugw(ctx, "MibSync FSM - repeat MdsGetRequest (updated SequenceNumber)", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +0000686 requestedAttributes := me.AttributeValueMap{me.OnuData_MibDataSync: ""}
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000687 _, err := oo.PDevOmciCC.SendGetMe(log.WithSpanFromContext(context.TODO(), ctx),
Holger Hildebrandtd930cb22022-06-17 09:24:50 +0000688 me.OnuDataClassID, cmn.OnuDataMeID, requestedAttributes, oo.baseDeviceHandler.GetOmciTimeout(), true, oo.PMibUploadFsm.CommChan, false)
ozgecanetsiab36ed572021-04-01 10:38:48 +0300689 if err != nil {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000690 oo.mutexLastTxParamStruct.Unlock()
ozgecanetsiab36ed572021-04-01 10:38:48 +0300691 logger.Errorw(ctx, "ONUData get failed, aborting MibSync", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000692 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
ozgecanetsiab36ed572021-04-01 10:38:48 +0300693 return
694 }
mpagenko01499812021-03-25 10:37:12 +0000695 //TODO: needs extra handling of timeouts
696 oo.lastTxParamStruct.repeatCount = 1
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000697 oo.mutexLastTxParamStruct.Unlock()
mpagenko01499812021-03-25 10:37:12 +0000698 return
699 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000700 oo.mutexLastTxParamStruct.Unlock()
mpagenko01499812021-03-25 10:37:12 +0000701 logger.Errorw(ctx, "unexpected MibResetResponse - ignoring", log.Fields{"device-id": oo.deviceID})
702 //perhaps some still lingering message from some prior activity, let's wait for the real response
703 return
Himani Chawla4d908332020-08-31 12:30:20 +0530704 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000705 logger.Info(ctx, "MibSync Msg", log.Fields{"Stopped handling of MibSyncChan for device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000706 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Himani Chawla4d908332020-08-31 12:30:20 +0530707}
708
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000709func (oo *OnuDeviceEntry) handleOmciMibUploadResponseMessage(ctx context.Context, msg cmn.OmciMessage) {
Himani Chawla4d908332020-08-31 12:30:20 +0530710 msgLayer := (*msg.OmciPacket).Layer(omci.LayerTypeMibUploadResponse)
711 if msgLayer == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000712 logger.Errorw(ctx, "Omci Msg layer could not be detected", log.Fields{"device-id": oo.deviceID})
Himani Chawla4d908332020-08-31 12:30:20 +0530713 return
714 }
715 msgObj, msgOk := msgLayer.(*omci.MibUploadResponse)
716 if !msgOk {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000717 logger.Errorw(ctx, "Omci Msg layer could not be assigned", log.Fields{"device-id": oo.deviceID})
Himani Chawla4d908332020-08-31 12:30:20 +0530718 return
719 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000720 logger.Debugw(ctx, "MibUploadResponse Data for:", log.Fields{"device-id": oo.deviceID, "data-fields": msgObj})
Himani Chawla4d908332020-08-31 12:30:20 +0530721 /* to be verified / reworked !!! */
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000722 oo.PDevOmciCC.UploadNoOfCmds = msgObj.NumberOfCommands
723 if oo.PDevOmciCC.UploadSequNo < oo.PDevOmciCC.UploadNoOfCmds {
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000724 _ = oo.PDevOmciCC.SendMibUploadNext(log.WithSpanFromContext(context.TODO(), ctx),
725 oo.baseDeviceHandler.GetOmciTimeout(), true, oo.GetPersIsExtOmciSupported())
mpagenko01499812021-03-25 10:37:12 +0000726 //even though lastTxParameters are currently not used for checking the ResetResponse message we have to ensure
727 // that the lastTxMessageType is correctly set to avoid misinterpreting other responses
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000728 oo.mutexLastTxParamStruct.Lock()
mpagenko01499812021-03-25 10:37:12 +0000729 oo.lastTxParamStruct.lastTxMessageType = omci.MibUploadNextRequestType
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000730 oo.mutexLastTxParamStruct.Unlock()
Himani Chawla4d908332020-08-31 12:30:20 +0530731 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000732 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 +0530733 //TODO right action?
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000734 _ = oo.PMibUploadFsm.PFsm.Event(UlEvTimeout)
Himani Chawla4d908332020-08-31 12:30:20 +0530735 }
736}
737
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000738func (oo *OnuDeviceEntry) handleOmciMibUploadNextResponseMessage(ctx context.Context, msg cmn.OmciMessage) {
Himani Chawla4d908332020-08-31 12:30:20 +0530739 msgLayer := (*msg.OmciPacket).Layer(omci.LayerTypeMibUploadNextResponse)
mpagenko7033f4e2021-11-19 18:04:22 +0000740 if msgLayer != nil {
741 msgObj, msgOk := msgLayer.(*omci.MibUploadNextResponse)
742 if !msgOk {
743 logger.Errorw(ctx, "Omci Msg layer could not be assigned", log.Fields{"device-id": oo.deviceID})
744 return
mpagenko836a1fd2021-11-01 16:12:42 +0000745 }
mpagenko7033f4e2021-11-19 18:04:22 +0000746 meName := msgObj.ReportedME.GetName()
747 meClassID := msgObj.ReportedME.GetClassID()
748 meEntityID := msgObj.ReportedME.GetEntityID()
749
750 logger.Debugw(ctx, "MibUploadNextResponse Data for:", log.Fields{"device-id": oo.deviceID, "meName": meName, "data-fields": msgObj})
751
752 if meName == devdb.CUnknownItuG988ManagedEntity || meName == devdb.CUnknownVendorSpecificManagedEntity {
Holger Hildebrandt39080022022-03-16 10:03:17 +0000753 logger.Debugw(ctx, "MibUploadNextResponse contains unknown ME", log.Fields{"device-id": oo.deviceID,
754 "Me-Name": devdb.UnknownMeOrAttribName(meName), "Me-ClassId": meClassID, "Me-InstId": meEntityID,
mgoudad611f4c2025-10-30 14:49:27 +0530755 "unknown mask": msgObj.ReportedME.GetAttributeMask(), "unknown attributes": msgObj.Payload})
Holger Hildebrandt39080022022-03-16 10:03:17 +0000756 oo.pOnuDB.PutUnknownMeOrAttrib(ctx, devdb.UnknownMeOrAttribName(meName), meClassID, meEntityID,
mgoudad611f4c2025-10-30 14:49:27 +0530757 msgObj.ReportedME.GetAttributeMask(), msgObj.Payload[devdb.CStartUnknownMeAttribsInBaseLayerPayload:])
mpagenko7033f4e2021-11-19 18:04:22 +0000758 } else {
759 //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
760 if unknownAttrLayer := (*msg.OmciPacket).Layer(omci.LayerTypeUnknownAttributes); unknownAttrLayer != nil {
761 logger.Warnw(ctx, "MibUploadNextResponse contains unknown attributes", log.Fields{"device-id": oo.deviceID})
762 if unknownAttributes, ok := unknownAttrLayer.(*omci.UnknownAttributes); ok {
763 // provide a loop over several ME's here already in preparation of OMCI extended message format
764 for _, unknown := range unknownAttributes.Attributes {
765 unknownAttrClassID := unknown.EntityClass // ClassID
766 unknownAttrInst := unknown.EntityInstance // uint16
767 unknownAttrMask := unknown.AttributeMask // ui
768 unknownAttrBlob := unknown.AttributeData // []byte
769 logger.Warnw(ctx, "unknown attributes detected for", log.Fields{"device-id": oo.deviceID,
770 "Me-ClassId": unknownAttrClassID, "Me-InstId": unknownAttrInst, "unknown mask": unknownAttrMask,
771 "unknown attributes": unknownAttrBlob})
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000772 oo.pOnuDB.PutUnknownMeOrAttrib(ctx, devdb.CUnknownAttributesManagedEntity, unknown.EntityClass, unknown.EntityInstance,
773 unknown.AttributeMask, unknown.AttributeData)
mpagenko7033f4e2021-11-19 18:04:22 +0000774 } // for all included ME's with unknown attributes
775 } else {
776 logger.Errorw(ctx, "unknownAttrLayer could not be decoded", log.Fields{"device-id": oo.deviceID})
777 }
778 }
779 oo.pOnuDB.PutMe(ctx, meClassID, meEntityID, msgObj.ReportedME.GetAttributeValueMap())
780 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000781 if msg.OmciMsg.DeviceIdentifier == omci.ExtendedIdent {
782 for _, additionalME := range msgObj.AdditionalMEs {
783 meName := additionalME.GetName()
784 meClassID := additionalME.GetClassID()
785 meEntityID := additionalME.GetEntityID()
786 attributes := additionalME.GetAttributeValueMap()
787
788 if meName == devdb.CUnknownItuG988ManagedEntity || meName == devdb.CUnknownVendorSpecificManagedEntity {
789 attribMask := additionalME.GetAttributeMask()
790 logger.Debugw(ctx, "MibUploadNextResponse AdditionalData contains unknown ME", log.Fields{"device-id": oo.deviceID,
791 "Me-Name": devdb.UnknownMeOrAttribName(meName), "Me-ClassId": meClassID, "Me-InstId": meEntityID,
792 "unknown mask": attribMask})
793
794 attribValues := make([]byte, 0)
795 for key, value := range attributes {
796 if key != cmn.CGenericManagedEntityIDName {
797 data, err := me.InterfaceToOctets(value)
798 if err != nil {
799 logger.Infow(ctx, "MibUploadNextResponse unknown ME AdditionalData attrib - could not decode", log.Fields{"device-id": oo.deviceID, "key": key})
800 } else {
801 attribValues = append(attribValues[:], data[:]...)
802 logger.Debugw(ctx, "MibUploadNextResponse unknown ME AdditionalData attrib", log.Fields{"device-id": oo.deviceID, "attribValues": attribValues, "data": data, "key": key})
803 }
804 }
805 }
806 oo.pOnuDB.PutUnknownMeOrAttrib(ctx, devdb.UnknownMeOrAttribName(meName), meClassID, meEntityID, attribMask, attribValues)
807 } else {
808 logger.Debugw(ctx, "MibUploadNextResponse AdditionalData for:", log.Fields{"device-id": oo.deviceID, "meName": meName, "meEntityID": meEntityID, "attributes": attributes})
809 oo.pOnuDB.PutMe(ctx, meClassID, meEntityID, attributes)
810 }
811 }
812 }
mpagenko7033f4e2021-11-19 18:04:22 +0000813 } else {
814 logger.Errorw(ctx, "Omci Msg layer could not be detected", log.Fields{"device-id": oo.deviceID})
815 //as long as omci-lib does not support decoding of table attribute as 'unknown/unspecified' attribute
816 // we have to verify, if this failure is from table attribute and try to go forward with ignoring the complete message
817 errLayer := (*msg.OmciPacket).Layer(gopacket.LayerTypeDecodeFailure)
818 if failure, decodeOk := errLayer.(*gopacket.DecodeFailure); decodeOk {
819 errMsg := failure.String()
820 if !strings.Contains(strings.ToLower(errMsg), "table decode") {
821 //something still unexected happened, needs deeper investigation - stop complete MIB upload process (timeout)
822 return
823 }
824 logger.Warnw(ctx, "Decode issue on received MibUploadNextResponse frame - found table attribute(s) (message ignored)",
825 log.Fields{"device-id": oo.deviceID, "issue": errMsg})
826 }
Himani Chawla4d908332020-08-31 12:30:20 +0530827 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000828 if oo.PDevOmciCC.UploadSequNo < oo.PDevOmciCC.UploadNoOfCmds {
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000829 _ = oo.PDevOmciCC.SendMibUploadNext(log.WithSpanFromContext(context.TODO(), ctx),
830 oo.baseDeviceHandler.GetOmciTimeout(), true, oo.GetPersIsExtOmciSupported())
mpagenko01499812021-03-25 10:37:12 +0000831 //even though lastTxParameters are currently not used for checking the ResetResponse message we have to ensure
832 // that the lastTxMessageType is correctly set to avoid misinterpreting other responses
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000833 oo.mutexLastTxParamStruct.Lock()
mpagenko01499812021-03-25 10:37:12 +0000834 oo.lastTxParamStruct.lastTxMessageType = omci.MibUploadNextRequestType
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000835 oo.mutexLastTxParamStruct.Unlock()
Himani Chawla4d908332020-08-31 12:30:20 +0530836 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000837 err := oo.createAndPersistMibTemplate(ctx)
Himani Chawla4d908332020-08-31 12:30:20 +0530838 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000839 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 +0530840 }
841
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +0530842 oo.updateOnuSpecificEntries(ctx)
843 logger.Errorw(ctx, "MibSync - Updtaed the ONU Specific MEs ", log.Fields{"device-id": oo.deviceID})
844
845 cmnMEDB, _ := oo.pOpenOnuAc.FetchEntryFromMibDatabaseMap(ctx, oo.mibTemplatePath)
846 cmnMEDB.MIBUploadStatus = devdb.Completed
847 oo.pOnuDB.CommonMeDb.MeDbLock.Unlock()
848 oo.pOpenOnuAc.SetMibTemplatesGenerated(oo.mibTemplatePath, true)
849 oo.pOpenOnuAc.UnlockMutexMibTemplateGenerated()
850
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000851 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Himani Chawla4d908332020-08-31 12:30:20 +0530852 }
853}
854
Girish Gowdra21bbf052022-02-17 16:08:22 -0800855// nolint: gocyclo
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000856func (oo *OnuDeviceEntry) handleOmciGetResponseMessage(ctx context.Context, msg cmn.OmciMessage) error {
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000857 var err error = nil
mpagenko01499812021-03-25 10:37:12 +0000858
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000859 oo.mutexLastTxParamStruct.RLock()
mpagenko01499812021-03-25 10:37:12 +0000860 if oo.lastTxParamStruct.lastTxMessageType != omci.GetRequestType ||
861 oo.lastTxParamStruct.pLastTxMeInstance == nil {
862 //in case the last request was MibReset this issue may appear if the ONU was online before and has received the MDS GetRequest
863 // with Sequence number 0x8000 as last request before - so it may still respond to that
864 // then we may force the ONU to react on the MIB reset with a new message that uses an increased Sequence number
865 if oo.lastTxParamStruct.lastTxMessageType == omci.MibResetRequestType && oo.lastTxParamStruct.repeatCount == 0 {
866 logger.Debugw(ctx, "MibSync FSM - repeat mibReset (updated SequenceNumber)", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000867 _ = oo.PDevOmciCC.SendMibReset(log.WithSpanFromContext(context.TODO(), ctx), oo.baseDeviceHandler.GetOmciTimeout(), true)
mpagenko01499812021-03-25 10:37:12 +0000868 //TODO: needs extra handling of timeouts
869 oo.lastTxParamStruct.repeatCount = 1
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000870 oo.mutexLastTxParamStruct.RUnlock()
mpagenko01499812021-03-25 10:37:12 +0000871 return nil
872 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000873 oo.mutexLastTxParamStruct.RUnlock()
mpagenko01499812021-03-25 10:37:12 +0000874 logger.Warnw(ctx, "unexpected GetResponse - ignoring", log.Fields{"device-id": oo.deviceID})
875 //perhaps some still lingering message from some prior activity, let's wait for the real response
876 return nil
877 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000878 oo.mutexLastTxParamStruct.RUnlock()
Himani Chawla4d908332020-08-31 12:30:20 +0530879 msgLayer := (*msg.OmciPacket).Layer(omci.LayerTypeGetResponse)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000880 if msgLayer == nil {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000881 logger.Errorw(ctx, "omci Msg layer could not be detected for GetResponse - handling of MibSyncChan stopped",
882 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000883 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000884 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 +0000885 }
886 msgObj, msgOk := msgLayer.(*omci.GetResponse)
887 if !msgOk {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000888 logger.Errorw(ctx, "omci Msg layer could not be assigned for GetResponse - handling of MibSyncChan stopped",
889 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000890 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000891 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 +0000892 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000893 logger.Debugw(ctx, "MibSync FSM - GetResponse Data", log.Fields{"device-id": oo.deviceID, "data-fields": msgObj})
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000894 if msgObj.Result == me.Success {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000895 oo.mutexLastTxParamStruct.RLock()
mpagenko01499812021-03-25 10:37:12 +0000896 entityID := oo.lastTxParamStruct.pLastTxMeInstance.GetEntityID()
897 if msgObj.EntityClass == oo.lastTxParamStruct.pLastTxMeInstance.GetClassID() && msgObj.EntityInstance == entityID {
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000898 meAttributes := msgObj.Attributes
mpagenko01499812021-03-25 10:37:12 +0000899 meInstance := oo.lastTxParamStruct.pLastTxMeInstance.GetName()
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000900 logger.Debugf(ctx, "MibSync FSM - GetResponse Data for %s",
901 log.Fields{"device-id": oo.deviceID, "data-fields": msgObj}, meInstance)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000902 switch meInstance {
903 case "OnuG":
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000904 oo.mutexLastTxParamStruct.RUnlock()
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000905 return oo.handleOmciGetResponseOnuG(ctx, meAttributes)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000906 case "Onu2G":
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000907 oo.mutexLastTxParamStruct.RUnlock()
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000908 var equipmentID string
909 if onu2GEquipmentID, ok := meAttributes[me.Onu2G_EquipmentId]; ok {
910 equipmentID = cmn.TrimStringFromMeOctet(onu2GEquipmentID)
911 if equipmentID == "" {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000912 logger.Infow(ctx,
913 "MibSync FSM - optional attribute EquipmentID is empty in Onu2G instance - fill with appropriate value",
914 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000915 equipmentID = cEmptyEquipIDString
916 }
917 } else {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000918 logger.Infow(ctx,
919 "MibSync FSM - optional attribute EquipmentID not present in Onu2G instance - fill with appropriate value",
920 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000921 equipmentID = cNotPresentEquipIDString
922 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000923 oo.MutexPersOnuConfig.Lock()
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000924 oo.SOnuPersistentData.PersEquipmentID = equipmentID
dbainbri4d3a0dc2020-12-02 00:33:42 +0000925 logger.Debugw(ctx, "MibSync FSM - GetResponse Data for Onu2-G - EquipmentId", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000926 "onuDeviceEntry.equipmentID": oo.SOnuPersistentData.PersEquipmentID})
927 oo.MutexPersOnuConfig.Unlock()
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000928
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000929 var omccVersion uint8
930 if onu2GOmccVersion, ok := meAttributes[me.Onu2G_OpticalNetworkUnitManagementAndControlChannelOmccVersion]; ok {
931 oo.MutexPersOnuConfig.Lock()
932 omccVersion = onu2GOmccVersion.(uint8)
933 if _, ok := omccVersionSupportsExtendedOmciFormat[omccVersion]; ok {
934 oo.SOnuPersistentData.PersIsExtOmciSupported = omccVersionSupportsExtendedOmciFormat[omccVersion]
Holger Hildebrandtc572e622022-06-22 09:19:17 +0000935 if oo.SOnuPersistentData.PersIsExtOmciSupported && !oo.baseDeviceHandler.GetExtendedOmciSupportEnabled() {
936 logger.Infow(ctx, "MibSync FSM - ONU supports extended OMCI, but support is disabled in the adapter: reset flag",
937 log.Fields{"device-id": oo.deviceID})
938 oo.SOnuPersistentData.PersIsExtOmciSupported = false
939 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000940 } else {
941 logger.Infow(ctx, "MibSync FSM - unknown OMCC version in Onu2G instance - disable extended OMCI support",
942 log.Fields{"device-id": oo.deviceID})
943 oo.SOnuPersistentData.PersIsExtOmciSupported = false
944 }
945 logger.Debugw(ctx, "MibSync FSM - GetResponse Data for Onu2-G - OMCC version", log.Fields{"device-id": oo.deviceID,
946 "omccVersion": omccVersion, "isExtOmciSupported": oo.SOnuPersistentData.PersIsExtOmciSupported})
947 oo.MutexPersOnuConfig.Unlock()
948 } else {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000949 logger.Errorw(ctx,
950 "MibSync FSM - mandatory attribute OMCC version not present in Onu2G instance - handling of MibSyncChan stopped!",
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000951 log.Fields{"device-id": oo.deviceID})
952 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000953 return fmt.Errorf(
954 "mibSync FSM - mandatory attribute OMCC version not present in Onu2G instance - handling of MibSyncChan stopped: %s",
955 oo.deviceID)
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000956 }
957 oo.MutexPersOnuConfig.RLock()
958 if oo.SOnuPersistentData.PersIsExtOmciSupported {
959 oo.MutexPersOnuConfig.RUnlock()
960 // trigger test of OMCI extended msg format
961 _ = oo.PMibUploadFsm.PFsm.Event(UlEvTestExtOmciSupport)
962 return nil
963 }
964 oo.MutexPersOnuConfig.RUnlock()
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000965 // trigger retrieval of 1st SW-image info
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000966 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetFirstSwVersion)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000967 return nil
968 case "SoftwareImage":
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000969 oo.mutexLastTxParamStruct.RUnlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000970 if entityID > cmn.SecondSwImageMeID {
mpagenko15ff4a52021-03-02 10:09:20 +0000971 logger.Errorw(ctx, "mibSync FSM - Failed to GetResponse Data for SoftwareImage with expected EntityId",
972 log.Fields{"device-id": oo.deviceID, "entity-ID": entityID})
973 return fmt.Errorf("mibSync FSM - SwResponse Data with unexpected EntityId: %s %x",
974 oo.deviceID, entityID)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000975 }
mpagenko15ff4a52021-03-02 10:09:20 +0000976 // need to use function for go lint complexity
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000977 if !oo.HandleSwImageIndications(ctx, entityID, meAttributes) {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000978 logger.Errorw(ctx,
979 "MibSync FSM - Not all mandatory attributes present in in SoftwareImage instance - handling of MibSyncChan stopped!",
980 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000981 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000982 return fmt.Errorf(
983 "mibSync FSM - Not all mandatory attributes present in in SoftwareImage instance - handling of MibSyncChan stopped: %s",
984 oo.deviceID)
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000985 }
mpagenko15ff4a52021-03-02 10:09:20 +0000986 return nil
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000987 case "IpHostConfigData":
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000988 oo.mutexLastTxParamStruct.RUnlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000989 oo.MutexPersOnuConfig.Lock()
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000990 if ipHostConfigMacAddress, ok := meAttributes[me.IpHostConfigData_MacAddress]; ok {
Girish Gowdra21bbf052022-02-17 16:08:22 -0800991 macBytes, _ := me.InterfaceToOctets(ipHostConfigMacAddress)
992 if cmn.OmciMacAddressLen == len(macBytes) {
993 oo.SOnuPersistentData.PersMacAddress = hex.EncodeToString(macBytes[:])
994 logger.Debugw(ctx, "MibSync FSM - GetResponse Data for IpHostConfigData - MacAddress", log.Fields{"device-id": oo.deviceID,
995 "macAddress": oo.SOnuPersistentData.PersMacAddress})
996 } else {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000997 logger.Infow(ctx, "MibSync FSM - MacAddress wrong length - fill macAddress with zeros",
998 log.Fields{"device-id": oo.deviceID, "length": len(macBytes)})
Girish Gowdra21bbf052022-02-17 16:08:22 -0800999 oo.SOnuPersistentData.PersMacAddress = cEmptyMacAddrString
1000 }
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001001 } else {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001002 // since ONU creates instances of this ME automatically only when IP host services are available,
1003 // processing continues here despite the error
1004 logger.Infow(ctx, "MibSync FSM - MacAddress attribute not present in IpHostConfigData instance - fill macAddress with zeros",
1005 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001006 oo.SOnuPersistentData.PersMacAddress = cEmptyMacAddrString
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001007 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001008 oo.MutexPersOnuConfig.Unlock()
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001009 // trigger retrieval of mib template
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001010 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetMibTemplate)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001011 return nil
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00001012 case "OnuData":
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001013 oo.mutexLastTxParamStruct.RUnlock()
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +00001014 if onuDataMibDataSync, ok := meAttributes[me.OnuData_MibDataSync]; ok {
1015 oo.checkMdsValue(ctx, onuDataMibDataSync.(uint8))
1016 } else {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001017 logger.Errorw(ctx, "MibSync FSM - MibDataSync attribute not present in OnuData instance - handling of MibSyncChan stopped!",
1018 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +00001019 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001020 return fmt.Errorf("mibSync FSM - VendorId attribute not present in OnuG instance - handling of MibSyncChan stopped: %s",
1021 oo.deviceID)
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +00001022 }
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00001023 return nil
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001024 default:
1025 oo.mutexLastTxParamStruct.RUnlock()
1026 logger.Warnw(ctx, "Unsupported ME name received!",
1027 log.Fields{"ME name": meInstance, "device-id": oo.deviceID})
1028
Himani Chawla4d908332020-08-31 12:30:20 +05301029 }
Matteo Scandolo20ca10c2021-01-21 14:35:45 -08001030 } else {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001031 oo.mutexLastTxParamStruct.RUnlock()
1032 logger.Warnf(ctx, "MibSync FSM - Received GetResponse Data for %s with wrong classID or entityID ",
1033 log.Fields{"device-id": oo.deviceID, "data-fields": msgObj}, msgObj.EntityClass)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001034 }
Himani Chawla4d908332020-08-31 12:30:20 +05301035 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001036 if err = oo.handleOmciGetResponseErrors(ctx, msgObj); err == nil {
Holger Hildebrandt80129db2020-11-23 10:49:32 +00001037 return nil
1038 }
Himani Chawla4d908332020-08-31 12:30:20 +05301039 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001040 logger.Info(ctx, "MibSync Msg", log.Fields{"Stopped handling of MibSyncChan for device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001041 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001042 return err
Himani Chawla4d908332020-08-31 12:30:20 +05301043}
1044
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05301045// HandleSwImageIndications updates onuSwImageIndications with the ONU data just received
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +00001046func (oo *OnuDeviceEntry) HandleSwImageIndications(ctx context.Context, entityID uint16, meAttributes me.AttributeValueMap) bool {
1047
1048 var imageVersion string
1049 var imageIsCommitted, imageIsActive uint8
1050
1051 allMandAttribsPresent := false
1052 if softwareImageIsCommitted, ok := meAttributes[me.SoftwareImage_IsCommitted]; ok {
1053 if softwareImageIsActiveimage, ok := meAttributes[me.SoftwareImage_IsActive]; ok {
1054 if softwareImageVersion, ok := meAttributes[me.SoftwareImage_Version]; ok {
1055 imageVersion = cmn.TrimStringFromMeOctet(softwareImageVersion)
1056 imageIsActive = softwareImageIsActiveimage.(uint8)
1057 imageIsCommitted = softwareImageIsCommitted.(uint8)
1058 allMandAttribsPresent = true
1059 }
1060 }
1061 }
1062 if !allMandAttribsPresent {
1063 logger.Errorw(ctx, "MibSync FSM - Not all mandatory attributes present in SoftwareImage instance - skip processing!", log.Fields{"device-id": oo.deviceID})
1064 return allMandAttribsPresent
1065 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001066 oo.MutexPersOnuConfig.RLock()
mpagenko15ff4a52021-03-02 10:09:20 +00001067 logger.Infow(ctx, "MibSync FSM - GetResponse Data for SoftwareImage",
1068 log.Fields{"device-id": oo.deviceID, "entityID": entityID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001069 "version": imageVersion, "isActive": imageIsActive, "isCommitted": imageIsCommitted, "SNR": oo.SOnuPersistentData.PersSerialNumber})
1070 oo.MutexPersOnuConfig.RUnlock()
1071 if cmn.FirstSwImageMeID == entityID {
mpagenko15ff4a52021-03-02 10:09:20 +00001072 //always accept the state of the first image (2nd image info should not yet be available)
Holger Hildebrandt05011352021-06-15 09:40:24 +00001073 oo.mutexOnuSwImageIndications.Lock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001074 if imageIsActive == cmn.SwIsActive {
1075 oo.onuSwImageIndications.ActiveEntityEntry.EntityID = entityID
1076 oo.onuSwImageIndications.ActiveEntityEntry.Valid = true
1077 oo.onuSwImageIndications.ActiveEntityEntry.Version = imageVersion
1078 oo.onuSwImageIndications.ActiveEntityEntry.IsCommitted = imageIsCommitted
mpagenko59498c12021-03-18 14:15:15 +00001079 //as the SW version indication may stem from some ONU Down/up event
1080 //the complementary image state is to be invalidated
1081 // (state of the second image is always expected afterwards or just invalid)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001082 oo.onuSwImageIndications.InActiveEntityEntry.Valid = false
mpagenko15ff4a52021-03-02 10:09:20 +00001083 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001084 oo.onuSwImageIndications.InActiveEntityEntry.EntityID = entityID
1085 oo.onuSwImageIndications.InActiveEntityEntry.Valid = true
1086 oo.onuSwImageIndications.InActiveEntityEntry.Version = imageVersion
1087 oo.onuSwImageIndications.InActiveEntityEntry.IsCommitted = imageIsCommitted
mpagenko59498c12021-03-18 14:15:15 +00001088 //as the SW version indication may stem form some ONU Down/up event
1089 //the complementary image state is to be invalidated
1090 // (state of the second image is always expected afterwards or just invalid)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001091 oo.onuSwImageIndications.ActiveEntityEntry.Valid = false
mpagenko15ff4a52021-03-02 10:09:20 +00001092 }
Holger Hildebrandt05011352021-06-15 09:40:24 +00001093 oo.mutexOnuSwImageIndications.Unlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001094 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetSecondSwVersion)
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +00001095 return allMandAttribsPresent
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001096 } else if cmn.SecondSwImageMeID == entityID {
mpagenko15ff4a52021-03-02 10:09:20 +00001097 //2nd image info might conflict with first image info, in which case we priorize first image info!
Holger Hildebrandt05011352021-06-15 09:40:24 +00001098 oo.mutexOnuSwImageIndications.Lock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001099 if imageIsActive == cmn.SwIsActive { //2nd image reported to be active
1100 if oo.onuSwImageIndications.ActiveEntityEntry.Valid {
mpagenko15ff4a52021-03-02 10:09:20 +00001101 //conflict exists - state of first image is left active
1102 logger.Warnw(ctx, "mibSync FSM - both ONU images are reported as active - assuming 2nd to be inactive",
1103 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001104 oo.onuSwImageIndications.InActiveEntityEntry.EntityID = entityID
1105 oo.onuSwImageIndications.InActiveEntityEntry.Valid = true ////to indicate that at least something has been reported
1106 oo.onuSwImageIndications.InActiveEntityEntry.Version = imageVersion
1107 oo.onuSwImageIndications.InActiveEntityEntry.IsCommitted = imageIsCommitted
mpagenko15ff4a52021-03-02 10:09:20 +00001108 } else { //first image inactive, this one active
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001109 oo.onuSwImageIndications.ActiveEntityEntry.EntityID = entityID
1110 oo.onuSwImageIndications.ActiveEntityEntry.Valid = true
1111 oo.onuSwImageIndications.ActiveEntityEntry.Version = imageVersion
1112 oo.onuSwImageIndications.ActiveEntityEntry.IsCommitted = imageIsCommitted
mpagenko15ff4a52021-03-02 10:09:20 +00001113 }
1114 } else { //2nd image reported to be inactive
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001115 if oo.onuSwImageIndications.InActiveEntityEntry.Valid {
mpagenko15ff4a52021-03-02 10:09:20 +00001116 //conflict exists - both images inactive - regard it as ONU failure and assume first image to be active
1117 logger.Warnw(ctx, "mibSync FSM - both ONU images are reported as inactive, defining first to be active",
1118 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001119 oo.onuSwImageIndications.ActiveEntityEntry.EntityID = cmn.FirstSwImageMeID
1120 oo.onuSwImageIndications.ActiveEntityEntry.Valid = true //to indicate that at least something has been reported
mpagenko15ff4a52021-03-02 10:09:20 +00001121 //copy active commit/version from the previously stored inactive position
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001122 oo.onuSwImageIndications.ActiveEntityEntry.Version = oo.onuSwImageIndications.InActiveEntityEntry.Version
1123 oo.onuSwImageIndications.ActiveEntityEntry.IsCommitted = oo.onuSwImageIndications.InActiveEntityEntry.IsCommitted
mpagenko15ff4a52021-03-02 10:09:20 +00001124 }
1125 //in any case we indicate (and possibly overwrite) the second image indications as inactive
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001126 oo.onuSwImageIndications.InActiveEntityEntry.EntityID = entityID
1127 oo.onuSwImageIndications.InActiveEntityEntry.Valid = true
1128 oo.onuSwImageIndications.InActiveEntityEntry.Version = imageVersion
1129 oo.onuSwImageIndications.InActiveEntityEntry.IsCommitted = imageIsCommitted
mpagenko15ff4a52021-03-02 10:09:20 +00001130 }
Holger Hildebrandt05011352021-06-15 09:40:24 +00001131 oo.mutexOnuSwImageIndications.Unlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001132 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetMacAddress)
mpagenko15ff4a52021-03-02 10:09:20 +00001133 }
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +00001134 return allMandAttribsPresent
mpagenko15ff4a52021-03-02 10:09:20 +00001135}
1136
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001137func (oo *OnuDeviceEntry) handleOmciMessage(ctx context.Context, msg cmn.OmciMessage) {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001138 logger.Debugw(ctx, "MibSync Msg", log.Fields{"OmciMessage received for device-id": oo.deviceID,
Andrea Campanella6515c582020-10-05 11:25:00 +02001139 "msgType": msg.OmciMsg.MessageType, "msg": msg})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001140 //further analysis could be done here based on msg.OmciMsg.Payload, e.g. verification of error code ...
1141 switch msg.OmciMsg.MessageType {
1142 case omci.MibResetResponseType:
dbainbri4d3a0dc2020-12-02 00:33:42 +00001143 oo.handleOmciMibResetResponseMessage(ctx, msg)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001144
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001145 case omci.MibUploadResponseType:
dbainbri4d3a0dc2020-12-02 00:33:42 +00001146 oo.handleOmciMibUploadResponseMessage(ctx, msg)
Himani Chawla4d908332020-08-31 12:30:20 +05301147
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001148 case omci.MibUploadNextResponseType:
dbainbri4d3a0dc2020-12-02 00:33:42 +00001149 oo.handleOmciMibUploadNextResponseMessage(ctx, msg)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001150
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001151 case omci.GetResponseType:
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001152 //TODO: error handling
dbainbri4d3a0dc2020-12-02 00:33:42 +00001153 _ = oo.handleOmciGetResponseMessage(ctx, msg)
Himani Chawla4d908332020-08-31 12:30:20 +05301154
Andrea Campanella6515c582020-10-05 11:25:00 +02001155 default:
Holger Hildebrandtabfef032022-02-25 12:40:20 +00001156 logger.Warnw(ctx, "Unknown Message Type", log.Fields{"device-id": oo.deviceID, "msgType": msg.OmciMsg.MessageType})
Andrea Campanella6515c582020-10-05 11:25:00 +02001157
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001158 }
1159}
1160
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001161func (oo *OnuDeviceEntry) handleOmciGetResponseOnuG(ctx context.Context, meAttributes me.AttributeValueMap) error {
1162 currentState := oo.PMibUploadFsm.PFsm.Current()
mgoudad611f4c2025-10-30 14:49:27 +05301163 switch currentState {
1164 case UlStGettingVendorAndSerial:
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001165 if onuGVendorID, ok := meAttributes[me.OnuG_VendorId]; ok {
1166 vendorID := cmn.TrimStringFromMeOctet(onuGVendorID)
1167 if vendorID == "" {
1168 logger.Infow(ctx,
1169 "MibSync FSM - mandatory attribute VendorId is empty in OnuG instance - fill with appropriate value",
1170 log.Fields{"device-id": oo.deviceID})
1171 vendorID = cEmptyVendorIDString
1172 }
1173 oo.MutexPersOnuConfig.Lock()
1174 oo.SOnuPersistentData.PersVendorID = vendorID
1175 oo.MutexPersOnuConfig.Unlock()
1176 } else {
1177 logger.Errorw(ctx,
1178 "MibSync FSM - mandatory attribute VendorId not present in OnuG instance - handling of MibSyncChan stopped!",
1179 log.Fields{"device-id": oo.deviceID})
1180 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
1181 return fmt.Errorf(
1182 "mibSync FSM - mandatory attribute VendorId not present in OnuG instance - handling of MibSyncChan stopped: %s",
1183 oo.deviceID)
1184 }
1185 if onuGSerialNumber, ok := meAttributes[me.OnuG_SerialNumber]; ok {
1186 oo.MutexPersOnuConfig.Lock()
1187 snBytes, _ := me.InterfaceToOctets(onuGSerialNumber)
1188 if cmn.OnugSerialNumberLen == len(snBytes) {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +05301189 snVendorPart := string(snBytes[:4])
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001190 snNumberPart := hex.EncodeToString(snBytes[4:])
1191 oo.SOnuPersistentData.PersSerialNumber = snVendorPart + snNumberPart
1192 } else {
1193 logger.Infow(ctx, "MibSync FSM - SerialNumber has wrong length - fill serialNumber with zeros",
1194 log.Fields{"device-id": oo.deviceID, "length": len(snBytes)})
1195 oo.SOnuPersistentData.PersSerialNumber = cEmptySerialNumberString
1196 }
1197 oo.MutexPersOnuConfig.Unlock()
1198 } else {
1199 logger.Errorw(ctx,
1200 "MibSync FSM - mandatory attribute SerialNumber not present in OnuG instance - handling of MibSyncChan stopped!",
1201 log.Fields{"device-id": oo.deviceID})
1202 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
1203 return fmt.Errorf(
1204 "mibSync FSM - mandatory attribute SerialNumber not present in OnuG instance - handling of MibSyncChan stopped: %s",
1205 oo.deviceID)
1206 }
1207 oo.MutexPersOnuConfig.Lock()
1208 logger.Debugw(ctx, "MibSync FSM - GetResponse Data for Onu-G - VendorId/SerialNumber", log.Fields{"device-id": oo.deviceID,
1209 "onuDeviceEntry.vendorID": oo.SOnuPersistentData.PersVendorID,
1210 "onuDeviceEntry.serialNumber": oo.SOnuPersistentData.PersSerialNumber})
1211 oo.MutexPersOnuConfig.Unlock()
1212 // trigger retrieval of Version
1213 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetVersion)
1214 return nil
mgoudad611f4c2025-10-30 14:49:27 +05301215 case UlStGettingVersion:
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001216 if onuGVersion, ok := meAttributes[me.OnuG_Version]; ok {
1217 version := cmn.TrimStringFromMeOctet(onuGVersion)
1218 if version == "" {
1219 logger.Infow(ctx, "MibSync FSM - mandatory attribute Version is empty in OnuG instance - fill with appropriate value",
1220 log.Fields{"device-id": oo.deviceID})
1221 version = cEmptyVersionString
1222 }
1223 oo.MutexPersOnuConfig.Lock()
1224 oo.SOnuPersistentData.PersVersion = version
1225 oo.MutexPersOnuConfig.Unlock()
1226 } else {
1227 logger.Errorw(ctx,
1228 "MibSync FSM - mandatory attribute Version not present in OnuG instance - handling of MibSyncChan stopped!",
1229 log.Fields{"device-id": oo.deviceID})
1230 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
1231 return fmt.Errorf(
1232 "mibSync FSM - mandatory attribute Version not present in OnuG instance - handling of MibSyncChan stopped: %s",
1233 oo.deviceID)
1234 }
1235 oo.MutexPersOnuConfig.Lock()
1236 logger.Debugw(ctx, "MibSync FSM - GetResponse Data for Onu-G - Version", log.Fields{"device-id": oo.deviceID,
1237 "onuDeviceEntry.version": oo.SOnuPersistentData.PersVersion})
1238 oo.MutexPersOnuConfig.Unlock()
1239 // trigger retrieval of EquipmentId and OMCC version
1240 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetEquipIDAndOmcc)
1241 return nil
mgoudad611f4c2025-10-30 14:49:27 +05301242 default:
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001243 logger.Errorw(ctx, "MibSync FSM - wrong state OnuG response processing - handling of MibSyncChan stopped!",
1244 log.Fields{"currentState": currentState, "device-id": oo.deviceID})
1245 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
1246 return fmt.Errorf("mibSync FSM - wrong state OnuG response processing - handling of MibSyncChan stopped: %s",
1247 oo.deviceID)
1248 }
1249}
1250
dbainbri4d3a0dc2020-12-02 00:33:42 +00001251func (oo *OnuDeviceEntry) handleOmciGetResponseErrors(ctx context.Context, msgObj *omci.GetResponse) error {
Holger Hildebrandt80129db2020-11-23 10:49:32 +00001252 var err error = nil
dbainbri4d3a0dc2020-12-02 00:33:42 +00001253 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 +00001254 // Up to now the following erroneous results have been seen for different ONU-types to indicate an unsupported ME
1255 if msgObj.Result == me.UnknownInstance || msgObj.Result == me.UnknownEntity || msgObj.Result == me.ProcessingError || msgObj.Result == me.NotSupported {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001256 oo.mutexLastTxParamStruct.RLock()
1257 if oo.lastTxParamStruct.pLastTxMeInstance != nil {
1258 entityID := oo.lastTxParamStruct.pLastTxMeInstance.GetEntityID()
1259 if msgObj.EntityClass == oo.lastTxParamStruct.pLastTxMeInstance.GetClassID() && msgObj.EntityInstance == entityID {
1260 meInstance := oo.lastTxParamStruct.pLastTxMeInstance.GetName()
1261 switch meInstance {
1262 case "IpHostConfigData":
1263 oo.mutexLastTxParamStruct.RUnlock()
1264 logger.Debugw(ctx, "MibSync FSM - erroneous result for IpHostConfigData received - ONU doesn't support ME - fill macAddress with zeros",
1265 log.Fields{"device-id": oo.deviceID, "data-fields": msgObj})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001266 oo.MutexPersOnuConfig.Lock()
1267 oo.SOnuPersistentData.PersMacAddress = cEmptyMacAddrString
1268 oo.MutexPersOnuConfig.Unlock()
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001269 // trigger retrieval of mib template
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001270 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetMibTemplate)
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001271 return nil
1272 default:
1273 oo.mutexLastTxParamStruct.RUnlock()
1274 logger.Warnf(ctx, "MibSync FSM - erroneous result for %s received - no exceptional treatment defined", log.Fields{"device-id": oo.deviceID, "data-fields": msgObj}, meInstance)
1275 err = fmt.Errorf("erroneous result for %s received - no exceptional treatment defined: %s", meInstance, oo.deviceID)
1276 }
1277 } else {
1278 oo.mutexLastTxParamStruct.RUnlock()
Holger Hildebrandt80129db2020-11-23 10:49:32 +00001279 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001280 } else {
1281 oo.mutexLastTxParamStruct.RUnlock()
1282 logger.Warnw(ctx, "Pointer to last Tx MeInstance is nil!", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt80129db2020-11-23 10:49:32 +00001283 }
1284 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001285 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 +00001286 err = fmt.Errorf("erroneous result in GetResponse Data: %s - %s", msgObj.Result, oo.deviceID)
1287 }
1288 return err
1289}
1290
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001291// IsNewOnu - TODO: add comment
1292func (oo *OnuDeviceEntry) IsNewOnu() bool {
1293 oo.MutexPersOnuConfig.RLock()
1294 defer oo.MutexPersOnuConfig.RUnlock()
1295 return oo.SOnuPersistentData.PersMibLastDbSync == 0
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00001296}
1297
Himani Chawla6d2ae152020-09-02 13:11:20 +05301298func isSupportedClassID(meClassID me.ClassID) bool {
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001299 for _, v := range supportedClassIds {
Himani Chawla4d908332020-08-31 12:30:20 +05301300 if v == meClassID {
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001301 return true
1302 }
1303 }
1304 return false
1305}
1306
dbainbri4d3a0dc2020-12-02 00:33:42 +00001307func (oo *OnuDeviceEntry) mibDbVolatileDict(ctx context.Context) error {
1308 logger.Debug(ctx, "MibVolatileDict- running from default Entry code")
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001309 return errors.New("not_implemented")
1310}
1311
Himani Chawla6d2ae152020-09-02 13:11:20 +05301312// 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 +05301313// 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 +00001314// 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 +00001315func (oo *OnuDeviceEntry) createAndPersistMibTemplate(ctx context.Context) error {
1316 logger.Debugw(ctx, "MibSync - MibTemplate - path name", log.Fields{"path": oo.mibTemplatePath,
Holger Hildebrandt61b24d02020-11-16 13:36:40 +00001317 "device-id": oo.deviceID})
divyadesaibbed37c2020-08-28 13:35:20 +05301318
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301319 //Fetch the MEs dependent on serial number and MAC address and add them to onuSpecific ME DB
1320 //Modify the serial number and MAC address with generic content in the common DB.
1321 knownAttributeMEDb := oo.pOnuDB.CommonMeDb.MeDb
1322 for firstLevelKey, firstLevelValue := range knownAttributeMEDb {
1323 classID := strconv.Itoa(int(firstLevelKey))
Holger Hildebrandt61b24d02020-11-16 13:36:40 +00001324
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301325 for secondLevelKey, secondLevelValue := range firstLevelValue {
1326 switch classID {
1327 case "6", "256":
1328 if _, exists := secondLevelValue["SerialNumber"]; exists {
1329 oo.pOnuDB.PutOnuSpeficMe(ctx, firstLevelKey, secondLevelKey, secondLevelValue)
1330 secondLevelValue["SerialNumber"] = "%SERIAL_NUMBER%"
1331 }
1332 case "134":
1333 if _, exists := secondLevelValue["MacAddress"]; exists {
1334 oo.pOnuDB.PutOnuSpeficMe(ctx, firstLevelKey, secondLevelKey, secondLevelValue)
1335 secondLevelValue["MacAddress"] = "%MAC_ADDRESS%"
1336 }
1337 }
1338 }
1339 }
1340
1341 //Create the MIB Template
Holger Hildebrandt61b24d02020-11-16 13:36:40 +00001342 currentTime := time.Now()
divyadesaibbed37c2020-08-28 13:35:20 +05301343 templateMap := make(map[string]interface{})
Holger Hildebrandt61b24d02020-11-16 13:36:40 +00001344 templateMap["TemplateName"] = oo.mibTemplatePath
divyadesaibbed37c2020-08-28 13:35:20 +05301345 templateMap["TemplateCreated"] = currentTime.Format("2006-01-02 15:04:05.000000")
1346
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301347 firstLevelMap := oo.pOnuDB.CommonMeDb.MeDb
divyadesaibbed37c2020-08-28 13:35:20 +05301348 for firstLevelKey, firstLevelValue := range firstLevelMap {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001349 logger.Debugw(ctx, "MibSync - MibTemplate - firstLevelKey", log.Fields{"firstLevelKey": firstLevelKey})
Himani Chawla26e555c2020-08-31 12:30:20 +05301350 classID := strconv.Itoa(int(firstLevelKey))
divyadesaibbed37c2020-08-28 13:35:20 +05301351
1352 secondLevelMap := make(map[string]interface{})
1353 for secondLevelKey, secondLevelValue := range firstLevelValue {
Holger Hildebrandt8998ed52022-03-23 09:52:37 +00001354 // ManagedEntityId is already key of secondLevelMap - remove this redundant attribute from secondLevelValue
1355 delete(secondLevelValue, cmn.CGenericManagedEntityIDName)
divyadesaibbed37c2020-08-28 13:35:20 +05301356 thirdLevelMap := make(map[string]interface{})
Himani Chawla26e555c2020-08-31 12:30:20 +05301357 entityID := strconv.Itoa(int(secondLevelKey))
divyadesaibbed37c2020-08-28 13:35:20 +05301358 thirdLevelMap["Attributes"] = secondLevelValue
Himani Chawla26e555c2020-08-31 12:30:20 +05301359 secondLevelMap[entityID] = thirdLevelMap
1360 if classID == "6" || classID == "256" {
divyadesaibbed37c2020-08-28 13:35:20 +05301361 forthLevelMap := map[string]interface{}(thirdLevelMap["Attributes"].(me.AttributeValueMap))
1362 delete(forthLevelMap, "SerialNumber")
1363 forthLevelMap["SerialNumber"] = "%SERIAL_NUMBER%"
1364
1365 }
Himani Chawla26e555c2020-08-31 12:30:20 +05301366 if classID == "134" {
divyadesaibbed37c2020-08-28 13:35:20 +05301367 forthLevelMap := map[string]interface{}(thirdLevelMap["Attributes"].(me.AttributeValueMap))
1368 delete(forthLevelMap, "MacAddress")
1369 forthLevelMap["MacAddress"] = "%MAC_ADDRESS%"
1370 }
1371 }
Himani Chawla26e555c2020-08-31 12:30:20 +05301372 templateMap[classID] = secondLevelMap
divyadesaibbed37c2020-08-28 13:35:20 +05301373 }
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301374 unknownMeAndAttribMap := oo.pOnuDB.CommonMeDb.UnknownMeAndAttribDb
Holger Hildebrandt39080022022-03-16 10:03:17 +00001375 for unknownMeAndAttribMapKey := range unknownMeAndAttribMap {
1376 templateMap[string(unknownMeAndAttribMapKey)] = unknownMeAndAttribMap[unknownMeAndAttribMapKey]
Holger Hildebrandtf3c7a182021-11-17 13:42:08 +00001377 }
divyadesaibbed37c2020-08-28 13:35:20 +05301378 mibTemplate, err := json.Marshal(&templateMap)
1379 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001380 logger.Errorw(ctx, "MibSync - MibTemplate - Failed to marshal mibTemplate", log.Fields{"error": err, "device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001381 oo.pOpenOnuAc.SetMibTemplatesGenerated(oo.mibTemplatePath, false)
divyadesaibbed37c2020-08-28 13:35:20 +05301382 return err
1383 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001384 err = oo.mibTemplateKVStore.Put(log.WithSpanFromContext(context.TODO(), ctx), oo.mibTemplatePath, string(mibTemplate))
divyadesaibbed37c2020-08-28 13:35:20 +05301385 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001386 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 +00001387 oo.pOpenOnuAc.SetMibTemplatesGenerated(oo.mibTemplatePath, false)
divyadesaibbed37c2020-08-28 13:35:20 +05301388 return err
1389 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001390 logger.Debugw(ctx, "MibSync - MibTemplate - Stored the template to etcd", log.Fields{"device-id": oo.deviceID})
divyadesaibbed37c2020-08-28 13:35:20 +05301391 return nil
1392}
1393
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00001394func (oo *OnuDeviceEntry) requestMdsValue(ctx context.Context) {
1395 logger.Debugw(ctx, "Request MDS value", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001396 requestedAttributes := me.AttributeValueMap{me.OnuData_MibDataSync: ""}
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001397 meInstance, err := oo.PDevOmciCC.SendGetMe(log.WithSpanFromContext(context.TODO(), ctx),
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001398 me.OnuDataClassID, cmn.OnuDataMeID, requestedAttributes, oo.baseDeviceHandler.GetOmciTimeout(), true,
1399 oo.PMibUploadFsm.CommChan, oo.GetPersIsExtOmciSupported())
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00001400 //accept also nil as (error) return value for writing to LastTx
1401 // - this avoids misinterpretation of new received OMCI messages
ozgecanetsiab36ed572021-04-01 10:38:48 +03001402 if err != nil {
1403 logger.Errorw(ctx, "ONUData get failed, aborting MibSync FSM!", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001404 pMibUlFsm := oo.PMibUploadFsm
ozgecanetsiab36ed572021-04-01 10:38:48 +03001405 if pMibUlFsm != nil {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +05301406 //nolint:unparam
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001407 go func(a_pAFsm *cmn.AdapterFsm) {
1408 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
ozgecanetsiab36ed572021-04-01 10:38:48 +03001409 }(pMibUlFsm)
1410 }
1411 return
1412 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001413 oo.mutexLastTxParamStruct.Lock()
mpagenko01499812021-03-25 10:37:12 +00001414 oo.lastTxParamStruct.lastTxMessageType = omci.GetRequestType
1415 oo.lastTxParamStruct.pLastTxMeInstance = meInstance
1416 oo.lastTxParamStruct.repeatCount = 0
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001417 oo.mutexLastTxParamStruct.Unlock()
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00001418}
1419
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001420func (oo *OnuDeviceEntry) checkMdsValue(ctx context.Context, mibDataSyncOnu uint8) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001421 oo.MutexPersOnuConfig.RLock()
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001422 logger.Debugw(ctx, "MibSync FSM - GetResponse Data for Onu-Data - MibDataSync", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001423 "mibDataSyncOnu": mibDataSyncOnu, "PersMibDataSyncAdpt": oo.SOnuPersistentData.PersMibDataSyncAdpt})
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001424
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001425 mdsValuesAreEqual := oo.SOnuPersistentData.PersMibDataSyncAdpt == mibDataSyncOnu
1426 oo.MutexPersOnuConfig.RUnlock()
1427 if oo.PMibUploadFsm.PFsm.Is(UlStAuditing) {
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001428 if mdsValuesAreEqual {
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001429 logger.Debugw(ctx, "MibSync FSM - mib audit - MDS check ok", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001430 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001431 } else {
1432 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 +00001433 _ = oo.PMibUploadFsm.PFsm.Event(UlEvMismatch)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001434 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001435 } else if oo.PMibUploadFsm.PFsm.Is(UlStReAuditing) {
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001436 if mdsValuesAreEqual {
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001437 logger.Debugw(ctx, "MibSync FSM - mib reaudit - MDS check ok", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001438 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001439 } else {
Holger Hildebrandt80f57762022-02-16 10:03:24 +00001440 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 +00001441 log.Fields{"device-id": oo.deviceID})
1442 oo.SendOnuDeviceEvent(ctx, cmn.OnuMibAuditFailureMds, cmn.OnuMibAuditFailureMdsDesc)
Holger Hildebrandt80f57762022-02-16 10:03:24 +00001443 // To reconcile ONU with active adapter later on, we have to retrieve TP instances from parent adapter.
1444 // In the present use case inconsistencies between TP pathes stored in kv store and TP instances retrieved
1445 // should not occur. Nevertheless, the respective code is inserted to catch the unlikely case.
1446 if !oo.getAllStoredTpInstFromParentAdapter(ctx) {
1447 logger.Debugw(ctx, "MibSync FSM - mib reaudit - inconsistencies between TP pathes stored in kv and parent adapter instances",
1448 log.Fields{"device-id": oo.deviceID})
1449 oo.baseDeviceHandler.SetReconcilingReasonUpdate(true)
1450 go func() {
1451 if err := oo.baseDeviceHandler.StorePersistentData(ctx); err != nil {
1452 logger.Warnw(ctx,
1453 "MibSync FSM - mib reaudit - store persistent data error - continue for now as there will be additional write attempts",
1454 log.Fields{"device-id": oo.deviceID, "err": err})
1455 }
1456 }()
1457 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001458 _ = oo.PMibUploadFsm.PFsm.Event(UlEvMismatch)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001459 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001460 } else if oo.PMibUploadFsm.PFsm.Is(UlStExaminingMds) {
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001461 if mdsValuesAreEqual && mibDataSyncOnu != 0 {
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001462 logger.Debugw(ctx, "MibSync FSM - MDS examination ok", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001463 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001464 } else {
1465 logger.Debugw(ctx, "MibSync FSM - MDS examination failed - new provisioning", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001466 _ = oo.PMibUploadFsm.PFsm.Event(UlEvMismatch)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001467 }
1468 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001469 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 +00001470 }
1471}
mpagenko15ff4a52021-03-02 10:09:20 +00001472
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05301473// GetActiveImageMeID returns the Omci MeId of the active ONU image together with error code for validity
mpagenko15ff4a52021-03-02 10:09:20 +00001474func (oo *OnuDeviceEntry) GetActiveImageMeID(ctx context.Context) (uint16, error) {
Holger Hildebrandt05011352021-06-15 09:40:24 +00001475 oo.mutexOnuSwImageIndications.RLock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001476 if oo.onuSwImageIndications.ActiveEntityEntry.Valid {
1477 value := oo.onuSwImageIndications.ActiveEntityEntry.EntityID
Holger Hildebrandt05011352021-06-15 09:40:24 +00001478 oo.mutexOnuSwImageIndications.RUnlock()
1479 return value, nil
mpagenko15ff4a52021-03-02 10:09:20 +00001480 }
Holger Hildebrandt05011352021-06-15 09:40:24 +00001481 oo.mutexOnuSwImageIndications.RUnlock()
mpagenko15ff4a52021-03-02 10:09:20 +00001482 return 0xFFFF, fmt.Errorf("no valid active image found: %s", oo.deviceID)
1483}
1484
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05301485// GetInactiveImageMeID returns the Omci MeId of the inactive ONU image together with error code for validity
mpagenko15ff4a52021-03-02 10:09:20 +00001486func (oo *OnuDeviceEntry) GetInactiveImageMeID(ctx context.Context) (uint16, error) {
Holger Hildebrandt05011352021-06-15 09:40:24 +00001487 oo.mutexOnuSwImageIndications.RLock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001488 if oo.onuSwImageIndications.InActiveEntityEntry.Valid {
1489 value := oo.onuSwImageIndications.InActiveEntityEntry.EntityID
Holger Hildebrandt05011352021-06-15 09:40:24 +00001490 oo.mutexOnuSwImageIndications.RUnlock()
1491 return value, nil
mpagenko15ff4a52021-03-02 10:09:20 +00001492 }
Holger Hildebrandt05011352021-06-15 09:40:24 +00001493 oo.mutexOnuSwImageIndications.RUnlock()
mpagenko15ff4a52021-03-02 10:09:20 +00001494 return 0xFFFF, fmt.Errorf("no valid inactive image found: %s", oo.deviceID)
1495}
1496
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05301497// IsImageToBeCommitted returns true if the active image is still uncommitted
mpagenko15ff4a52021-03-02 10:09:20 +00001498func (oo *OnuDeviceEntry) IsImageToBeCommitted(ctx context.Context, aImageID uint16) bool {
Holger Hildebrandt05011352021-06-15 09:40:24 +00001499 oo.mutexOnuSwImageIndications.RLock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001500 if oo.onuSwImageIndications.ActiveEntityEntry.Valid {
1501 if oo.onuSwImageIndications.ActiveEntityEntry.EntityID == aImageID {
1502 if oo.onuSwImageIndications.ActiveEntityEntry.IsCommitted == cmn.SwIsUncommitted {
Holger Hildebrandt05011352021-06-15 09:40:24 +00001503 oo.mutexOnuSwImageIndications.RUnlock()
mpagenko15ff4a52021-03-02 10:09:20 +00001504 return true
1505 }
1506 }
1507 }
Holger Hildebrandt05011352021-06-15 09:40:24 +00001508 oo.mutexOnuSwImageIndications.RUnlock()
mpagenko15ff4a52021-03-02 10:09:20 +00001509 return false //all other case are treated as 'nothing to commit
1510}
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001511func (oo *OnuDeviceEntry) getMibFromTemplate(ctx context.Context) bool {
1512
1513 oo.mibTemplatePath = oo.buildMibTemplatePath()
Holger Hildebrandtbdc5f002021-04-19 14:46:21 +00001514 logger.Debugw(ctx, "MibSync FSM - get Mib from template", log.Fields{"path": fmt.Sprintf("%s/%s", cBasePathMibTemplateKvStore, oo.mibTemplatePath),
1515 "device-id": oo.deviceID})
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001516
1517 restoredFromMibTemplate := false
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301518 oo.pOpenOnuAc.LockMutexMibTemplateGenerated()
1519 defer oo.pOpenOnuAc.UnlockMutexMibTemplateGenerated()
1520 if meDbValue, ok := oo.pOpenOnuAc.FetchEntryFromMibDatabaseMap(ctx, oo.mibTemplatePath); ok {
1521 logger.Infow(ctx, "Found MIB common DB Instance , copy and use", log.Fields{"path": oo.mibTemplatePath, "device-id": oo.deviceID})
1522 oo.pOnuDB.CommonMeDb = meDbValue
1523 oo.updateOnuSpecificEntries(ctx)
1524 restoredFromMibTemplate = true
1525 } else {
1526 //Create a common ME MIB Instance as it doesn't prior exists.
1527 Value, err := oo.mibTemplateKVStore.Get(log.WithSpanFromContext(context.TODO(), ctx), oo.mibTemplatePath)
1528 //Unmarshal the MIB template and create the entry in the ONU Common Device DB
1529 if err == nil {
1530 if Value != nil {
1531 oo.processMibTemplate(ctx, Value)
1532 restoredFromMibTemplate = true
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001533 } else {
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301534 logger.Infow(ctx, "No MIB template found", log.Fields{"path": oo.mibTemplatePath, "device-id": oo.deviceID})
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001535 }
1536 } else {
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301537 logger.Errorw(ctx, "Get from kvstore operation failed for path",
1538 log.Fields{"path": oo.mibTemplatePath, "device-id": oo.deviceID})
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001539 }
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301540
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001541 }
1542 return restoredFromMibTemplate
1543}
Holger Hildebrandtb4563ab2021-04-14 10:27:20 +00001544
Holger Hildebrandt80f57762022-02-16 10:03:24 +00001545func (oo *OnuDeviceEntry) getAllStoredTpInstFromParentAdapter(ctx context.Context) bool {
1546
1547 allTpInstPresent := true
1548 oo.MutexPersOnuConfig.Lock()
1549 oo.MutexReconciledTpInstances.Lock()
1550 for indexUni, uniData := range oo.SOnuPersistentData.PersUniConfig {
1551 uniID := uniData.PersUniID
1552 oo.ReconciledTpInstances[uniID] = make(map[uint8]inter_adapter.TechProfileDownloadMessage)
1553 for tpID, tpPath := range uniData.PersTpPathMap {
1554 if tpPath != "" {
mgoudaa797e1c2025-06-24 17:49:42 +05301555 logger.Infow(ctx, "Starting retrieval for TechProfileInstance", log.Fields{
1556 "uniID": uniID, "tpID": tpID, "tpPath": tpPath, "device-id": oo.deviceID,
1557 })
1558 // Attempt the initial call before entering the retry loop
Holger Hildebrandt80f57762022-02-16 10:03:24 +00001559 iaTechTpInst, err := oo.baseDeviceHandler.GetTechProfileInstanceFromParentAdapter(ctx, uniID, tpPath)
mgoudaa797e1c2025-06-24 17:49:42 +05301560 if err != nil {
1561 var ticker *time.Ticker
1562
1563 // Log the initial failure and proceed to the retry mechanism
1564 logger.Warnw(ctx, "Initial TechProfileInstance API call failed, entering retry mechanism", log.Fields{
1565 "tp-id": tpID, "tpPath": tpPath, "uni-id": uniID, "device-id": oo.deviceID, "err": err,
1566 })
1567 // Retry logic
1568 /*
1569 We are retrying here because the OLT adapter may not have been up and reachable
1570 at the time of the initial attempt. This prevents the ONU adapter from fetching
1571 the TechProfile.
1572
1573 This issue might occur when both the ONU and OLT adapters are restarted simultaneously,
1574 causing a temporary mismatch in their availability. The retry logic ensures that
1575 the ONU adapter periodically attempts to fetch the TechProfile, allowing time for the
1576 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
1577 process from failing prematurely due to transient unavailability of the OLT adapter.
1578 */
1579
1580 for tpRetryAttempt := initialRetryAttempt; tpRetryAttempt <= maxRetries; tpRetryAttempt++ {
1581 ticker = time.NewTicker(retryDelay)
1582 select {
1583 case _, ok := <-oo.baseDeviceHandler.GetDeviceDeleteCommChan(ctx):
1584 if !ok {
1585 logger.Warnw(ctx, "Device deletion channel closed - aborting retry", log.Fields{"device-id": oo.deviceID})
1586 ticker.Stop()
1587 return false
1588 }
1589 case <-ticker.C:
1590 iaTechTpInst, err = oo.baseDeviceHandler.GetTechProfileInstanceFromParentAdapter(ctx, uniID, tpPath)
1591 if err != nil {
1592 logger.Warnw(ctx, "TechProfileInstance API will be retried", log.Fields{
1593 "tp-id": tpID, "tpPath": tpPath, "uni-id": uniID,
1594 "device-id": oo.deviceID, "err": err, "retry": tpRetryAttempt,
1595 "totalRetries": maxRetries,
1596 })
1597 continue
1598 }
1599
1600 logger.Info(ctx, "Successfully retrieved TechProfileInstance after retry", log.Fields{
1601 "retry": tpRetryAttempt, "device-id": oo.deviceID,
1602 })
1603 }
1604 if err == nil {
1605 break // Exit the retry loop upon success
1606 }
1607
1608 }
1609 }
Holger Hildebrandt80f57762022-02-16 10:03:24 +00001610 if err == nil && iaTechTpInst != nil {
1611 logger.Debugw(ctx, "reconciling - store Tp instance", log.Fields{"uniID": uniID, "tpID": tpID,
1612 "*iaTechTpInst": iaTechTpInst, "device-id": oo.deviceID})
1613 oo.ReconciledTpInstances[uniID][tpID] = *iaTechTpInst
1614 } else {
1615 // During the absence of the ONU adapter there seem to have been TP specific configurations!
1616 // The no longer available TP and the associated flows must be deleted from the ONU KV store
1617 // and after a MIB reset a new reconciling attempt with OMCI configuration must be started.
1618 allTpInstPresent = false
1619 logger.Infow(ctx, "reconciling - can't get tp instance - delete tp and associated flows",
1620 log.Fields{"tp-id": tpID, "tpPath": tpPath, "uni-id": uniID, "device-id": oo.deviceID, "err": err})
1621 delete(oo.SOnuPersistentData.PersUniConfig[indexUni].PersTpPathMap, tpID)
1622 flowSlice := oo.SOnuPersistentData.PersUniConfig[indexUni].PersFlowParams
1623 for indexFlow, flowData := range flowSlice {
1624 if flowData.VlanRuleParams.TpID == tpID {
1625 if len(flowSlice) == 1 {
1626 flowSlice = []cmn.UniVlanFlowParams{}
1627 } else {
1628 flowSlice = append(flowSlice[:indexFlow], flowSlice[indexFlow+1:]...)
1629 }
1630 oo.SOnuPersistentData.PersUniConfig[indexUni].PersFlowParams = flowSlice
1631 }
1632 }
1633 }
1634 }
1635 }
1636 }
1637 oo.MutexReconciledTpInstances.Unlock()
1638 oo.MutexPersOnuConfig.Unlock()
1639 return allTpInstPresent
1640}
1641
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05301642// CancelProcessing terminates potentially running reconciling processes and stops the FSM
Holger Hildebrandtb4563ab2021-04-14 10:27:20 +00001643func (oo *OnuDeviceEntry) CancelProcessing(ctx context.Context) {
Holger Hildebrandt12609a12022-03-25 13:23:25 +00001644 logger.Debugw(ctx, "CancelProcessing entered", log.Fields{"device-id": oo.deviceID})
mpagenko101ac942021-11-16 15:01:29 +00001645 if oo.isReconcilingFlows() {
Holger Hildebrandtf2fcdd42021-12-15 11:42:19 +00001646 oo.SendChReconcilingFlowsFinished(ctx, false)
Holger Hildebrandtb4563ab2021-04-14 10:27:20 +00001647 }
1648 //the MibSync FSM might be active all the ONU-active time,
1649 // hence it must be stopped unconditionally
Girish Gowdra37c9d912022-02-08 16:24:57 -08001650 oo.mutexMibSyncMsgProcessorRunning.RLock()
1651 defer oo.mutexMibSyncMsgProcessorRunning.RUnlock()
1652 if oo.mibSyncMsgProcessorRunning {
1653 pMibUlFsm := oo.PMibUploadFsm
1654 if pMibUlFsm != nil {
1655 // abort running message processing
1656 fsmAbortMsg := cmn.Message{
1657 Type: cmn.TestMsg,
1658 Data: cmn.TestMessage{
1659 TestMessageVal: cmn.AbortMessageProcessing,
1660 },
1661 }
1662 pMibUlFsm.CommChan <- fsmAbortMsg
1663 _ = pMibUlFsm.PFsm.Event(UlEvStop)
Holger Hildebrandte7cc6092022-02-01 11:37:03 +00001664 }
Holger Hildebrandtb4563ab2021-04-14 10:27:20 +00001665 }
1666}
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301667
1668// Updates Serial Number and MAC Address in the database
1669func (oo *OnuDeviceEntry) updateOnuSpecificEntries(ctx context.Context) {
1670 knownAttributeMEDb := oo.pOnuDB.CommonMeDb.MeDb
1671
1672 for firstLevelKey, firstLevelValue := range knownAttributeMEDb {
1673 classID := strconv.Itoa(int(firstLevelKey))
1674
1675 for secondLevelKey, secondLevelValue := range firstLevelValue {
1676 switch classID {
1677 case "6", "256":
1678 oo.updateAttribute(ctx, "SerialNumber", secondLevelValue, firstLevelKey, secondLevelKey, oo.SOnuPersistentData.PersSerialNumber)
1679 case "134":
1680 oo.updateAttribute(ctx, "MacAddress", secondLevelValue, firstLevelKey, secondLevelKey, oo.SOnuPersistentData.PersMacAddress)
1681 }
1682 }
1683 }
1684}
1685
1686// Updates a specific attribute in the MIB database
1687func (oo *OnuDeviceEntry) updateAttribute(ctx context.Context, attributeName string, attributesMap me.AttributeValueMap, classID me.ClassID, entityID uint16, newValue interface{}) {
1688 if _, exists := attributesMap[attributeName]; exists {
bseeniva8c4547f2026-01-30 16:30:30 +05301689 logger.Debugw(ctx, "Updating "+attributeName, log.Fields{"classID": strconv.Itoa(int(classID)), "oldValue": attributesMap[attributeName], "newValue": newValue})
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301690 attributeCopy := make(me.AttributeValueMap)
1691 for k, v := range attributesMap {
1692 attributeCopy[k] = v
1693 }
1694 attributeCopy[attributeName] = newValue
1695 oo.pOnuDB.PutOnuSpeficMe(ctx, classID, entityID, attributeCopy)
1696 } else {
1697 logger.Warnw(ctx, attributeName+" key not found", log.Fields{"classID": strconv.Itoa(int(classID))})
1698 }
1699}
1700
1701// Processes the MIB template by replacing tokens and unmarshaling it
1702func (oo *OnuDeviceEntry) processMibTemplate(ctx context.Context, value *kvstore.KVPair) {
1703 mibTmpString, _ := kvstore.ToString(value.Value)
1704 mibTmpString2 := strings.ReplaceAll(mibTmpString, "\x00", "")
1705 mibTmpBytes := []byte(mibTmpString2)
1706
1707 logger.Debugf(ctx, "MibSync FSM - Mib template tokens swapped out: %s", mibTmpBytes)
1708
1709 var firstLevelMap map[string]interface{}
1710 if err := json.Unmarshal(mibTmpBytes, &firstLevelMap); err != nil {
1711 logger.Errorw(ctx, "MibSync FSM - Failed to unmarshal template", log.Fields{"error": err, "device-id": oo.deviceID})
1712 return
1713 }
1714
1715 cmnMEDbValue, _ := oo.pOpenOnuAc.CreateEntryAtMibDatabaseMap(ctx, oo.mibTemplatePath)
1716 oo.populateMibDatabase(ctx, cmnMEDbValue, firstLevelMap)
1717 cmnMEDbValue.MIBUploadStatus = devdb.Completed
1718 oo.pOnuDB.CommonMeDb = cmnMEDbValue
1719}
1720
1721// Populates the MIB database with parsed data
1722func (oo *OnuDeviceEntry) populateMibDatabase(ctx context.Context, cmnMEDbValue *devdb.OnuCmnMEDB, firstLevelMap map[string]interface{}) {
1723 cmnMEDbValue.MeDbLock.Lock()
1724 defer cmnMEDbValue.MeDbLock.Unlock()
1725
bseeniva8c4547f2026-01-30 16:30:30 +05301726 logger.Debugw(ctx, "Populating MIbDatabase with the template information ", log.Fields{"device-id": oo.deviceID})
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301727 for firstLevelKey, firstLevelValue := range firstLevelMap {
1728 if uint16ValidNumber, err := strconv.ParseUint(firstLevelKey, 10, 16); err == nil {
1729 meClassID := me.ClassID(uint16ValidNumber)
1730 if isSupportedClassID(meClassID) {
1731 secondLevelMap := firstLevelValue.(map[string]interface{})
1732 for secondLevelKey, secondLevelValue := range secondLevelMap {
1733 if uint16ValidNumber, err := strconv.ParseUint(secondLevelKey, 10, 16); err == nil {
1734 meEntityID := uint16(uint16ValidNumber)
1735 thirdLevelMap := secondLevelValue.(map[string]interface{})
1736 if attributes, exists := thirdLevelMap["Attributes"].(map[string]interface{}); exists {
1737 if _, found := cmnMEDbValue.MeDb[meClassID]; !found {
1738 cmnMEDbValue.MeDb[meClassID] = make(map[uint16]me.AttributeValueMap)
1739 }
1740 if _, found := cmnMEDbValue.MeDb[meClassID][meEntityID]; !found {
1741 cmnMEDbValue.MeDb[meClassID][meEntityID] = make(me.AttributeValueMap)
1742 }
1743 for attrKey, attrValue := range attributes {
1744 cmnMEDbValue.MeDb[meClassID][meEntityID][attrKey] = attrValue
1745 }
1746 }
1747
1748 }
1749 }
1750 }
1751 }
1752 }
1753}