blob: 13f404705557302a97e0e0b9693f0d23a0380d1e [file] [log] [blame]
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001/*
Joey Armstrong89c812c2024-01-12 19:00:20 -05002 * Copyright 2020-2024 Open Networking Foundation (ONF) and the ONF Contributors
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
nikesh.krishnan1ffb8132023-05-23 03:44:13 +053017// Package mib provides the utilities for managing the onu mib
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000018package mib
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000019
20import (
21 "context"
Holger Hildebrandtc54939a2020-06-17 08:14:27 +000022 "encoding/hex"
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000023 "encoding/json"
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000024 "errors"
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000025 "fmt"
26 "strconv"
mpagenko3af1f032020-06-10 08:53:41 +000027 "strings"
Girish Gowdraf7d82d02022-04-26 16:18:35 -070028 "sync"
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000029
30 "github.com/looplab/fsm"
31
divyadesaibbed37c2020-08-28 13:35:20 +053032 "time"
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000033
mpagenko7033f4e2021-11-19 18:04:22 +000034 "github.com/google/gopacket"
mpagenko836a1fd2021-11-01 16:12:42 +000035 "github.com/opencord/omci-lib-go/v2"
36 me "github.com/opencord/omci-lib-go/v2/generated"
khenaidoo7d3c5582021-08-11 18:09:44 -040037 "github.com/opencord/voltha-lib-go/v7/pkg/db/kvstore"
38 "github.com/opencord/voltha-lib-go/v7/pkg/log"
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000039 cmn "github.com/opencord/voltha-openonu-adapter-go/internal/pkg/common"
40 devdb "github.com/opencord/voltha-openonu-adapter-go/internal/pkg/devdb"
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +000041 otst "github.com/opencord/voltha-openonu-adapter-go/internal/pkg/omcitst"
Holger Hildebrandt9afc1582021-11-30 16:10:19 +000042 "github.com/opencord/voltha-protos/v5/go/inter_adapter"
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000043)
44
mpagenko01499812021-03-25 10:37:12 +000045type sLastTxMeParameter struct {
mpagenko01499812021-03-25 10:37:12 +000046 pLastTxMeInstance *me.ManagedEntity
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +053047 lastTxMessageType omci.MessageType
mpagenko01499812021-03-25 10:37:12 +000048 repeatCount uint8
49}
50
mgoudaa797e1c2025-06-24 17:49:42 +053051const (
52 retryDelay = 30 * time.Second
53 maxRetries = 3
54 initialRetryAttempt = 1
55)
56
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000057var supportedClassIds = []me.ClassID{
58 me.CardholderClassID, // 5
59 me.CircuitPackClassID, // 6
60 me.SoftwareImageClassID, // 7
61 me.PhysicalPathTerminationPointEthernetUniClassID, // 11
ozgecanetsia124d9732021-09-16 14:31:57 +030062 me.PhysicalPathTerminationPointPotsUniClassID, // 53
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000063 me.OltGClassID, // 131
64 me.OnuPowerSheddingClassID, // 133
65 me.IpHostConfigDataClassID, // 134
66 me.OnuGClassID, // 256
67 me.Onu2GClassID, // 257
68 me.TContClassID, // 262
69 me.AniGClassID, // 263
70 me.UniGClassID, // 264
71 me.PriorityQueueClassID, // 277
72 me.TrafficSchedulerClassID, // 278
73 me.VirtualEthernetInterfacePointClassID, // 329
74 me.EnhancedSecurityControlClassID, // 332
75 me.OnuDynamicPowerManagementControlClassID, // 336
76 // 347 // definitions for ME "IPv6 host config data" are currently missing in omci-lib-go!
77}
78
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +000079var omccVersionSupportsExtendedOmciFormat = map[uint8]bool{
80 0x80: false,
81 0x81: false,
82 0x82: false,
83 0x83: false,
84 0x84: false,
85 0x85: false,
86 0x86: false,
87 0xA0: false,
88 0xA1: false,
89 0xA2: false,
90 0xA3: false,
91 0x96: true,
92 0xB0: true,
93 0xB1: true,
94 0xB2: true,
95 0xB3: true,
96 0xB4: true,
97}
98
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000099var fsmMsg cmn.TestMessageType
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000100
dbainbri4d3a0dc2020-12-02 00:33:42 +0000101func (oo *OnuDeviceEntry) enterStartingState(ctx context.Context, e *fsm.Event) {
102 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start processing MibSync-msgs in State": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000103 oo.pOnuDB = devdb.NewOnuDeviceDB(log.WithSpanFromContext(context.TODO(), ctx), oo.deviceID)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000104 go oo.processMibSyncMessages(ctx)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000105}
106
dbainbri4d3a0dc2020-12-02 00:33:42 +0000107func (oo *OnuDeviceEntry) enterResettingMibState(ctx context.Context, e *fsm.Event) {
108 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start MibTemplate processing in State": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000109
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000110 if (!oo.IsNewOnu() && !oo.baseDeviceHandler.IsReconciling()) || //use case: re-auditing failed
111 oo.baseDeviceHandler.IsSkipOnuConfigReconciling() { //use case: reconciling without omci-config failed
112 oo.baseDeviceHandler.PrepareReconcilingWithActiveAdapter(ctx)
113 oo.devState = cmn.DeviceStatusInit
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000114 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000115 logger.Debugw(ctx, "MibSync FSM", log.Fields{"send mibReset in State": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000116 oo.mutexLastTxParamStruct.Lock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000117 _ = oo.PDevOmciCC.SendMibReset(log.WithSpanFromContext(context.TODO(), ctx), oo.baseDeviceHandler.GetOmciTimeout(), true)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000118 //TODO: needs to handle timeouts
mpagenko01499812021-03-25 10:37:12 +0000119 //even though lastTxParameters are currently not used for checking the ResetResponse message we have to ensure
120 // that the lastTxMessageType is correctly set to avoid misinterpreting other responses
121 oo.lastTxParamStruct.lastTxMessageType = omci.MibResetRequestType
122 oo.lastTxParamStruct.repeatCount = 0
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000123 oo.mutexLastTxParamStruct.Unlock()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000124}
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000125
dbainbri4d3a0dc2020-12-02 00:33:42 +0000126func (oo *OnuDeviceEntry) enterGettingVendorAndSerialState(ctx context.Context, e *fsm.Event) {
127 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start getting VendorId and SerialNumber in State": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +0000128 requestedAttributes := me.AttributeValueMap{me.OnuG_VendorId: "", me.OnuG_SerialNumber: 0}
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000129 oo.mutexLastTxParamStruct.Lock()
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000130 meInstance, err := oo.PDevOmciCC.SendGetMe(log.WithSpanFromContext(context.TODO(), ctx), me.OnuGClassID, cmn.OnugMeID, requestedAttributes,
Holger Hildebrandtd930cb22022-06-17 09:24:50 +0000131 oo.baseDeviceHandler.GetOmciTimeout(), true, oo.PMibUploadFsm.CommChan, false)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000132 //accept also nil as (error) return value for writing to LastTx
133 // - this avoids misinterpretation of new received OMCI messages
ozgecanetsiab36ed572021-04-01 10:38:48 +0300134 if err != nil {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000135 oo.mutexLastTxParamStruct.Unlock()
ozgecanetsiab36ed572021-04-01 10:38:48 +0300136 logger.Errorw(ctx, "ONU-G get failed, aborting MibSync FSM", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000137 pMibUlFsm := oo.PMibUploadFsm
ozgecanetsiab36ed572021-04-01 10:38:48 +0300138 if pMibUlFsm != nil {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530139 //nolint:unparam
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000140 go func(a_pAFsm *cmn.AdapterFsm) {
141 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
ozgecanetsiab36ed572021-04-01 10:38:48 +0300142 }(pMibUlFsm)
143 }
144 return
145 }
mpagenko01499812021-03-25 10:37:12 +0000146 oo.lastTxParamStruct.lastTxMessageType = omci.GetRequestType
147 oo.lastTxParamStruct.pLastTxMeInstance = meInstance
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000148 oo.mutexLastTxParamStruct.Unlock()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000149}
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000150
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000151func (oo *OnuDeviceEntry) enterGettingVersionState(ctx context.Context, e *fsm.Event) {
152 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start getting Version in State": e.FSM.Current(), "device-id": oo.deviceID})
153 requestedAttributes := me.AttributeValueMap{me.OnuG_Version: ""}
154 oo.mutexLastTxParamStruct.Lock()
155 meInstance, err := oo.PDevOmciCC.SendGetMe(log.WithSpanFromContext(context.TODO(), ctx), me.OnuGClassID, cmn.OnugMeID,
Holger Hildebrandtd930cb22022-06-17 09:24:50 +0000156 requestedAttributes, oo.baseDeviceHandler.GetOmciTimeout(), true, oo.PMibUploadFsm.CommChan, false)
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000157 //accept also nil as (error) return value for writing to LastTx
158 // - this avoids misinterpretation of new received OMCI messages
159 if err != nil {
160 oo.mutexLastTxParamStruct.Unlock()
161 logger.Errorw(ctx, "ONU-G get failed, aborting MibSync FSM", log.Fields{"device-id": oo.deviceID})
162 pMibUlFsm := oo.PMibUploadFsm
163 if pMibUlFsm != nil {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530164 //nolint:unparam
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000165 go func(a_pAFsm *cmn.AdapterFsm) {
166 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
167 }(pMibUlFsm)
168 }
169 return
170 }
171 oo.lastTxParamStruct.lastTxMessageType = omci.GetRequestType
172 oo.lastTxParamStruct.pLastTxMeInstance = meInstance
173 oo.mutexLastTxParamStruct.Unlock()
174}
175
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000176func (oo *OnuDeviceEntry) enterGettingEquipIDAndOmccVersState(ctx context.Context, e *fsm.Event) {
177 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start getting EquipmentId and OMCC version in State": e.FSM.Current(), "device-id": oo.deviceID})
178 requestedAttributes := me.AttributeValueMap{me.Onu2G_EquipmentId: "", me.Onu2G_OpticalNetworkUnitManagementAndControlChannelOmccVersion: 0}
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000179 oo.mutexLastTxParamStruct.Lock()
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000180 meInstance, err := oo.PDevOmciCC.SendGetMe(log.WithSpanFromContext(context.TODO(), ctx), me.Onu2GClassID, cmn.Onu2gMeID, requestedAttributes,
Holger Hildebrandtd930cb22022-06-17 09:24:50 +0000181 oo.baseDeviceHandler.GetOmciTimeout(), true, oo.PMibUploadFsm.CommChan, false)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000182 //accept also nil as (error) return value for writing to LastTx
183 // - this avoids misinterpretation of new received OMCI messages
ozgecanetsiab36ed572021-04-01 10:38:48 +0300184 if err != nil {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000185 oo.mutexLastTxParamStruct.Unlock()
ozgecanetsiab36ed572021-04-01 10:38:48 +0300186 logger.Errorw(ctx, "ONU2-G get failed, aborting MibSync FSM!", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000187 pMibUlFsm := oo.PMibUploadFsm
ozgecanetsiab36ed572021-04-01 10:38:48 +0300188 if pMibUlFsm != nil {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530189 //nolint:unparam
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000190 go func(a_pAFsm *cmn.AdapterFsm) {
191 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
ozgecanetsiab36ed572021-04-01 10:38:48 +0300192 }(pMibUlFsm)
193 }
194 return
195 }
mpagenko01499812021-03-25 10:37:12 +0000196 oo.lastTxParamStruct.lastTxMessageType = omci.GetRequestType
197 oo.lastTxParamStruct.pLastTxMeInstance = meInstance
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000198 oo.mutexLastTxParamStruct.Unlock()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000199}
200
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000201func (oo *OnuDeviceEntry) enterTestingExtOmciSupportState(ctx context.Context, e *fsm.Event) {
202 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start testing extended OMCI msg in State": e.FSM.Current(), "device-id": oo.deviceID})
203 omciVerify := otst.NewOmciTestRequest(log.WithSpanFromContext(context.TODO(), ctx),
204 oo.deviceID, oo.PDevOmciCC, true, true, true)
205 verifyExec := make(chan bool)
206 omciVerify.PerformOmciTest(log.WithSpanFromContext(context.TODO(), ctx), verifyExec)
207
208 // If verification of test message in extended OMCI format fails, reset ONU capability to OMCI baseline format
209 select {
210 case <-time.After(((cmn.CDefaultRetries+1)*otst.CTestRequestOmciTimeout + 1) * time.Second):
211 logger.Warnw(ctx, "testing extended OMCI msg format timed out - reset to baseline format", log.Fields{"device-id": oo.deviceID})
212 oo.MutexPersOnuConfig.Lock()
213 oo.SOnuPersistentData.PersIsExtOmciSupported = false
214 oo.MutexPersOnuConfig.Unlock()
215 case success := <-verifyExec:
216 if success {
217 logger.Debugw(ctx, "testing extended OMCI msg format succeeded", log.Fields{"device-id": oo.deviceID})
218 } else {
219 logger.Warnw(ctx, "testing extended OMCI msg format failed - reset to baseline format", log.Fields{"device-id": oo.deviceID, "result": success})
220 oo.MutexPersOnuConfig.Lock()
221 oo.SOnuPersistentData.PersIsExtOmciSupported = false
222 oo.MutexPersOnuConfig.Unlock()
223 }
224 }
225 pMibUlFsm := oo.PMibUploadFsm
226 if pMibUlFsm != nil {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530227 //nolint:unparam
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000228 go func(a_pAFsm *cmn.AdapterFsm) {
229 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetFirstSwVersion)
230 }(pMibUlFsm)
231 }
232}
233
dbainbri4d3a0dc2020-12-02 00:33:42 +0000234func (oo *OnuDeviceEntry) enterGettingFirstSwVersionState(ctx context.Context, e *fsm.Event) {
235 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start getting IsActive and Version of first SW-image in State": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +0000236 requestedAttributes := me.AttributeValueMap{me.SoftwareImage_IsCommitted: 0, me.SoftwareImage_IsActive: 0, me.SoftwareImage_Version: ""}
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000237 oo.mutexLastTxParamStruct.Lock()
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000238 meInstance, err := oo.PDevOmciCC.SendGetMe(log.WithSpanFromContext(context.TODO(), ctx), me.SoftwareImageClassID, cmn.FirstSwImageMeID, requestedAttributes,
Holger Hildebrandtd930cb22022-06-17 09:24:50 +0000239 oo.baseDeviceHandler.GetOmciTimeout(), true, oo.PMibUploadFsm.CommChan, oo.GetPersIsExtOmciSupported())
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000240 //accept also nil as (error) return value for writing to LastTx
241 // - this avoids misinterpretation of new received OMCI messages
ozgecanetsiab36ed572021-04-01 10:38:48 +0300242 if err != nil {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000243 oo.mutexLastTxParamStruct.Unlock()
ozgecanetsiab36ed572021-04-01 10:38:48 +0300244 logger.Errorw(ctx, "SoftwareImage get failed, aborting MibSync FSM", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000245 pMibUlFsm := oo.PMibUploadFsm
ozgecanetsiab36ed572021-04-01 10:38:48 +0300246 if pMibUlFsm != nil {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530247 //nolint:unparam
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000248 go func(a_pAFsm *cmn.AdapterFsm) {
249 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
ozgecanetsiab36ed572021-04-01 10:38:48 +0300250 }(pMibUlFsm)
251 }
252 return
253 }
mpagenko01499812021-03-25 10:37:12 +0000254 oo.lastTxParamStruct.lastTxMessageType = omci.GetRequestType
255 oo.lastTxParamStruct.pLastTxMeInstance = meInstance
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000256 oo.mutexLastTxParamStruct.Unlock()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000257}
258
dbainbri4d3a0dc2020-12-02 00:33:42 +0000259func (oo *OnuDeviceEntry) enterGettingSecondSwVersionState(ctx context.Context, e *fsm.Event) {
260 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start getting IsActive and Version of second SW-image in State": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +0000261 requestedAttributes := me.AttributeValueMap{me.SoftwareImage_IsCommitted: 0, me.SoftwareImage_IsActive: 0, me.SoftwareImage_Version: ""}
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000262 oo.mutexLastTxParamStruct.Lock()
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000263 meInstance, err := oo.PDevOmciCC.SendGetMe(log.WithSpanFromContext(context.TODO(), ctx), me.SoftwareImageClassID, cmn.SecondSwImageMeID, requestedAttributes,
Holger Hildebrandtd930cb22022-06-17 09:24:50 +0000264 oo.baseDeviceHandler.GetOmciTimeout(), true, oo.PMibUploadFsm.CommChan, oo.GetPersIsExtOmciSupported())
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000265 //accept also nil as (error) return value for writing to LastTx
266 // - this avoids misinterpretation of new received OMCI messages
ozgecanetsiab36ed572021-04-01 10:38:48 +0300267 if err != nil {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000268 oo.mutexLastTxParamStruct.Unlock()
ozgecanetsiab36ed572021-04-01 10:38:48 +0300269 logger.Errorw(ctx, "SoftwareImage get failed, aborting MibSync FSM", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000270 pMibUlFsm := oo.PMibUploadFsm
ozgecanetsiab36ed572021-04-01 10:38:48 +0300271 if pMibUlFsm != nil {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530272 //nolint:unparam
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000273 go func(a_pAFsm *cmn.AdapterFsm) {
274 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
ozgecanetsiab36ed572021-04-01 10:38:48 +0300275 }(pMibUlFsm)
276 }
277 return
278 }
mpagenko01499812021-03-25 10:37:12 +0000279 oo.lastTxParamStruct.lastTxMessageType = omci.GetRequestType
280 oo.lastTxParamStruct.pLastTxMeInstance = meInstance
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000281 oo.mutexLastTxParamStruct.Unlock()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000282}
283
dbainbri4d3a0dc2020-12-02 00:33:42 +0000284func (oo *OnuDeviceEntry) enterGettingMacAddressState(ctx context.Context, e *fsm.Event) {
285 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start getting MacAddress in State": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +0000286 requestedAttributes := me.AttributeValueMap{me.IpHostConfigData_MacAddress: ""}
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000287 oo.mutexLastTxParamStruct.Lock()
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000288 meInstance, err := oo.PDevOmciCC.SendGetMe(log.WithSpanFromContext(context.TODO(), ctx), me.IpHostConfigDataClassID, cmn.IPHostConfigDataMeID, requestedAttributes,
Holger Hildebrandtd930cb22022-06-17 09:24:50 +0000289 oo.baseDeviceHandler.GetOmciTimeout(), true, oo.PMibUploadFsm.CommChan, oo.GetPersIsExtOmciSupported())
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000290 //accept also nil as (error) return value for writing to LastTx
291 // - this avoids misinterpretation of new received OMCI messages
ozgecanetsiab36ed572021-04-01 10:38:48 +0300292 if err != nil {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000293 oo.mutexLastTxParamStruct.Unlock()
ozgecanetsiab36ed572021-04-01 10:38:48 +0300294 logger.Errorw(ctx, "IpHostConfigData get failed, aborting MibSync FSM", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000295 pMibUlFsm := oo.PMibUploadFsm
ozgecanetsiab36ed572021-04-01 10:38:48 +0300296 if pMibUlFsm != nil {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530297 //nolint:unparam
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000298 go func(a_pAFsm *cmn.AdapterFsm) {
299 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
ozgecanetsiab36ed572021-04-01 10:38:48 +0300300 }(pMibUlFsm)
301 }
302 return
303 }
mpagenko01499812021-03-25 10:37:12 +0000304 oo.lastTxParamStruct.lastTxMessageType = omci.GetRequestType
305 oo.lastTxParamStruct.pLastTxMeInstance = meInstance
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000306 oo.mutexLastTxParamStruct.Unlock()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000307}
308
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530309//nolint:unparam
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000310func (oo *OnuDeviceEntry) enterGettingMibTemplateState(ctx context.Context, e *fsm.Event) {
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000311
Holger Hildebrandt05011352021-06-15 09:40:24 +0000312 oo.mutexOnuSwImageIndications.RLock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000313 if oo.onuSwImageIndications.ActiveEntityEntry.Valid {
314 oo.MutexPersOnuConfig.Lock()
315 oo.SOnuPersistentData.PersActiveSwVersion = oo.onuSwImageIndications.ActiveEntityEntry.Version
316 oo.MutexPersOnuConfig.Unlock()
Holger Hildebrandt05011352021-06-15 09:40:24 +0000317 oo.mutexOnuSwImageIndications.RUnlock()
mpagenko15ff4a52021-03-02 10:09:20 +0000318 } else {
Holger Hildebrandt05011352021-06-15 09:40:24 +0000319 oo.mutexOnuSwImageIndications.RUnlock()
mpagenko15ff4a52021-03-02 10:09:20 +0000320 logger.Errorw(ctx, "get-mib-template: no active SW version found, working with empty SW version, which might be untrustworthy",
321 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtc54939a2020-06-17 08:14:27 +0000322 }
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000323
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +0530324 //create the MIB Template path
325 oo.mibTemplatePath = oo.buildMibTemplatePath()
326
327 if cmnMEDBVal, exist := oo.pOpenOnuAc.FetchEntryFromMibDatabaseMap(ctx, oo.mibTemplatePath); exist {
328 logger.Infow(ctx, "A Common MIB DB Instance exist for this type of ONT", log.Fields{"device-id": oo.deviceID, "mibTemplatePath": oo.mibTemplatePath})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000329 oo.pOpenOnuAc.LockMutexMibTemplateGenerated()
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +0530330 oo.pOnuDB.CommonMeDb = cmnMEDBVal
331
pnalmas8c2f09d2025-01-02 11:30:03 +0530332 //VOL-5406:If the Instance is present but the MIB templates are cleaned up . Check and create one.
333 Value, err := oo.mibTemplateKVStore.Get(log.WithSpanFromContext(context.TODO(), ctx), oo.mibTemplatePath)
334 if err == nil {
335 if Value == nil {
336
337 error := oo.createAndPersistMibTemplate(ctx)
338 if error != nil {
339 logger.Errorw(ctx, "MibSync - MibTemplate - Failed to create and persist the mib template", log.Fields{"error": err, "device-id": oo.deviceID})
340 } else {
341 logger.Infow(ctx, "MIB Template created and stored ", log.Fields{"device-id": oo.deviceID, "mibTemplatePath": oo.mibTemplatePath})
342 }
343 }
344 } else {
345 logger.Errorw(ctx, "MibSync - MibTemplate - Failed to create and persist the mib template", log.Fields{"error": err, "device-id": oo.deviceID})
346 }
347
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +0530348 if cmnMEDBVal.MIBUploadStatus == devdb.Completed {
349 oo.pOnuDB.CommonMeDb.MeDbLock.Lock()
350 oo.updateOnuSpecificEntries(ctx)
351 oo.pOnuDB.CommonMeDb.MeDbLock.Unlock()
352 fsmMsg = cmn.LoadMibTemplateOk
353 } else {
354 logger.Errorw(ctx, "A previous MIB Upload for this type of ONT has failed, request for a MIB UPload", log.Fields{"device-id": oo.deviceID})
355 oo.pOpenOnuAc.ResetEntryFromMibDatabaseMap(ctx, oo.mibTemplatePath)
356 fsmMsg = cmn.LoadMibTemplateFailed
Holger Hildebrandt441a0172020-12-10 13:57:08 +0000357 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000358 oo.pOpenOnuAc.UnlockMutexMibTemplateGenerated()
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +0530359
360 } else {
361 Value, err := oo.mibTemplateKVStore.Get(log.WithSpanFromContext(context.TODO(), ctx), oo.mibTemplatePath)
362 if err == nil && Value != nil {
363 logger.Infow(ctx, "No Common MIB DB instance exist , creating from Template", log.Fields{"device-id": oo.deviceID, "mibTemplatePath": oo.mibTemplatePath})
364 oo.processMibTemplate(ctx, Value)
pnalmasaad81392025-01-03 11:21:19 +0530365 fsmMsg = cmn.LoadMibTemplateOk
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +0530366 } else {
367 logger.Infow(ctx, "Neither Common MIB DB Instance nor MIB template exist for this type of ONT", log.Fields{"device-id": oo.deviceID, "mibTemplatePath": oo.mibTemplatePath})
368 oo.pOpenOnuAc.LockMutexMibTemplateGenerated()
369 cmnMEDBValue, _ := oo.pOpenOnuAc.CreateEntryAtMibDatabaseMap(ctx, oo.mibTemplatePath)
370 oo.pOnuDB.CommonMeDb = cmnMEDBValue
371 oo.pOnuDB.CommonMeDb.MeDbLock.Lock()
372 fsmMsg = cmn.LoadMibTemplateFailed
373
374 }
375
Holger Hildebrandt441a0172020-12-10 13:57:08 +0000376 }
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +0530377
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000378 mibSyncMsg := cmn.Message{
379 Type: cmn.TestMsg,
380 Data: cmn.TestMessage{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000381 TestMessageVal: fsmMsg,
382 },
383 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000384 oo.PMibUploadFsm.CommChan <- mibSyncMsg
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000385}
386
dbainbri4d3a0dc2020-12-02 00:33:42 +0000387func (oo *OnuDeviceEntry) enterUploadingState(ctx context.Context, e *fsm.Event) {
388 logger.Debugw(ctx, "MibSync FSM", log.Fields{"send MibUpload in State": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000389 _ = oo.PDevOmciCC.SendMibUpload(log.WithSpanFromContext(context.TODO(), ctx),
390 oo.baseDeviceHandler.GetOmciTimeout(), true, oo.GetPersIsExtOmciSupported())
mpagenko01499812021-03-25 10:37:12 +0000391 //even though lastTxParameters are currently not used for checking the ResetResponse message we have to ensure
392 // that the lastTxMessageType is correctly set to avoid misinterpreting other responses
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000393 oo.mutexLastTxParamStruct.Lock()
mpagenko01499812021-03-25 10:37:12 +0000394 oo.lastTxParamStruct.lastTxMessageType = omci.MibUploadRequestType
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000395 oo.mutexLastTxParamStruct.Unlock()
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000396}
397
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000398func (oo *OnuDeviceEntry) enterUploadDoneState(ctx context.Context, e *fsm.Event) {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000399 logger.Debugw(ctx, "MibSync FSM", log.Fields{"send notification to core in State": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000400 oo.transferSystemEvent(ctx, cmn.MibDatabaseSync)
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000401 go func() {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000402 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000403 }()
404}
405
406func (oo *OnuDeviceEntry) enterInSyncState(ctx context.Context, e *fsm.Event) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000407 oo.MutexPersOnuConfig.Lock()
408 oo.SOnuPersistentData.PersMibLastDbSync = uint32(time.Now().Unix())
409 oo.MutexPersOnuConfig.Unlock()
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000410 if oo.mibAuditInterval > 0 {
411 logger.Debugw(ctx, "MibSync FSM", log.Fields{"trigger next Audit in State": e.FSM.Current(), "oo.mibAuditInterval": oo.mibAuditInterval, "device-id": oo.deviceID})
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000412 go func() {
Holger Hildebrandte3677f12021-02-05 14:50:56 +0000413 time.Sleep(oo.mibAuditInterval)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000414 if err := oo.PMibUploadFsm.PFsm.Event(UlEvAuditMib); err != nil {
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000415 logger.Debugw(ctx, "MibSyncFsm: Can't go to state auditing", log.Fields{"device-id": oo.deviceID, "err": err})
416 }
417 }()
418 }
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000419}
420
Holger Hildebrandt9afc1582021-11-30 16:10:19 +0000421func (oo *OnuDeviceEntry) enterVerifyingAndStoringTPsState(ctx context.Context, e *fsm.Event) {
422 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start verifying and storing TPs in State": e.FSM.Current(), "device-id": oo.deviceID})
423
Holger Hildebrandt80f57762022-02-16 10:03:24 +0000424 if oo.getAllStoredTpInstFromParentAdapter(ctx) {
Holger Hildebrandt9afc1582021-11-30 16:10:19 +0000425 logger.Debugw(ctx, "MibSync FSM", log.Fields{"reconciling - verifying TPs successful": e.FSM.Current(), "device-id": oo.deviceID})
426 go func() {
427 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
428 }()
429 } else {
430 logger.Debugw(ctx, "MibSync FSM", log.Fields{"reconciling - verifying TPs not successful": e.FSM.Current(), "device-id": oo.deviceID})
431 oo.baseDeviceHandler.SetReconcilingReasonUpdate(true)
432 go func() {
433 if err := oo.baseDeviceHandler.StorePersistentData(ctx); err != nil {
434 logger.Warnw(ctx, "reconciling - store persistent data error - continue for now as there will be additional write attempts",
435 log.Fields{"device-id": oo.deviceID, "err": err})
436 }
437 _ = oo.PMibUploadFsm.PFsm.Event(UlEvMismatch)
438 }()
439 }
440}
441
dbainbri4d3a0dc2020-12-02 00:33:42 +0000442func (oo *OnuDeviceEntry) enterExaminingMdsState(ctx context.Context, e *fsm.Event) {
443 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start GetMds processing in State": e.FSM.Current(), "device-id": oo.deviceID})
Praneeth Kumar Nalmas77ab2f32024-04-17 11:14:27 +0530444 oo.pOpenOnuAc.RLockMutexDeviceHandlersMap()
445 dh, _ := oo.pOpenOnuAc.GetDeviceHandler(oo.deviceID)
446 oo.pOpenOnuAc.RUnlockMutexDeviceHandlersMap()
447 if dh.GetSkipOnuConfigEnabled() {
448 go func() {
449 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
450 }()
451 } else {
452 oo.requestMdsValue(ctx)
453 }
454
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000455}
456
dbainbri4d3a0dc2020-12-02 00:33:42 +0000457func (oo *OnuDeviceEntry) enterResynchronizingState(ctx context.Context, e *fsm.Event) {
458 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start MibResync processing in State": e.FSM.Current(), "device-id": oo.deviceID})
459 logger.Debug(ctx, "function not implemented yet")
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000460 // TODOs:
461 // VOL-3805 - Provide exclusive OMCI channel for one FSM
462 // VOL-3785 - New event notifications and corresponding performance counters for openonu-adapter-go
463 // VOL-3792 - Support periodical audit via mib resync
464 // VOL-3793 - ONU-reconcile handling after adapter restart based on mib resync
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000465}
466
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000467func (oo *OnuDeviceEntry) enterExaminingMdsSuccessState(ctx context.Context, e *fsm.Event) {
468 logger.Debugw(ctx, "MibSync FSM",
469 log.Fields{"Start processing on examining MDS success in State": e.FSM.Current(), "device-id": oo.deviceID})
470
471 if oo.getMibFromTemplate(ctx) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000472 oo.baseDeviceHandler.StartReconciling(ctx, true)
473 oo.baseDeviceHandler.AddAllUniPorts(ctx)
Holger Hildebrandt9afc1582021-11-30 16:10:19 +0000474 _ = oo.baseDeviceHandler.ReasonUpdate(ctx, cmn.DrInitialMibDownloaded, oo.baseDeviceHandler.IsReconcilingReasonUpdate())
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000475 oo.baseDeviceHandler.SetReadyForOmciConfig(true)
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000476
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000477 if !oo.baseDeviceHandler.GetCollectorIsRunning() {
Girish Gowdraf7d82d02022-04-26 16:18:35 -0700478 var waitForOmciProcess sync.WaitGroup
479 waitForOmciProcess.Add(1)
Holger Hildebrandtced74e72021-06-10 14:55:53 +0000480 // Start PM collector routine
Girish Gowdraf7d82d02022-04-26 16:18:35 -0700481 go oo.baseDeviceHandler.StartCollector(ctx, &waitForOmciProcess)
482 waitForOmciProcess.Wait()
Holger Hildebrandtced74e72021-06-10 14:55:53 +0000483 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000484 if !oo.baseDeviceHandler.GetAlarmManagerIsRunning(ctx) {
485 go oo.baseDeviceHandler.StartAlarmManager(ctx)
Holger Hildebrandtced74e72021-06-10 14:55:53 +0000486 }
Girish Gowdrae95687a2021-09-08 16:30:58 -0700487
488 for _, uniPort := range *oo.baseDeviceHandler.GetUniEntityMap() {
489 // only if this port was enabled for use by the operator at startup
490 if (1<<uniPort.UniID)&oo.baseDeviceHandler.GetUniPortMask() == (1 << uniPort.UniID) {
491 if !oo.baseDeviceHandler.GetFlowMonitoringIsRunning(uniPort.UniID) {
492 go oo.baseDeviceHandler.PerOnuFlowHandlerRoutine(uniPort.UniID)
493 }
494 }
495 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000496 oo.MutexPersOnuConfig.RLock()
497 if oo.SOnuPersistentData.PersUniDisableDone {
498 oo.MutexPersOnuConfig.RUnlock()
499 oo.baseDeviceHandler.DisableUniPortStateUpdate(ctx)
Holger Hildebrandt9afc1582021-11-30 16:10:19 +0000500 _ = oo.baseDeviceHandler.ReasonUpdate(ctx, cmn.DrOmciAdminLock, oo.baseDeviceHandler.IsReconcilingReasonUpdate())
Holger Hildebrandtbdc5f002021-04-19 14:46:21 +0000501 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000502 oo.MutexPersOnuConfig.RUnlock()
503 oo.baseDeviceHandler.EnableUniPortStateUpdate(ctx)
Holger Hildebrandtbdc5f002021-04-19 14:46:21 +0000504 }
Holger Hildebrandtb314f442021-11-24 12:03:10 +0000505
506 // no need to reconcile additional data for MibDownloadFsm, LockStateFsm, or UnlockStateFsm
507
Sridhar Ravindraa9cb0442025-07-21 16:55:05 +0530508 // During reboot, if the adapter restarted while configuring TP or flows, we need to continue with flow configurations now.
509 // Set the mibUpload FSM as success and proceed with flow configs
510 oo.MutexPersOnuConfig.RLock()
511 if oo.SOnuPersistentData.PersRebootInProgress {
512 oo.MutexPersOnuConfig.RUnlock()
513 logger.Debugw(ctx, "Set mib upload as success before proceeding with flow configuration", log.Fields{"device-id": oo.deviceID})
514 go func() {
515 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
516 if oo.baseDeviceHandler.CheckForDeviceTechProf(ctx) {
517 oo.baseDeviceHandler.DeviceFlowConfigOnReboot(ctx)
Holger Hildebrandtb314f442021-11-24 12:03:10 +0000518 }
Sridhar Ravindraa9cb0442025-07-21 16:55:05 +0530519 }()
520 } else {
521 oo.MutexPersOnuConfig.RUnlock()
522 if oo.baseDeviceHandler.ReconcileDeviceTechProf(ctx) {
523 // start go routine with select() on reconciling flow channel before
524 // starting flow reconciling process to prevent loss of any signal
525 syncChannel := make(chan struct{})
526 go func(aSyncChannel chan struct{}) {
527 // In multi-ONU/multi-flow environment stopping reconcilement has to be delayed until
528 // we get a signal that the processing of the last step to rebuild the adapter internal
529 // flow data is finished.
530 expiry := oo.baseDeviceHandler.GetReconcileExpiryVlanConfigAbort()
531 oo.setReconcilingFlows(true)
532 aSyncChannel <- struct{}{}
533 select {
534 case success := <-oo.chReconcilingFlowsFinished:
535 if success {
536 logger.Debugw(ctx, "reconciling flows has been finished in time",
537 log.Fields{"device-id": oo.deviceID})
538 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
539
540 } else {
541 logger.Debugw(ctx, "wait for reconciling flows aborted",
542 log.Fields{"device-id": oo.deviceID})
543 }
544 case <-time.After(expiry):
545 logger.Errorw(ctx, "timeout waiting for reconciling flows to be finished!",
546 log.Fields{"device-id": oo.deviceID, "expiry": expiry})
547 _ = oo.PMibUploadFsm.PFsm.Event(UlEvMismatch)
548 }
549 oo.setReconcilingFlows(false)
550 }(syncChannel)
551 // block further processing until the above Go routine has really started
552 // and is ready to receive values from chReconcilingFlowsFinished
553 <-syncChannel
554 oo.baseDeviceHandler.ReconcileDeviceFlowConfig(ctx)
555 }
Holger Hildebrandtb314f442021-11-24 12:03:10 +0000556 }
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000557 } else {
558 logger.Debugw(ctx, "MibSync FSM",
559 log.Fields{"Getting MIB from template not successful": e.FSM.Current(), "device-id": oo.deviceID})
560 go func() {
561 //switch to reconciling with OMCI config
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000562 _ = oo.PMibUploadFsm.PFsm.Event(UlEvMismatch)
Holger Hildebrandtbe523842021-03-10 10:47:18 +0000563 }()
564 }
565}
566
dbainbri4d3a0dc2020-12-02 00:33:42 +0000567func (oo *OnuDeviceEntry) enterAuditingState(ctx context.Context, e *fsm.Event) {
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000568 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start MibAudit processing in State": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000569 if oo.baseDeviceHandler.CheckAuditStartCondition(ctx, cmn.CUploadFsm) {
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000570 oo.requestMdsValue(ctx)
571 } else {
mpagenkof1fc3862021-02-16 10:09:52 +0000572 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Configuration is ongoing or missing - skip auditing!": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000573 go func() {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000574 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000575 }()
576 }
577}
578
579func (oo *OnuDeviceEntry) enterReAuditingState(ctx context.Context, e *fsm.Event) {
580 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start retest MdsValue processing in State": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000581 if oo.baseDeviceHandler.CheckAuditStartCondition(ctx, cmn.CUploadFsm) {
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000582 oo.requestMdsValue(ctx)
583 } else {
mpagenkof1fc3862021-02-16 10:09:52 +0000584 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Configuration is ongoing or missing - skip re-auditing!": e.FSM.Current(), "device-id": oo.deviceID})
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000585 go func() {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000586 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Holger Hildebrandt10d98192021-01-27 15:29:31 +0000587 }()
588 }
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000589}
590
dbainbri4d3a0dc2020-12-02 00:33:42 +0000591func (oo *OnuDeviceEntry) enterOutOfSyncState(ctx context.Context, e *fsm.Event) {
592 logger.Debugw(ctx, "MibSync FSM", log.Fields{"Start MibReconcile processing in State": e.FSM.Current(), "device-id": oo.deviceID})
593 logger.Debug(ctx, "function not implemented yet")
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000594}
595
dbainbri4d3a0dc2020-12-02 00:33:42 +0000596func (oo *OnuDeviceEntry) processMibSyncMessages(ctx context.Context) {
597 logger.Debugw(ctx, "MibSync Msg", log.Fields{"Start routine to process OMCI-messages for device-id": oo.deviceID})
Girish Gowdra37c9d912022-02-08 16:24:57 -0800598 oo.mutexMibSyncMsgProcessorRunning.Lock()
599 oo.mibSyncMsgProcessorRunning = true
600 oo.mutexMibSyncMsgProcessorRunning.Unlock()
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000601loop:
602 for {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000603 // case <-ctx.Done():
604 // logger.Info("MibSync Msg", log.Fields{"Message handling canceled via context for device-id": onuDeviceEntry.deviceID})
605 // break loop
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000606 message, ok := <-oo.PMibUploadFsm.CommChan
Himani Chawla4d908332020-08-31 12:30:20 +0530607 if !ok {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000608 logger.Info(ctx, "MibSync Msg", log.Fields{"Message couldn't be read from channel for device-id": oo.deviceID})
Girish Gowdra37c9d912022-02-08 16:24:57 -0800609 oo.mutexMibSyncMsgProcessorRunning.Lock()
610 oo.mibSyncMsgProcessorRunning = false
611 oo.mutexMibSyncMsgProcessorRunning.Unlock()
Himani Chawla4d908332020-08-31 12:30:20 +0530612 break loop
613 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000614 logger.Debugw(ctx, "MibSync Msg", log.Fields{"Received message on ONU MibSyncChan for device-id": oo.deviceID})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000615
Himani Chawla4d908332020-08-31 12:30:20 +0530616 switch message.Type {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000617 case cmn.TestMsg:
618 msg, _ := message.Data.(cmn.TestMessage)
Holger Hildebrandte7cc6092022-02-01 11:37:03 +0000619 if msg.TestMessageVal == cmn.AbortMessageProcessing {
620 logger.Debugw(ctx, "MibSync Msg abort ProcessMsg", log.Fields{"for device-id": oo.deviceID})
Girish Gowdra37c9d912022-02-08 16:24:57 -0800621 oo.mutexMibSyncMsgProcessorRunning.Lock()
622 oo.mibSyncMsgProcessorRunning = false
623 oo.mutexMibSyncMsgProcessorRunning.Unlock()
Holger Hildebrandte7cc6092022-02-01 11:37:03 +0000624 break loop
625 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000626 oo.handleTestMsg(ctx, msg)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000627 case cmn.OMCI:
628 msg, _ := message.Data.(cmn.OmciMessage)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000629 oo.handleOmciMessage(ctx, msg)
Himani Chawla4d908332020-08-31 12:30:20 +0530630 default:
dbainbri4d3a0dc2020-12-02 00:33:42 +0000631 logger.Warn(ctx, "MibSync Msg", log.Fields{"Unknown message type received for device-id": oo.deviceID, "message.Type": message.Type})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000632 }
633 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000634 logger.Info(ctx, "MibSync Msg", log.Fields{"Stopped handling of MibSyncChan for device-id": oo.deviceID})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000635 // TODO: only this action?
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000636 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000637}
638
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000639func (oo *OnuDeviceEntry) handleTestMsg(ctx context.Context, msg cmn.TestMessage) {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000640
dbainbri4d3a0dc2020-12-02 00:33:42 +0000641 logger.Debugw(ctx, "MibSync Msg", log.Fields{"TestMessage received for device-id": oo.deviceID, "msg.TestMessageVal": msg.TestMessageVal})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000642
643 switch msg.TestMessageVal {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000644 case cmn.LoadMibTemplateFailed:
645 _ = oo.PMibUploadFsm.PFsm.Event(UlEvUploadMib)
646 logger.Debugw(ctx, "MibSync Msg", log.Fields{"state": string(oo.PMibUploadFsm.PFsm.Current())})
647 case cmn.LoadMibTemplateOk:
648 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
649 logger.Debugw(ctx, "MibSync Msg", log.Fields{"state": string(oo.PMibUploadFsm.PFsm.Current())})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000650 default:
dbainbri4d3a0dc2020-12-02 00:33:42 +0000651 logger.Warn(ctx, "MibSync Msg", log.Fields{"Unknown message type received for device-id": oo.deviceID, "msg.TestMessageVal": msg.TestMessageVal})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000652 }
653}
654
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000655func (oo *OnuDeviceEntry) handleOmciMibResetResponseMessage(ctx context.Context, msg cmn.OmciMessage) {
656 if oo.PMibUploadFsm.PFsm.Is(UlStResettingMib) {
Himani Chawla4d908332020-08-31 12:30:20 +0530657 msgLayer := (*msg.OmciPacket).Layer(omci.LayerTypeMibResetResponse)
658 if msgLayer != nil {
659 msgObj, msgOk := msgLayer.(*omci.MibResetResponse)
660 if msgOk {
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530661 logger.Infow(ctx, "MibResetResponse Data", log.Fields{"data-fields": msgObj})
Himani Chawla4d908332020-08-31 12:30:20 +0530662 if msgObj.Result == me.Success {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000663 oo.MutexPersOnuConfig.Lock()
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000664 oo.SOnuPersistentData.PersMibDataSyncAdpt = cmn.MdsDefaultMib
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000665 oo.MutexPersOnuConfig.Unlock()
Holger Hildebrandt7e138462023-03-29 12:12:14 +0000666 oo.PDevOmciCC.ResetConfFailMEs()
Himani Chawla4d908332020-08-31 12:30:20 +0530667 // trigger retrieval of VendorId and SerialNumber
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000668 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetVendorAndSerial)
Himani Chawla4d908332020-08-31 12:30:20 +0530669 return
670 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000671 logger.Errorw(ctx, "Omci MibResetResponse Error", log.Fields{"device-id": oo.deviceID, "Error": msgObj.Result})
Himani Chawla4d908332020-08-31 12:30:20 +0530672 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000673 logger.Errorw(ctx, "Omci Msg layer could not be assigned", log.Fields{"device-id": oo.deviceID})
Himani Chawla4d908332020-08-31 12:30:20 +0530674 }
675 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000676 logger.Errorw(ctx, "Omci Msg layer could not be detected", log.Fields{"device-id": oo.deviceID})
Himani Chawla4d908332020-08-31 12:30:20 +0530677 }
678 } else {
mpagenko01499812021-03-25 10:37:12 +0000679 //in case the last request was MdsGetRequest this issue may appear if the ONU was online before and has received the MIB reset
680 // with Sequence number 0x8000 as last request before - so it may still respond to that
681 // then we may force the ONU to react on the MdsGetRequest with a new message that uses an increased Sequence number
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000682 oo.mutexLastTxParamStruct.Lock()
mpagenko01499812021-03-25 10:37:12 +0000683 if oo.lastTxParamStruct.lastTxMessageType == omci.GetRequestType && oo.lastTxParamStruct.repeatCount == 0 {
684 logger.Debugw(ctx, "MibSync FSM - repeat MdsGetRequest (updated SequenceNumber)", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +0000685 requestedAttributes := me.AttributeValueMap{me.OnuData_MibDataSync: ""}
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000686 _, err := oo.PDevOmciCC.SendGetMe(log.WithSpanFromContext(context.TODO(), ctx),
Holger Hildebrandtd930cb22022-06-17 09:24:50 +0000687 me.OnuDataClassID, cmn.OnuDataMeID, requestedAttributes, oo.baseDeviceHandler.GetOmciTimeout(), true, oo.PMibUploadFsm.CommChan, false)
ozgecanetsiab36ed572021-04-01 10:38:48 +0300688 if err != nil {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000689 oo.mutexLastTxParamStruct.Unlock()
ozgecanetsiab36ed572021-04-01 10:38:48 +0300690 logger.Errorw(ctx, "ONUData get failed, aborting MibSync", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000691 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
ozgecanetsiab36ed572021-04-01 10:38:48 +0300692 return
693 }
mpagenko01499812021-03-25 10:37:12 +0000694 //TODO: needs extra handling of timeouts
695 oo.lastTxParamStruct.repeatCount = 1
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000696 oo.mutexLastTxParamStruct.Unlock()
mpagenko01499812021-03-25 10:37:12 +0000697 return
698 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000699 oo.mutexLastTxParamStruct.Unlock()
mpagenko01499812021-03-25 10:37:12 +0000700 logger.Errorw(ctx, "unexpected MibResetResponse - ignoring", log.Fields{"device-id": oo.deviceID})
701 //perhaps some still lingering message from some prior activity, let's wait for the real response
702 return
Himani Chawla4d908332020-08-31 12:30:20 +0530703 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000704 logger.Info(ctx, "MibSync Msg", log.Fields{"Stopped handling of MibSyncChan for device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000705 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Himani Chawla4d908332020-08-31 12:30:20 +0530706}
707
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000708func (oo *OnuDeviceEntry) handleOmciMibUploadResponseMessage(ctx context.Context, msg cmn.OmciMessage) {
Himani Chawla4d908332020-08-31 12:30:20 +0530709 msgLayer := (*msg.OmciPacket).Layer(omci.LayerTypeMibUploadResponse)
710 if msgLayer == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000711 logger.Errorw(ctx, "Omci Msg layer could not be detected", log.Fields{"device-id": oo.deviceID})
Himani Chawla4d908332020-08-31 12:30:20 +0530712 return
713 }
714 msgObj, msgOk := msgLayer.(*omci.MibUploadResponse)
715 if !msgOk {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000716 logger.Errorw(ctx, "Omci Msg layer could not be assigned", log.Fields{"device-id": oo.deviceID})
Himani Chawla4d908332020-08-31 12:30:20 +0530717 return
718 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000719 logger.Debugw(ctx, "MibUploadResponse Data for:", log.Fields{"device-id": oo.deviceID, "data-fields": msgObj})
Himani Chawla4d908332020-08-31 12:30:20 +0530720 /* to be verified / reworked !!! */
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000721 oo.PDevOmciCC.UploadNoOfCmds = msgObj.NumberOfCommands
722 if oo.PDevOmciCC.UploadSequNo < oo.PDevOmciCC.UploadNoOfCmds {
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000723 _ = oo.PDevOmciCC.SendMibUploadNext(log.WithSpanFromContext(context.TODO(), ctx),
724 oo.baseDeviceHandler.GetOmciTimeout(), true, oo.GetPersIsExtOmciSupported())
mpagenko01499812021-03-25 10:37:12 +0000725 //even though lastTxParameters are currently not used for checking the ResetResponse message we have to ensure
726 // that the lastTxMessageType is correctly set to avoid misinterpreting other responses
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000727 oo.mutexLastTxParamStruct.Lock()
mpagenko01499812021-03-25 10:37:12 +0000728 oo.lastTxParamStruct.lastTxMessageType = omci.MibUploadNextRequestType
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000729 oo.mutexLastTxParamStruct.Unlock()
Himani Chawla4d908332020-08-31 12:30:20 +0530730 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000731 logger.Errorw(ctx, "Invalid number of commands received for:", log.Fields{"device-id": oo.deviceID, "UploadNoOfCmds": oo.PDevOmciCC.UploadNoOfCmds})
Himani Chawla4d908332020-08-31 12:30:20 +0530732 //TODO right action?
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000733 _ = oo.PMibUploadFsm.PFsm.Event(UlEvTimeout)
Himani Chawla4d908332020-08-31 12:30:20 +0530734 }
735}
736
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000737func (oo *OnuDeviceEntry) handleOmciMibUploadNextResponseMessage(ctx context.Context, msg cmn.OmciMessage) {
Himani Chawla4d908332020-08-31 12:30:20 +0530738 msgLayer := (*msg.OmciPacket).Layer(omci.LayerTypeMibUploadNextResponse)
mpagenko7033f4e2021-11-19 18:04:22 +0000739 if msgLayer != nil {
740 msgObj, msgOk := msgLayer.(*omci.MibUploadNextResponse)
741 if !msgOk {
742 logger.Errorw(ctx, "Omci Msg layer could not be assigned", log.Fields{"device-id": oo.deviceID})
743 return
mpagenko836a1fd2021-11-01 16:12:42 +0000744 }
mpagenko7033f4e2021-11-19 18:04:22 +0000745 meName := msgObj.ReportedME.GetName()
746 meClassID := msgObj.ReportedME.GetClassID()
747 meEntityID := msgObj.ReportedME.GetEntityID()
748
749 logger.Debugw(ctx, "MibUploadNextResponse Data for:", log.Fields{"device-id": oo.deviceID, "meName": meName, "data-fields": msgObj})
750
751 if meName == devdb.CUnknownItuG988ManagedEntity || meName == devdb.CUnknownVendorSpecificManagedEntity {
Holger Hildebrandt39080022022-03-16 10:03:17 +0000752 logger.Debugw(ctx, "MibUploadNextResponse contains unknown ME", log.Fields{"device-id": oo.deviceID,
753 "Me-Name": devdb.UnknownMeOrAttribName(meName), "Me-ClassId": meClassID, "Me-InstId": meEntityID,
754 "unknown mask": msgObj.ReportedME.GetAttributeMask(), "unknown attributes": msgObj.BaseLayer.Payload})
755 oo.pOnuDB.PutUnknownMeOrAttrib(ctx, devdb.UnknownMeOrAttribName(meName), meClassID, meEntityID,
756 msgObj.ReportedME.GetAttributeMask(), msgObj.BaseLayer.Payload[devdb.CStartUnknownMeAttribsInBaseLayerPayload:])
mpagenko7033f4e2021-11-19 18:04:22 +0000757 } else {
758 //with relaxed decoding set in the OMCI-LIB we have the chance to detect if there are some unknown attributes appended which we cannot decode
759 if unknownAttrLayer := (*msg.OmciPacket).Layer(omci.LayerTypeUnknownAttributes); unknownAttrLayer != nil {
760 logger.Warnw(ctx, "MibUploadNextResponse contains unknown attributes", log.Fields{"device-id": oo.deviceID})
761 if unknownAttributes, ok := unknownAttrLayer.(*omci.UnknownAttributes); ok {
762 // provide a loop over several ME's here already in preparation of OMCI extended message format
763 for _, unknown := range unknownAttributes.Attributes {
764 unknownAttrClassID := unknown.EntityClass // ClassID
765 unknownAttrInst := unknown.EntityInstance // uint16
766 unknownAttrMask := unknown.AttributeMask // ui
767 unknownAttrBlob := unknown.AttributeData // []byte
768 logger.Warnw(ctx, "unknown attributes detected for", log.Fields{"device-id": oo.deviceID,
769 "Me-ClassId": unknownAttrClassID, "Me-InstId": unknownAttrInst, "unknown mask": unknownAttrMask,
770 "unknown attributes": unknownAttrBlob})
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000771 oo.pOnuDB.PutUnknownMeOrAttrib(ctx, devdb.CUnknownAttributesManagedEntity, unknown.EntityClass, unknown.EntityInstance,
772 unknown.AttributeMask, unknown.AttributeData)
mpagenko7033f4e2021-11-19 18:04:22 +0000773 } // for all included ME's with unknown attributes
774 } else {
775 logger.Errorw(ctx, "unknownAttrLayer could not be decoded", log.Fields{"device-id": oo.deviceID})
776 }
777 }
778 oo.pOnuDB.PutMe(ctx, meClassID, meEntityID, msgObj.ReportedME.GetAttributeValueMap())
779 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000780 if msg.OmciMsg.DeviceIdentifier == omci.ExtendedIdent {
781 for _, additionalME := range msgObj.AdditionalMEs {
782 meName := additionalME.GetName()
783 meClassID := additionalME.GetClassID()
784 meEntityID := additionalME.GetEntityID()
785 attributes := additionalME.GetAttributeValueMap()
786
787 if meName == devdb.CUnknownItuG988ManagedEntity || meName == devdb.CUnknownVendorSpecificManagedEntity {
788 attribMask := additionalME.GetAttributeMask()
789 logger.Debugw(ctx, "MibUploadNextResponse AdditionalData contains unknown ME", log.Fields{"device-id": oo.deviceID,
790 "Me-Name": devdb.UnknownMeOrAttribName(meName), "Me-ClassId": meClassID, "Me-InstId": meEntityID,
791 "unknown mask": attribMask})
792
793 attribValues := make([]byte, 0)
794 for key, value := range attributes {
795 if key != cmn.CGenericManagedEntityIDName {
796 data, err := me.InterfaceToOctets(value)
797 if err != nil {
798 logger.Infow(ctx, "MibUploadNextResponse unknown ME AdditionalData attrib - could not decode", log.Fields{"device-id": oo.deviceID, "key": key})
799 } else {
800 attribValues = append(attribValues[:], data[:]...)
801 logger.Debugw(ctx, "MibUploadNextResponse unknown ME AdditionalData attrib", log.Fields{"device-id": oo.deviceID, "attribValues": attribValues, "data": data, "key": key})
802 }
803 }
804 }
805 oo.pOnuDB.PutUnknownMeOrAttrib(ctx, devdb.UnknownMeOrAttribName(meName), meClassID, meEntityID, attribMask, attribValues)
806 } else {
807 logger.Debugw(ctx, "MibUploadNextResponse AdditionalData for:", log.Fields{"device-id": oo.deviceID, "meName": meName, "meEntityID": meEntityID, "attributes": attributes})
808 oo.pOnuDB.PutMe(ctx, meClassID, meEntityID, attributes)
809 }
810 }
811 }
mpagenko7033f4e2021-11-19 18:04:22 +0000812 } else {
813 logger.Errorw(ctx, "Omci Msg layer could not be detected", log.Fields{"device-id": oo.deviceID})
814 //as long as omci-lib does not support decoding of table attribute as 'unknown/unspecified' attribute
815 // we have to verify, if this failure is from table attribute and try to go forward with ignoring the complete message
816 errLayer := (*msg.OmciPacket).Layer(gopacket.LayerTypeDecodeFailure)
817 if failure, decodeOk := errLayer.(*gopacket.DecodeFailure); decodeOk {
818 errMsg := failure.String()
819 if !strings.Contains(strings.ToLower(errMsg), "table decode") {
820 //something still unexected happened, needs deeper investigation - stop complete MIB upload process (timeout)
821 return
822 }
823 logger.Warnw(ctx, "Decode issue on received MibUploadNextResponse frame - found table attribute(s) (message ignored)",
824 log.Fields{"device-id": oo.deviceID, "issue": errMsg})
825 }
Himani Chawla4d908332020-08-31 12:30:20 +0530826 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000827 if oo.PDevOmciCC.UploadSequNo < oo.PDevOmciCC.UploadNoOfCmds {
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000828 _ = oo.PDevOmciCC.SendMibUploadNext(log.WithSpanFromContext(context.TODO(), ctx),
829 oo.baseDeviceHandler.GetOmciTimeout(), true, oo.GetPersIsExtOmciSupported())
mpagenko01499812021-03-25 10:37:12 +0000830 //even though lastTxParameters are currently not used for checking the ResetResponse message we have to ensure
831 // that the lastTxMessageType is correctly set to avoid misinterpreting other responses
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000832 oo.mutexLastTxParamStruct.Lock()
mpagenko01499812021-03-25 10:37:12 +0000833 oo.lastTxParamStruct.lastTxMessageType = omci.MibUploadNextRequestType
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000834 oo.mutexLastTxParamStruct.Unlock()
Himani Chawla4d908332020-08-31 12:30:20 +0530835 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000836 err := oo.createAndPersistMibTemplate(ctx)
Himani Chawla4d908332020-08-31 12:30:20 +0530837 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000838 logger.Errorw(ctx, "MibSync - MibTemplate - Failed to create and persist the mib template", log.Fields{"error": err, "device-id": oo.deviceID})
Himani Chawla4d908332020-08-31 12:30:20 +0530839 }
840
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +0530841 oo.updateOnuSpecificEntries(ctx)
842 logger.Errorw(ctx, "MibSync - Updtaed the ONU Specific MEs ", log.Fields{"device-id": oo.deviceID})
843
844 cmnMEDB, _ := oo.pOpenOnuAc.FetchEntryFromMibDatabaseMap(ctx, oo.mibTemplatePath)
845 cmnMEDB.MIBUploadStatus = devdb.Completed
846 oo.pOnuDB.CommonMeDb.MeDbLock.Unlock()
847 oo.pOpenOnuAc.SetMibTemplatesGenerated(oo.mibTemplatePath, true)
848 oo.pOpenOnuAc.UnlockMutexMibTemplateGenerated()
849
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000850 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Himani Chawla4d908332020-08-31 12:30:20 +0530851 }
852}
853
Girish Gowdra21bbf052022-02-17 16:08:22 -0800854// nolint: gocyclo
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000855func (oo *OnuDeviceEntry) handleOmciGetResponseMessage(ctx context.Context, msg cmn.OmciMessage) error {
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000856 var err error = nil
mpagenko01499812021-03-25 10:37:12 +0000857
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000858 oo.mutexLastTxParamStruct.RLock()
mpagenko01499812021-03-25 10:37:12 +0000859 if oo.lastTxParamStruct.lastTxMessageType != omci.GetRequestType ||
860 oo.lastTxParamStruct.pLastTxMeInstance == nil {
861 //in case the last request was MibReset this issue may appear if the ONU was online before and has received the MDS GetRequest
862 // with Sequence number 0x8000 as last request before - so it may still respond to that
863 // then we may force the ONU to react on the MIB reset with a new message that uses an increased Sequence number
864 if oo.lastTxParamStruct.lastTxMessageType == omci.MibResetRequestType && oo.lastTxParamStruct.repeatCount == 0 {
865 logger.Debugw(ctx, "MibSync FSM - repeat mibReset (updated SequenceNumber)", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000866 _ = oo.PDevOmciCC.SendMibReset(log.WithSpanFromContext(context.TODO(), ctx), oo.baseDeviceHandler.GetOmciTimeout(), true)
mpagenko01499812021-03-25 10:37:12 +0000867 //TODO: needs extra handling of timeouts
868 oo.lastTxParamStruct.repeatCount = 1
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000869 oo.mutexLastTxParamStruct.RUnlock()
mpagenko01499812021-03-25 10:37:12 +0000870 return nil
871 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000872 oo.mutexLastTxParamStruct.RUnlock()
mpagenko01499812021-03-25 10:37:12 +0000873 logger.Warnw(ctx, "unexpected GetResponse - ignoring", log.Fields{"device-id": oo.deviceID})
874 //perhaps some still lingering message from some prior activity, let's wait for the real response
875 return nil
876 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000877 oo.mutexLastTxParamStruct.RUnlock()
Himani Chawla4d908332020-08-31 12:30:20 +0530878 msgLayer := (*msg.OmciPacket).Layer(omci.LayerTypeGetResponse)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000879 if msgLayer == nil {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000880 logger.Errorw(ctx, "omci Msg layer could not be detected for GetResponse - handling of MibSyncChan stopped",
881 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000882 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000883 return fmt.Errorf("omci Msg layer could not be detected for GetResponse - handling of MibSyncChan stopped: %s", oo.deviceID)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000884 }
885 msgObj, msgOk := msgLayer.(*omci.GetResponse)
886 if !msgOk {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000887 logger.Errorw(ctx, "omci Msg layer could not be assigned for GetResponse - handling of MibSyncChan stopped",
888 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000889 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt61b24d02020-11-16 13:36:40 +0000890 return fmt.Errorf("omci Msg layer could not be assigned for GetResponse - handling of MibSyncChan stopped: %s", oo.deviceID)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000891 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000892 logger.Debugw(ctx, "MibSync FSM - GetResponse Data", log.Fields{"device-id": oo.deviceID, "data-fields": msgObj})
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000893 if msgObj.Result == me.Success {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000894 oo.mutexLastTxParamStruct.RLock()
mpagenko01499812021-03-25 10:37:12 +0000895 entityID := oo.lastTxParamStruct.pLastTxMeInstance.GetEntityID()
896 if msgObj.EntityClass == oo.lastTxParamStruct.pLastTxMeInstance.GetClassID() && msgObj.EntityInstance == entityID {
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000897 meAttributes := msgObj.Attributes
mpagenko01499812021-03-25 10:37:12 +0000898 meInstance := oo.lastTxParamStruct.pLastTxMeInstance.GetName()
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000899 logger.Debugf(ctx, "MibSync FSM - GetResponse Data for %s",
900 log.Fields{"device-id": oo.deviceID, "data-fields": msgObj}, meInstance)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000901 switch meInstance {
902 case "OnuG":
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000903 oo.mutexLastTxParamStruct.RUnlock()
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000904 return oo.handleOmciGetResponseOnuG(ctx, meAttributes)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000905 case "Onu2G":
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000906 oo.mutexLastTxParamStruct.RUnlock()
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000907 var equipmentID string
908 if onu2GEquipmentID, ok := meAttributes[me.Onu2G_EquipmentId]; ok {
909 equipmentID = cmn.TrimStringFromMeOctet(onu2GEquipmentID)
910 if equipmentID == "" {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000911 logger.Infow(ctx,
912 "MibSync FSM - optional attribute EquipmentID is empty in Onu2G instance - fill with appropriate value",
913 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000914 equipmentID = cEmptyEquipIDString
915 }
916 } else {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000917 logger.Infow(ctx,
918 "MibSync FSM - optional attribute EquipmentID not present in Onu2G instance - fill with appropriate value",
919 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000920 equipmentID = cNotPresentEquipIDString
921 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000922 oo.MutexPersOnuConfig.Lock()
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000923 oo.SOnuPersistentData.PersEquipmentID = equipmentID
dbainbri4d3a0dc2020-12-02 00:33:42 +0000924 logger.Debugw(ctx, "MibSync FSM - GetResponse Data for Onu2-G - EquipmentId", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000925 "onuDeviceEntry.equipmentID": oo.SOnuPersistentData.PersEquipmentID})
926 oo.MutexPersOnuConfig.Unlock()
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000927
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000928 var omccVersion uint8
929 if onu2GOmccVersion, ok := meAttributes[me.Onu2G_OpticalNetworkUnitManagementAndControlChannelOmccVersion]; ok {
930 oo.MutexPersOnuConfig.Lock()
931 omccVersion = onu2GOmccVersion.(uint8)
932 if _, ok := omccVersionSupportsExtendedOmciFormat[omccVersion]; ok {
933 oo.SOnuPersistentData.PersIsExtOmciSupported = omccVersionSupportsExtendedOmciFormat[omccVersion]
Holger Hildebrandtc572e622022-06-22 09:19:17 +0000934 if oo.SOnuPersistentData.PersIsExtOmciSupported && !oo.baseDeviceHandler.GetExtendedOmciSupportEnabled() {
935 logger.Infow(ctx, "MibSync FSM - ONU supports extended OMCI, but support is disabled in the adapter: reset flag",
936 log.Fields{"device-id": oo.deviceID})
937 oo.SOnuPersistentData.PersIsExtOmciSupported = false
938 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000939 } else {
940 logger.Infow(ctx, "MibSync FSM - unknown OMCC version in Onu2G instance - disable extended OMCI support",
941 log.Fields{"device-id": oo.deviceID})
942 oo.SOnuPersistentData.PersIsExtOmciSupported = false
943 }
944 logger.Debugw(ctx, "MibSync FSM - GetResponse Data for Onu2-G - OMCC version", log.Fields{"device-id": oo.deviceID,
945 "omccVersion": omccVersion, "isExtOmciSupported": oo.SOnuPersistentData.PersIsExtOmciSupported})
946 oo.MutexPersOnuConfig.Unlock()
947 } else {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000948 logger.Errorw(ctx,
949 "MibSync FSM - mandatory attribute OMCC version not present in Onu2G instance - handling of MibSyncChan stopped!",
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000950 log.Fields{"device-id": oo.deviceID})
951 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000952 return fmt.Errorf(
953 "mibSync FSM - mandatory attribute OMCC version not present in Onu2G instance - handling of MibSyncChan stopped: %s",
954 oo.deviceID)
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000955 }
956 oo.MutexPersOnuConfig.RLock()
957 if oo.SOnuPersistentData.PersIsExtOmciSupported {
958 oo.MutexPersOnuConfig.RUnlock()
959 // trigger test of OMCI extended msg format
960 _ = oo.PMibUploadFsm.PFsm.Event(UlEvTestExtOmciSupport)
961 return nil
962 }
963 oo.MutexPersOnuConfig.RUnlock()
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000964 // trigger retrieval of 1st SW-image info
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000965 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetFirstSwVersion)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000966 return nil
967 case "SoftwareImage":
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000968 oo.mutexLastTxParamStruct.RUnlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000969 if entityID > cmn.SecondSwImageMeID {
mpagenko15ff4a52021-03-02 10:09:20 +0000970 logger.Errorw(ctx, "mibSync FSM - Failed to GetResponse Data for SoftwareImage with expected EntityId",
971 log.Fields{"device-id": oo.deviceID, "entity-ID": entityID})
972 return fmt.Errorf("mibSync FSM - SwResponse Data with unexpected EntityId: %s %x",
973 oo.deviceID, entityID)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000974 }
mpagenko15ff4a52021-03-02 10:09:20 +0000975 // need to use function for go lint complexity
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000976 if !oo.HandleSwImageIndications(ctx, entityID, meAttributes) {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000977 logger.Errorw(ctx,
978 "MibSync FSM - Not all mandatory attributes present in in SoftwareImage instance - handling of MibSyncChan stopped!",
979 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000980 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000981 return fmt.Errorf(
982 "mibSync FSM - Not all mandatory attributes present in in SoftwareImage instance - handling of MibSyncChan stopped: %s",
983 oo.deviceID)
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000984 }
mpagenko15ff4a52021-03-02 10:09:20 +0000985 return nil
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000986 case "IpHostConfigData":
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000987 oo.mutexLastTxParamStruct.RUnlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000988 oo.MutexPersOnuConfig.Lock()
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +0000989 if ipHostConfigMacAddress, ok := meAttributes[me.IpHostConfigData_MacAddress]; ok {
Girish Gowdra21bbf052022-02-17 16:08:22 -0800990 macBytes, _ := me.InterfaceToOctets(ipHostConfigMacAddress)
991 if cmn.OmciMacAddressLen == len(macBytes) {
992 oo.SOnuPersistentData.PersMacAddress = hex.EncodeToString(macBytes[:])
993 logger.Debugw(ctx, "MibSync FSM - GetResponse Data for IpHostConfigData - MacAddress", log.Fields{"device-id": oo.deviceID,
994 "macAddress": oo.SOnuPersistentData.PersMacAddress})
995 } else {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +0000996 logger.Infow(ctx, "MibSync FSM - MacAddress wrong length - fill macAddress with zeros",
997 log.Fields{"device-id": oo.deviceID, "length": len(macBytes)})
Girish Gowdra21bbf052022-02-17 16:08:22 -0800998 oo.SOnuPersistentData.PersMacAddress = cEmptyMacAddrString
999 }
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001000 } else {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001001 // since ONU creates instances of this ME automatically only when IP host services are available,
1002 // processing continues here despite the error
1003 logger.Infow(ctx, "MibSync FSM - MacAddress attribute not present in IpHostConfigData instance - fill macAddress with zeros",
1004 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001005 oo.SOnuPersistentData.PersMacAddress = cEmptyMacAddrString
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001006 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001007 oo.MutexPersOnuConfig.Unlock()
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001008 // trigger retrieval of mib template
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001009 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetMibTemplate)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001010 return nil
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00001011 case "OnuData":
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001012 oo.mutexLastTxParamStruct.RUnlock()
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +00001013 if onuDataMibDataSync, ok := meAttributes[me.OnuData_MibDataSync]; ok {
1014 oo.checkMdsValue(ctx, onuDataMibDataSync.(uint8))
1015 } else {
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001016 logger.Errorw(ctx, "MibSync FSM - MibDataSync attribute not present in OnuData instance - handling of MibSyncChan stopped!",
1017 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +00001018 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001019 return fmt.Errorf("mibSync FSM - VendorId attribute not present in OnuG instance - handling of MibSyncChan stopped: %s",
1020 oo.deviceID)
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +00001021 }
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00001022 return nil
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001023 default:
1024 oo.mutexLastTxParamStruct.RUnlock()
1025 logger.Warnw(ctx, "Unsupported ME name received!",
1026 log.Fields{"ME name": meInstance, "device-id": oo.deviceID})
1027
Himani Chawla4d908332020-08-31 12:30:20 +05301028 }
Matteo Scandolo20ca10c2021-01-21 14:35:45 -08001029 } else {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001030 oo.mutexLastTxParamStruct.RUnlock()
1031 logger.Warnf(ctx, "MibSync FSM - Received GetResponse Data for %s with wrong classID or entityID ",
1032 log.Fields{"device-id": oo.deviceID, "data-fields": msgObj}, msgObj.EntityClass)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001033 }
Himani Chawla4d908332020-08-31 12:30:20 +05301034 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001035 if err = oo.handleOmciGetResponseErrors(ctx, msgObj); err == nil {
Holger Hildebrandt80129db2020-11-23 10:49:32 +00001036 return nil
1037 }
Himani Chawla4d908332020-08-31 12:30:20 +05301038 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001039 logger.Info(ctx, "MibSync Msg", log.Fields{"Stopped handling of MibSyncChan for device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001040 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001041 return err
Himani Chawla4d908332020-08-31 12:30:20 +05301042}
1043
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05301044// HandleSwImageIndications updates onuSwImageIndications with the ONU data just received
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +00001045func (oo *OnuDeviceEntry) HandleSwImageIndications(ctx context.Context, entityID uint16, meAttributes me.AttributeValueMap) bool {
1046
1047 var imageVersion string
1048 var imageIsCommitted, imageIsActive uint8
1049
1050 allMandAttribsPresent := false
1051 if softwareImageIsCommitted, ok := meAttributes[me.SoftwareImage_IsCommitted]; ok {
1052 if softwareImageIsActiveimage, ok := meAttributes[me.SoftwareImage_IsActive]; ok {
1053 if softwareImageVersion, ok := meAttributes[me.SoftwareImage_Version]; ok {
1054 imageVersion = cmn.TrimStringFromMeOctet(softwareImageVersion)
1055 imageIsActive = softwareImageIsActiveimage.(uint8)
1056 imageIsCommitted = softwareImageIsCommitted.(uint8)
1057 allMandAttribsPresent = true
1058 }
1059 }
1060 }
1061 if !allMandAttribsPresent {
1062 logger.Errorw(ctx, "MibSync FSM - Not all mandatory attributes present in SoftwareImage instance - skip processing!", log.Fields{"device-id": oo.deviceID})
1063 return allMandAttribsPresent
1064 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001065 oo.MutexPersOnuConfig.RLock()
mpagenko15ff4a52021-03-02 10:09:20 +00001066 logger.Infow(ctx, "MibSync FSM - GetResponse Data for SoftwareImage",
1067 log.Fields{"device-id": oo.deviceID, "entityID": entityID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001068 "version": imageVersion, "isActive": imageIsActive, "isCommitted": imageIsCommitted, "SNR": oo.SOnuPersistentData.PersSerialNumber})
1069 oo.MutexPersOnuConfig.RUnlock()
1070 if cmn.FirstSwImageMeID == entityID {
mpagenko15ff4a52021-03-02 10:09:20 +00001071 //always accept the state of the first image (2nd image info should not yet be available)
Holger Hildebrandt05011352021-06-15 09:40:24 +00001072 oo.mutexOnuSwImageIndications.Lock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001073 if imageIsActive == cmn.SwIsActive {
1074 oo.onuSwImageIndications.ActiveEntityEntry.EntityID = entityID
1075 oo.onuSwImageIndications.ActiveEntityEntry.Valid = true
1076 oo.onuSwImageIndications.ActiveEntityEntry.Version = imageVersion
1077 oo.onuSwImageIndications.ActiveEntityEntry.IsCommitted = imageIsCommitted
mpagenko59498c12021-03-18 14:15:15 +00001078 //as the SW version indication may stem from some ONU Down/up event
1079 //the complementary image state is to be invalidated
1080 // (state of the second image is always expected afterwards or just invalid)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001081 oo.onuSwImageIndications.InActiveEntityEntry.Valid = false
mpagenko15ff4a52021-03-02 10:09:20 +00001082 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001083 oo.onuSwImageIndications.InActiveEntityEntry.EntityID = entityID
1084 oo.onuSwImageIndications.InActiveEntityEntry.Valid = true
1085 oo.onuSwImageIndications.InActiveEntityEntry.Version = imageVersion
1086 oo.onuSwImageIndications.InActiveEntityEntry.IsCommitted = imageIsCommitted
mpagenko59498c12021-03-18 14:15:15 +00001087 //as the SW version indication may stem form some ONU Down/up event
1088 //the complementary image state is to be invalidated
1089 // (state of the second image is always expected afterwards or just invalid)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001090 oo.onuSwImageIndications.ActiveEntityEntry.Valid = false
mpagenko15ff4a52021-03-02 10:09:20 +00001091 }
Holger Hildebrandt05011352021-06-15 09:40:24 +00001092 oo.mutexOnuSwImageIndications.Unlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001093 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetSecondSwVersion)
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +00001094 return allMandAttribsPresent
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001095 } else if cmn.SecondSwImageMeID == entityID {
mpagenko15ff4a52021-03-02 10:09:20 +00001096 //2nd image info might conflict with first image info, in which case we priorize first image info!
Holger Hildebrandt05011352021-06-15 09:40:24 +00001097 oo.mutexOnuSwImageIndications.Lock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001098 if imageIsActive == cmn.SwIsActive { //2nd image reported to be active
1099 if oo.onuSwImageIndications.ActiveEntityEntry.Valid {
mpagenko15ff4a52021-03-02 10:09:20 +00001100 //conflict exists - state of first image is left active
1101 logger.Warnw(ctx, "mibSync FSM - both ONU images are reported as active - assuming 2nd to be inactive",
1102 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001103 oo.onuSwImageIndications.InActiveEntityEntry.EntityID = entityID
1104 oo.onuSwImageIndications.InActiveEntityEntry.Valid = true ////to indicate that at least something has been reported
1105 oo.onuSwImageIndications.InActiveEntityEntry.Version = imageVersion
1106 oo.onuSwImageIndications.InActiveEntityEntry.IsCommitted = imageIsCommitted
mpagenko15ff4a52021-03-02 10:09:20 +00001107 } else { //first image inactive, this one active
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001108 oo.onuSwImageIndications.ActiveEntityEntry.EntityID = entityID
1109 oo.onuSwImageIndications.ActiveEntityEntry.Valid = true
1110 oo.onuSwImageIndications.ActiveEntityEntry.Version = imageVersion
1111 oo.onuSwImageIndications.ActiveEntityEntry.IsCommitted = imageIsCommitted
mpagenko15ff4a52021-03-02 10:09:20 +00001112 }
1113 } else { //2nd image reported to be inactive
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001114 if oo.onuSwImageIndications.InActiveEntityEntry.Valid {
mpagenko15ff4a52021-03-02 10:09:20 +00001115 //conflict exists - both images inactive - regard it as ONU failure and assume first image to be active
1116 logger.Warnw(ctx, "mibSync FSM - both ONU images are reported as inactive, defining first to be active",
1117 log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001118 oo.onuSwImageIndications.ActiveEntityEntry.EntityID = cmn.FirstSwImageMeID
1119 oo.onuSwImageIndications.ActiveEntityEntry.Valid = true //to indicate that at least something has been reported
mpagenko15ff4a52021-03-02 10:09:20 +00001120 //copy active commit/version from the previously stored inactive position
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001121 oo.onuSwImageIndications.ActiveEntityEntry.Version = oo.onuSwImageIndications.InActiveEntityEntry.Version
1122 oo.onuSwImageIndications.ActiveEntityEntry.IsCommitted = oo.onuSwImageIndications.InActiveEntityEntry.IsCommitted
mpagenko15ff4a52021-03-02 10:09:20 +00001123 }
1124 //in any case we indicate (and possibly overwrite) the second image indications as inactive
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001125 oo.onuSwImageIndications.InActiveEntityEntry.EntityID = entityID
1126 oo.onuSwImageIndications.InActiveEntityEntry.Valid = true
1127 oo.onuSwImageIndications.InActiveEntityEntry.Version = imageVersion
1128 oo.onuSwImageIndications.InActiveEntityEntry.IsCommitted = imageIsCommitted
mpagenko15ff4a52021-03-02 10:09:20 +00001129 }
Holger Hildebrandt05011352021-06-15 09:40:24 +00001130 oo.mutexOnuSwImageIndications.Unlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001131 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetMacAddress)
mpagenko15ff4a52021-03-02 10:09:20 +00001132 }
Holger Hildebrandtfdb4bba2022-03-10 12:12:59 +00001133 return allMandAttribsPresent
mpagenko15ff4a52021-03-02 10:09:20 +00001134}
1135
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001136func (oo *OnuDeviceEntry) handleOmciMessage(ctx context.Context, msg cmn.OmciMessage) {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001137 logger.Debugw(ctx, "MibSync Msg", log.Fields{"OmciMessage received for device-id": oo.deviceID,
Andrea Campanella6515c582020-10-05 11:25:00 +02001138 "msgType": msg.OmciMsg.MessageType, "msg": msg})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001139 //further analysis could be done here based on msg.OmciMsg.Payload, e.g. verification of error code ...
1140 switch msg.OmciMsg.MessageType {
1141 case omci.MibResetResponseType:
dbainbri4d3a0dc2020-12-02 00:33:42 +00001142 oo.handleOmciMibResetResponseMessage(ctx, msg)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001143
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001144 case omci.MibUploadResponseType:
dbainbri4d3a0dc2020-12-02 00:33:42 +00001145 oo.handleOmciMibUploadResponseMessage(ctx, msg)
Himani Chawla4d908332020-08-31 12:30:20 +05301146
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001147 case omci.MibUploadNextResponseType:
dbainbri4d3a0dc2020-12-02 00:33:42 +00001148 oo.handleOmciMibUploadNextResponseMessage(ctx, msg)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001149
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001150 case omci.GetResponseType:
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001151 //TODO: error handling
dbainbri4d3a0dc2020-12-02 00:33:42 +00001152 _ = oo.handleOmciGetResponseMessage(ctx, msg)
Himani Chawla4d908332020-08-31 12:30:20 +05301153
Andrea Campanella6515c582020-10-05 11:25:00 +02001154 default:
Holger Hildebrandtabfef032022-02-25 12:40:20 +00001155 logger.Warnw(ctx, "Unknown Message Type", log.Fields{"device-id": oo.deviceID, "msgType": msg.OmciMsg.MessageType})
Andrea Campanella6515c582020-10-05 11:25:00 +02001156
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001157 }
1158}
1159
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001160func (oo *OnuDeviceEntry) handleOmciGetResponseOnuG(ctx context.Context, meAttributes me.AttributeValueMap) error {
1161 currentState := oo.PMibUploadFsm.PFsm.Current()
1162 if currentState == UlStGettingVendorAndSerial {
1163 if onuGVendorID, ok := meAttributes[me.OnuG_VendorId]; ok {
1164 vendorID := cmn.TrimStringFromMeOctet(onuGVendorID)
1165 if vendorID == "" {
1166 logger.Infow(ctx,
1167 "MibSync FSM - mandatory attribute VendorId is empty in OnuG instance - fill with appropriate value",
1168 log.Fields{"device-id": oo.deviceID})
1169 vendorID = cEmptyVendorIDString
1170 }
1171 oo.MutexPersOnuConfig.Lock()
1172 oo.SOnuPersistentData.PersVendorID = vendorID
1173 oo.MutexPersOnuConfig.Unlock()
1174 } else {
1175 logger.Errorw(ctx,
1176 "MibSync FSM - mandatory attribute VendorId not present in OnuG instance - handling of MibSyncChan stopped!",
1177 log.Fields{"device-id": oo.deviceID})
1178 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
1179 return fmt.Errorf(
1180 "mibSync FSM - mandatory attribute VendorId not present in OnuG instance - handling of MibSyncChan stopped: %s",
1181 oo.deviceID)
1182 }
1183 if onuGSerialNumber, ok := meAttributes[me.OnuG_SerialNumber]; ok {
1184 oo.MutexPersOnuConfig.Lock()
1185 snBytes, _ := me.InterfaceToOctets(onuGSerialNumber)
1186 if cmn.OnugSerialNumberLen == len(snBytes) {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +05301187 snVendorPart := string(snBytes[:4])
Holger Hildebrandt3d3c2c52022-06-08 13:25:43 +00001188 snNumberPart := hex.EncodeToString(snBytes[4:])
1189 oo.SOnuPersistentData.PersSerialNumber = snVendorPart + snNumberPart
1190 } else {
1191 logger.Infow(ctx, "MibSync FSM - SerialNumber has wrong length - fill serialNumber with zeros",
1192 log.Fields{"device-id": oo.deviceID, "length": len(snBytes)})
1193 oo.SOnuPersistentData.PersSerialNumber = cEmptySerialNumberString
1194 }
1195 oo.MutexPersOnuConfig.Unlock()
1196 } else {
1197 logger.Errorw(ctx,
1198 "MibSync FSM - mandatory attribute SerialNumber not present in OnuG instance - handling of MibSyncChan stopped!",
1199 log.Fields{"device-id": oo.deviceID})
1200 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
1201 return fmt.Errorf(
1202 "mibSync FSM - mandatory attribute SerialNumber not present in OnuG instance - handling of MibSyncChan stopped: %s",
1203 oo.deviceID)
1204 }
1205 oo.MutexPersOnuConfig.Lock()
1206 logger.Debugw(ctx, "MibSync FSM - GetResponse Data for Onu-G - VendorId/SerialNumber", log.Fields{"device-id": oo.deviceID,
1207 "onuDeviceEntry.vendorID": oo.SOnuPersistentData.PersVendorID,
1208 "onuDeviceEntry.serialNumber": oo.SOnuPersistentData.PersSerialNumber})
1209 oo.MutexPersOnuConfig.Unlock()
1210 // trigger retrieval of Version
1211 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetVersion)
1212 return nil
1213 } else if currentState == UlStGettingVersion {
1214 if onuGVersion, ok := meAttributes[me.OnuG_Version]; ok {
1215 version := cmn.TrimStringFromMeOctet(onuGVersion)
1216 if version == "" {
1217 logger.Infow(ctx, "MibSync FSM - mandatory attribute Version is empty in OnuG instance - fill with appropriate value",
1218 log.Fields{"device-id": oo.deviceID})
1219 version = cEmptyVersionString
1220 }
1221 oo.MutexPersOnuConfig.Lock()
1222 oo.SOnuPersistentData.PersVersion = version
1223 oo.MutexPersOnuConfig.Unlock()
1224 } else {
1225 logger.Errorw(ctx,
1226 "MibSync FSM - mandatory attribute Version not present in OnuG instance - handling of MibSyncChan stopped!",
1227 log.Fields{"device-id": oo.deviceID})
1228 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
1229 return fmt.Errorf(
1230 "mibSync FSM - mandatory attribute Version not present in OnuG instance - handling of MibSyncChan stopped: %s",
1231 oo.deviceID)
1232 }
1233 oo.MutexPersOnuConfig.Lock()
1234 logger.Debugw(ctx, "MibSync FSM - GetResponse Data for Onu-G - Version", log.Fields{"device-id": oo.deviceID,
1235 "onuDeviceEntry.version": oo.SOnuPersistentData.PersVersion})
1236 oo.MutexPersOnuConfig.Unlock()
1237 // trigger retrieval of EquipmentId and OMCC version
1238 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetEquipIDAndOmcc)
1239 return nil
1240 } else {
1241 logger.Errorw(ctx, "MibSync FSM - wrong state OnuG response processing - handling of MibSyncChan stopped!",
1242 log.Fields{"currentState": currentState, "device-id": oo.deviceID})
1243 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
1244 return fmt.Errorf("mibSync FSM - wrong state OnuG response processing - handling of MibSyncChan stopped: %s",
1245 oo.deviceID)
1246 }
1247}
1248
dbainbri4d3a0dc2020-12-02 00:33:42 +00001249func (oo *OnuDeviceEntry) handleOmciGetResponseErrors(ctx context.Context, msgObj *omci.GetResponse) error {
Holger Hildebrandt80129db2020-11-23 10:49:32 +00001250 var err error = nil
dbainbri4d3a0dc2020-12-02 00:33:42 +00001251 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 +00001252 // Up to now the following erroneous results have been seen for different ONU-types to indicate an unsupported ME
1253 if msgObj.Result == me.UnknownInstance || msgObj.Result == me.UnknownEntity || msgObj.Result == me.ProcessingError || msgObj.Result == me.NotSupported {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001254 oo.mutexLastTxParamStruct.RLock()
1255 if oo.lastTxParamStruct.pLastTxMeInstance != nil {
1256 entityID := oo.lastTxParamStruct.pLastTxMeInstance.GetEntityID()
1257 if msgObj.EntityClass == oo.lastTxParamStruct.pLastTxMeInstance.GetClassID() && msgObj.EntityInstance == entityID {
1258 meInstance := oo.lastTxParamStruct.pLastTxMeInstance.GetName()
1259 switch meInstance {
1260 case "IpHostConfigData":
1261 oo.mutexLastTxParamStruct.RUnlock()
1262 logger.Debugw(ctx, "MibSync FSM - erroneous result for IpHostConfigData received - ONU doesn't support ME - fill macAddress with zeros",
1263 log.Fields{"device-id": oo.deviceID, "data-fields": msgObj})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001264 oo.MutexPersOnuConfig.Lock()
1265 oo.SOnuPersistentData.PersMacAddress = cEmptyMacAddrString
1266 oo.MutexPersOnuConfig.Unlock()
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001267 // trigger retrieval of mib template
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001268 _ = oo.PMibUploadFsm.PFsm.Event(UlEvGetMibTemplate)
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001269 return nil
1270 default:
1271 oo.mutexLastTxParamStruct.RUnlock()
1272 logger.Warnf(ctx, "MibSync FSM - erroneous result for %s received - no exceptional treatment defined", log.Fields{"device-id": oo.deviceID, "data-fields": msgObj}, meInstance)
1273 err = fmt.Errorf("erroneous result for %s received - no exceptional treatment defined: %s", meInstance, oo.deviceID)
1274 }
1275 } else {
1276 oo.mutexLastTxParamStruct.RUnlock()
Holger Hildebrandt80129db2020-11-23 10:49:32 +00001277 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001278 } else {
1279 oo.mutexLastTxParamStruct.RUnlock()
1280 logger.Warnw(ctx, "Pointer to last Tx MeInstance is nil!", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt80129db2020-11-23 10:49:32 +00001281 }
1282 } else {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001283 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 +00001284 err = fmt.Errorf("erroneous result in GetResponse Data: %s - %s", msgObj.Result, oo.deviceID)
1285 }
1286 return err
1287}
1288
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001289// IsNewOnu - TODO: add comment
1290func (oo *OnuDeviceEntry) IsNewOnu() bool {
1291 oo.MutexPersOnuConfig.RLock()
1292 defer oo.MutexPersOnuConfig.RUnlock()
1293 return oo.SOnuPersistentData.PersMibLastDbSync == 0
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00001294}
1295
Himani Chawla6d2ae152020-09-02 13:11:20 +05301296func isSupportedClassID(meClassID me.ClassID) bool {
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001297 for _, v := range supportedClassIds {
Himani Chawla4d908332020-08-31 12:30:20 +05301298 if v == meClassID {
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001299 return true
1300 }
1301 }
1302 return false
1303}
1304
dbainbri4d3a0dc2020-12-02 00:33:42 +00001305func (oo *OnuDeviceEntry) mibDbVolatileDict(ctx context.Context) error {
1306 logger.Debug(ctx, "MibVolatileDict- running from default Entry code")
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001307 return errors.New("not_implemented")
1308}
1309
Himani Chawla6d2ae152020-09-02 13:11:20 +05301310// 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 +05301311// 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 +00001312// 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 +00001313func (oo *OnuDeviceEntry) createAndPersistMibTemplate(ctx context.Context) error {
1314 logger.Debugw(ctx, "MibSync - MibTemplate - path name", log.Fields{"path": oo.mibTemplatePath,
Holger Hildebrandt61b24d02020-11-16 13:36:40 +00001315 "device-id": oo.deviceID})
divyadesaibbed37c2020-08-28 13:35:20 +05301316
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301317 //Fetch the MEs dependent on serial number and MAC address and add them to onuSpecific ME DB
1318 //Modify the serial number and MAC address with generic content in the common DB.
1319 knownAttributeMEDb := oo.pOnuDB.CommonMeDb.MeDb
1320 for firstLevelKey, firstLevelValue := range knownAttributeMEDb {
1321 classID := strconv.Itoa(int(firstLevelKey))
Holger Hildebrandt61b24d02020-11-16 13:36:40 +00001322
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301323 for secondLevelKey, secondLevelValue := range firstLevelValue {
1324 switch classID {
1325 case "6", "256":
1326 if _, exists := secondLevelValue["SerialNumber"]; exists {
1327 oo.pOnuDB.PutOnuSpeficMe(ctx, firstLevelKey, secondLevelKey, secondLevelValue)
1328 secondLevelValue["SerialNumber"] = "%SERIAL_NUMBER%"
1329 }
1330 case "134":
1331 if _, exists := secondLevelValue["MacAddress"]; exists {
1332 oo.pOnuDB.PutOnuSpeficMe(ctx, firstLevelKey, secondLevelKey, secondLevelValue)
1333 secondLevelValue["MacAddress"] = "%MAC_ADDRESS%"
1334 }
1335 }
1336 }
1337 }
1338
1339 //Create the MIB Template
Holger Hildebrandt61b24d02020-11-16 13:36:40 +00001340 currentTime := time.Now()
divyadesaibbed37c2020-08-28 13:35:20 +05301341 templateMap := make(map[string]interface{})
Holger Hildebrandt61b24d02020-11-16 13:36:40 +00001342 templateMap["TemplateName"] = oo.mibTemplatePath
divyadesaibbed37c2020-08-28 13:35:20 +05301343 templateMap["TemplateCreated"] = currentTime.Format("2006-01-02 15:04:05.000000")
1344
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301345 firstLevelMap := oo.pOnuDB.CommonMeDb.MeDb
divyadesaibbed37c2020-08-28 13:35:20 +05301346 for firstLevelKey, firstLevelValue := range firstLevelMap {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001347 logger.Debugw(ctx, "MibSync - MibTemplate - firstLevelKey", log.Fields{"firstLevelKey": firstLevelKey})
Himani Chawla26e555c2020-08-31 12:30:20 +05301348 classID := strconv.Itoa(int(firstLevelKey))
divyadesaibbed37c2020-08-28 13:35:20 +05301349
1350 secondLevelMap := make(map[string]interface{})
1351 for secondLevelKey, secondLevelValue := range firstLevelValue {
Holger Hildebrandt8998ed52022-03-23 09:52:37 +00001352 // ManagedEntityId is already key of secondLevelMap - remove this redundant attribute from secondLevelValue
1353 delete(secondLevelValue, cmn.CGenericManagedEntityIDName)
divyadesaibbed37c2020-08-28 13:35:20 +05301354 thirdLevelMap := make(map[string]interface{})
Himani Chawla26e555c2020-08-31 12:30:20 +05301355 entityID := strconv.Itoa(int(secondLevelKey))
divyadesaibbed37c2020-08-28 13:35:20 +05301356 thirdLevelMap["Attributes"] = secondLevelValue
Himani Chawla26e555c2020-08-31 12:30:20 +05301357 secondLevelMap[entityID] = thirdLevelMap
1358 if classID == "6" || classID == "256" {
divyadesaibbed37c2020-08-28 13:35:20 +05301359 forthLevelMap := map[string]interface{}(thirdLevelMap["Attributes"].(me.AttributeValueMap))
1360 delete(forthLevelMap, "SerialNumber")
1361 forthLevelMap["SerialNumber"] = "%SERIAL_NUMBER%"
1362
1363 }
Himani Chawla26e555c2020-08-31 12:30:20 +05301364 if classID == "134" {
divyadesaibbed37c2020-08-28 13:35:20 +05301365 forthLevelMap := map[string]interface{}(thirdLevelMap["Attributes"].(me.AttributeValueMap))
1366 delete(forthLevelMap, "MacAddress")
1367 forthLevelMap["MacAddress"] = "%MAC_ADDRESS%"
1368 }
1369 }
Himani Chawla26e555c2020-08-31 12:30:20 +05301370 templateMap[classID] = secondLevelMap
divyadesaibbed37c2020-08-28 13:35:20 +05301371 }
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301372 unknownMeAndAttribMap := oo.pOnuDB.CommonMeDb.UnknownMeAndAttribDb
Holger Hildebrandt39080022022-03-16 10:03:17 +00001373 for unknownMeAndAttribMapKey := range unknownMeAndAttribMap {
1374 templateMap[string(unknownMeAndAttribMapKey)] = unknownMeAndAttribMap[unknownMeAndAttribMapKey]
Holger Hildebrandtf3c7a182021-11-17 13:42:08 +00001375 }
divyadesaibbed37c2020-08-28 13:35:20 +05301376 mibTemplate, err := json.Marshal(&templateMap)
1377 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001378 logger.Errorw(ctx, "MibSync - MibTemplate - Failed to marshal mibTemplate", log.Fields{"error": err, "device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001379 oo.pOpenOnuAc.SetMibTemplatesGenerated(oo.mibTemplatePath, false)
divyadesaibbed37c2020-08-28 13:35:20 +05301380 return err
1381 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001382 err = oo.mibTemplateKVStore.Put(log.WithSpanFromContext(context.TODO(), ctx), oo.mibTemplatePath, string(mibTemplate))
divyadesaibbed37c2020-08-28 13:35:20 +05301383 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001384 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 +00001385 oo.pOpenOnuAc.SetMibTemplatesGenerated(oo.mibTemplatePath, false)
divyadesaibbed37c2020-08-28 13:35:20 +05301386 return err
1387 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001388 logger.Debugw(ctx, "MibSync - MibTemplate - Stored the template to etcd", log.Fields{"device-id": oo.deviceID})
divyadesaibbed37c2020-08-28 13:35:20 +05301389 return nil
1390}
1391
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00001392func (oo *OnuDeviceEntry) requestMdsValue(ctx context.Context) {
1393 logger.Debugw(ctx, "Request MDS value", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001394 requestedAttributes := me.AttributeValueMap{me.OnuData_MibDataSync: ""}
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001395 meInstance, err := oo.PDevOmciCC.SendGetMe(log.WithSpanFromContext(context.TODO(), ctx),
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001396 me.OnuDataClassID, cmn.OnuDataMeID, requestedAttributes, oo.baseDeviceHandler.GetOmciTimeout(), true,
1397 oo.PMibUploadFsm.CommChan, oo.GetPersIsExtOmciSupported())
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00001398 //accept also nil as (error) return value for writing to LastTx
1399 // - this avoids misinterpretation of new received OMCI messages
ozgecanetsiab36ed572021-04-01 10:38:48 +03001400 if err != nil {
1401 logger.Errorw(ctx, "ONUData get failed, aborting MibSync FSM!", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001402 pMibUlFsm := oo.PMibUploadFsm
ozgecanetsiab36ed572021-04-01 10:38:48 +03001403 if pMibUlFsm != nil {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +05301404 //nolint:unparam
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001405 go func(a_pAFsm *cmn.AdapterFsm) {
1406 _ = oo.PMibUploadFsm.PFsm.Event(UlEvStop)
ozgecanetsiab36ed572021-04-01 10:38:48 +03001407 }(pMibUlFsm)
1408 }
1409 return
1410 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001411 oo.mutexLastTxParamStruct.Lock()
mpagenko01499812021-03-25 10:37:12 +00001412 oo.lastTxParamStruct.lastTxMessageType = omci.GetRequestType
1413 oo.lastTxParamStruct.pLastTxMeInstance = meInstance
1414 oo.lastTxParamStruct.repeatCount = 0
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +00001415 oo.mutexLastTxParamStruct.Unlock()
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00001416}
1417
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001418func (oo *OnuDeviceEntry) checkMdsValue(ctx context.Context, mibDataSyncOnu uint8) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001419 oo.MutexPersOnuConfig.RLock()
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001420 logger.Debugw(ctx, "MibSync FSM - GetResponse Data for Onu-Data - MibDataSync", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001421 "mibDataSyncOnu": mibDataSyncOnu, "PersMibDataSyncAdpt": oo.SOnuPersistentData.PersMibDataSyncAdpt})
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001422
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001423 mdsValuesAreEqual := oo.SOnuPersistentData.PersMibDataSyncAdpt == mibDataSyncOnu
1424 oo.MutexPersOnuConfig.RUnlock()
1425 if oo.PMibUploadFsm.PFsm.Is(UlStAuditing) {
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001426 if mdsValuesAreEqual {
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001427 logger.Debugw(ctx, "MibSync FSM - mib audit - MDS check ok", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001428 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001429 } else {
1430 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 +00001431 _ = oo.PMibUploadFsm.PFsm.Event(UlEvMismatch)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001432 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001433 } else if oo.PMibUploadFsm.PFsm.Is(UlStReAuditing) {
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001434 if mdsValuesAreEqual {
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001435 logger.Debugw(ctx, "MibSync FSM - mib reaudit - MDS check ok", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001436 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001437 } else {
Holger Hildebrandt80f57762022-02-16 10:03:24 +00001438 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 +00001439 log.Fields{"device-id": oo.deviceID})
1440 oo.SendOnuDeviceEvent(ctx, cmn.OnuMibAuditFailureMds, cmn.OnuMibAuditFailureMdsDesc)
Holger Hildebrandt80f57762022-02-16 10:03:24 +00001441 // To reconcile ONU with active adapter later on, we have to retrieve TP instances from parent adapter.
1442 // In the present use case inconsistencies between TP pathes stored in kv store and TP instances retrieved
1443 // should not occur. Nevertheless, the respective code is inserted to catch the unlikely case.
1444 if !oo.getAllStoredTpInstFromParentAdapter(ctx) {
1445 logger.Debugw(ctx, "MibSync FSM - mib reaudit - inconsistencies between TP pathes stored in kv and parent adapter instances",
1446 log.Fields{"device-id": oo.deviceID})
1447 oo.baseDeviceHandler.SetReconcilingReasonUpdate(true)
1448 go func() {
1449 if err := oo.baseDeviceHandler.StorePersistentData(ctx); err != nil {
1450 logger.Warnw(ctx,
1451 "MibSync FSM - mib reaudit - store persistent data error - continue for now as there will be additional write attempts",
1452 log.Fields{"device-id": oo.deviceID, "err": err})
1453 }
1454 }()
1455 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001456 _ = oo.PMibUploadFsm.PFsm.Event(UlEvMismatch)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001457 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001458 } else if oo.PMibUploadFsm.PFsm.Is(UlStExaminingMds) {
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001459 if mdsValuesAreEqual && mibDataSyncOnu != 0 {
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001460 logger.Debugw(ctx, "MibSync FSM - MDS examination ok", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001461 _ = oo.PMibUploadFsm.PFsm.Event(UlEvSuccess)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001462 } else {
1463 logger.Debugw(ctx, "MibSync FSM - MDS examination failed - new provisioning", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001464 _ = oo.PMibUploadFsm.PFsm.Event(UlEvMismatch)
Holger Hildebrandt10d98192021-01-27 15:29:31 +00001465 }
1466 } else {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001467 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 +00001468 }
1469}
mpagenko15ff4a52021-03-02 10:09:20 +00001470
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05301471// GetActiveImageMeID returns the Omci MeId of the active ONU image together with error code for validity
mpagenko15ff4a52021-03-02 10:09:20 +00001472func (oo *OnuDeviceEntry) GetActiveImageMeID(ctx context.Context) (uint16, error) {
Holger Hildebrandt05011352021-06-15 09:40:24 +00001473 oo.mutexOnuSwImageIndications.RLock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001474 if oo.onuSwImageIndications.ActiveEntityEntry.Valid {
1475 value := oo.onuSwImageIndications.ActiveEntityEntry.EntityID
Holger Hildebrandt05011352021-06-15 09:40:24 +00001476 oo.mutexOnuSwImageIndications.RUnlock()
1477 return value, nil
mpagenko15ff4a52021-03-02 10:09:20 +00001478 }
Holger Hildebrandt05011352021-06-15 09:40:24 +00001479 oo.mutexOnuSwImageIndications.RUnlock()
mpagenko15ff4a52021-03-02 10:09:20 +00001480 return 0xFFFF, fmt.Errorf("no valid active image found: %s", oo.deviceID)
1481}
1482
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05301483// GetInactiveImageMeID returns the Omci MeId of the inactive ONU image together with error code for validity
mpagenko15ff4a52021-03-02 10:09:20 +00001484func (oo *OnuDeviceEntry) GetInactiveImageMeID(ctx context.Context) (uint16, error) {
Holger Hildebrandt05011352021-06-15 09:40:24 +00001485 oo.mutexOnuSwImageIndications.RLock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001486 if oo.onuSwImageIndications.InActiveEntityEntry.Valid {
1487 value := oo.onuSwImageIndications.InActiveEntityEntry.EntityID
Holger Hildebrandt05011352021-06-15 09:40:24 +00001488 oo.mutexOnuSwImageIndications.RUnlock()
1489 return value, nil
mpagenko15ff4a52021-03-02 10:09:20 +00001490 }
Holger Hildebrandt05011352021-06-15 09:40:24 +00001491 oo.mutexOnuSwImageIndications.RUnlock()
mpagenko15ff4a52021-03-02 10:09:20 +00001492 return 0xFFFF, fmt.Errorf("no valid inactive image found: %s", oo.deviceID)
1493}
1494
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05301495// IsImageToBeCommitted returns true if the active image is still uncommitted
mpagenko15ff4a52021-03-02 10:09:20 +00001496func (oo *OnuDeviceEntry) IsImageToBeCommitted(ctx context.Context, aImageID uint16) bool {
Holger Hildebrandt05011352021-06-15 09:40:24 +00001497 oo.mutexOnuSwImageIndications.RLock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001498 if oo.onuSwImageIndications.ActiveEntityEntry.Valid {
1499 if oo.onuSwImageIndications.ActiveEntityEntry.EntityID == aImageID {
1500 if oo.onuSwImageIndications.ActiveEntityEntry.IsCommitted == cmn.SwIsUncommitted {
Holger Hildebrandt05011352021-06-15 09:40:24 +00001501 oo.mutexOnuSwImageIndications.RUnlock()
mpagenko15ff4a52021-03-02 10:09:20 +00001502 return true
1503 }
1504 }
1505 }
Holger Hildebrandt05011352021-06-15 09:40:24 +00001506 oo.mutexOnuSwImageIndications.RUnlock()
mpagenko15ff4a52021-03-02 10:09:20 +00001507 return false //all other case are treated as 'nothing to commit
1508}
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001509func (oo *OnuDeviceEntry) getMibFromTemplate(ctx context.Context) bool {
1510
1511 oo.mibTemplatePath = oo.buildMibTemplatePath()
Holger Hildebrandtbdc5f002021-04-19 14:46:21 +00001512 logger.Debugw(ctx, "MibSync FSM - get Mib from template", log.Fields{"path": fmt.Sprintf("%s/%s", cBasePathMibTemplateKvStore, oo.mibTemplatePath),
1513 "device-id": oo.deviceID})
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001514
1515 restoredFromMibTemplate := false
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301516 oo.pOpenOnuAc.LockMutexMibTemplateGenerated()
1517 defer oo.pOpenOnuAc.UnlockMutexMibTemplateGenerated()
1518 if meDbValue, ok := oo.pOpenOnuAc.FetchEntryFromMibDatabaseMap(ctx, oo.mibTemplatePath); ok {
1519 logger.Infow(ctx, "Found MIB common DB Instance , copy and use", log.Fields{"path": oo.mibTemplatePath, "device-id": oo.deviceID})
1520 oo.pOnuDB.CommonMeDb = meDbValue
1521 oo.updateOnuSpecificEntries(ctx)
1522 restoredFromMibTemplate = true
1523 } else {
1524 //Create a common ME MIB Instance as it doesn't prior exists.
1525 Value, err := oo.mibTemplateKVStore.Get(log.WithSpanFromContext(context.TODO(), ctx), oo.mibTemplatePath)
1526 //Unmarshal the MIB template and create the entry in the ONU Common Device DB
1527 if err == nil {
1528 if Value != nil {
1529 oo.processMibTemplate(ctx, Value)
1530 restoredFromMibTemplate = true
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001531 } else {
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301532 logger.Infow(ctx, "No MIB template found", log.Fields{"path": oo.mibTemplatePath, "device-id": oo.deviceID})
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001533 }
1534 } else {
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301535 logger.Errorw(ctx, "Get from kvstore operation failed for path",
1536 log.Fields{"path": oo.mibTemplatePath, "device-id": oo.deviceID})
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001537 }
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301538
Holger Hildebrandtbe523842021-03-10 10:47:18 +00001539 }
1540 return restoredFromMibTemplate
1541}
Holger Hildebrandtb4563ab2021-04-14 10:27:20 +00001542
Holger Hildebrandt80f57762022-02-16 10:03:24 +00001543func (oo *OnuDeviceEntry) getAllStoredTpInstFromParentAdapter(ctx context.Context) bool {
1544
1545 allTpInstPresent := true
1546 oo.MutexPersOnuConfig.Lock()
1547 oo.MutexReconciledTpInstances.Lock()
1548 for indexUni, uniData := range oo.SOnuPersistentData.PersUniConfig {
1549 uniID := uniData.PersUniID
1550 oo.ReconciledTpInstances[uniID] = make(map[uint8]inter_adapter.TechProfileDownloadMessage)
1551 for tpID, tpPath := range uniData.PersTpPathMap {
1552 if tpPath != "" {
mgoudaa797e1c2025-06-24 17:49:42 +05301553 logger.Infow(ctx, "Starting retrieval for TechProfileInstance", log.Fields{
1554 "uniID": uniID, "tpID": tpID, "tpPath": tpPath, "device-id": oo.deviceID,
1555 })
1556 // Attempt the initial call before entering the retry loop
Holger Hildebrandt80f57762022-02-16 10:03:24 +00001557 iaTechTpInst, err := oo.baseDeviceHandler.GetTechProfileInstanceFromParentAdapter(ctx, uniID, tpPath)
mgoudaa797e1c2025-06-24 17:49:42 +05301558 if err != nil {
1559 var ticker *time.Ticker
1560
1561 // Log the initial failure and proceed to the retry mechanism
1562 logger.Warnw(ctx, "Initial TechProfileInstance API call failed, entering retry mechanism", log.Fields{
1563 "tp-id": tpID, "tpPath": tpPath, "uni-id": uniID, "device-id": oo.deviceID, "err": err,
1564 })
1565 // Retry logic
1566 /*
1567 We are retrying here because the OLT adapter may not have been up and reachable
1568 at the time of the initial attempt. This prevents the ONU adapter from fetching
1569 the TechProfile.
1570
1571 This issue might occur when both the ONU and OLT adapters are restarted simultaneously,
1572 causing a temporary mismatch in their availability. The retry logic ensures that
1573 the ONU adapter periodically attempts to fetch the TechProfile, allowing time for the
1574 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
1575 process from failing prematurely due to transient unavailability of the OLT adapter.
1576 */
1577
1578 for tpRetryAttempt := initialRetryAttempt; tpRetryAttempt <= maxRetries; tpRetryAttempt++ {
1579 ticker = time.NewTicker(retryDelay)
1580 select {
1581 case _, ok := <-oo.baseDeviceHandler.GetDeviceDeleteCommChan(ctx):
1582 if !ok {
1583 logger.Warnw(ctx, "Device deletion channel closed - aborting retry", log.Fields{"device-id": oo.deviceID})
1584 ticker.Stop()
1585 return false
1586 }
1587 case <-ticker.C:
1588 iaTechTpInst, err = oo.baseDeviceHandler.GetTechProfileInstanceFromParentAdapter(ctx, uniID, tpPath)
1589 if err != nil {
1590 logger.Warnw(ctx, "TechProfileInstance API will be retried", log.Fields{
1591 "tp-id": tpID, "tpPath": tpPath, "uni-id": uniID,
1592 "device-id": oo.deviceID, "err": err, "retry": tpRetryAttempt,
1593 "totalRetries": maxRetries,
1594 })
1595 continue
1596 }
1597
1598 logger.Info(ctx, "Successfully retrieved TechProfileInstance after retry", log.Fields{
1599 "retry": tpRetryAttempt, "device-id": oo.deviceID,
1600 })
1601 }
1602 if err == nil {
1603 break // Exit the retry loop upon success
1604 }
1605
1606 }
1607 }
Holger Hildebrandt80f57762022-02-16 10:03:24 +00001608 if err == nil && iaTechTpInst != nil {
1609 logger.Debugw(ctx, "reconciling - store Tp instance", log.Fields{"uniID": uniID, "tpID": tpID,
1610 "*iaTechTpInst": iaTechTpInst, "device-id": oo.deviceID})
1611 oo.ReconciledTpInstances[uniID][tpID] = *iaTechTpInst
1612 } else {
1613 // During the absence of the ONU adapter there seem to have been TP specific configurations!
1614 // The no longer available TP and the associated flows must be deleted from the ONU KV store
1615 // and after a MIB reset a new reconciling attempt with OMCI configuration must be started.
1616 allTpInstPresent = false
1617 logger.Infow(ctx, "reconciling - can't get tp instance - delete tp and associated flows",
1618 log.Fields{"tp-id": tpID, "tpPath": tpPath, "uni-id": uniID, "device-id": oo.deviceID, "err": err})
1619 delete(oo.SOnuPersistentData.PersUniConfig[indexUni].PersTpPathMap, tpID)
1620 flowSlice := oo.SOnuPersistentData.PersUniConfig[indexUni].PersFlowParams
1621 for indexFlow, flowData := range flowSlice {
1622 if flowData.VlanRuleParams.TpID == tpID {
1623 if len(flowSlice) == 1 {
1624 flowSlice = []cmn.UniVlanFlowParams{}
1625 } else {
1626 flowSlice = append(flowSlice[:indexFlow], flowSlice[indexFlow+1:]...)
1627 }
1628 oo.SOnuPersistentData.PersUniConfig[indexUni].PersFlowParams = flowSlice
1629 }
1630 }
1631 }
1632 }
1633 }
1634 }
1635 oo.MutexReconciledTpInstances.Unlock()
1636 oo.MutexPersOnuConfig.Unlock()
1637 return allTpInstPresent
1638}
1639
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05301640// CancelProcessing terminates potentially running reconciling processes and stops the FSM
Holger Hildebrandtb4563ab2021-04-14 10:27:20 +00001641func (oo *OnuDeviceEntry) CancelProcessing(ctx context.Context) {
Holger Hildebrandt12609a12022-03-25 13:23:25 +00001642 logger.Debugw(ctx, "CancelProcessing entered", log.Fields{"device-id": oo.deviceID})
mpagenko101ac942021-11-16 15:01:29 +00001643 if oo.isReconcilingFlows() {
Holger Hildebrandtf2fcdd42021-12-15 11:42:19 +00001644 oo.SendChReconcilingFlowsFinished(ctx, false)
Holger Hildebrandtb4563ab2021-04-14 10:27:20 +00001645 }
1646 //the MibSync FSM might be active all the ONU-active time,
1647 // hence it must be stopped unconditionally
Girish Gowdra37c9d912022-02-08 16:24:57 -08001648 oo.mutexMibSyncMsgProcessorRunning.RLock()
1649 defer oo.mutexMibSyncMsgProcessorRunning.RUnlock()
1650 if oo.mibSyncMsgProcessorRunning {
1651 pMibUlFsm := oo.PMibUploadFsm
1652 if pMibUlFsm != nil {
1653 // abort running message processing
1654 fsmAbortMsg := cmn.Message{
1655 Type: cmn.TestMsg,
1656 Data: cmn.TestMessage{
1657 TestMessageVal: cmn.AbortMessageProcessing,
1658 },
1659 }
1660 pMibUlFsm.CommChan <- fsmAbortMsg
1661 _ = pMibUlFsm.PFsm.Event(UlEvStop)
Holger Hildebrandte7cc6092022-02-01 11:37:03 +00001662 }
Holger Hildebrandtb4563ab2021-04-14 10:27:20 +00001663 }
1664}
Praneeth Kumar Nalmas8f8f0c02024-10-22 19:29:09 +05301665
1666// Updates Serial Number and MAC Address in the database
1667func (oo *OnuDeviceEntry) updateOnuSpecificEntries(ctx context.Context) {
1668 knownAttributeMEDb := oo.pOnuDB.CommonMeDb.MeDb
1669
1670 for firstLevelKey, firstLevelValue := range knownAttributeMEDb {
1671 classID := strconv.Itoa(int(firstLevelKey))
1672
1673 for secondLevelKey, secondLevelValue := range firstLevelValue {
1674 switch classID {
1675 case "6", "256":
1676 oo.updateAttribute(ctx, "SerialNumber", secondLevelValue, firstLevelKey, secondLevelKey, oo.SOnuPersistentData.PersSerialNumber)
1677 case "134":
1678 oo.updateAttribute(ctx, "MacAddress", secondLevelValue, firstLevelKey, secondLevelKey, oo.SOnuPersistentData.PersMacAddress)
1679 }
1680 }
1681 }
1682}
1683
1684// Updates a specific attribute in the MIB database
1685func (oo *OnuDeviceEntry) updateAttribute(ctx context.Context, attributeName string, attributesMap me.AttributeValueMap, classID me.ClassID, entityID uint16, newValue interface{}) {
1686 if _, exists := attributesMap[attributeName]; exists {
1687 logger.Infow(ctx, "Updating "+attributeName, log.Fields{"classID": strconv.Itoa(int(classID)), "oldValue": attributesMap[attributeName], "newValue": newValue})
1688 attributeCopy := make(me.AttributeValueMap)
1689 for k, v := range attributesMap {
1690 attributeCopy[k] = v
1691 }
1692 attributeCopy[attributeName] = newValue
1693 oo.pOnuDB.PutOnuSpeficMe(ctx, classID, entityID, attributeCopy)
1694 } else {
1695 logger.Warnw(ctx, attributeName+" key not found", log.Fields{"classID": strconv.Itoa(int(classID))})
1696 }
1697}
1698
1699// Processes the MIB template by replacing tokens and unmarshaling it
1700func (oo *OnuDeviceEntry) processMibTemplate(ctx context.Context, value *kvstore.KVPair) {
1701 mibTmpString, _ := kvstore.ToString(value.Value)
1702 mibTmpString2 := strings.ReplaceAll(mibTmpString, "\x00", "")
1703 mibTmpBytes := []byte(mibTmpString2)
1704
1705 logger.Debugf(ctx, "MibSync FSM - Mib template tokens swapped out: %s", mibTmpBytes)
1706
1707 var firstLevelMap map[string]interface{}
1708 if err := json.Unmarshal(mibTmpBytes, &firstLevelMap); err != nil {
1709 logger.Errorw(ctx, "MibSync FSM - Failed to unmarshal template", log.Fields{"error": err, "device-id": oo.deviceID})
1710 return
1711 }
1712
1713 cmnMEDbValue, _ := oo.pOpenOnuAc.CreateEntryAtMibDatabaseMap(ctx, oo.mibTemplatePath)
1714 oo.populateMibDatabase(ctx, cmnMEDbValue, firstLevelMap)
1715 cmnMEDbValue.MIBUploadStatus = devdb.Completed
1716 oo.pOnuDB.CommonMeDb = cmnMEDbValue
1717}
1718
1719// Populates the MIB database with parsed data
1720func (oo *OnuDeviceEntry) populateMibDatabase(ctx context.Context, cmnMEDbValue *devdb.OnuCmnMEDB, firstLevelMap map[string]interface{}) {
1721 cmnMEDbValue.MeDbLock.Lock()
1722 defer cmnMEDbValue.MeDbLock.Unlock()
1723
1724 logger.Infow(ctx, "Populating MIbDatabase with the template information ", log.Fields{"device-id": oo.deviceID})
1725 for firstLevelKey, firstLevelValue := range firstLevelMap {
1726 if uint16ValidNumber, err := strconv.ParseUint(firstLevelKey, 10, 16); err == nil {
1727 meClassID := me.ClassID(uint16ValidNumber)
1728 if isSupportedClassID(meClassID) {
1729 secondLevelMap := firstLevelValue.(map[string]interface{})
1730 for secondLevelKey, secondLevelValue := range secondLevelMap {
1731 if uint16ValidNumber, err := strconv.ParseUint(secondLevelKey, 10, 16); err == nil {
1732 meEntityID := uint16(uint16ValidNumber)
1733 thirdLevelMap := secondLevelValue.(map[string]interface{})
1734 if attributes, exists := thirdLevelMap["Attributes"].(map[string]interface{}); exists {
1735 if _, found := cmnMEDbValue.MeDb[meClassID]; !found {
1736 cmnMEDbValue.MeDb[meClassID] = make(map[uint16]me.AttributeValueMap)
1737 }
1738 if _, found := cmnMEDbValue.MeDb[meClassID][meEntityID]; !found {
1739 cmnMEDbValue.MeDb[meClassID][meEntityID] = make(me.AttributeValueMap)
1740 }
1741 for attrKey, attrValue := range attributes {
1742 cmnMEDbValue.MeDb[meClassID][meEntityID][attrKey] = attrValue
1743 }
1744 }
1745
1746 }
1747 }
1748 }
1749 }
1750 }
1751}