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