blob: 89d1afbad332608d81b2ac8a5e492283f740726c [file] [log] [blame]
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001/*
Joey Armstrong89c812c2024-01-12 19:00:20 -05002 * Copyright 2020-2024 Open Networking Foundation (ONF) and the ONF Contributors
Holger Hildebrandtfa074992020-03-27 15:42:06 +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 common provides global definitions
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000018package common
Holger Hildebrandtfa074992020-03-27 15:42:06 +000019
20import (
21 "container/list"
22 "context"
23 "encoding/binary"
24 "encoding/hex"
Andrea Campanella6515c582020-10-05 11:25:00 +020025 "fmt"
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000026 "strconv"
Holger Hildebrandt93d183f2022-04-22 15:50:26 +000027 "strings"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000028 "sync"
mpagenko80622a52021-02-09 16:53:23 +000029 "time" //by now for testing
Holger Hildebrandtfa074992020-03-27 15:42:06 +000030
31 "github.com/google/gopacket"
32 // TODO!!! Some references could be resolved auto, but some need specific context ....
Holger Hildebrandtfa074992020-03-27 15:42:06 +000033
mpagenko836a1fd2021-11-01 16:12:42 +000034 "github.com/opencord/omci-lib-go/v2"
35 me "github.com/opencord/omci-lib-go/v2/generated"
36 oframe "github.com/opencord/omci-lib-go/v2/meframe"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000037
khenaidoo7d3c5582021-08-11 18:09:44 -040038 vgrpc "github.com/opencord/voltha-lib-go/v7/pkg/grpc"
39
khenaidoo7d3c5582021-08-11 18:09:44 -040040 "github.com/opencord/voltha-lib-go/v7/pkg/log"
khenaidoo42dcdfd2021-10-19 17:34:12 -040041 "github.com/opencord/voltha-protos/v5/go/common"
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +000042 "github.com/opencord/voltha-protos/v5/go/extension"
khenaidoo42dcdfd2021-10-19 17:34:12 -040043 ia "github.com/opencord/voltha-protos/v5/go/inter_adapter"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000044)
45
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000046// ### OMCI related definitions - retrieved from Python adapter code/trace ####
Himani Chawla6d2ae152020-09-02 13:11:20 +053047
Holger Hildebrandt9b64e0b2022-04-21 08:02:00 +000048const maxGemPayloadSize = uint16(2048)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000049const connectivityModeValue = uint8(5)
Himani Chawla4d908332020-08-31 12:30:20 +053050
51//const defaultTPID = uint16(0x8100)
52//const broadComDefaultVID = uint16(4091)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000053
54// UnusedTcontAllocID - TODO: add comment
55const UnusedTcontAllocID = uint16(0xFFFF) //common unused AllocId for G.984 and G.987 systems
mpagenko8b07c1b2020-11-26 10:36:31 +000056
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +000057const cOmciDeviceIdentifierPos = 3
mpagenkoc8bba412021-01-15 15:38:44 +000058const cOmciBaseMessageTrailerLen = 40
59
60// tOmciReceiveError - enum type for detected problems/errors in the received OMCI message (format)
61type tOmciReceiveError uint8
62
63const (
64 // cOmciMessageReceiveNoError - default start state
65 cOmciMessageReceiveNoError tOmciReceiveError = iota
66 // Error indication wrong trailer length within the message
67 cOmciMessageReceiveErrorTrailerLen
68 // Error indication missing trailer within the message
69 cOmciMessageReceiveErrorMissTrailer
70)
71
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000072// CDefaultRetries - TODO: add comment
73const CDefaultRetries = 2
Holger Hildebrandt366ef192021-05-05 11:07:44 +000074
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000075// ### OMCI related definitions - end
76
nikesh.krishnan1ffb8132023-05-23 03:44:13 +053077// CallbackPairEntry to be used for OMCI send/receive correlation
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000078type CallbackPairEntry struct {
79 CbRespChannel chan Message
mgoudad611f4c2025-10-30 14:49:27 +053080 CbFunction func(context.Context, *omci.OMCI, *gopacket.Packet, chan Message) error
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000081 FramePrint bool //true for printing
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000082}
83
nikesh.krishnan1ffb8132023-05-23 03:44:13 +053084// CallbackPair to be used for ReceiveCallback init
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000085type CallbackPair struct {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000086 CbEntry CallbackPairEntry
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +053087 CbKey uint16
Holger Hildebrandtfa074992020-03-27 15:42:06 +000088}
89
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000090// OmciTransferStructure - TODO: add comment
91type OmciTransferStructure struct {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +053092 chSuccess chan bool
93 OnuSwWindow *ia.OmciMessages
94 cbPair CallbackPair
mpagenko80622a52021-02-09 16:53:23 +000095 txFrame []byte
96 timeout int
Holger Hildebrandt366ef192021-05-05 11:07:44 +000097 retries int
mpagenko80622a52021-02-09 16:53:23 +000098 highPrio bool
99 withFramePrint bool
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000100}
101
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000102type txRxCounters struct {
103 txArFrames uint32
104 txNoArFrames uint32
105 rxAkFrames uint32
106 rxNoAkFrames uint32
107}
108
Joey Armstrong89c812c2024-01-12 19:00:20 -0500109// OmciCC structure holds information needed for OMCI communication (to/from OLT Adapter)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000110type OmciCC struct {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000111 pBaseDeviceHandler IdeviceHandler
112 pOnuDeviceEntry IonuDeviceEntry
113 pOnuAlarmManager IonuAlarmManager
khenaidoo7d3c5582021-08-11 18:09:44 -0400114 coreClient *vgrpc.Client
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530115 lowPrioTxQueue *list.List
116 highPrioTxQueue *list.List
117 rxSchedulerMap map[uint16]CallbackPairEntry
118 monitoredRequests map[uint16]OmciTransferStructure
119 deviceID string
Holger Hildebrandt7e138462023-03-29 12:12:14 +0000120 confFailMEs []me.ClassID
121 mutexConfFailMEs sync.RWMutex
mpagenkoc8bba412021-01-15 15:38:44 +0000122
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000123 mutexCounters sync.RWMutex
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530124 mutexMonReq sync.RWMutex
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000125 countersBase txRxCounters
126 countersExt txRxCounters
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000127
128 // OMCI params
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530129 mutexTid sync.Mutex
130 mutexHpTid sync.Mutex
131
132 mutexSendQueuedRequests sync.Mutex
133 mutexLowPrioTxQueue sync.Mutex
134 mutexHighPrioTxQueue sync.Mutex
135 mutexRxSchedMap sync.Mutex
136 txRetries uint32
137 txTimeouts uint32
138
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000139 tid uint16
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000140 hpTid uint16
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000141 UploadSequNo uint16
142 UploadNoOfCmds uint16
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000143
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530144 enabled bool
145 supportExtMsg bool
146 rxOmciFrameError tOmciReceiveError
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000147}
148
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000149var responsesWithMibDataSync = []omci.MessageType{
150 omci.CreateResponseType,
151 omci.DeleteResponseType,
152 omci.SetResponseType,
153 omci.StartSoftwareDownloadResponseType,
154 omci.EndSoftwareDownloadResponseType,
155 omci.ActivateSoftwareResponseType,
156 omci.CommitSoftwareResponseType,
157}
158
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530159// NewOmciCC constructor returns a new instance of a OmciCC
160// mib_db (as well as not inluded alarm_db not really used in this code? VERIFY!!)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000161func NewOmciCC(ctx context.Context, deviceID string, deviceHandler IdeviceHandler,
162 onuDeviceEntry IonuDeviceEntry, onuAlarmManager IonuAlarmManager,
163 coreClient *vgrpc.Client) *OmciCC {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000164 logger.Debugw(ctx, "init-omciCC", log.Fields{"device-id": deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000165 var omciCC OmciCC
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000166 omciCC.enabled = false
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000167 omciCC.pBaseDeviceHandler = deviceHandler
168 omciCC.pOnuAlarmManager = onuAlarmManager
Himani Chawla4d908332020-08-31 12:30:20 +0530169 omciCC.pOnuDeviceEntry = onuDeviceEntry
170 omciCC.deviceID = deviceID
khenaidoo7d3c5582021-08-11 18:09:44 -0400171 omciCC.coreClient = coreClient
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000172 omciCC.supportExtMsg = false
mpagenkoc8bba412021-01-15 15:38:44 +0000173 omciCC.rxOmciFrameError = cOmciMessageReceiveNoError
Holger Hildebrandt7e138462023-03-29 12:12:14 +0000174 omciCC.confFailMEs = nil
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000175 omciCC.countersBase = txRxCounters{0, 0, 0, 0}
176 omciCC.countersExt = txRxCounters{0, 0, 0, 0}
177 omciCC.txRetries = 0
178 omciCC.txTimeouts = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000179 omciCC.tid = 0x1
180 omciCC.hpTid = 0x8000
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000181 omciCC.UploadSequNo = 0
182 omciCC.UploadNoOfCmds = 0
Holger Hildebrandt34555512021-10-01 16:26:59 +0000183 omciCC.lowPrioTxQueue = list.New()
184 omciCC.highPrioTxQueue = list.New()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000185 omciCC.rxSchedulerMap = make(map[uint16]CallbackPairEntry)
186 omciCC.monitoredRequests = make(map[uint16]OmciTransferStructure)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000187 return &omciCC
188}
189
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530190// Stop stops/resets the omciCC
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000191func (oo *OmciCC) Stop(ctx context.Context) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000192 logger.Debugw(ctx, "omciCC-stopping", log.Fields{"device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000193 //reseting all internal data, which might also be helpful for discarding any lingering tx/rx requests
mpagenko8cd1bf72021-06-22 10:11:19 +0000194 oo.CancelRequestMonitoring(ctx)
Holger Hildebrandt34555512021-10-01 16:26:59 +0000195 // clear the tx queues
196 oo.mutexHighPrioTxQueue.Lock()
197 oo.highPrioTxQueue.Init()
198 oo.mutexHighPrioTxQueue.Unlock()
199 oo.mutexLowPrioTxQueue.Lock()
200 oo.lowPrioTxQueue.Init()
201 oo.mutexLowPrioTxQueue.Unlock()
202 //clear the scheduler map
mpagenko900ee4b2020-10-12 11:56:34 +0000203 oo.mutexRxSchedMap.Lock()
204 for k := range oo.rxSchedulerMap {
Holger Hildebrandt34555512021-10-01 16:26:59 +0000205 delete(oo.rxSchedulerMap, k)
mpagenko900ee4b2020-10-12 11:56:34 +0000206 }
207 oo.mutexRxSchedMap.Unlock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000208 //reset the high prio transactionId
mpagenko900ee4b2020-10-12 11:56:34 +0000209 oo.mutexHpTid.Lock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000210 oo.hpTid = 0x8000
mpagenko900ee4b2020-10-12 11:56:34 +0000211 oo.mutexHpTid.Unlock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000212 //reset the low prio transactionId
mpagenko900ee4b2020-10-12 11:56:34 +0000213 oo.mutexTid.Lock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000214 oo.tid = 1
mpagenko900ee4b2020-10-12 11:56:34 +0000215 oo.mutexTid.Unlock()
216 //reset control values
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000217 oo.UploadSequNo = 0
218 oo.UploadNoOfCmds = 0
mpagenkoc8bba412021-01-15 15:38:44 +0000219 oo.rxOmciFrameError = cOmciMessageReceiveNoError
Holger Hildebrandt7e138462023-03-29 12:12:14 +0000220 oo.ResetConfFailMEs()
mpagenko900ee4b2020-10-12 11:56:34 +0000221
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000222 //reset the stats counter
223 oo.mutexCounters.Lock()
224 oo.countersBase = txRxCounters{0, 0, 0, 0}
225 oo.countersExt = txRxCounters{0, 0, 0, 0}
226 oo.txRetries = 0
227 oo.txTimeouts = 0
228 oo.mutexCounters.Unlock()
mpagenko900ee4b2020-10-12 11:56:34 +0000229 return nil
230}
231
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000232// Rx handler for omci messages
mgoudad611f4c2025-10-30 14:49:27 +0530233func (oo *OmciCC) receiveOnuMessage(ctx context.Context, omciMsg *omci.OMCI, packet *gopacket.Packet) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000234 logger.Debugw(ctx, "rx-onu-autonomous-message", log.Fields{"omciMsgType": omciMsg.MessageType,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000235 "payload": hex.EncodeToString(omciMsg.Payload)})
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530236 switch omciMsg.MessageType {
237 case omci.AlarmNotificationType:
238 data := OmciMessage{
239 OmciMsg: omciMsg,
240 OmciPacket: packet,
241 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000242 go oo.pOnuAlarmManager.HandleOmciAlarmNotificationMessage(ctx, data)
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530243 return nil
244 default:
245 return fmt.Errorf("receiveOnuMessageType %s unimplemented", omciMsg.MessageType.String())
246 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000247 /*
248 msgType = rxFrame.fields["message_type"] //assumed OmciOperationsValue
249 rxOnuFrames++
250
251 switch msgType {
252 case AlarmNotification:
253 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000254 logger.Info("Unhandled: received-onu-alarm-message")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000255 // python code was:
256 //if msg_type == EntityOperations.AlarmNotification.value:
257 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.Alarm_Notification)
258 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
259 //
260 return errors.New("RxAlarmNotification unimplemented")
261 }
262 case AttributeValueChange:
263 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000264 logger.Info("Unhandled: received-attribute-value-change")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000265 // python code was:
266 //elif msg_type == EntityOperations.AttributeValueChange.value:
267 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.AVC_Notification)
268 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
269 //
270 return errors.New("RxAttributeValueChange unimplemented")
271 }
272 case TestResult:
273 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000274 logger.Info("Unhandled: received-test-result")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000275 // python code was:
276 //elif msg_type == EntityOperations.TestResult.value:
277 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.Test_Result)
278 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
279 //
280 return errors.New("RxTestResult unimplemented")
281 }
282 default:
283 {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000284 logger.Errorw(ctx,"rx-onu-unsupported-autonomous-message", log.Fields{"msgType": msgType})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000285 rxOnuDiscards++
286 return errors.New("RxOnuMsgType unimplemented")
287 }
288 }
289 */
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000290}
291
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000292func (oo *OmciCC) printRxMessage(ctx context.Context, rxMsg []byte) {
mpagenko80622a52021-02-09 16:53:23 +0000293 //assuming omci message content is hex coded!
294 // with restricted output of 16bytes would be ...rxMsg[:16]
295 logger.Debugw(ctx, "omci-message-received:", log.Fields{
296 "RxOmciMessage": hex.EncodeToString(rxMsg),
297 "device-id": oo.deviceID})
298}
299
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000300// ReceiveMessage - Rx handler for onu messages
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530301//
302// e.g. would call ReceiveOnuMessage() in case of TID=0 or Action=test ...
303//
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000304// nolint: gocyclo
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000305func (oo *OmciCC) ReceiveMessage(ctx context.Context, rxMsg []byte) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000306 //logger.Debugw(ctx,"cc-receive-omci-message", log.Fields{"RxOmciMessage-x2s": hex.EncodeToString(rxMsg)})
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000307
308 if len(rxMsg) < 10 {
309 logger.Errorw(ctx, "rxOmciMessage has wrong length in general - abort",
310 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
311 if len(rxMsg) > 0 {
312 oo.printRxMessage(ctx, rxMsg)
mpagenkoc8bba412021-01-15 15:38:44 +0000313 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000314 return fmt.Errorf("rxOmciMessage has wrong length in general - abort %s", oo.deviceID)
315 }
316 if rxMsg[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
317 if len(rxMsg) >= 44 { // then it should normally include the BaseFormat trailer Len
318 // NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
319 // (an extendedFormat message could be destroyed this way!)
320 trailerLenData := rxMsg[42:44]
321 trailerLen := binary.BigEndian.Uint16(trailerLenData)
322 //logger.Debugw(ctx,"omci-received-trailer-len", log.Fields{"Length": trailerLen})
323 if trailerLen != cOmciBaseMessageTrailerLen { // invalid base Format entry -> autocorrect
324 binary.BigEndian.PutUint16(rxMsg[42:44], cOmciBaseMessageTrailerLen)
325 if oo.rxOmciFrameError != cOmciMessageReceiveErrorTrailerLen {
326 //do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
327 logger.Errorw(ctx, "wrong omci-message trailer length: trailer len auto-corrected",
328 log.Fields{"trailer-length": trailerLen, "device-id": oo.deviceID})
329 oo.rxOmciFrameError = cOmciMessageReceiveErrorTrailerLen
330 }
331 }
332 } else if len(rxMsg) >= cOmciBaseMessageTrailerLen { // workaround for Adtran OLT Sim, which currently does not send trailer bytes at all!
333 // NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
334 // (an extendedFormat message could be destroyed this way!)
335 // extend/overwrite with trailer
336 trailer := make([]byte, 8)
337 binary.BigEndian.PutUint16(trailer[2:], cOmciBaseMessageTrailerLen) //set the defined baseline length
338 rxMsg = append(rxMsg[:cOmciBaseMessageTrailerLen], trailer...)
339 if oo.rxOmciFrameError != cOmciMessageReceiveErrorMissTrailer {
340 //do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
341 logger.Errorw(ctx, "omci-message to short to include trailer len: trailer auto-corrected (added)",
342 log.Fields{"message-length": len(rxMsg), "device-id": oo.deviceID})
343 oo.rxOmciFrameError = cOmciMessageReceiveErrorMissTrailer
344 }
345 } else {
346 logger.Errorw(ctx, "received omci-message too small for OmciBaseFormat - abort",
347 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
348 oo.printRxMessage(ctx, rxMsg)
349 return fmt.Errorf("rxOmciMessage too small for BaseFormat %s", oo.deviceID)
350 }
351 } else if rxMsg[cOmciDeviceIdentifierPos] == byte(omci.ExtendedIdent) {
352 if len(rxMsg) > 1980 {
353 logger.Errorw(ctx, "rxOmciMessage has wrong length for OmciExtendedFormat - abort",
354 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
355 oo.printRxMessage(ctx, rxMsg)
356 return fmt.Errorf("rxOmciMessage has wrong length for OmciExtendedFormat %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000357 }
358 } else {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000359 logger.Errorw(ctx, "rxOmciMessage has wrong Device Identifier - abort",
mpagenkoc8bba412021-01-15 15:38:44 +0000360 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000361 oo.printRxMessage(ctx, rxMsg)
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000362 return fmt.Errorf("rxOmciMessage has wrong Device Identifier %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000363 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000364 decodeOptions := gopacket.DecodeOptions{
365 Lazy: true,
366 NoCopy: true,
367 }
368 packet := gopacket.NewPacket(rxMsg, omci.LayerTypeOMCI, decodeOptions)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000369 if packet == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000370 logger.Errorw(ctx, "omci-message could not be decoded", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000371 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200372 return fmt.Errorf("could not decode rxMsg as OMCI %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000373 }
374 omciLayer := packet.Layer(omci.LayerTypeOMCI)
375 if omciLayer == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000376 logger.Errorw(ctx, "omci-message could not decode omci layer", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000377 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200378 return fmt.Errorf("could not decode omci layer %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000379 }
mpagenko836a1fd2021-11-01 16:12:42 +0000380 // insert some check on detected OMCI decoding issues and log them
381 // e.g. should indicate problems when detecting some unknown attribute mask content (independent from message type)
382 // even though allowed from omci-lib due to set relaxed decoding
383 // application may dig into further details if wanted/needed on their own [but info is not transferred from here so far]
384 // (compare mib_sync.go unknownAttrLayer)
385 errLayer := packet.Layer(gopacket.LayerTypeDecodeFailure)
386 if failure, decodeOk := errLayer.(*gopacket.DecodeFailure); decodeOk {
387 errMsg := failure.Error()
388 logger.Warnw(ctx, "Detected decode issue on received OMCI frame", log.Fields{
389 "device-id": oo.deviceID, "issue": errMsg})
390 }
391 //anyway try continue OMCI decoding further on message type layer
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000392 omciMsg, ok := omciLayer.(*omci.OMCI)
393 if !ok {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000394 logger.Errorw(ctx, "omci-message could not assign omci layer", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000395 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200396 return fmt.Errorf("could not assign omci layer %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000397 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000398 logger.Debugw(ctx, "omci-message-decoded:", log.Fields{"omciMsgType": omciMsg.MessageType,
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000399 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16),
400 "DeviceIdent": omciMsg.DeviceIdentifier, "device-id": oo.deviceID})
mpagenko836a1fd2021-11-01 16:12:42 +0000401
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700402 // TestResult is asynchronous indication that carries the same TID as the TestResponse.
403 // We expect to find the TID in the oo.rxSchedulerMap
404 if byte(omciMsg.MessageType)&me.AK == 0 && omciMsg.MessageType != omci.TestResultType {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000405 // Not a response
mpagenko80622a52021-02-09 16:53:23 +0000406 oo.printRxMessage(ctx, rxMsg)
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000407 logger.Debugw(ctx, "RxMsg is no Omci Response Message", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000408 if omciMsg.TransactionID == 0 {
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000409 if rxMsg[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
410 oo.incrementBaseRxNoAkFrames()
411 } else {
412 oo.incrementExtRxNoAkFrames()
413 }
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530414 return oo.receiveOnuMessage(ctx, omciMsg, &packet)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000415 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000416 logger.Errorw(ctx, "Unexpected TransCorrId != 0 not accepted for autonomous messages",
Andrea Campanella6515c582020-10-05 11:25:00 +0200417 log.Fields{"msgType": omciMsg.MessageType, "payload": hex.EncodeToString(omciMsg.Payload),
mpagenko8b07c1b2020-11-26 10:36:31 +0000418 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200419 return fmt.Errorf("autonomous Omci Message with TranSCorrId != 0 not acccepted %s", oo.deviceID)
Himani Chawla4d908332020-08-31 12:30:20 +0530420 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000421 //logger.Debug(ctx,"RxMsg is a Omci Response Message: try to schedule it to the requester")
Himani Chawla4d908332020-08-31 12:30:20 +0530422 oo.mutexRxSchedMap.Lock()
423 rxCallbackEntry, ok := oo.rxSchedulerMap[omciMsg.TransactionID]
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000424 if ok && rxCallbackEntry.CbFunction != nil {
Holger Hildebrandt68854a82022-09-05 07:00:21 +0000425
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000426 if rxCallbackEntry.FramePrint {
mpagenko80622a52021-02-09 16:53:23 +0000427 oo.printRxMessage(ctx, rxMsg)
428 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000429 if rxMsg[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
430 oo.incrementBaseRxAkFrames()
431 } else {
432 oo.incrementExtRxAkFrames()
433 }
Himani Chawla4d908332020-08-31 12:30:20 +0530434 //disadvantage of decoupling: error verification made difficult, but anyway the question is
435 // how to react on erroneous frame reception, maybe can simply be ignored
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530436 go func() {
437 _ = rxCallbackEntry.CbFunction(ctx, omciMsg, &packet, rxCallbackEntry.CbRespChannel)
438 }()
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000439 isSuccessfulResponse, err := oo.isSuccessfulResponseWithMibDataSync(ctx, omciMsg, &packet)
440 if err != nil {
441 // qualified error logging already done in function above
442 if !rxCallbackEntry.FramePrint {
443 oo.printRxMessage(ctx, rxMsg)
444 }
445 return fmt.Errorf("could not decode further layers %s", oo.deviceID)
446 }
447 if isSuccessfulResponse {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000448 oo.pOnuDeviceEntry.IncrementMibDataSync(ctx)
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000449 } else {
450 logger.Debugw(ctx, "mibDataSync counter not to be updated for this message type",
451 log.Fields{"omciMsg.MessageType": omciMsg.MessageType, "device-id": oo.deviceID})
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000452 }
mpagenkoc8bba412021-01-15 15:38:44 +0000453
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700454 // If omciMsg.MessageType is omci.TestResponseType, we still expect the TestResult OMCI message,
455 // so do not clean up the TransactionID in that case.
456 if omciMsg.MessageType != omci.TestResponseType {
457 // having posted the response the request is regarded as 'done'
458 delete(oo.rxSchedulerMap, omciMsg.TransactionID)
459 }
Himani Chawla4d908332020-08-31 12:30:20 +0530460 oo.mutexRxSchedMap.Unlock()
mpagenko80622a52021-02-09 16:53:23 +0000461 return nil
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000462 }
mpagenko80622a52021-02-09 16:53:23 +0000463 oo.mutexRxSchedMap.Unlock()
464 logger.Errorw(ctx, "omci-message-response for not registered transCorrId", log.Fields{"device-id": oo.deviceID})
465 oo.printRxMessage(ctx, rxMsg)
466 return fmt.Errorf("could not find registered response handler tor transCorrId %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000467
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000468 /* py code was:
469 Receive and OMCI message from the proxy channel to the OLT.
470
471 Call this from your ONU Adapter on a new OMCI Rx on the proxy channel
472 :param msg: (str) OMCI binary message (used as input to Scapy packet decoder)
473 """
474 if not self.enabled:
475 return
476
477 try:
478 now = arrow.utcnow()
479 d = None
480
481 # NOTE: Since we may need to do an independent ME map on a per-ONU basis
482 # save the current value of the entity_id_to_class_map, then
483 # replace it with our custom one before decode, and then finally
484 # restore it later. Tried other ways but really made the code messy.
485 saved_me_map = omci_entities.entity_id_to_class_map
486 omci_entities.entity_id_to_class_map = self._me_map
487
488 try:
489 rx_frame = msg if isinstance(msg, OmciFrame) else OmciFrame(msg)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000490 self.logger.debug('recv-omci-msg', omci_msg=hexlify(msg))
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000491 except KeyError as e:
492 # Unknown, Unsupported, or vendor-specific ME. Key is the unknown classID
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000493 self.logger.debug('frame-decode-key-error', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000494 rx_frame = self._decode_unknown_me(msg)
495 self._rx_unknown_me += 1
496
497 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000498 self.logger.exception('frame-decode', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000499 return
500
501 finally:
502 omci_entities.entity_id_to_class_map = saved_me_map # Always restore it.
503
504 rx_tid = rx_frame.fields['transaction_id']
505 msg_type = rx_frame.fields['message_type']
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000506 self.logger.debug('Received message for rx_tid', rx_tid = rx_tid, msg_type = msg_type)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000507 # Filter the Test Result frame and route through receive onu
508 # message method.
509 if rx_tid == 0 or msg_type == EntityOperations.TestResult.value:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000510 self.logger.debug('Receive ONU message', rx_tid=0)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000511 return self._receive_onu_message(rx_frame)
512
513 # Previously unreachable if this is the very first round-trip Rx or we
514 # have been running consecutive errors
515 if self._rx_frames == 0 or self._consecutive_errors != 0:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000516 self.logger.debug('Consecutive errors for rx', err = self._consecutive_errors)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000517 self.reactor.callLater(0, self._publish_connectivity_event, True)
518
519 self._rx_frames += 1
520 self._consecutive_errors = 0
521
522 try:
523 high_priority = self._tid_is_high_priority(rx_tid)
524 index = self._get_priority_index(high_priority)
525
526 # (timestamp, defer, frame, timeout, retry, delayedCall)
527 last_tx_tuple = self._tx_request[index]
528
529 if last_tx_tuple is None or \
530 last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id') != rx_tid:
531 # Possible late Rx on a message that timed-out
532 if last_tx_tuple:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000533 self.logger.debug('Unknown message', rx_tid=rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000534 tx_id=last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id'))
535 self._rx_unknown_tid += 1
536 self._rx_late += 1
537 return
538
539 ts, d, tx_frame, timeout, retry, dc = last_tx_tuple
540 if dc is not None and not dc.cancelled and not dc.called:
541 dc.cancel()
542
543 _secs = self._update_rx_tx_stats(now, ts)
544
545 # Late arrival already serviced by a timeout?
546 if d.called:
547 self._rx_late += 1
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000548 self.logger.debug('Serviced by timeout. Late arrival', rx_late = self._rx_late)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000549 return
550
551 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000552 self.logger.exception('frame-match', msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000553 if d is not None:
554 return d.errback(failure.Failure(e))
555 return
556
557 # Publish Rx event to listeners in a different task
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000558 self.logger.debug('Publish rx event', rx_tid = rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000559 tx_tid = tx_frame.fields['transaction_id'])
560 reactor.callLater(0, self._publish_rx_frame, tx_frame, rx_frame)
561
562 # begin success callback chain (will cancel timeout and queue next Tx message)
563 self._rx_response[index] = rx_frame
564 d.callback(rx_frame)
565
566 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000567 self.logger.exception('rx-msg', e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000568 */
569}
570
Himani Chawla6d2ae152020-09-02 13:11:20 +0530571/*
572func (oo *omciCC) publishRxResponseFrame(ctx context.Context, txFrame []byte, rxFrame []byte) error {
Himani Chawla4d908332020-08-31 12:30:20 +0530573 return errors.New("publishRxResponseFrame unimplemented")
Himani Chawla6d2ae152020-09-02 13:11:20 +0530574 //def _publish_rx_frame(self, tx_frame, rx_frame):
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000575}
Himani Chawla6d2ae152020-09-02 13:11:20 +0530576*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000577
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700578// ReleaseTid releases OMCI transaction identifier from rxSchedulerMap
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000579func (oo *OmciCC) ReleaseTid(ctx context.Context, tid uint16) {
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700580 logger.Debugw(ctx, "releasing tid from rxSchedulerMap", log.Fields{"tid": tid})
581 delete(oo.rxSchedulerMap, tid)
582}
583
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000584// Send - Queue the OMCI Frame for a transmit to the ONU via the proxy_channel
585func (oo *OmciCC) Send(ctx context.Context, txFrame []byte, timeout int, retry int, highPrio bool,
586 receiveCallbackPair CallbackPair) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000587
mpagenkoc26d4c02021-05-06 14:27:57 +0000588 if timeout != 0 {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000589 logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TransCorrId": receiveCallbackPair.CbKey})
mpagenkoc26d4c02021-05-06 14:27:57 +0000590 oo.mutexRxSchedMap.Lock()
591 // it could be checked, if the callback key is already registered - but simply overwrite may be acceptable ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000592 oo.rxSchedulerMap[receiveCallbackPair.CbKey] = receiveCallbackPair.CbEntry
mpagenkoc26d4c02021-05-06 14:27:57 +0000593 oo.mutexRxSchedMap.Unlock()
594 } //else timeout 0 indicates that no response is expected - fire and forget
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000595
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000596 printFrame := receiveCallbackPair.CbEntry.FramePrint //printFrame true means debug print of frame is requested
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000597 //just use a simple list for starting - might need some more effort, especially for multi source write access
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000598 omciTxRequest := OmciTransferStructure{
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530599 chSuccess: make(chan bool),
600 OnuSwWindow: nil,
601 cbPair: receiveCallbackPair,
602 txFrame: txFrame,
603 timeout: timeout,
604 retries: retry,
605 highPrio: highPrio,
606 withFramePrint: printFrame,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000607 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000608 oo.mutexMonReq.Lock()
609 defer oo.mutexMonReq.Unlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000610 if _, exist := oo.monitoredRequests[receiveCallbackPair.CbKey]; !exist {
mpagenko7455fd42021-06-10 16:25:55 +0000611 // do not call processRequestMonitoring in background here to ensure correct sequencing
612 // of requested messages into txQueue (especially for non-response-supervised messages)
613 oo.processRequestMonitoring(ctx, omciTxRequest)
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000614 return nil
615 }
616 logger.Errorw(ctx, "A message with this tid is processed already!",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000617 log.Fields{"tid": receiveCallbackPair.CbKey, "device-id": oo.deviceID})
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000618 return fmt.Errorf("message with tid is processed already %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000619}
620
Holger Hildebrandt34555512021-10-01 16:26:59 +0000621func (oo *OmciCC) sendQueuedRequests(ctx context.Context) {
622 // Avoid accessing the txQueues from parallel send routines to block
623 // parallel omci send requests at least until SendIAP is 'committed'.
624 // To guarantee window size 1 for one ONU it would be necessary to wait
625 // for the corresponding response too (t.b.d.).
626 oo.mutexSendQueuedRequests.Lock()
627 defer oo.mutexSendQueuedRequests.Unlock()
628 if err := oo.sendQueuedHighPrioRequests(ctx); err != nil {
629 logger.Errorw(ctx, "Error during sending high prio requests!",
630 log.Fields{"err": err, "device-id": oo.deviceID})
631 return
632 }
633 if err := oo.sendQueuedLowPrioRequests(ctx); err != nil {
634 logger.Errorw(ctx, "Error during sending low prio requests!",
635 log.Fields{"err": err, "device-id": oo.deviceID})
636 return
637 }
638}
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000639
Holger Hildebrandt34555512021-10-01 16:26:59 +0000640func (oo *OmciCC) sendQueuedHighPrioRequests(ctx context.Context) error {
641 oo.mutexHighPrioTxQueue.Lock()
642 defer oo.mutexHighPrioTxQueue.Unlock()
643 for oo.highPrioTxQueue.Len() > 0 {
balaji.nagarajan3cab2b62025-06-23 15:44:54 +0530644 select {
645 case _, ok := <-oo.pBaseDeviceHandler.GetDeviceDeleteCommChan(ctx):
646 if !ok {
647 return fmt.Errorf("device deletion channel is closed at sendQueuedHighPrioRequests %s", oo.deviceID)
648 }
649 default:
650 queueElement := oo.highPrioTxQueue.Front() // First element
651 if err := oo.sendOMCIRequest(ctx, queueElement.Value.(OmciTransferStructure)); err != nil {
652 // Element will be removed from the queue regardless of the send success, to prevent
653 // an accumulation of send requests for the same message in the event of an error.
654 // In this case, resend attempts for the message are ensured by our retry
655 // mechanism after omci-timeout.
656 oo.highPrioTxQueue.Remove(queueElement) // Dequeue
657 //Remove the call back from the rxSchedulerMap
658 oo.mutexRxSchedMap.Lock()
659 delete(oo.rxSchedulerMap, queueElement.Value.(OmciTransferStructure).cbPair.CbKey)
660 oo.mutexRxSchedMap.Unlock()
661 return err
662 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000663 oo.highPrioTxQueue.Remove(queueElement) // Dequeue
mpagenko80622a52021-02-09 16:53:23 +0000664 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000665 }
666 return nil
667}
668
669func (oo *OmciCC) sendQueuedLowPrioRequests(ctx context.Context) error {
670 oo.mutexLowPrioTxQueue.Lock()
671 for oo.lowPrioTxQueue.Len() > 0 {
balaji.nagarajan3cab2b62025-06-23 15:44:54 +0530672 select {
673 case _, ok := <-oo.pBaseDeviceHandler.GetDeviceDeleteCommChan(ctx):
674 if !ok {
kesavand011d5162021-11-25 19:21:06 +0530675 oo.mutexLowPrioTxQueue.Unlock()
balaji.nagarajan3cab2b62025-06-23 15:44:54 +0530676 return fmt.Errorf("device deletion channel is closed at sendQueuedLowPrioRequests %s", oo.deviceID)
677 }
678 default:
679 queueElement := oo.lowPrioTxQueue.Front() // First element
680 // check if the element is for onu sw section
681 aOmciTxReq := queueElement.Value.(OmciTransferStructure)
682 if aOmciTxReq.OnuSwWindow != nil {
683 if err := oo.sendOnuSwSectionsOfWindow(ctx, aOmciTxReq); err != nil {
684 // Element will be removed from the queue regardless of the send success, to prevent
685 // an accumulation of send requests for the same message in the event of an error.
686 // In this case, resend attempts for the message are ensured by our retry
687 // mechanism after omci-timeout.
688 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
689 oo.mutexLowPrioTxQueue.Unlock()
690 //Remove the call back from the rxSchedulerMap
691 oo.mutexRxSchedMap.Lock()
692 delete(oo.rxSchedulerMap, queueElement.Value.(OmciTransferStructure).cbPair.CbKey)
693 oo.mutexRxSchedMap.Unlock()
694 return err
695 }
696 } else {
697 err := oo.sendOMCIRequest(ctx, queueElement.Value.(OmciTransferStructure))
698 if err != nil {
699 // Element will be removed from the queue regardless of the send success, to prevent
700 // an accumulation of send requests for the same message in the event of an error.
701 // In this case, resend attempts for the message are ensured by our retry
702 // mechanism after omci-timeout.
703 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
704 oo.mutexLowPrioTxQueue.Unlock()
705 oo.mutexRxSchedMap.Lock()
706 delete(oo.rxSchedulerMap, queueElement.Value.(OmciTransferStructure).cbPair.CbKey)
707 oo.mutexRxSchedMap.Unlock()
708 return err
709 }
710 }
711 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
712 // Interrupt the sending of low priority requests to process any high priority requests
713 // that may have arrived in the meantime
714 oo.mutexLowPrioTxQueue.Unlock()
715 if err := oo.sendQueuedHighPrioRequests(ctx); err != nil {
kesavand011d5162021-11-25 19:21:06 +0530716 return err
717 }
balaji.nagarajan3cab2b62025-06-23 15:44:54 +0530718 oo.mutexLowPrioTxQueue.Lock()
amit.ghosh58b704b2021-06-18 03:45:52 +0200719 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000720 }
721
722 oo.mutexLowPrioTxQueue.Unlock()
723 return nil
724}
725
726func (oo *OmciCC) sendOMCIRequest(ctx context.Context, omciTxRequest OmciTransferStructure) error {
727 if omciTxRequest.withFramePrint {
728 logger.Debugw(ctx, "omci-message-to-send:", log.Fields{
729 "TxOmciMessage": hex.EncodeToString(omciTxRequest.txFrame),
730 "device-id": oo.deviceID,
731 "toDeviceType": oo.pBaseDeviceHandler.GetProxyAddressType(),
732 "proxyDeviceID": oo.pBaseDeviceHandler.GetProxyAddressID(),
733 "proxyAddress": oo.pBaseDeviceHandler.GetProxyAddress()})
734 }
khenaidoo42dcdfd2021-10-19 17:34:12 -0400735 omciMsg := &ia.OmciMessage{
Holger Hildebrandt34555512021-10-01 16:26:59 +0000736 ParentDeviceId: oo.pBaseDeviceHandler.GetProxyAddressID(),
737 ChildDeviceId: oo.deviceID,
738 Message: omciTxRequest.txFrame,
739 ProxyAddress: oo.pBaseDeviceHandler.GetProxyAddress(),
740 ConnectStatus: common.ConnectStatus_REACHABLE, // If we are sending OMCI messages means we are connected, else we should not be here
741 }
742 sendErr := oo.pBaseDeviceHandler.SendOMCIRequest(ctx, oo.pBaseDeviceHandler.GetProxyAddress().AdapterEndpoint, omciMsg)
743 if sendErr != nil {
Holger Hildebrandtabfef032022-02-25 12:40:20 +0000744 logger.Errorw(ctx, "send omci request error", log.Fields{"device-id": oo.deviceID, "ChildId": oo.deviceID, "error": sendErr})
Holger Hildebrandt34555512021-10-01 16:26:59 +0000745 return sendErr
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000746 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000747 if omciTxRequest.txFrame[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
748 oo.incrementBaseTxArFrames()
749 } else {
750 oo.incrementExtTxArFrames()
751 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000752 return nil
753}
754
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000755// GetNextTid - TODO: add comment
756func (oo *OmciCC) GetNextTid(highPriority bool) uint16 {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000757 var next uint16
758 if highPriority {
mpagenko900ee4b2020-10-12 11:56:34 +0000759 oo.mutexHpTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000760 next = oo.hpTid
Himani Chawla4d908332020-08-31 12:30:20 +0530761 oo.hpTid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000762 if oo.hpTid < 0x8000 {
763 oo.hpTid = 0x8000
764 }
mpagenko900ee4b2020-10-12 11:56:34 +0000765 oo.mutexHpTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000766 } else {
mpagenko900ee4b2020-10-12 11:56:34 +0000767 oo.mutexTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000768 next = oo.tid
Himani Chawla4d908332020-08-31 12:30:20 +0530769 oo.tid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000770 if oo.tid >= 0x8000 {
771 oo.tid = 1
772 }
mpagenko900ee4b2020-10-12 11:56:34 +0000773 oo.mutexTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000774 }
775 return next
776}
777
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530778// GetOnuSwSecNextTid get the next low prio tid for the onu sw sections
779// onu sw sections uses only low priority tids
780// The mutexTid lock should be taken prior to using this function
kesavand011d5162021-11-25 19:21:06 +0530781func (oo *OmciCC) GetOnuSwSecNextTid() uint16 {
kesavand011d5162021-11-25 19:21:06 +0530782 if oo.tid >= 0x8000 {
783 oo.tid = 1
784 }
bseenivad32c2742024-12-09 11:46:17 +0530785 next := oo.tid
786 oo.tid++
kesavand011d5162021-11-25 19:21:06 +0530787 return next
788}
789
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530790// GetOnuSwSecLastTid gets the last allocated tid
791// The mutexTid lock should be taken prior to using this function
kesavand011d5162021-11-25 19:21:06 +0530792func (oo *OmciCC) GetOnuSwSecLastTid() uint16 {
793 next := oo.tid
794 lastAllocatedTid := next - 1
795 return lastAllocatedTid
796}
797
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530798// LockMutexTID locks mutexTid
kesavand011d5162021-11-25 19:21:06 +0530799func (oo *OmciCC) LockMutexTID() {
800 oo.mutexTid.Lock()
801}
802
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530803// UnLockMutexTID unlocks mutexTid
kesavand011d5162021-11-25 19:21:06 +0530804func (oo *OmciCC) UnLockMutexTID() {
805 oo.mutexTid.Unlock()
806}
807
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000808// ###################################################################################
809// # utility methods provided to work on OMCI messages
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000810
811// Serialize - TODO: add comment
812func Serialize(ctx context.Context, msgType omci.MessageType, request gopacket.SerializableLayer, tid uint16) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000813 omciLayer := &omci.OMCI{
814 TransactionID: tid,
815 MessageType: msgType,
816 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000817 return SerializeOmciLayer(ctx, omciLayer, request)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000818}
819
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000820// SerializeOmciLayer - TODO: add comment
821func SerializeOmciLayer(ctx context.Context, aOmciLayer *omci.OMCI, aRequest gopacket.SerializableLayer) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000822 var options gopacket.SerializeOptions
823 options.FixLengths = true
824
825 buffer := gopacket.NewSerializeBuffer()
Himani Chawla4d908332020-08-31 12:30:20 +0530826 err := gopacket.SerializeLayers(buffer, options, aOmciLayer, aRequest)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000827 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000828 logger.Errorw(ctx, "Could not create goPacket Omci serial buffer", log.Fields{"Err": err})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000829 return nil, err
830 }
831 return buffer.Bytes(), nil
832}
833
Himani Chawla4d908332020-08-31 12:30:20 +0530834/*
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000835func hexEncode(omciPkt []byte) ([]byte, error) {
836 dst := make([]byte, hex.EncodedLen(len(omciPkt)))
837 hex.Encode(dst, omciPkt)
838 return dst, nil
839}
Himani Chawla4d908332020-08-31 12:30:20 +0530840*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000841
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530842// supply a response handler for omci response messages to be transferred to the requested FSM
mgoudad611f4c2025-10-30 14:49:27 +0530843func (oo *OmciCC) receiveOmciResponse(ctx context.Context, omciMsg *omci.OMCI, packet *gopacket.Packet, respChan chan Message) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000844
dbainbri4d3a0dc2020-12-02 00:33:42 +0000845 logger.Debugw(ctx, "omci-message-response - transfer on omciRespChannel", log.Fields{"omciMsgType": omciMsg.MessageType,
divyadesai4d299552020-08-18 07:13:49 +0000846 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000847
848 if oo.pOnuDeviceEntry == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000849 logger.Errorw(ctx, "Abort receiving OMCI response, DeviceEntryPointer is nil", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000850 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200851 return fmt.Errorf("deviceEntryPointer is nil %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000852 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000853 oo.mutexMonReq.RLock()
854 if _, exist := oo.monitoredRequests[omciMsg.TransactionID]; exist {
mpagenko8cd1bf72021-06-22 10:11:19 +0000855 //implement non-blocking channel send to avoid blocking on mutexMonReq later
856 select {
857 case oo.monitoredRequests[omciMsg.TransactionID].chSuccess <- true:
858 default:
859 logger.Debugw(ctx, "response not send on omciRespChannel (no receiver)", log.Fields{
860 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
861 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000862 } else {
863 logger.Infow(ctx, "reqMon: map entry does not exist!",
864 log.Fields{"tid": omciMsg.TransactionID, "device-id": oo.deviceID})
865 }
866 oo.mutexMonReq.RUnlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000867
868 // no further test on SeqNo is done here, assignment from rxScheduler is trusted
869 // MibSync responses are simply transferred via deviceEntry to MibSync, no specific analysis here
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000870 omciRespMsg := Message{
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000871 Type: OMCI,
872 Data: OmciMessage{
873 OmciMsg: omciMsg,
874 OmciPacket: packet,
875 },
876 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000877 //logger.Debugw(ctx,"Message to be sent into channel:", log.Fields{"mibSyncMsg": mibSyncMsg})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000878 respChan <- omciRespMsg
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000879
880 return nil
881}
882
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000883// SendMibReset sends MibResetRequest
884func (oo *OmciCC) SendMibReset(ctx context.Context, timeout int, highPrio bool) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000885
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530886 logger.Infow(ctx, "send MibReset-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000887 request := &omci.MibResetRequest{
888 MeBasePacket: omci.MeBasePacket{
889 EntityClass: me.OnuDataClassID,
890 },
891 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000892 tid := oo.GetNextTid(highPrio)
893 pkt, err := Serialize(ctx, omci.MibResetRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000894 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000895 logger.Errorw(ctx, "Cannot serialize MibResetRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000896 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000897 return err
898 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000899 omciRxCallbackPair := CallbackPair{
900 CbKey: tid,
901 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000902 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000903 return oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000904}
905
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000906// SendReboot sends RebootRequest
907func (oo *OmciCC) SendReboot(ctx context.Context, timeout int, highPrio bool, responseChannel chan Message) error {
908 logger.Debugw(ctx, "send reboot-msg to:", log.Fields{"device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300909 request := &omci.RebootRequest{
910 MeBasePacket: omci.MeBasePacket{
911 EntityClass: me.OnuGClassID,
912 },
913 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000914 tid := oo.GetNextTid(highPrio)
915 pkt, err := Serialize(ctx, omci.RebootRequestType, request, tid)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300916 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000917 logger.Errorw(ctx, "Cannot serialize RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000918 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300919 return err
920 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000921 omciRxCallbackPair := CallbackPair{
922 CbKey: tid,
923 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetOmciRebootMsgRevChan(), oo.receiveOmciResponse, true},
ozgecanetsiae11479f2020-07-06 09:44:47 +0300924 }
925
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000926 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300927 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000928 logger.Errorw(ctx, "Cannot send RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000929 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300930 return err
931 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000932 err = oo.pOnuDeviceEntry.WaitForRebootResponse(ctx, responseChannel)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300933 if err != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000934 logger.Errorw(ctx, "aborting ONU reboot!", log.Fields{
Andrea Campanella6515c582020-10-05 11:25:00 +0200935 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300936 return err
937 }
938 return nil
939}
940
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000941// SendMibUpload sends MibUploadRequest
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000942func (oo *OmciCC) SendMibUpload(ctx context.Context, timeout int, highPrio bool, isExtOmciSupported bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000943 logger.Debugw(ctx, "send MibUpload-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000944
945 tid := oo.GetNextTid(highPrio)
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000946
947 omciLayer := &omci.OMCI{
948 TransactionID: tid,
949 MessageType: omci.MibUploadRequestType,
950 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000951 if isExtOmciSupported {
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000952 omciLayer.DeviceIdentifier = omci.ExtendedIdent
953 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000954 request := &omci.MibUploadRequest{
955 MeBasePacket: omci.MeBasePacket{
956 EntityClass: me.OnuDataClassID,
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000957 Extended: isExtOmciSupported,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000958 },
959 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000960 var options gopacket.SerializeOptions
961 options.FixLengths = true
962
963 buffer := gopacket.NewSerializeBuffer()
964 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000965 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000966 logger.Errorw(ctx, "Cannot serialize MibUploadRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000967 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000968 return err
969 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000970 oo.UploadSequNo = 0
971 oo.UploadNoOfCmds = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000972
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000973 omciRxCallbackPair := CallbackPair{
974 CbKey: tid,
975 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000976 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000977 return oo.Send(ctx, buffer.Bytes(), timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000978}
979
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000980// SendMibUploadNext sends MibUploadNextRequest
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000981func (oo *OmciCC) SendMibUploadNext(ctx context.Context, timeout int, highPrio bool, isExtOmciSupported bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000982 logger.Debugw(ctx, "send MibUploadNext-msg to:", log.Fields{"device-id": oo.deviceID, "UploadSequNo": oo.UploadSequNo})
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000983
984 tid := oo.GetNextTid(highPrio)
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000985
986 omciLayer := &omci.OMCI{
987 TransactionID: tid,
988 MessageType: omci.MibUploadNextRequestType,
989 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000990 if isExtOmciSupported {
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000991 omciLayer.DeviceIdentifier = omci.ExtendedIdent
992 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000993 request := &omci.MibUploadNextRequest{
994 MeBasePacket: omci.MeBasePacket{
995 EntityClass: me.OnuDataClassID,
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000996 Extended: isExtOmciSupported,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000997 },
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000998 CommandSequenceNumber: oo.UploadSequNo,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000999 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +00001000 var options gopacket.SerializeOptions
1001 options.FixLengths = true
1002
1003 buffer := gopacket.NewSerializeBuffer()
1004 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001005 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001006 logger.Errorw(ctx, "Cannot serialize MibUploadNextRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001007 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001008 return err
1009 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001010 oo.UploadSequNo++
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001011
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001012 omciRxCallbackPair := CallbackPair{
1013 CbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001014 //frame printing for MibUpload frames disabled now per default to avoid log file abort situations (size/speed?)
1015 // if wanted, rx frame printing should be specifically done within the MibUpload FSM or controlled via extra parameter
1016 // compare also software upgrade download section handling
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001017 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001018 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +00001019 return oo.Send(ctx, buffer.Bytes(), timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001020}
1021
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001022// SendGetAllAlarm gets all alarm ME instances
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001023func (oo *OmciCC) SendGetAllAlarm(ctx context.Context, alarmRetreivalMode uint8, timeout int, highPrio bool, isExtendedOmci bool) error {
Himani Chawlad3dac422021-03-13 02:31:31 +05301024 logger.Debugw(ctx, "send GetAllAlarms-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001025
1026 tid := oo.GetNextTid(highPrio)
1027 omciLayer := &omci.OMCI{
1028 TransactionID: tid,
1029 MessageType: omci.GetAllAlarmsRequestType,
1030 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1031 }
1032 if isExtendedOmci {
1033 omciLayer.DeviceIdentifier = omci.ExtendedIdent
1034 }
Himani Chawlad3dac422021-03-13 02:31:31 +05301035 request := &omci.GetAllAlarmsRequest{
1036 MeBasePacket: omci.MeBasePacket{
1037 EntityClass: me.OnuDataClassID,
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001038 Extended: isExtendedOmci,
Himani Chawlad3dac422021-03-13 02:31:31 +05301039 },
1040 AlarmRetrievalMode: byte(alarmRetreivalMode),
1041 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001042 var options gopacket.SerializeOptions
1043 options.FixLengths = true
1044 buffer := gopacket.NewSerializeBuffer()
1045 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Himani Chawlad3dac422021-03-13 02:31:31 +05301046 if err != nil {
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001047 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsRequest", log.Fields{"Err": err,
1048 "device-id": oo.deviceID})
Himani Chawlad3dac422021-03-13 02:31:31 +05301049 return err
1050 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001051 outgoingPacket := buffer.Bytes()
1052
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001053 oo.pOnuAlarmManager.ResetAlarmUploadCounters()
Himani Chawlad3dac422021-03-13 02:31:31 +05301054
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001055 omciRxCallbackPair := CallbackPair{
1056 CbKey: tid,
1057 CbEntry: CallbackPairEntry{oo.pOnuAlarmManager.GetAlarmMgrEventChannel(), oo.receiveOmciResponse, true},
Himani Chawlad3dac422021-03-13 02:31:31 +05301058 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001059 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
1060 if err != nil {
1061 logger.Errorw(ctx, "Cannot send GetAllAlarmsRequest", log.Fields{"Err": err,
1062 "device-id": oo.deviceID})
1063 return err
1064 }
1065 logger.Debug(ctx, "send GetAllAlarmsRequest done")
1066 return nil
Himani Chawlad3dac422021-03-13 02:31:31 +05301067}
1068
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001069// SendGetAllAlarmNext gets next alarm ME instance
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001070func (oo *OmciCC) SendGetAllAlarmNext(ctx context.Context, timeout int, highPrio bool, isExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001071 alarmUploadSeqNo := oo.pOnuAlarmManager.GetAlarmUploadSeqNo()
1072 logger.Debugw(ctx, "send SendGetAllAlarmNext-msg to:", log.Fields{"device-id": oo.deviceID,
Himani Chawlad3dac422021-03-13 02:31:31 +05301073 "alarmUploadSeqNo": alarmUploadSeqNo})
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001074
1075 tid := oo.GetNextTid(highPrio)
1076 omciLayer := &omci.OMCI{
1077 TransactionID: tid,
1078 MessageType: omci.GetAllAlarmsNextRequestType,
1079 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1080 }
1081 if isExtendedOmci {
1082 omciLayer.DeviceIdentifier = omci.ExtendedIdent
1083 }
Himani Chawlad3dac422021-03-13 02:31:31 +05301084 request := &omci.GetAllAlarmsNextRequest{
1085 MeBasePacket: omci.MeBasePacket{
1086 EntityClass: me.OnuDataClassID,
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001087 Extended: isExtendedOmci,
Himani Chawlad3dac422021-03-13 02:31:31 +05301088 },
1089 CommandSequenceNumber: alarmUploadSeqNo,
1090 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001091 var options gopacket.SerializeOptions
1092 options.FixLengths = true
1093 buffer := gopacket.NewSerializeBuffer()
1094 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Himani Chawlad3dac422021-03-13 02:31:31 +05301095 if err != nil {
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001096 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsNextRequest", log.Fields{"Err": err,
1097 "device-id": oo.deviceID})
Himani Chawlad3dac422021-03-13 02:31:31 +05301098 return err
1099 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001100 outgoingPacket := buffer.Bytes()
1101
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001102 oo.pOnuAlarmManager.IncrementAlarmUploadSeqNo()
Himani Chawlad3dac422021-03-13 02:31:31 +05301103
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001104 omciRxCallbackPair := CallbackPair{
1105 CbKey: tid,
1106 CbEntry: CallbackPairEntry{oo.pOnuAlarmManager.GetAlarmMgrEventChannel(), oo.receiveOmciResponse, true},
Himani Chawlad3dac422021-03-13 02:31:31 +05301107 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001108 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
1109 if err != nil {
1110 logger.Errorw(ctx, "Cannot send GetAllAlarmsNextRequest", log.Fields{"Err": err,
1111 "device-id": oo.deviceID})
1112 return err
1113 }
1114 logger.Debug(ctx, "send GetAllAlarmsNextRequest done")
1115 return nil
Himani Chawlad3dac422021-03-13 02:31:31 +05301116}
1117
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001118// SendCreateGalEthernetProfile creates GalEthernetProfile ME instance
1119func (oo *OmciCC) SendCreateGalEthernetProfile(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1120 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001121 logger.Debugw(ctx, "send GalEnetProfile-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001122 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001123
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001124 meParams := me.ParamData{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001125 EntityID: GalEthernetEID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001126 Attributes: me.AttributeValueMap{me.GalEthernetProfile_MaximumGemPayloadSize: maxGemPayloadSize},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001127 }
1128 meInstance, omciErr := me.NewGalEthernetProfile(meParams)
1129 if omciErr.GetError() == nil {
1130 //all setByCreate parameters already set, no default option required ...
mpagenko836a1fd2021-11-01 16:12:42 +00001131 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001132 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001133 logger.Errorw(ctx, "Cannot encode GalEnetProfileInstance for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001134 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001135 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001136 }
1137
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001138 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001139 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001140 logger.Errorw(ctx, "Cannot serialize GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001141 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001142 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001143 }
1144
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001145 omciRxCallbackPair := CallbackPair{
1146 CbKey: tid,
1147 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001148 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001149 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001150 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001151 logger.Errorw(ctx, "Cannot send GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001152 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001153 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001154 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001155 logger.Debug(ctx, "send GalEnetProfile-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001156 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001157 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001158 logger.Errorw(ctx, "Cannot generate GalEnetProfileInstance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001159 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001160 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001161}
1162
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001163// SendSetOnu2g sets Onu2G ME instance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001164// might be needed to extend for parameter arguments, here just for setting the ConnectivityMode!!
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001165func (oo *OmciCC) SendSetOnu2g(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1166 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001167 logger.Debugw(ctx, "send ONU2-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001168 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001169
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001170 // ONU-G ME-ID is defined to be 0, but we could verify, if the ONU really supports the desired
1171 // connectivity mode 5 (in ConnCap)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001172 // By now we just use fix values to fire - this is anyway what the python adapter does
1173 // read ONU-2G from DB ???? //TODO!!!
1174 meParams := me.ParamData{
1175 EntityID: 0,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001176 Attributes: me.AttributeValueMap{me.Onu2G_CurrentConnectivityMode: connectivityModeValue},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001177 }
1178 meInstance, omciErr := me.NewOnu2G(meParams)
1179 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001180 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001181 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001182 logger.Errorw(ctx, "Cannot encode ONU2-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001183 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001184 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001185 }
1186
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001187 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001188 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001189 logger.Errorw(ctx, "Cannot serialize ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001190 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001191 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001192 }
1193
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001194 omciRxCallbackPair := CallbackPair{
1195 CbKey: tid,
1196 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001197 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001198 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001199 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001200 logger.Errorw(ctx, "Cannot send ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001201 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001202 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001203 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001204 logger.Debug(ctx, "send ONU2-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001205 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001206 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001207 logger.Errorw(ctx, "Cannot generate ONU2-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001208 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001209 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001210}
1211
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001212// SendCreateMBServiceProfile creates MacBridgeServiceProfile ME instance
1213func (oo *OmciCC) SendCreateMBServiceProfile(ctx context.Context,
1214 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1215 tid := oo.GetNextTid(highPrio)
1216 instID := MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001217 logger.Debugw(ctx, "send MBSP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001218 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001219
1220 meParams := me.ParamData{
1221 EntityID: instID,
1222 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001223 me.MacBridgeServiceProfile_Priority: 0x8000,
1224 me.MacBridgeServiceProfile_MaxAge: 20 * 256, //20s
1225 me.MacBridgeServiceProfile_HelloTime: 2 * 256, //2s
1226 me.MacBridgeServiceProfile_ForwardDelay: 15 * 256, //15s
1227 me.MacBridgeServiceProfile_DynamicFilteringAgeingTime: 0,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001228 },
1229 }
1230
1231 meInstance, omciErr := me.NewMacBridgeServiceProfile(meParams)
1232 if omciErr.GetError() == nil {
1233 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001234 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1235 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001236 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001237 logger.Errorw(ctx, "Cannot encode MBSP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001238 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001239 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001240 }
1241
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001242 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001243 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001244 logger.Errorw(ctx, "Cannot serialize MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001245 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001246 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001247 }
1248
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001249 omciRxCallbackPair := CallbackPair{
1250 CbKey: tid,
1251 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001252 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001253 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001254 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001255 logger.Errorw(ctx, "Cannot send MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001256 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001257 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001258 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001259 logger.Debug(ctx, "send MBSP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001260 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001261 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001262 logger.Errorw(ctx, "Cannot generate MBSP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001263 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001264 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001265}
1266
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001267// SendCreateMBPConfigDataUniSide creates MacBridgePortConfigurationData ME instance
1268func (oo *OmciCC) SendCreateMBPConfigDataUniSide(ctx context.Context,
1269 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1270 tid := oo.GetNextTid(highPrio)
1271 instID, idErr := GenerateUNISideMBPCDEID(uint16(aPUniPort.MacBpNo))
Mahir Gunyel6781f962021-05-16 23:30:08 -07001272 if idErr != nil {
1273 logger.Errorw(ctx, "Cannot generate MBPCD entity id", log.Fields{
1274 "Err": idErr, "device-id": oo.deviceID})
1275 return nil, idErr
1276 }
1277 logger.Debugw(ctx, "send MBPCD-Create-msg for uni side:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001278 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16), "macBpNo": aPUniPort.MacBpNo})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001279
1280 meParams := me.ParamData{
1281 EntityID: instID,
1282 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001283 me.MacBridgePortConfigurationData_BridgeIdPointer: MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo),
1284 me.MacBridgePortConfigurationData_PortNum: aPUniPort.MacBpNo,
1285 me.MacBridgePortConfigurationData_TpType: uint8(aPUniPort.PortType),
1286 me.MacBridgePortConfigurationData_TpPointer: aPUniPort.EntityID,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001287 },
1288 }
1289 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
1290 if omciErr.GetError() == nil {
1291 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001292 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1293 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001294 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001295 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001296 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001297 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001298 }
1299
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001300 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001301 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001302 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001303 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001304 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001305 }
1306
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001307 omciRxCallbackPair := CallbackPair{
1308 CbKey: tid,
1309 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001310 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001311 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001312 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001313 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001314 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001315 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001316 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001317 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001318 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001319 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001320 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001321 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001322 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001323}
1324
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001325// SendCreateEVTOConfigData creates ExtendedVlanTaggingOperationConfigurationData ME instance
1326func (oo *OmciCC) SendCreateEVTOConfigData(ctx context.Context,
1327 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1328 tid := oo.GetNextTid(highPrio)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001329 //same entityId is used as for MBSP (see there), but just arbitrary ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001330 instID := MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001331 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001332 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001333
1334 // compare python adapter code WA VOL-1311: this is not done here!
1335 // (setting TPID values for the create would probably anyway be ignored by the omci lib)
1336 // but perhaps we have to be aware of possible problems at get(Next) Request handling for EVTOOCD tables later ...
1337 assType := uint8(2) // default AssociationType is PPTPEthUni
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001338 if aPUniPort.PortType == UniVEIP {
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001339 assType = uint8(10) // for VEIP
1340 }
1341 meParams := me.ParamData{
1342 EntityID: instID,
1343 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001344 me.ExtendedVlanTaggingOperationConfigurationData_AssociationType: assType,
1345 me.ExtendedVlanTaggingOperationConfigurationData_AssociatedMePointer: aPUniPort.EntityID,
mpagenko836a1fd2021-11-01 16:12:42 +00001346 //EnhancedMode not yet supported, used with default options
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001347 },
1348 }
1349 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(meParams)
1350 if omciErr.GetError() == nil {
1351 //all setByCreate parameters already set, no default option required ...
mpagenko836a1fd2021-11-01 16:12:42 +00001352 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1353 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001354 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001355 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001356 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001357 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001358 }
1359
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001360 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001361 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001362 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001363 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001364 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001365 }
1366
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001367 omciRxCallbackPair := CallbackPair{
1368 CbKey: tid,
1369 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001370 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001371 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001372 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001373 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001374 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001375 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001376 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001377 logger.Debug(ctx, "send EVTOCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001378 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001379 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001380 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001381 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001382 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001383}
1384
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001385// SendSetOnuGLS sets OnuG ME instance
1386func (oo *OmciCC) SendSetOnuGLS(ctx context.Context, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001387 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001388 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001389 logger.Debugw(ctx, "send ONU-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001390 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001391
1392 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1393 meParams := me.ParamData{
1394 EntityID: 0,
1395 Attributes: requestedAttributes,
1396 }
1397 meInstance, omciErr := me.NewOnuG(meParams)
1398 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001399 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001400 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001401 logger.Errorw(ctx, "Cannot encode ONU-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001402 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001403 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001404 }
1405
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001406 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001407 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001408 logger.Errorw(ctx, "Cannot serialize ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001409 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001410 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001411 }
1412
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001413 omciRxCallbackPair := CallbackPair{
1414 CbKey: tid,
1415 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001416 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001417 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001418 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001419 logger.Errorw(ctx, "Cannot send ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001420 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001421 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001422 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001423 logger.Debug(ctx, "send ONU-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001424 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001425 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001426 logger.Errorw(ctx, "Cannot generate ONU-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001427 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001428 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001429}
1430
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001431// SendSetPptpEthUniLS sets PhysicalPathTerminationPointEthernetUni ME instance
1432func (oo *OmciCC) SendSetPptpEthUniLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001433 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001434 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001435 logger.Debugw(ctx, "send PPTPEthUni-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001436 "SequNo": strconv.FormatInt(int64(tid), 16)})
1437
1438 // PPTPEthUni ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1439 meParams := me.ParamData{
1440 EntityID: aInstNo,
1441 Attributes: requestedAttributes,
1442 }
1443 meInstance, omciErr := me.NewPhysicalPathTerminationPointEthernetUni(meParams)
1444 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001445 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001446 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001447 logger.Errorw(ctx, "Cannot encode PPTPEthUni instance for set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001448 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001449 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001450 }
1451
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001452 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001453 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001454 logger.Errorw(ctx, "Cannot serialize PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001455 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001456 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001457 }
1458
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001459 omciRxCallbackPair := CallbackPair{
1460 CbKey: tid,
1461 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001462 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001463 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001464 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001465 logger.Errorw(ctx, "Cannot send PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001466 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001467 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001468 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001469 logger.Debug(ctx, "send PPTPEthUni-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001470 return meInstance, nil
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001471 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001472 logger.Errorw(ctx, "Cannot generate PPTPEthUni", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001473 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001474 return nil, omciErr.GetError()
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001475}
1476
1477/* UniG obsolete by now, left here in case it should be needed once again
1478 UniG AdminState anyway should be ignored by ONU acc. to G988
Himani Chawla6d2ae152020-09-02 13:11:20 +05301479func (oo *omciCC) sendSetUniGLS(ctx context.Context, aInstNo uint16, timeout int,
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001480 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) *me.ManagedEntity {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001481 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001482 logger.Debugw(ctx,"send UNI-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001483 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001484
1485 // UNI-G ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1486 meParams := me.ParamData{
1487 EntityID: aInstNo,
1488 Attributes: requestedAttributes,
1489 }
1490 meInstance, omciErr := me.NewUniG(meParams)
1491 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001492 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001493 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001494 logger.Errorw(ctx,"Cannot encode UNI-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001495 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001496 return nil
1497 }
1498
1499 pkt, err := serializeOmciLayer(omciLayer, msgLayer)
1500 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001501 logger.Errorw(ctx,"Cannot serialize UNI-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001502 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001503 return nil
1504 }
1505
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001506 omciRxCallbackPair := CallbackPair{
1507 CbKey: tid,
1508 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001509 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001510 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001511 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001512 logger.Errorw(ctx,"Cannot send UNIG-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001513 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001514 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001515 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001516 logger.Debug(ctx,"send UNI-G-Set-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001517 return meInstance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001518 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001519 logger.Errorw(ctx,"Cannot generate UNI-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001520 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001521 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001522}
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001523*/
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001524
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001525// SendSetVeipLS sets VirtualEthernetInterfacePoint ME instance
1526func (oo *OmciCC) SendSetVeipLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001527 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001528 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001529 logger.Debugw(ctx, "send VEIP-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001530 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001531
1532 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1533 meParams := me.ParamData{
1534 EntityID: aInstNo,
1535 Attributes: requestedAttributes,
1536 }
1537 meInstance, omciErr := me.NewVirtualEthernetInterfacePoint(meParams)
1538 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001539 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001540 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001541 logger.Errorw(ctx, "Cannot encode VEIP instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001542 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001543 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001544 }
1545
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001546 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001547 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001548 logger.Errorw(ctx, "Cannot serialize VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001549 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001550 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001551 }
1552
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001553 omciRxCallbackPair := CallbackPair{
1554 CbKey: tid,
1555 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001556 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001557 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001558 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001559 logger.Errorw(ctx, "Cannot send VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001560 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001561 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001562 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001563 logger.Debug(ctx, "send VEIP-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001564 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001565 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001566 logger.Errorw(ctx, "Cannot generate VEIP", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001567 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001568 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001569}
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001570
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001571// SendGetMe gets ME instance
1572func (oo *OmciCC) SendGetMe(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributes me.AttributeValueMap,
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001573 timeout int, highPrio bool, rxChan chan Message, isExtendedOmci bool) (*me.ManagedEntity, error) {
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001574
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001575 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001576 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001577 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001578
1579 meParams := me.ParamData{
1580 EntityID: entityID,
1581 Attributes: requestedAttributes,
1582 }
mgoudad611f4c2025-10-30 14:49:27 +05301583 var messageSet = omci.BaselineIdent
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001584 if isExtendedOmci {
1585 messageSet = omci.ExtendedIdent
1586 }
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001587 meInstance, omciErr := me.LoadManagedEntityDefinition(classID, meParams)
1588 if omciErr.GetError() == nil {
Himani Chawla4d908332020-08-31 12:30:20 +05301589 meClassIDName := meInstance.GetName()
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001590 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.GetRequestType, oframe.TransactionID(tid), oframe.FrameFormat(messageSet))
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001591 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001592 logger.Errorf(ctx, "Cannot encode instance for get-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001593 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001594 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001595 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001596 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001597 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001598 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001599 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001600 omciRxCallbackPair := CallbackPair{
1601 CbKey: tid,
1602 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001603 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001604 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001605 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001606 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001607 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001608 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001609 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": meClassIDName, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001610 return meInstance, nil
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001611 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001612 logger.Errorw(ctx, "Cannot generate meDefinition", log.Fields{"classID": classID, "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001613 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001614}
1615
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001616// SendGetMeWithAttributeMask gets ME instance with attribute mask
1617func (oo *OmciCC) SendGetMeWithAttributeMask(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributesMask uint16,
Himani Chawla43f95ff2021-06-03 00:24:12 +05301618 timeout int, highPrio bool, rxChan chan Message) error {
1619
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001620 tid := oo.GetNextTid(highPrio)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301621 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
1622 "SequNo": strconv.FormatInt(int64(tid), 16)})
1623
1624 request := &omci.GetRequest{
1625 MeBasePacket: omci.MeBasePacket{
1626 EntityInstance: entityID,
1627 EntityClass: classID,
1628 },
1629 AttributeMask: requestedAttributesMask,
1630 }
1631
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001632 pkt, err := Serialize(ctx, omci.GetRequestType, request, tid)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301633 if err != nil {
1634 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1635 return err
1636 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001637 omciRxCallbackPair := CallbackPair{
1638 CbKey: tid,
1639 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Himani Chawla43f95ff2021-06-03 00:24:12 +05301640 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001641 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301642 if err != nil {
1643 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1644 return err
1645 }
1646 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": classID, "device-id": oo.deviceID})
1647 return nil
1648}
1649
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001650// SendCreateDot1PMapper creates Ieee8021PMapperServiceProfile ME instance
1651func (oo *OmciCC) SendCreateDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001652 aInstID uint16, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001653 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001654 logger.Debugw(ctx, "send .1pMapper-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001655 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(aInstID), 16)})
1656
1657 meParams := me.ParamData{
mpagenko8b5fdd22020-12-17 17:58:32 +00001658 EntityID: aInstID,
1659 Attributes: me.AttributeValueMap{
1660 //workaround for unsuitable omci-lib default values, cmp VOL-3729
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001661 me.Ieee8021PMapperServiceProfile_TpPointer: 0xFFFF,
1662 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority0: 0xFFFF,
1663 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority1: 0xFFFF,
1664 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority2: 0xFFFF,
1665 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority3: 0xFFFF,
1666 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority4: 0xFFFF,
1667 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority5: 0xFFFF,
1668 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority6: 0xFFFF,
1669 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority7: 0xFFFF,
mpagenko8b5fdd22020-12-17 17:58:32 +00001670 },
mpagenko3dbcdd22020-07-22 07:38:45 +00001671 }
1672 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
1673 if omciErr.GetError() == nil {
1674 //we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001675 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1676 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001677 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001678 logger.Errorw(ctx, "Cannot encode .1pMapper for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001679 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001680 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001681 }
1682
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001683 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001684 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001685 logger.Errorw(ctx, "Cannot serialize .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001686 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001687 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001688 }
1689
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001690 omciRxCallbackPair := CallbackPair{
1691 CbKey: tid,
1692 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001693 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001694 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001695 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001696 logger.Errorw(ctx, "Cannot send .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001697 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001698 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001699 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001700 logger.Debug(ctx, "send .1pMapper-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001701 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001702 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001703 logger.Errorw(ctx, "Cannot generate .1pMapper", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001704 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001705 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001706}
1707
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001708// SendCreateMBPConfigDataVar creates MacBridgePortConfigurationData ME instance
1709func (oo *OmciCC) SendCreateMBPConfigDataVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001710 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001711 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001712 logger.Debugw(ctx, "send MBPCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001713 "SequNo": strconv.FormatInt(int64(tid), 16),
1714 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1715
1716 meInstance, omciErr := me.NewMacBridgePortConfigurationData(params[0])
1717 if omciErr.GetError() == nil {
1718 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001719 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1720 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001721 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001722 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001723 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001724 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001725 }
1726
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001727 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001728 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001729 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001730 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001731 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001732 }
1733
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001734 omciRxCallbackPair := CallbackPair{
1735 CbKey: tid,
1736 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001737 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001738 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001739 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001740 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001741 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001742 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001743 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001744 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001745 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001746 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001747 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001748 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001749 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001750}
1751
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001752// SendCreateGemNCTPVar creates GemPortNetworkCtp ME instance
1753func (oo *OmciCC) SendCreateGemNCTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001754 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001755 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001756 logger.Debugw(ctx, "send GemNCTP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001757 "SequNo": strconv.FormatInt(int64(tid), 16),
1758 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1759
1760 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1761 if omciErr.GetError() == nil {
1762 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001763 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1764 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001765 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001766 logger.Errorw(ctx, "Cannot encode GemNCTP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001767 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001768 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001769 }
1770
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001771 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001772 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001773 logger.Errorw(ctx, "Cannot serialize GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001774 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001775 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001776 }
1777
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001778 omciRxCallbackPair := CallbackPair{
1779 CbKey: tid,
1780 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001781 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001782 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001783 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001784 logger.Errorw(ctx, "Cannot send GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001785 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001786 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001787 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001788 logger.Debug(ctx, "send GemNCTP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001789 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001790 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001791 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001792 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001793 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001794}
1795
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001796// SendSetGemNCTPVar sets GemPortNetworkCtp ME instance
1797func (oo *OmciCC) SendSetGemNCTPVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
1798 tid := oo.GetNextTid(highPrio)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001799 logger.Debugw(ctx, "send GemNCTP-Set-msg:", log.Fields{"device-id": oo.deviceID,
1800 "SequNo": strconv.FormatInt(int64(tid), 16),
1801 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1802
1803 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1804 if omciErr.GetError() == nil {
1805 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001806 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType,
1807 oframe.TransactionID(tid), oframe.AddDefaults(true))
ozgecanetsia82b91a62021-05-21 18:54:49 +03001808 if err != nil {
1809 logger.Errorw(ctx, "Cannot encode GemNCTP for set", log.Fields{
1810 "Err": err, "device-id": oo.deviceID})
1811 return nil, err
1812 }
1813
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001814 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001815 if err != nil {
1816 logger.Errorw(ctx, "Cannot serialize GemNCTP set", log.Fields{
1817 "Err": err, "device-id": oo.deviceID})
1818 return nil, err
1819 }
1820
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001821 omciRxCallbackPair := CallbackPair{
1822 CbKey: tid,
1823 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia82b91a62021-05-21 18:54:49 +03001824 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001825 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001826 if err != nil {
1827 logger.Errorw(ctx, "Cannot send GemNCTP set", log.Fields{
1828 "Err": err, "device-id": oo.deviceID})
1829 return nil, err
1830 }
1831 logger.Debug(ctx, "send GemNCTP-Set-msg done", log.Fields{"device-id": oo.deviceID})
1832 return meInstance, nil
1833 }
1834 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
1835 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1836 return nil, omciErr.GetError()
1837}
1838
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001839// SendCreateGemIWTPVar creates GemInterworkingTerminationPoint ME instance
1840func (oo *OmciCC) SendCreateGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001841 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001842 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001843 logger.Debugw(ctx, "send GemIwTp-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001844 "SequNo": strconv.FormatInt(int64(tid), 16),
1845 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1846
1847 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(params[0])
1848 if omciErr.GetError() == nil {
1849 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
mpagenko836a1fd2021-11-01 16:12:42 +00001850 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1851 oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001852 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001853 logger.Errorw(ctx, "Cannot encode GemIwTp for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001854 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001855 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001856 }
1857
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001858 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001859 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001860 logger.Errorw(ctx, "Cannot serialize GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001861 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001862 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001863 }
1864
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001865 omciRxCallbackPair := CallbackPair{
1866 CbKey: tid,
1867 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001868 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001869 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001870 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001871 logger.Errorw(ctx, "Cannot send GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001872 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001873 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001874 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001875 logger.Debug(ctx, "send GemIwTp-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001876 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001877 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001878 logger.Errorw(ctx, "Cannot generate GemIwTp Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001879 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001880 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001881}
1882
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001883// SendSetTcontVar sets TCont ME instance
1884func (oo *OmciCC) SendSetTcontVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001885 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001886 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001887 logger.Debugw(ctx, "send TCont-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001888 "SequNo": strconv.FormatInt(int64(tid), 16),
1889 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1890
1891 meInstance, omciErr := me.NewTCont(params[0])
1892 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001893 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001894 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001895 logger.Errorw(ctx, "Cannot encode TCont for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001896 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001897 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001898 }
1899
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001900 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001901 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001902 logger.Errorw(ctx, "Cannot serialize TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001903 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001904 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001905 }
1906
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001907 omciRxCallbackPair := CallbackPair{
1908 CbKey: tid,
1909 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001910 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001911 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001912 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001913 logger.Errorw(ctx, "Cannot send TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001914 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001915 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001916 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001917 logger.Debug(ctx, "send TCont-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001918 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001919 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001920 logger.Errorw(ctx, "Cannot generate TCont Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001921 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001922 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001923}
1924
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001925// SendSetPrioQueueVar sets PriorityQueue ME instance
1926func (oo *OmciCC) SendSetPrioQueueVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001927 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001928 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001929 logger.Debugw(ctx, "send PrioQueue-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001930 "SequNo": strconv.FormatInt(int64(tid), 16),
1931 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1932
1933 meInstance, omciErr := me.NewPriorityQueue(params[0])
1934 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001935 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001936 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001937 logger.Errorw(ctx, "Cannot encode PrioQueue for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001938 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001939 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001940 }
1941
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001942 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001943 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001944 logger.Errorw(ctx, "Cannot serialize PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001945 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001946 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001947 }
1948
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001949 omciRxCallbackPair := CallbackPair{
1950 CbKey: tid,
1951 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001952 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001953 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001954 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001955 logger.Errorw(ctx, "Cannot send PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001956 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001957 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001958 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001959 logger.Debug(ctx, "send PrioQueue-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001960 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001961 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001962 logger.Errorw(ctx, "Cannot generate PrioQueue Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001963 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001964 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001965}
1966
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001967// SendSetDot1PMapperVar sets Ieee8021PMapperServiceProfile ME instance
1968func (oo *OmciCC) SendSetDot1PMapperVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001969 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001970 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001971 logger.Debugw(ctx, "send 1PMapper-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001972 "SequNo": strconv.FormatInt(int64(tid), 16),
1973 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1974
1975 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(params[0])
1976 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001977 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001978 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001979 logger.Errorw(ctx, "Cannot encode 1PMapper for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001980 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001981 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001982 }
1983
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001984 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001985 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001986 logger.Errorw(ctx, "Cannot serialize 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001987 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001988 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001989 }
1990
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001991 omciRxCallbackPair := CallbackPair{
1992 CbKey: tid,
1993 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001994 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001995 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001996 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001997 logger.Errorw(ctx, "Cannot send 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001998 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001999 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00002000 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002001 logger.Debug(ctx, "send 1PMapper-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002002 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00002003 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002004 logger.Errorw(ctx, "Cannot generate 1PMapper Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00002005 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002006 return nil, omciErr.GetError()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00002007}
mpagenkodff5dda2020-08-28 11:52:01 +00002008
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002009// SendCreateVtfdVar creates VlanTaggingFilterData ME instance
2010func (oo *OmciCC) SendCreateVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002011 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002012 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002013 logger.Debugw(ctx, "send VTFD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002014 "SequNo": strconv.FormatInt(int64(tid), 16),
2015 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2016
2017 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
2018 if omciErr.GetError() == nil {
2019 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
mpagenko836a1fd2021-11-01 16:12:42 +00002020 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
2021 oframe.TransactionID(tid))
mpagenkodff5dda2020-08-28 11:52:01 +00002022 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002023 logger.Errorw(ctx, "Cannot encode VTFD for create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002024 "Err": err, "device-id": oo.deviceID})
2025 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2026 // return (dual format) error code that can be used at caller for immediate error treatment
2027 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002028 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002029 }
2030
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002031 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00002032 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002033 logger.Errorw(ctx, "Cannot serialize VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002034 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002035 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002036 }
2037
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002038 omciRxCallbackPair := CallbackPair{
2039 CbKey: tid,
2040 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00002041 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002042 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00002043 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002044 logger.Errorw(ctx, "Cannot send VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002045 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002046 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002047 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002048 logger.Debug(ctx, "send VTFD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002049 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00002050 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002051 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002052 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002053 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00002054}
2055
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002056// nolint: unused
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002057func (oo *OmciCC) sendSetVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002058 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002059 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002060 logger.Debugw(ctx, "send VTFD-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002061 "SequNo": strconv.FormatInt(int64(tid), 16),
2062 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2063
2064 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
2065 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002066 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType,
2067 oframe.TransactionID(tid))
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002068 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002069 logger.Errorw(ctx, "Cannot encode VTFD for set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002070 "Err": err, "device-id": oo.deviceID})
2071 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2072 // return (dual format) error code that can be used at caller for immediate error treatment
2073 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002074 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002075 }
2076
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002077 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002078 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002079 logger.Errorw(ctx, "Cannot serialize VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002080 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002081 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002082 }
2083
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002084 omciRxCallbackPair := CallbackPair{
2085 CbKey: tid,
2086 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002087 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002088 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002089 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002090 logger.Errorw(ctx, "Cannot send VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002091 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002092 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002093 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002094 logger.Debug(ctx, "send VTFD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002095 return meInstance, nil
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002096 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002097 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002098 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002099 return nil, omciErr.GetError()
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002100}
2101
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002102// SendCreateEvtocdVar creates ExtendedVlanTaggingOperationConfigurationData ME instance
2103func (oo *OmciCC) SendCreateEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002104 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002105 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002106 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002107 "SequNo": strconv.FormatInt(int64(tid), 16),
2108 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2109
2110 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2111 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002112 //EnhancedMode not yet supported, used with default options
2113 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
2114 oframe.TransactionID(tid), oframe.AddDefaults(true))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002115 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002116 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002117 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002118 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002119 }
2120
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002121 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002122 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002123 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002124 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002125 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002126 }
2127
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002128 omciRxCallbackPair := CallbackPair{
2129 CbKey: tid,
2130 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002131 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002132 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002133 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002134 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002135 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002136 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002137 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002138 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002139 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002140 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002141 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002142 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002143 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002144}
2145
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002146// SendSetEvtocdVar sets ExtendedVlanTaggingOperationConfigurationData ME instance
2147func (oo *OmciCC) SendSetEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002148 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002149 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002150 logger.Debugw(ctx, "send EVTOCD-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002151 "SequNo": strconv.FormatInt(int64(tid), 16),
2152 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2153
2154 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2155 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002156 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenkodff5dda2020-08-28 11:52:01 +00002157 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002158 logger.Errorw(ctx, "Cannot encode EVTOCD for set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002159 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002160 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002161 }
2162
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002163 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00002164 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002165 logger.Errorw(ctx, "Cannot serialize EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002166 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002167 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002168 }
2169
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002170 omciRxCallbackPair := CallbackPair{
2171 CbKey: tid,
2172 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00002173 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002174 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00002175 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002176 logger.Errorw(ctx, "Cannot send EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002177 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002178 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002179 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002180 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002181 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00002182 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002183 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002184 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002185 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00002186}
mpagenko01e726e2020-10-23 09:45:29 +00002187
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002188// SendDeleteEvtocd deletes ExtendedVlanTaggingOperationConfigurationData ME instance
2189func (oo *OmciCC) SendDeleteEvtocd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002190 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002191 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002192 logger.Debugw(ctx, "send EVTOCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002193 "SequNo": strconv.FormatInt(int64(tid), 16),
2194 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2195
2196 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2197 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002198 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002199 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002200 logger.Errorw(ctx, "Cannot encode EVTOCD for delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002201 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002202 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002203 }
2204
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002205 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002206 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002207 logger.Errorw(ctx, "Cannot serialize EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002208 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002209 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002210 }
2211
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002212 omciRxCallbackPair := CallbackPair{
2213 CbKey: tid,
2214 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002215 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002216 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002217 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002218 logger.Errorw(ctx, "Cannot send EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002219 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002220 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002221 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002222 logger.Debug(ctx, "send EVTOCD-delete msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002223 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002224 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002225 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002226 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002227 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002228}
2229
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002230// SendDeleteVtfd deletes VlanTaggingFilterData ME instance
2231func (oo *OmciCC) SendDeleteVtfd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002232 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002233 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002234 logger.Debugw(ctx, "send VTFD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko01e726e2020-10-23 09:45:29 +00002235 "SequNo": strconv.FormatInt(int64(tid), 16),
2236 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2237
2238 meParams := me.ParamData{EntityID: aInstID}
2239 meInstance, omciErr := me.NewVlanTaggingFilterData(meParams)
2240 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002241 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2242 oframe.TransactionID(tid))
mpagenko01e726e2020-10-23 09:45:29 +00002243 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002244 logger.Errorw(ctx, "Cannot encode VTFD for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002245 "Err": err, "device-id": oo.deviceID})
2246 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2247 // return (dual format) error code that can be used at caller for immediate error treatment
2248 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002249 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002250 }
2251
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002252 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko01e726e2020-10-23 09:45:29 +00002253 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002254 logger.Errorw(ctx, "Cannot serialize VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002255 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002256 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002257 }
2258
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002259 omciRxCallbackPair := CallbackPair{
2260 CbKey: tid,
2261 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko01e726e2020-10-23 09:45:29 +00002262 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002263 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko01e726e2020-10-23 09:45:29 +00002264 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002265 logger.Errorw(ctx, "Cannot send VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002266 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002267 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002268 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002269 logger.Debug(ctx, "send VTFD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002270 return meInstance, nil
mpagenko01e726e2020-10-23 09:45:29 +00002271 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002272 logger.Errorw(ctx, "Cannot generate VTFD Instance for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002273 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002274 return nil, omciErr.GetError()
mpagenko01e726e2020-10-23 09:45:29 +00002275}
ozgecanetsia422dbf32020-10-28 14:07:19 +03002276
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002277// SendCreateTDVar creates TrafficDescriptor ME instance
2278func (oo *OmciCC) SendCreateTDVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2279 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002280 logger.Debugw(ctx, "send TD-Create-msg:", log.Fields{"device-id": oo.deviceID,
2281 "SequNo": strconv.FormatInt(int64(tid), 16),
2282 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2283 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2284 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002285 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002286 if err != nil {
2287 logger.Errorw(ctx, "Cannot encode TD for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002288 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002289 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002290 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002291 if err != nil {
2292 logger.Errorw(ctx, "Cannot serialize TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002293 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002294 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002295 omciRxCallbackPair := CallbackPair{
2296 CbKey: tid,
2297 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002298 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002299 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002300 if err != nil {
2301 logger.Errorw(ctx, "Cannot send TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002302 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002303 }
2304 logger.Debug(ctx, "send TD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002305 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002306 }
2307 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002308 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002309}
2310
2311// nolint: unused
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002312func (oo *OmciCC) sendSetTDVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002313 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002314 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002315 logger.Debugw(ctx, "send TD-Set-msg:", log.Fields{"device-id": oo.deviceID,
2316 "SequNo": strconv.FormatInt(int64(tid), 16),
2317 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2318
2319 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2320 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002321 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002322 if err != nil {
2323 logger.Errorw(ctx, "Cannot encode TD for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002324 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002325 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002326 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002327 if err != nil {
2328 logger.Errorw(ctx, "Cannot serialize TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002329 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002330 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002331 omciRxCallbackPair := CallbackPair{
2332 CbKey: tid,
2333 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002334 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002335 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002336 if err != nil {
2337 logger.Errorw(ctx, "Cannot send TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002338 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002339 }
2340 logger.Debug(ctx, "send TD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002341 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002342 }
2343 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002344 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002345
2346}
2347
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002348// SendDeleteTD - TODO: add comment
2349func (oo *OmciCC) SendDeleteTD(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002350 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002351 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002352 logger.Debugw(ctx, "send TD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2353 "SequNo": strconv.FormatInt(int64(tid), 16),
2354 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2355
2356 meParams := me.ParamData{EntityID: aInstID}
2357 meInstance, omciErr := me.NewTrafficDescriptor(meParams)
2358 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002359 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002360 if err != nil {
2361 logger.Errorw(ctx, "Cannot encode TD for delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002362 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002363 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002364 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002365 if err != nil {
2366 logger.Errorw(ctx, "Cannot serialize TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002367 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002368 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002369 omciRxCallbackPair := CallbackPair{
2370 CbKey: tid,
2371 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002372 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002373 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002374 if err != nil {
2375 logger.Errorw(ctx, "Cannot send TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002376 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002377 }
2378 logger.Debug(ctx, "send TD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002379 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002380 }
2381 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002382 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002383
2384}
2385
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002386// SendDeleteGemIWTP deletes GemInterworkingTerminationPoint ME instance
2387func (oo *OmciCC) SendDeleteGemIWTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002388 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002389 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002390 logger.Debugw(ctx, "send GemIwTp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002391 "SequNo": strconv.FormatInt(int64(tid), 16),
2392 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2393
2394 meParams := me.ParamData{EntityID: aInstID}
2395 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(meParams)
2396 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002397 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2398 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002399 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002400 logger.Errorw(ctx, "Cannot encode GemIwTp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002401 "Err": err, "device-id": oo.deviceID})
2402 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2403 // return (dual format) error code that can be used at caller for immediate error treatment
2404 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002405 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002406 }
2407
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002408 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002409 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002410 logger.Errorw(ctx, "Cannot serialize GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002411 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002412 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002413 }
2414
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002415 omciRxCallbackPair := CallbackPair{
2416 CbKey: tid,
2417 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002418 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002419 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002420 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002421 logger.Errorw(ctx, "Cannot send GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002422 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002423 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002424 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002425 logger.Debug(ctx, "send GemIwTp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002426 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002427 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002428 logger.Errorw(ctx, "Cannot generate GemIwTp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002429 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002430 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002431}
2432
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002433// SendDeleteGemNCTP deletes GemPortNetworkCtp ME instance
2434func (oo *OmciCC) SendDeleteGemNCTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002435 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002436 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002437 logger.Debugw(ctx, "send GemNCtp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002438 "SequNo": strconv.FormatInt(int64(tid), 16),
2439 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2440
2441 meParams := me.ParamData{EntityID: aInstID}
2442 meInstance, omciErr := me.NewGemPortNetworkCtp(meParams)
2443 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002444 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2445 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002446 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002447 logger.Errorw(ctx, "Cannot encode GemNCtp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002448 "Err": err, "device-id": oo.deviceID})
2449 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2450 // return (dual format) error code that can be used at caller for immediate error treatment
2451 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002452 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002453 }
2454
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002455 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002456 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002457 logger.Errorw(ctx, "Cannot serialize GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002458 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002459 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002460 }
2461
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002462 omciRxCallbackPair := CallbackPair{
2463 CbKey: tid,
2464 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002465 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002466 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002467 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002468 logger.Errorw(ctx, "Cannot send GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002469 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002470 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002471 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002472 logger.Debug(ctx, "send GemNCtp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002473 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002474 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002475 logger.Errorw(ctx, "Cannot generate GemNCtp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002476 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002477 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002478}
2479
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002480// SendDeleteDot1PMapper deletes Ieee8021PMapperServiceProfile ME instance
2481func (oo *OmciCC) SendDeleteDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002482 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002483 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002484 logger.Debugw(ctx, "send .1pMapper-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002485 "SequNo": strconv.FormatInt(int64(tid), 16),
2486 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2487
2488 meParams := me.ParamData{EntityID: aInstID}
2489 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
2490 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002491 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2492 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002493 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002494 logger.Errorw(ctx, "Cannot encode .1pMapper for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002495 "Err": err, "device-id": oo.deviceID})
2496 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2497 // return (dual format) error code that can be used at caller for immediate error treatment
2498 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002499 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002500 }
2501
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002502 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002503 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002504 logger.Errorw(ctx, "Cannot serialize .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002505 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002506 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002507 }
2508
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002509 omciRxCallbackPair := CallbackPair{
2510 CbKey: tid,
2511 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002512 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002513 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002514 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002515 logger.Errorw(ctx, "Cannot send .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002516 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002517 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002518 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002519 logger.Debug(ctx, "send .1pMapper-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002520 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002521 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002522 logger.Errorw(ctx, "Cannot generate .1pMapper Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002523 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002524 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002525}
2526
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002527// SendDeleteMBPConfigData deletes MacBridgePortConfigurationData ME instance
2528func (oo *OmciCC) SendDeleteMBPConfigData(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002529 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002530 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002531 logger.Debugw(ctx, "send MBPCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002532 "SequNo": strconv.FormatInt(int64(tid), 16),
2533 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2534
2535 meParams := me.ParamData{EntityID: aInstID}
2536 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
2537 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002538 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2539 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002540 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002541 logger.Errorw(ctx, "Cannot encode MBPCD for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002542 "Err": err, "device-id": oo.deviceID})
2543 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2544 // return (dual format) error code that can be used at caller for immediate error treatment
2545 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002546 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002547 }
2548
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002549 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002550 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002551 logger.Errorw(ctx, "Cannot serialize MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002552 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002553 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002554 }
2555
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002556 omciRxCallbackPair := CallbackPair{
2557 CbKey: tid,
2558 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002559 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002560 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002561 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002562 logger.Errorw(ctx, "Cannot send MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002563 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002564 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002565 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002566 logger.Debug(ctx, "send MBPCD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002567 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002568 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002569 logger.Errorw(ctx, "Cannot generate MBPCD Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002570 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002571 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002572}
2573
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002574// SendCreateMulticastGemIWTPVar creates MulticastGemInterworkingTerminationPoint ME instance
2575func (oo *OmciCC) SendCreateMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002576 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002577 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002578 logger.Debugw(ctx, "send MulticastGemIWTP-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002579 "SequNo": strconv.FormatInt(int64(tid), 16),
2580 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2581
2582 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2583 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002584 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2585 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002586 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002587 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002588 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002589 }
2590
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002591 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002592 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002593 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002594 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002595 }
2596
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002597 omciRxCallbackPair := CallbackPair{CbKey: tid,
2598 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002599 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002600 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002601 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002602 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002603 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002604 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002605 logger.Debug(ctx, "send MulticastGEMIWTP-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002606 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002607 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002608 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002609 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002610 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002611}
2612
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002613// SendSetMulticastGemIWTPVar sets MulticastGemInterworkingTerminationPoint ME instance
2614func (oo *OmciCC) SendSetMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002615 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002616 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002617 logger.Debugw(ctx, "send MulticastGemIWTP-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002618 "SequNo": strconv.FormatInt(int64(tid), 16),
2619 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2620
2621 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2622 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002623 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2624 oframe.AddDefaults(true))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002625 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002626 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002627 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002628 }
2629
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002630 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002631 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002632 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002633 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002634 }
2635
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002636 omciRxCallbackPair := CallbackPair{CbKey: tid,
2637 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002638 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002639 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002640 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002641 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002642 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002643 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002644 logger.Debug(ctx, "send MulticastGEMIWTP-set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002645 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002646 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002647 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002648 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002649 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002650}
2651
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002652// SendCreateMulticastOperationProfileVar creates MulticastOperationsProfile ME instance
2653func (oo *OmciCC) SendCreateMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002654 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002655 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002656 logger.Debugw(ctx, "send MulticastOperationProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002657 "SequNo": strconv.FormatInt(int64(tid), 16),
2658 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2659
2660 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2661 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002662 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2663 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002664 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002665 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002666 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002667 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002668 }
2669
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002670 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002671 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002672 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002673 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002674 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002675 }
2676
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002677 omciRxCallbackPair := CallbackPair{CbKey: tid,
2678 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002679 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002680 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002681 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002682 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002683 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002684 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002685 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002686 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002687 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002688 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002689 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002690 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002691 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002692}
2693
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002694// SendSetMulticastOperationProfileVar sets MulticastOperationsProfile ME instance
2695func (oo *OmciCC) SendSetMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002696 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002697 tid := oo.GetNextTid(highPrio)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002698 logger.Debugw(ctx, "send MulticastOperationProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002699 "SequNo": strconv.FormatInt(int64(tid), 16),
2700 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2701
2702 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2703 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002704 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2705 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002706 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002707 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002708 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002709 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002710 }
2711
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002712 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002713 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002714 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002715 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002716 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002717 }
2718
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002719 omciRxCallbackPair := CallbackPair{CbKey: tid,
2720 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002721 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002722 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002723 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002724 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002725 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002726 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002727 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002728 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002729 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002730 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002731 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002732 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002733 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002734}
2735
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002736// SendCreateMulticastSubConfigInfoVar creates MulticastSubscriberConfigInfo ME instance
2737func (oo *OmciCC) SendCreateMulticastSubConfigInfoVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002738 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002739 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002740 logger.Debugw(ctx, "send MulticastSubConfigInfo-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002741 "SequNo": strconv.FormatInt(int64(tid), 16),
2742 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2743
2744 meInstance, omciErr := me.NewMulticastSubscriberConfigInfo(params[0])
2745 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002746 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2747 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002748 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002749 logger.Errorw(ctx, "Cannot encode MulticastSubConfigInfo for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002750 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002751 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002752 }
2753
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002754 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002755 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002756 logger.Errorw(ctx, "Cannot serialize MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002757 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002758 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002759 }
2760
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002761 omciRxCallbackPair := CallbackPair{CbKey: tid,
2762 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002763 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002764 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002765 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002766 logger.Errorw(ctx, "Cannot send MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002767 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002768 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002769 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002770 logger.Debug(ctx, "send MulticastSubConfigInfo-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002771 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002772 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002773 logger.Errorw(ctx, "Cannot generate MulticastSubConfigInfo Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002774 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002775 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002776}
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00002777
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002778// SendCreateVoipVoiceCTP nolint: unused
2779func (oo *OmciCC) SendCreateVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2780 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2781 tid := oo.GetNextTid(highPrio)
2782 logger.Debugw(ctx, "send VoipVoiceCTP-create-msg:", log.Fields{"device-id": oo.deviceID,
2783 "SequNo": strconv.FormatInt(int64(tid), 16),
2784 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2785
2786 meInstance, omciErr := me.NewVoipVoiceCtp(params[0])
2787 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002788 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2789 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002790 if err != nil {
2791 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for create", log.Fields{"Err": err,
2792 "device-id": oo.deviceID})
2793 return nil, err
2794 }
2795
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002796 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002797 if err != nil {
2798 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP create", log.Fields{"Err": err,
2799 "device-id": oo.deviceID})
2800 return nil, err
2801 }
2802
2803 omciRxCallbackPair := CallbackPair{CbKey: tid,
2804 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2805 }
2806 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2807 if err != nil {
2808 logger.Errorw(ctx, "Cannot send VoipVoiceCTP create", log.Fields{"Err": err,
2809 "device-id": oo.deviceID})
2810 return nil, err
2811 }
2812 logger.Debug(ctx, "send VoipVoiceCTP-create-msg done")
2813 return meInstance, nil
2814 }
2815 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance", log.Fields{"Err": omciErr.GetError(),
2816 "device-id": oo.deviceID})
2817 return nil, omciErr.GetError()
2818}
2819
2820// SendSetVoipVoiceCTP nolint: unused
2821func (oo *OmciCC) SendSetVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2822 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2823 tid := oo.GetNextTid(highPrio)
2824 logger.Debugw(ctx, "send VoipVoiceCTP-set-msg:", log.Fields{"device-id": oo.deviceID,
2825 "SequNo": strconv.FormatInt(int64(tid), 16),
2826 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2827
2828 meInstance, omciErr := me.NewVoipVoiceCtp(params[0])
2829 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002830 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2831 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002832 if err != nil {
2833 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for set", log.Fields{"Err": err,
2834 "device-id": oo.deviceID})
2835 return nil, err
2836 }
2837
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002838 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002839 if err != nil {
2840 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP set", log.Fields{"Err": err,
2841 "device-id": oo.deviceID})
2842 return nil, err
2843 }
2844
2845 omciRxCallbackPair := CallbackPair{CbKey: tid,
2846 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2847 }
2848 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2849 if err != nil {
2850 logger.Errorw(ctx, "Cannot send VoipVoiceCTP set", log.Fields{"Err": err,
2851 "device-id": oo.deviceID})
2852 return nil, err
2853 }
2854 logger.Debug(ctx, "send VoipVoiceCTP-set-msg done")
2855 return meInstance, nil
2856 }
2857 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance", log.Fields{"Err": omciErr.GetError(),
2858 "device-id": oo.deviceID})
2859 return nil, omciErr.GetError()
2860}
2861
2862// SendDeleteVoipVoiceCTP nolint: unused
2863func (oo *OmciCC) SendDeleteVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2864 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
2865 tid := oo.GetNextTid(highPrio)
2866 logger.Debugw(ctx, "send VoipVoiceCTP-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2867 "SequNo": strconv.FormatInt(int64(tid), 16),
2868 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2869
2870 meParams := me.ParamData{EntityID: aInstID}
2871 meInstance, omciErr := me.NewVoipVoiceCtp(meParams)
2872 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002873 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2874 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002875 if err != nil {
2876 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for delete", log.Fields{
2877 "Err": err, "device-id": oo.deviceID})
2878 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2879 // return (dual format) error code that can be used at caller for immediate error treatment
2880 // (relevant to all used sendXX() methods and their error conditions)
2881 return nil, err
2882 }
2883
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002884 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002885 if err != nil {
2886 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP delete", log.Fields{
2887 "Err": err, "device-id": oo.deviceID})
2888 return nil, err
2889 }
2890
2891 omciRxCallbackPair := CallbackPair{
2892 CbKey: tid,
2893 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2894 }
2895 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2896 if err != nil {
2897 logger.Errorw(ctx, "Cannot send VoipVoiceCTP delete", log.Fields{
2898 "Err": err, "device-id": oo.deviceID})
2899 return nil, err
2900 }
2901 logger.Debug(ctx, "send VoipVoiceCTP-Delete-msg done")
2902 return meInstance, nil
2903 }
2904 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance for delete", log.Fields{
2905 "Err": omciErr.GetError(), "device-id": oo.deviceID})
2906 return nil, omciErr.GetError()
2907}
2908
2909// SendCreateVoipMediaProfile nolint: unused
2910func (oo *OmciCC) SendCreateVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2911 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2912 tid := oo.GetNextTid(highPrio)
2913 logger.Debugw(ctx, "send VoipMediaProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
2914 "SequNo": strconv.FormatInt(int64(tid), 16),
2915 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2916
2917 meInstance, omciErr := me.NewVoipMediaProfile(params[0])
2918 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002919 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2920 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002921 if err != nil {
2922 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for create", log.Fields{"Err": err,
2923 "device-id": oo.deviceID})
2924 return nil, err
2925 }
2926
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002927 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002928 if err != nil {
2929 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile create", log.Fields{"Err": err,
2930 "device-id": oo.deviceID})
2931 return nil, err
2932 }
2933
2934 omciRxCallbackPair := CallbackPair{CbKey: tid,
2935 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2936 }
2937 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2938 if err != nil {
2939 logger.Errorw(ctx, "Cannot send VoipMediaProfile create", log.Fields{"Err": err,
2940 "device-id": oo.deviceID})
2941 return nil, err
2942 }
2943 logger.Debug(ctx, "send VoipMediaProfile-create-msg done")
2944 return meInstance, nil
2945 }
2946 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance", log.Fields{"Err": omciErr.GetError(),
2947 "device-id": oo.deviceID})
2948 return nil, omciErr.GetError()
2949}
2950
2951// SendSetVoipMediaProfile nolint: unused
2952func (oo *OmciCC) SendSetVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2953 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2954 tid := oo.GetNextTid(highPrio)
2955 logger.Debugw(ctx, "send VoipMediaProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
2956 "SequNo": strconv.FormatInt(int64(tid), 16),
2957 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2958
2959 meInstance, omciErr := me.NewVoipMediaProfile(params[0])
2960 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002961 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2962 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002963 if err != nil {
2964 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for set", log.Fields{"Err": err,
2965 "device-id": oo.deviceID})
2966 return nil, err
2967 }
2968
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002969 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002970 if err != nil {
2971 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile set", log.Fields{"Err": err,
2972 "device-id": oo.deviceID})
2973 return nil, err
2974 }
2975
2976 omciRxCallbackPair := CallbackPair{CbKey: tid,
2977 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2978 }
2979 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2980 if err != nil {
2981 logger.Errorw(ctx, "Cannot send VoipMediaProfile set", log.Fields{"Err": err,
2982 "device-id": oo.deviceID})
2983 return nil, err
2984 }
2985 logger.Debug(ctx, "send VoipMediaProfile-set-msg done")
2986 return meInstance, nil
2987 }
2988 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance", log.Fields{"Err": omciErr.GetError(),
2989 "device-id": oo.deviceID})
2990 return nil, omciErr.GetError()
2991}
2992
2993// SendDeleteVoipMediaProfile nolint: unused
2994func (oo *OmciCC) SendDeleteVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2995 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
2996 tid := oo.GetNextTid(highPrio)
2997 logger.Debugw(ctx, "send VoipMediaProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2998 "SequNo": strconv.FormatInt(int64(tid), 16),
2999 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3000
3001 meParams := me.ParamData{EntityID: aInstID}
3002 meInstance, omciErr := me.NewVoipMediaProfile(meParams)
3003 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003004 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3005 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003006 if err != nil {
3007 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for delete", log.Fields{
3008 "Err": err, "device-id": oo.deviceID})
3009 return nil, err
3010 }
3011
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003012 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003013 if err != nil {
3014 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile delete", log.Fields{
3015 "Err": err, "device-id": oo.deviceID})
3016 return nil, err
3017 }
3018
3019 omciRxCallbackPair := CallbackPair{
3020 CbKey: tid,
3021 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3022 }
3023 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3024 if err != nil {
3025 logger.Errorw(ctx, "Cannot send VoipMediaProfile delete", log.Fields{
3026 "Err": err, "device-id": oo.deviceID})
3027 return nil, err
3028 }
3029 logger.Debug(ctx, "send VoipMediaProfile-Delete-msg done")
3030 return meInstance, nil
3031 }
3032 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance for delete", log.Fields{
3033 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3034 return nil, omciErr.GetError()
3035}
3036
3037// SendCreateVoiceServiceProfile nolint: unused
3038func (oo *OmciCC) SendCreateVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3039 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3040 tid := oo.GetNextTid(highPrio)
3041 logger.Debugw(ctx, "send VoiceServiceProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
3042 "SequNo": strconv.FormatInt(int64(tid), 16),
3043 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3044
3045 meInstance, omciErr := me.NewVoiceServiceProfile(params[0])
3046 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003047 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3048 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003049 if err != nil {
3050 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for create", log.Fields{"Err": err,
3051 "device-id": oo.deviceID})
3052 return nil, err
3053 }
3054
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003055 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003056 if err != nil {
3057 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile create", log.Fields{"Err": err,
3058 "device-id": oo.deviceID})
3059 return nil, err
3060 }
3061
3062 omciRxCallbackPair := CallbackPair{CbKey: tid,
3063 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3064 }
3065 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3066 if err != nil {
3067 logger.Errorw(ctx, "Cannot send VoiceServiceProfile create", log.Fields{"Err": err,
3068 "device-id": oo.deviceID})
3069 return nil, err
3070 }
3071 logger.Debug(ctx, "send VoiceServiceProfile-create-msg done")
3072 return meInstance, nil
3073 }
3074 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3075 "device-id": oo.deviceID})
3076 return nil, omciErr.GetError()
3077}
3078
3079// SendSetVoiceServiceProfile nolint: unused
3080func (oo *OmciCC) SendSetVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3081 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3082 tid := oo.GetNextTid(highPrio)
3083 logger.Debugw(ctx, "send VoiceServiceProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
3084 "SequNo": strconv.FormatInt(int64(tid), 16),
3085 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3086
3087 meInstance, omciErr := me.NewVoiceServiceProfile(params[0])
3088 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003089 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3090 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003091 if err != nil {
3092 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for set", log.Fields{"Err": err,
3093 "device-id": oo.deviceID})
3094 return nil, err
3095 }
3096
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003097 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003098 if err != nil {
3099 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile set", log.Fields{"Err": err,
3100 "device-id": oo.deviceID})
3101 return nil, err
3102 }
3103
3104 omciRxCallbackPair := CallbackPair{CbKey: tid,
3105 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3106 }
3107 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3108 if err != nil {
3109 logger.Errorw(ctx, "Cannot send VoiceServiceProfile set", log.Fields{"Err": err,
3110 "device-id": oo.deviceID})
3111 return nil, err
3112 }
3113 logger.Debug(ctx, "send VoiceServiceProfile-set-msg done")
3114 return meInstance, nil
3115 }
3116 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3117 "device-id": oo.deviceID})
3118 return nil, omciErr.GetError()
3119}
3120
3121// SendDeleteVoiceServiceProfile nolint: unused
3122func (oo *OmciCC) SendDeleteVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3123 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3124 tid := oo.GetNextTid(highPrio)
3125 logger.Debugw(ctx, "send VoiceServiceProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3126 "SequNo": strconv.FormatInt(int64(tid), 16),
3127 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3128
3129 meParams := me.ParamData{EntityID: aInstID}
3130 meInstance, omciErr := me.NewVoiceServiceProfile(meParams)
3131 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003132 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3133 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003134 if err != nil {
3135 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for delete", log.Fields{
3136 "Err": err, "device-id": oo.deviceID})
3137 return nil, err
3138 }
3139
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003140 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003141 if err != nil {
3142 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile delete", log.Fields{
3143 "Err": err, "device-id": oo.deviceID})
3144 return nil, err
3145 }
3146
3147 omciRxCallbackPair := CallbackPair{
3148 CbKey: tid,
3149 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3150 }
3151 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3152 if err != nil {
3153 logger.Errorw(ctx, "Cannot send VoiceServiceProfile delete", log.Fields{
3154 "Err": err, "device-id": oo.deviceID})
3155 return nil, err
3156 }
3157 logger.Debug(ctx, "send VoiceServiceProfile-Delete-msg done")
3158 return meInstance, nil
3159 }
3160 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance for delete", log.Fields{
3161 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3162 return nil, omciErr.GetError()
3163}
3164
3165// SendCreateSIPUserData nolint: unused
3166func (oo *OmciCC) SendCreateSIPUserData(ctx context.Context, timeout int, highPrio bool,
3167 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3168 tid := oo.GetNextTid(highPrio)
3169 logger.Debugw(ctx, "send SIPUserData-create-msg:", log.Fields{"device-id": oo.deviceID,
3170 "SequNo": strconv.FormatInt(int64(tid), 16),
3171 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3172
3173 meInstance, omciErr := me.NewSipUserData(params[0])
3174 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003175 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3176 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003177 if err != nil {
3178 logger.Errorw(ctx, "Cannot encode SIPUserData for create", log.Fields{"Err": err,
3179 "device-id": oo.deviceID})
3180 return nil, err
3181 }
3182
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003183 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003184 if err != nil {
3185 logger.Errorw(ctx, "Cannot serialize SIPUserData create", log.Fields{"Err": err,
3186 "device-id": oo.deviceID})
3187 return nil, err
3188 }
3189
3190 omciRxCallbackPair := CallbackPair{CbKey: tid,
3191 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3192 }
3193 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3194 if err != nil {
3195 logger.Errorw(ctx, "Cannot send SIPUserData create", log.Fields{"Err": err,
3196 "device-id": oo.deviceID})
3197 return nil, err
3198 }
3199 logger.Debug(ctx, "send SIPUserData-create-msg done")
3200 return meInstance, nil
3201 }
3202 logger.Errorw(ctx, "Cannot generate SIPUserData Instance", log.Fields{"Err": omciErr.GetError(),
3203 "device-id": oo.deviceID})
3204 return nil, omciErr.GetError()
3205}
3206
3207// SendSetSIPUserData nolint: unused
3208func (oo *OmciCC) SendSetSIPUserData(ctx context.Context, timeout int, highPrio bool,
3209 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3210 tid := oo.GetNextTid(highPrio)
3211 logger.Debugw(ctx, "send SIPUserData-set-msg:", log.Fields{"device-id": oo.deviceID,
3212 "SequNo": strconv.FormatInt(int64(tid), 16),
3213 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3214
3215 meInstance, omciErr := me.NewSipUserData(params[0])
3216 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003217 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3218 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003219 if err != nil {
3220 logger.Errorw(ctx, "Cannot encode SIPUserData for set", log.Fields{"Err": err,
3221 "device-id": oo.deviceID})
3222 return nil, err
3223 }
3224
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003225 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003226 if err != nil {
3227 logger.Errorw(ctx, "Cannot serialize SIPUserData set", log.Fields{"Err": err,
3228 "device-id": oo.deviceID})
3229 return nil, err
3230 }
3231
3232 omciRxCallbackPair := CallbackPair{CbKey: tid,
3233 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3234 }
3235 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3236 if err != nil {
3237 logger.Errorw(ctx, "Cannot send SIPUserData set", log.Fields{"Err": err,
3238 "device-id": oo.deviceID})
3239 return nil, err
3240 }
3241 logger.Debug(ctx, "send SIPUserData-set-msg done")
3242 return meInstance, nil
3243 }
3244 logger.Errorw(ctx, "Cannot generate SIPUserData Instance", log.Fields{"Err": omciErr.GetError(),
3245 "device-id": oo.deviceID})
3246 return nil, omciErr.GetError()
3247}
3248
3249// SendDeleteSIPUserData nolint: unused
3250func (oo *OmciCC) SendDeleteSIPUserData(ctx context.Context, timeout int, highPrio bool,
3251 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3252 tid := oo.GetNextTid(highPrio)
3253 logger.Debugw(ctx, "send SIPUserData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3254 "SequNo": strconv.FormatInt(int64(tid), 16),
3255 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3256
3257 meParams := me.ParamData{EntityID: aInstID}
3258 meInstance, omciErr := me.NewSipUserData(meParams)
3259 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003260 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3261 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003262 if err != nil {
3263 logger.Errorw(ctx, "Cannot encode SIPUserData for delete", log.Fields{
3264 "Err": err, "device-id": oo.deviceID})
3265 return nil, err
3266 }
3267
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003268 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003269 if err != nil {
3270 logger.Errorw(ctx, "Cannot serialize SIPUserData delete", log.Fields{
3271 "Err": err, "device-id": oo.deviceID})
3272 return nil, err
3273 }
3274
3275 omciRxCallbackPair := CallbackPair{
3276 CbKey: tid,
3277 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3278 }
3279 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3280 if err != nil {
3281 logger.Errorw(ctx, "Cannot send SIPUserData delete", log.Fields{
3282 "Err": err, "device-id": oo.deviceID})
3283 return nil, err
3284 }
3285 logger.Debug(ctx, "send SIPUserData-Delete-msg done")
3286 return meInstance, nil
3287 }
3288 logger.Errorw(ctx, "Cannot generate SIPUserData Instance for delete", log.Fields{
3289 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3290 return nil, omciErr.GetError()
3291}
3292
3293// SendCreateVoipApplicationServiceProfile nolint: unused
3294func (oo *OmciCC) SendCreateVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3295 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3296 tid := oo.GetNextTid(highPrio)
3297 logger.Debugw(ctx, "send VoipApplicationServiceProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
3298 "SequNo": strconv.FormatInt(int64(tid), 16),
3299 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3300
3301 meInstance, omciErr := me.NewVoipApplicationServiceProfile(params[0])
3302 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003303 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3304 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003305 if err != nil {
3306 logger.Errorw(ctx, "Cannot encode VoipApplicationServiceProfile for create", log.Fields{"Err": err,
3307 "device-id": oo.deviceID})
3308 return nil, err
3309 }
3310
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003311 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003312 if err != nil {
3313 logger.Errorw(ctx, "Cannot serialize VoipApplicationServiceProfile create", log.Fields{"Err": err,
3314 "device-id": oo.deviceID})
3315 return nil, err
3316 }
3317
3318 omciRxCallbackPair := CallbackPair{CbKey: tid,
3319 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3320 }
3321 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3322 if err != nil {
3323 logger.Errorw(ctx, "Cannot send VoipApplicationServiceProfile create", log.Fields{"Err": err,
3324 "device-id": oo.deviceID})
3325 return nil, err
3326 }
3327 logger.Debug(ctx, "send VoipApplicationServiceProfile-create-msg done")
3328 return meInstance, nil
3329 }
3330 logger.Errorw(ctx, "Cannot generate VoipApplicationServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3331 "device-id": oo.deviceID})
3332 return nil, omciErr.GetError()
3333}
3334
3335// SendSetVoipApplicationServiceProfile nolint: unused
3336func (oo *OmciCC) SendSetVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3337 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3338 tid := oo.GetNextTid(highPrio)
3339 logger.Debugw(ctx, "send VoipApplicationServiceProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
3340 "SequNo": strconv.FormatInt(int64(tid), 16),
3341 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3342
3343 meInstance, omciErr := me.NewVoipApplicationServiceProfile(params[0])
3344 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003345 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3346 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003347 if err != nil {
3348 logger.Errorw(ctx, "Cannot encode VoipApplicationServiceProfile for set", log.Fields{"Err": err,
3349 "device-id": oo.deviceID})
3350 return nil, err
3351 }
3352
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003353 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003354 if err != nil {
3355 logger.Errorw(ctx, "Cannot serialize VoipApplicationServiceProfile set", log.Fields{"Err": err,
3356 "device-id": oo.deviceID})
3357 return nil, err
3358 }
3359
3360 omciRxCallbackPair := CallbackPair{CbKey: tid,
3361 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3362 }
3363 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3364 if err != nil {
3365 logger.Errorw(ctx, "Cannot send VoipApplicationServiceProfile set", log.Fields{"Err": err,
3366 "device-id": oo.deviceID})
3367 return nil, err
3368 }
3369 logger.Debug(ctx, "send VoipApplicationServiceProfile-set-msg done")
3370 return meInstance, nil
3371 }
3372 logger.Errorw(ctx, "Cannot generate VoipApplicationServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3373 "device-id": oo.deviceID})
3374 return nil, omciErr.GetError()
3375}
3376
3377// SendDeleteVoipApplicationServiceProfile nolint: unused
3378func (oo *OmciCC) SendDeleteVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3379 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3380 tid := oo.GetNextTid(highPrio)
3381 logger.Debugw(ctx, "send SIPVoipApplicationServiceProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3382 "SequNo": strconv.FormatInt(int64(tid), 16),
3383 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3384
3385 meParams := me.ParamData{EntityID: aInstID}
3386 meInstance, omciErr := me.NewVoipApplicationServiceProfile(meParams)
3387 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003388 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3389 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003390 if err != nil {
3391 logger.Errorw(ctx, "Cannot encode SIPVoipApplicationServiceProfile for delete", log.Fields{
3392 "Err": err, "device-id": oo.deviceID})
3393 return nil, err
3394 }
3395
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003396 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003397 if err != nil {
3398 logger.Errorw(ctx, "Cannot serialize SIPVoipApplicationServiceProfile delete", log.Fields{
3399 "Err": err, "device-id": oo.deviceID})
3400 return nil, err
3401 }
3402
3403 omciRxCallbackPair := CallbackPair{
3404 CbKey: tid,
3405 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3406 }
3407 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3408 if err != nil {
3409 logger.Errorw(ctx, "Cannot send SIPVoipApplicationServiceProfile delete", log.Fields{
3410 "Err": err, "device-id": oo.deviceID})
3411 return nil, err
3412 }
3413 logger.Debug(ctx, "send SIPVoipApplicationServiceProfile-Delete-msg done")
3414 return meInstance, nil
3415 }
3416 logger.Errorw(ctx, "Cannot generate SIPVoipApplicationServiceProfile Instance for delete", log.Fields{
3417 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3418 return nil, omciErr.GetError()
3419}
3420
3421// SendCreateSIPAgentConfigData nolint: unused
3422func (oo *OmciCC) SendCreateSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3423 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3424 tid := oo.GetNextTid(highPrio)
3425 logger.Debugw(ctx, "send SIPAgentConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3426 "SequNo": strconv.FormatInt(int64(tid), 16),
3427 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3428
3429 meInstance, omciErr := me.NewSipAgentConfigData(params[0])
3430 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003431 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3432 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003433 if err != nil {
3434 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for create", log.Fields{"Err": err,
3435 "device-id": oo.deviceID})
3436 return nil, err
3437 }
3438
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003439 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003440 if err != nil {
3441 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData create", log.Fields{"Err": err,
3442 "device-id": oo.deviceID})
3443 return nil, err
3444 }
3445
3446 omciRxCallbackPair := CallbackPair{CbKey: tid,
3447 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3448 }
3449 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3450 if err != nil {
3451 logger.Errorw(ctx, "Cannot send SIPAgentConfigData create", log.Fields{"Err": err,
3452 "device-id": oo.deviceID})
3453 return nil, err
3454 }
3455 logger.Debug(ctx, "send SIPAgentConfigData-create-msg done")
3456 return meInstance, nil
3457 }
3458 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3459 "device-id": oo.deviceID})
3460 return nil, omciErr.GetError()
3461}
3462
3463// SendSetSIPAgentConfigData nolint: unused
3464func (oo *OmciCC) SendSetSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3465 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3466 tid := oo.GetNextTid(highPrio)
3467 logger.Debugw(ctx, "send SIPAgentConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3468 "SequNo": strconv.FormatInt(int64(tid), 16),
3469 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3470
3471 meInstance, omciErr := me.NewSipAgentConfigData(params[0])
3472 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003473 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3474 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003475 if err != nil {
3476 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for set", log.Fields{"Err": err,
3477 "device-id": oo.deviceID})
3478 return nil, err
3479 }
3480
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003481 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003482 if err != nil {
3483 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData set", log.Fields{"Err": err,
3484 "device-id": oo.deviceID})
3485 return nil, err
3486 }
3487
3488 omciRxCallbackPair := CallbackPair{CbKey: tid,
3489 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3490 }
3491 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3492 if err != nil {
3493 logger.Errorw(ctx, "Cannot send SIPAgentConfigData set", log.Fields{"Err": err,
3494 "device-id": oo.deviceID})
3495 return nil, err
3496 }
3497 logger.Debug(ctx, "send SIPAgentConfigData-set-msg done")
3498 return meInstance, nil
3499 }
3500 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3501 "device-id": oo.deviceID})
3502 return nil, omciErr.GetError()
3503}
3504
3505// SendDeleteSIPAgentConfigData nolint: unused
3506func (oo *OmciCC) SendDeleteSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3507 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3508 tid := oo.GetNextTid(highPrio)
3509 logger.Debugw(ctx, "send SIPAgentConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3510 "SequNo": strconv.FormatInt(int64(tid), 16),
3511 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3512
3513 meParams := me.ParamData{EntityID: aInstID}
3514 meInstance, omciErr := me.NewSipAgentConfigData(meParams)
3515 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003516 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3517 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003518 if err != nil {
3519 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for delete", log.Fields{
3520 "Err": err, "device-id": oo.deviceID})
3521 return nil, err
3522 }
3523
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003524 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003525 if err != nil {
3526 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData delete", log.Fields{
3527 "Err": err, "device-id": oo.deviceID})
3528 return nil, err
3529 }
3530
3531 omciRxCallbackPair := CallbackPair{
3532 CbKey: tid,
3533 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3534 }
3535 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3536 if err != nil {
3537 logger.Errorw(ctx, "Cannot send SIPAgentConfigData delete", log.Fields{
3538 "Err": err, "device-id": oo.deviceID})
3539 return nil, err
3540 }
3541 logger.Debug(ctx, "send SIPAgentConfigData-Delete-msg done")
3542 return meInstance, nil
3543 }
3544 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance for delete", log.Fields{
3545 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3546 return nil, omciErr.GetError()
3547}
3548
3549// SendCreateTCPUDPConfigData nolint: unused
3550func (oo *OmciCC) SendCreateTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3551 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3552 tid := oo.GetNextTid(highPrio)
3553 logger.Debugw(ctx, "send TCPUDPConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3554 "SequNo": strconv.FormatInt(int64(tid), 16),
3555 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3556
3557 meInstance, omciErr := me.NewTcpUdpConfigData(params[0])
3558 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003559 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3560 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003561 if err != nil {
3562 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for create", log.Fields{"Err": err,
3563 "device-id": oo.deviceID})
3564 return nil, err
3565 }
3566
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003567 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003568 if err != nil {
3569 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData create", log.Fields{"Err": err,
3570 "device-id": oo.deviceID})
3571 return nil, err
3572 }
3573
3574 omciRxCallbackPair := CallbackPair{CbKey: tid,
3575 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3576 }
3577 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3578 if err != nil {
3579 logger.Errorw(ctx, "Cannot send TCPUDPConfigData create", log.Fields{"Err": err,
3580 "device-id": oo.deviceID})
3581 return nil, err
3582 }
3583 logger.Debug(ctx, "send TCPUDPConfigData-create-msg done")
3584 return meInstance, nil
3585 }
3586 logger.Errorw(ctx, "Cannot generate TCPUDPConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3587 "device-id": oo.deviceID})
3588 return nil, omciErr.GetError()
3589}
3590
3591// SendSetTCPUDPConfigData nolint: unused
3592func (oo *OmciCC) SendSetTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3593 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3594 tid := oo.GetNextTid(highPrio)
3595 logger.Debugw(ctx, "send TCPUDPConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3596 "SequNo": strconv.FormatInt(int64(tid), 16),
3597 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3598
3599 meInstance, omciErr := me.NewTcpUdpConfigData(params[0])
3600 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003601 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3602 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003603 if err != nil {
3604 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for set", log.Fields{"Err": err,
3605 "device-id": oo.deviceID})
3606 return nil, err
3607 }
3608
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003609 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003610 if err != nil {
3611 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData set", log.Fields{"Err": err,
3612 "device-id": oo.deviceID})
3613 return nil, err
3614 }
3615
3616 omciRxCallbackPair := CallbackPair{CbKey: tid,
3617 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3618 }
3619 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3620 if err != nil {
3621 logger.Errorw(ctx, "Cannot send TCPUDPConfigData set", log.Fields{"Err": err,
3622 "device-id": oo.deviceID})
3623 return nil, err
3624 }
3625 logger.Debug(ctx, "send TCPUDPConfigData-set-msg done")
3626 return meInstance, nil
3627 }
3628 logger.Errorw(ctx, "Cannot generate TCPUDPConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3629 "device-id": oo.deviceID})
3630 return nil, omciErr.GetError()
3631}
3632
3633// SendDeleteTCPUDPConfigData nolint: unused
3634func (oo *OmciCC) SendDeleteTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3635 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3636 tid := oo.GetNextTid(highPrio)
3637 logger.Debugw(ctx, "send TCPUDPConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3638 "SequNo": strconv.FormatInt(int64(tid), 16),
3639 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3640
3641 meParams := me.ParamData{EntityID: aInstID}
3642 meInstance, omciErr := me.NewTcpUdpConfigData(meParams)
3643 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003644 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3645 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003646 if err != nil {
3647 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for delete", log.Fields{
3648 "Err": err, "device-id": oo.deviceID})
3649 return nil, err
3650 }
3651
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003652 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003653 if err != nil {
3654 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData delete", log.Fields{
3655 "Err": err, "device-id": oo.deviceID})
3656 return nil, err
3657 }
3658
3659 omciRxCallbackPair := CallbackPair{
3660 CbKey: tid,
3661 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3662 }
3663 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3664 if err != nil {
3665 logger.Errorw(ctx, "Cannot send TCPUDPConfigData delete", log.Fields{
3666 "Err": err, "device-id": oo.deviceID})
3667 return nil, err
3668 }
3669 logger.Debug(ctx, "send TCPUDPConfigData-Delete-msg done")
3670 return meInstance, nil
3671 }
3672 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance for delete", log.Fields{
3673 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3674 return nil, omciErr.GetError()
3675}
3676
3677// SendCreateIPHostConfigData nolint: unused
3678func (oo *OmciCC) SendCreateIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3679 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3680 tid := oo.GetNextTid(highPrio)
3681 logger.Debugw(ctx, "send IPHostConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3682 "SequNo": strconv.FormatInt(int64(tid), 16),
3683 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3684
3685 meInstance, omciErr := me.NewIpHostConfigData(params[0])
3686 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003687 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3688 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003689 if err != nil {
3690 logger.Errorw(ctx, "Cannot encode IPHostConfigData for create", log.Fields{"Err": err,
3691 "device-id": oo.deviceID})
3692 return nil, err
3693 }
3694
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003695 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003696 if err != nil {
3697 logger.Errorw(ctx, "Cannot serialize IPHostConfigData create", log.Fields{"Err": err,
3698 "device-id": oo.deviceID})
3699 return nil, err
3700 }
3701
3702 omciRxCallbackPair := CallbackPair{CbKey: tid,
3703 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3704 }
3705 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3706 if err != nil {
3707 logger.Errorw(ctx, "Cannot send IPHostConfigData create", log.Fields{"Err": err,
3708 "device-id": oo.deviceID})
3709 return nil, err
3710 }
3711 logger.Debug(ctx, "send IPHostConfigData-create-msg done")
3712 return meInstance, nil
3713 }
3714 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3715 "device-id": oo.deviceID})
3716 return nil, omciErr.GetError()
3717}
3718
3719// SendSetIPHostConfigData nolint: unused
3720func (oo *OmciCC) SendSetIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3721 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3722 tid := oo.GetNextTid(highPrio)
3723 logger.Debugw(ctx, "send IPHostConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3724 "SequNo": strconv.FormatInt(int64(tid), 16),
3725 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3726
3727 meInstance, omciErr := me.NewIpHostConfigData(params[0])
3728 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003729 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3730 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003731 if err != nil {
3732 logger.Errorw(ctx, "Cannot encode IPHostConfigData for set", log.Fields{"Err": err,
3733 "device-id": oo.deviceID})
3734 return nil, err
3735 }
3736
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003737 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003738 if err != nil {
3739 logger.Errorw(ctx, "Cannot serialize IPHostConfigData set", log.Fields{"Err": err,
3740 "device-id": oo.deviceID})
3741 return nil, err
3742 }
3743
3744 omciRxCallbackPair := CallbackPair{CbKey: tid,
3745 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3746 }
3747 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3748 if err != nil {
3749 logger.Errorw(ctx, "Cannot send IPHostConfigData set", log.Fields{"Err": err,
3750 "device-id": oo.deviceID})
3751 return nil, err
3752 }
3753 logger.Debug(ctx, "send IPHostConfigData-set-msg done")
3754 return meInstance, nil
3755 }
3756 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3757 "device-id": oo.deviceID})
3758 return nil, omciErr.GetError()
3759}
3760
3761// SendDeleteIPHostConfigData nolint: unused
3762func (oo *OmciCC) SendDeleteIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3763 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3764 tid := oo.GetNextTid(highPrio)
3765 logger.Debugw(ctx, "send IPHostConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3766 "SequNo": strconv.FormatInt(int64(tid), 16),
3767 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3768
3769 meParams := me.ParamData{EntityID: aInstID}
3770 meInstance, omciErr := me.NewIpHostConfigData(meParams)
3771 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003772 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3773 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003774 if err != nil {
3775 logger.Errorw(ctx, "Cannot encode IPHostConfigData for delete", log.Fields{
3776 "Err": err, "device-id": oo.deviceID})
3777 return nil, err
3778 }
3779
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003780 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003781 if err != nil {
3782 logger.Errorw(ctx, "Cannot serialize IPHostConfigData delete", log.Fields{
3783 "Err": err, "device-id": oo.deviceID})
3784 return nil, err
3785 }
3786
3787 omciRxCallbackPair := CallbackPair{
3788 CbKey: tid,
3789 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3790 }
3791 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3792 if err != nil {
3793 logger.Errorw(ctx, "Cannot send IPHostConfigData delete", log.Fields{
3794 "Err": err, "device-id": oo.deviceID})
3795 return nil, err
3796 }
3797 logger.Debug(ctx, "send IPHostConfigData-Delete-msg done")
3798 return meInstance, nil
3799 }
3800 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance for delete", log.Fields{
3801 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3802 return nil, omciErr.GetError()
3803}
3804
3805// SendCreateRTPProfileData nolint: unused
3806func (oo *OmciCC) SendCreateRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3807 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3808 tid := oo.GetNextTid(highPrio)
3809 logger.Debugw(ctx, "send RTPProfileData-create-msg:", log.Fields{"device-id": oo.deviceID,
3810 "SequNo": strconv.FormatInt(int64(tid), 16),
3811 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3812
3813 meInstance, omciErr := me.NewRtpProfileData(params[0])
3814 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003815 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3816 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003817 if err != nil {
3818 logger.Errorw(ctx, "Cannot encode RTPProfileData for create", log.Fields{"Err": err,
3819 "device-id": oo.deviceID})
3820 return nil, err
3821 }
3822
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003823 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003824 if err != nil {
3825 logger.Errorw(ctx, "Cannot serialize RTPProfileData create", log.Fields{"Err": err,
3826 "device-id": oo.deviceID})
3827 return nil, err
3828 }
3829
3830 omciRxCallbackPair := CallbackPair{CbKey: tid,
3831 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3832 }
3833 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3834 if err != nil {
3835 logger.Errorw(ctx, "Cannot send RTPProfileData create", log.Fields{"Err": err,
3836 "device-id": oo.deviceID})
3837 return nil, err
3838 }
3839 logger.Debug(ctx, "send RTPProfileData-create-msg done")
3840 return meInstance, nil
3841 }
3842 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance", log.Fields{"Err": omciErr.GetError(),
3843 "device-id": oo.deviceID})
3844 return nil, omciErr.GetError()
3845}
3846
3847// SendSetRTPProfileData nolint: unused
3848func (oo *OmciCC) SendSetRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3849 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3850 tid := oo.GetNextTid(highPrio)
3851 logger.Debugw(ctx, "send RTPProfileData-set-msg:", log.Fields{"device-id": oo.deviceID,
3852 "SequNo": strconv.FormatInt(int64(tid), 16),
3853 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3854
3855 meInstance, omciErr := me.NewRtpProfileData(params[0])
3856 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003857 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3858 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003859 if err != nil {
3860 logger.Errorw(ctx, "Cannot encode RTPProfileData for set", log.Fields{"Err": err,
3861 "device-id": oo.deviceID})
3862 return nil, err
3863 }
3864
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003865 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003866 if err != nil {
3867 logger.Errorw(ctx, "Cannot serialize RTPProfileData set", log.Fields{"Err": err,
3868 "device-id": oo.deviceID})
3869 return nil, err
3870 }
3871
3872 omciRxCallbackPair := CallbackPair{CbKey: tid,
3873 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3874 }
3875 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3876 if err != nil {
3877 logger.Errorw(ctx, "Cannot send RTPProfileData set", log.Fields{"Err": err,
3878 "device-id": oo.deviceID})
3879 return nil, err
3880 }
3881 logger.Debug(ctx, "send RTPProfileData-set-msg done")
3882 return meInstance, nil
3883 }
3884 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance", log.Fields{"Err": omciErr.GetError(),
3885 "device-id": oo.deviceID})
3886 return nil, omciErr.GetError()
3887}
3888
3889// SendDeleteRTPProfileData nolint: unused
3890func (oo *OmciCC) SendDeleteRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3891 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3892 tid := oo.GetNextTid(highPrio)
3893 logger.Debugw(ctx, "send RTPProfileData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3894 "SequNo": strconv.FormatInt(int64(tid), 16),
3895 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3896
3897 meParams := me.ParamData{EntityID: aInstID}
3898 meInstance, omciErr := me.NewRtpProfileData(meParams)
3899 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003900 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3901 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003902 if err != nil {
3903 logger.Errorw(ctx, "Cannot encode RTPProfileData for delete", log.Fields{
3904 "Err": err, "device-id": oo.deviceID})
3905 return nil, err
3906 }
3907
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003908 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003909 if err != nil {
3910 logger.Errorw(ctx, "Cannot serialize RTPProfileData delete", log.Fields{
3911 "Err": err, "device-id": oo.deviceID})
3912 return nil, err
3913 }
3914
3915 omciRxCallbackPair := CallbackPair{
3916 CbKey: tid,
3917 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3918 }
3919 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3920 if err != nil {
3921 logger.Errorw(ctx, "Cannot send RTPProfileData delete", log.Fields{
3922 "Err": err, "device-id": oo.deviceID})
3923 return nil, err
3924 }
3925 logger.Debug(ctx, "send RTPProfileData-Delete-msg done")
3926 return meInstance, nil
3927 }
3928 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance for delete", log.Fields{
3929 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3930 return nil, omciErr.GetError()
3931}
3932
3933// SendCreateNetworkDialPlanTable nolint: unused
3934func (oo *OmciCC) SendCreateNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
3935 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3936 tid := oo.GetNextTid(highPrio)
3937 logger.Debugw(ctx, "send NetworkDialPlanTable-create-msg:", log.Fields{"device-id": oo.deviceID,
3938 "SequNo": strconv.FormatInt(int64(tid), 16),
3939 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3940
3941 meInstance, omciErr := me.NewNetworkDialPlanTable(params[0])
3942 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003943 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3944 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003945 if err != nil {
3946 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for create", log.Fields{"Err": err,
3947 "device-id": oo.deviceID})
3948 return nil, err
3949 }
3950
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003951 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003952 if err != nil {
3953 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable create", log.Fields{"Err": err,
3954 "device-id": oo.deviceID})
3955 return nil, err
3956 }
3957
3958 omciRxCallbackPair := CallbackPair{CbKey: tid,
3959 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3960 }
3961 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3962 if err != nil {
3963 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable create", log.Fields{"Err": err,
3964 "device-id": oo.deviceID})
3965 return nil, err
3966 }
3967 logger.Debug(ctx, "send NetworkDialPlanTable-create-msg done")
3968 return meInstance, nil
3969 }
3970 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance", log.Fields{"Err": omciErr.GetError(),
3971 "device-id": oo.deviceID})
3972 return nil, omciErr.GetError()
3973}
3974
3975// SendSetNetworkDialPlanTable nolint: unused
3976func (oo *OmciCC) SendSetNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
3977 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3978 tid := oo.GetNextTid(highPrio)
3979 logger.Debugw(ctx, "send NetworkDialPlanTable-set-msg:", log.Fields{"device-id": oo.deviceID,
3980 "SequNo": strconv.FormatInt(int64(tid), 16),
3981 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3982
3983 meInstance, omciErr := me.NewNetworkDialPlanTable(params[0])
3984 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003985 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3986 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003987 if err != nil {
3988 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for set", log.Fields{"Err": err,
3989 "device-id": oo.deviceID})
3990 return nil, err
3991 }
3992
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003993 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003994 if err != nil {
3995 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable set", log.Fields{"Err": err,
3996 "device-id": oo.deviceID})
3997 return nil, err
3998 }
3999
4000 omciRxCallbackPair := CallbackPair{CbKey: tid,
4001 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4002 }
4003 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
4004 if err != nil {
4005 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable set", log.Fields{"Err": err,
4006 "device-id": oo.deviceID})
4007 return nil, err
4008 }
4009 logger.Debug(ctx, "send NetworkDialPlanTable-set-msg done")
4010 return meInstance, nil
4011 }
4012 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance", log.Fields{"Err": omciErr.GetError(),
4013 "device-id": oo.deviceID})
4014 return nil, omciErr.GetError()
4015}
4016
4017// SendDeleteNetworkDialPlanTable nolint: unused
4018func (oo *OmciCC) SendDeleteNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
4019 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
4020 tid := oo.GetNextTid(highPrio)
4021 logger.Debugw(ctx, "send NetworkDialPlanTable-Delete-msg:", log.Fields{"device-id": oo.deviceID,
4022 "SequNo": strconv.FormatInt(int64(tid), 16),
4023 "InstId": strconv.FormatInt(int64(aInstID), 16)})
4024
4025 meParams := me.ParamData{EntityID: aInstID}
4026 meInstance, omciErr := me.NewNetworkDialPlanTable(meParams)
4027 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00004028 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
4029 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004030 if err != nil {
4031 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for delete", log.Fields{
4032 "Err": err, "device-id": oo.deviceID})
4033 return nil, err
4034 }
4035
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004036 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004037 if err != nil {
4038 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable delete", log.Fields{
4039 "Err": err, "device-id": oo.deviceID})
4040 return nil, err
4041 }
4042
4043 omciRxCallbackPair := CallbackPair{
4044 CbKey: tid,
4045 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4046 }
4047 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
4048 if err != nil {
4049 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable delete", log.Fields{
4050 "Err": err, "device-id": oo.deviceID})
4051 return nil, err
4052 }
4053 logger.Debug(ctx, "send NetworkDialPlanTable-Delete-msg done")
4054 return meInstance, nil
4055 }
4056 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance for delete", log.Fields{
4057 "Err": omciErr.GetError(), "device-id": oo.deviceID})
4058 return nil, omciErr.GetError()
4059}
4060
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004061// SendSyncTime sends SynchronizeTimeRequest
4062func (oo *OmciCC) SendSyncTime(ctx context.Context, timeout int, highPrio bool, rxChan chan Message) error {
4063 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004064 logger.Debugw(ctx, "send synchronize time request:", log.Fields{"device-id": oo.deviceID,
4065 "SequNo": strconv.FormatInt(int64(tid), 16)})
4066
4067 omciLayer := &omci.OMCI{
4068 TransactionID: tid,
4069 MessageType: omci.SynchronizeTimeRequestType,
4070 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4071 // Length: 0x28, // Optional, defaults to 40 octets
4072 }
4073 utcTime := time.Now().UTC()
4074 request := &omci.SynchronizeTimeRequest{
4075 MeBasePacket: omci.MeBasePacket{
4076 EntityClass: me.OnuGClassID,
4077 // Default Instance ID is 0
4078 },
4079 Year: uint16(utcTime.Year()),
4080 Month: uint8(utcTime.Month()),
4081 Day: uint8(utcTime.Day()),
4082 Hour: uint8(utcTime.Hour()),
4083 Minute: uint8(utcTime.Minute()),
4084 Second: uint8(utcTime.Second()),
4085 }
4086
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004087 pkt, err := SerializeOmciLayer(ctx, omciLayer, request)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004088 if err != nil {
4089 logger.Errorw(ctx, "Cannot serialize synchronize time request", log.Fields{"Err": err,
4090 "device-id": oo.deviceID})
4091 return err
4092 }
4093
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004094 omciRxCallbackPair := CallbackPair{CbKey: tid,
4095 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004096 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004097 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004098 if err != nil {
4099 logger.Errorw(ctx, "Cannot send synchronize time request", log.Fields{"Err": err,
4100 "device-id": oo.deviceID})
4101 return err
4102 }
4103 logger.Debug(ctx, "send synchronize time request done")
4104 return nil
4105}
4106
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004107// SendCreateOrDeleteEthernetPerformanceMonitoringHistoryME creates or deletes EthernetFramePerformanceMonitoringHistoryData ME instance
4108func (oo *OmciCC) SendCreateOrDeleteEthernetPerformanceMonitoringHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004109 upstream bool, create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004110 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004111 logger.Debugw(ctx, "send ethernet-performance-monitoring-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4112 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
4113 meParam := me.ParamData{EntityID: entityID}
4114 var meInstance *me.ManagedEntity
4115 var omciErr me.OmciErrors
4116 if upstream {
4117 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataUpstream(meParam)
4118 } else {
4119 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataDownstream(meParam)
4120 }
4121 if omciErr.GetError() == nil {
4122 var omciLayer *omci.OMCI
4123 var msgLayer gopacket.SerializableLayer
4124 var err error
4125 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004126 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4127 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004128 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004129 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4130 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004131 }
4132 if err != nil {
4133 logger.Errorw(ctx, "Cannot encode ethernet frame performance monitoring history data ME",
4134 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004135 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004136 }
4137
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004138 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004139 if err != nil {
4140 logger.Errorw(ctx, "Cannot serialize ethernet frame performance monitoring history data ME",
4141 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004142 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004143 }
4144
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004145 omciRxCallbackPair := CallbackPair{CbKey: tid,
4146 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004147 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004148 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004149 if err != nil {
4150 logger.Errorw(ctx, "Cannot send ethernet frame performance monitoring history data ME",
4151 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004152 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004153 }
4154 logger.Debugw(ctx, "send ethernet frame performance monitoring history data ME done",
4155 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004156 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08004157 }
4158 logger.Errorw(ctx, "Cannot generate ethernet frame performance monitoring history data ME Instance",
4159 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004160 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08004161}
4162
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004163// SendCreateOrDeleteEthernetUniHistoryME creates or deletes EthernetPerformanceMonitoringHistoryData ME instance
4164func (oo *OmciCC) SendCreateOrDeleteEthernetUniHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004165 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004166 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004167 logger.Debugw(ctx, "send ethernet-uni-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4168 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4169 meParam := me.ParamData{EntityID: entityID}
4170 var meInstance *me.ManagedEntity
4171 var omciErr me.OmciErrors
4172 meInstance, omciErr = me.NewEthernetPerformanceMonitoringHistoryData(meParam)
4173
4174 if omciErr.GetError() == nil {
4175 var omciLayer *omci.OMCI
4176 var msgLayer gopacket.SerializableLayer
4177 var err error
4178 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004179 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4180 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004181 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004182 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4183 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004184 }
4185 if err != nil {
4186 logger.Errorw(ctx, "Cannot encode ethernet uni history data ME",
4187 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004188 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004189 }
4190
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004191 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004192 if err != nil {
4193 logger.Errorw(ctx, "Cannot serialize ethernet uni history data ME",
4194 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004195 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004196 }
4197
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004198 omciRxCallbackPair := CallbackPair{CbKey: tid,
4199 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004200 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004201 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004202 if err != nil {
4203 logger.Errorw(ctx, "Cannot send ethernet uni history data ME",
4204 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004205 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004206 }
4207 logger.Debugw(ctx, "send ethernet uni history data ME done",
4208 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004209 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08004210 }
4211 logger.Errorw(ctx, "Cannot generate ethernet uni history data ME Instance",
4212 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004213 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08004214}
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004215
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004216// SendCreateOrDeleteFecHistoryME creates or deletes FecPerformanceMonitoringHistoryData ME instance
4217func (oo *OmciCC) SendCreateOrDeleteFecHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004218 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004219 tid := oo.GetNextTid(highPrio)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004220 logger.Debugw(ctx, "send fec-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4221 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4222 meParam := me.ParamData{EntityID: entityID}
4223 var meInstance *me.ManagedEntity
4224 var omciErr me.OmciErrors
4225 meInstance, omciErr = me.NewFecPerformanceMonitoringHistoryData(meParam)
4226
4227 if omciErr.GetError() == nil {
4228 var omciLayer *omci.OMCI
4229 var msgLayer gopacket.SerializableLayer
4230 var err error
4231 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004232 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4233 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004234 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004235 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4236 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004237 }
4238 if err != nil {
4239 logger.Errorw(ctx, "Cannot encode fec history data ME",
4240 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004241 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004242 }
4243
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004244 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004245 if err != nil {
4246 logger.Errorw(ctx, "Cannot serialize fec history data ME",
4247 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004248 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004249 }
4250
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004251 omciRxCallbackPair := CallbackPair{CbKey: tid,
4252 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004253 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004254 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004255 if err != nil {
4256 logger.Errorw(ctx, "Cannot send fec history data ME",
4257 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004258 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004259 }
4260 logger.Debugw(ctx, "send fec history data ME done",
4261 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004262 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004263 }
4264 logger.Errorw(ctx, "Cannot generate fec history data ME Instance",
4265 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004266 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004267}
4268
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004269// SendCreateOrDeleteGemPortHistoryME deletes GemPortNetworkCtpPerformanceMonitoringHistoryData ME instance
4270func (oo *OmciCC) SendCreateOrDeleteGemPortHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004271 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004272 tid := oo.GetNextTid(highPrio)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004273 logger.Debugw(ctx, "send gemport-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4274 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4275 meParam := me.ParamData{EntityID: entityID}
4276 var meInstance *me.ManagedEntity
4277 var omciErr me.OmciErrors
4278 meInstance, omciErr = me.NewGemPortNetworkCtpPerformanceMonitoringHistoryData(meParam)
4279
4280 if omciErr.GetError() == nil {
4281 var omciLayer *omci.OMCI
4282 var msgLayer gopacket.SerializableLayer
4283 var err error
4284 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004285 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4286 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004287 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004288 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4289 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004290 }
4291 if err != nil {
4292 logger.Errorw(ctx, "Cannot encode gemport history data ME",
4293 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004294 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004295 }
4296
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004297 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004298 if err != nil {
4299 logger.Errorw(ctx, "Cannot serialize gemport history data ME",
4300 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004301 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004302 }
4303
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004304 omciRxCallbackPair := CallbackPair{CbKey: tid,
4305 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004306 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004307 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004308 if err != nil {
4309 logger.Errorw(ctx, "Cannot send gemport history data ME",
4310 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004311 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004312 }
4313 logger.Debugw(ctx, "send gemport history data ME done",
4314 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004315 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004316 }
4317 logger.Errorw(ctx, "Cannot generate gemport history data ME Instance",
4318 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004319 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004320}
4321
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004322// SendStartSoftwareDownload sends StartSoftwareDownloadRequest
4323func (oo *OmciCC) SendStartSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004324 rxChan chan Message, aImageMeID uint16, aDownloadWindowSize uint8, aFileLen uint32, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004325 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004326 logger.Debugw(ctx, "send StartSwDlRequest:", log.Fields{"device-id": oo.deviceID,
4327 "SequNo": strconv.FormatInt(int64(tid), 16),
4328 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4329
4330 omciLayer := &omci.OMCI{
4331 TransactionID: tid,
4332 MessageType: omci.StartSoftwareDownloadRequestType,
4333 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4334 // Length: 0x28, // Optional, defaults to 40 octets
4335 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004336 if aIsExtendedOmci {
4337 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4338 }
mpagenko80622a52021-02-09 16:53:23 +00004339 request := &omci.StartSoftwareDownloadRequest{
4340 MeBasePacket: omci.MeBasePacket{
4341 EntityClass: me.SoftwareImageClassID,
4342 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004343 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004344 },
4345 WindowSize: aDownloadWindowSize,
4346 ImageSize: aFileLen,
4347 NumberOfCircuitPacks: 1, //parallel download to multiple circuit packs not supported
4348 CircuitPacks: []uint16{0}, //circuit pack indication don't care for NumberOfCircuitPacks=1, but needed by omci-lib
4349 }
4350
4351 var options gopacket.SerializeOptions
4352 options.FixLengths = true
4353 buffer := gopacket.NewSerializeBuffer()
4354 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4355 if err != nil {
4356 logger.Errorw(ctx, "Cannot serialize StartSwDlRequest", log.Fields{"Err": err,
4357 "device-id": oo.deviceID})
4358 return err
4359 }
4360 outgoingPacket := buffer.Bytes()
4361
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004362 omciRxCallbackPair := CallbackPair{CbKey: tid,
4363 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko80622a52021-02-09 16:53:23 +00004364 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004365 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004366 if err != nil {
4367 logger.Errorw(ctx, "Cannot send StartSwDlRequest", log.Fields{"Err": err,
4368 "device-id": oo.deviceID})
4369 return err
4370 }
4371 logger.Debug(ctx, "send StartSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004372 return nil
4373}
4374
kesavand011d5162021-11-25 19:21:06 +05304375// PrepareOnuSectionsOfWindow prepares a list of sections for each window
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304376// Before invoking this function the oo.mutexTid needs to be be locked so that
4377// GetOnuSwSecNextTid can be invoked without further locking
kesavand011d5162021-11-25 19:21:06 +05304378func (oo *OmciCC) PrepareOnuSectionsOfWindow(ctx context.Context,
4379 aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004380 omciMsgsPerWindow *ia.OmciMessages, aIsExtendedOmci bool) (OmciTransferStructure, error) {
kesavand011d5162021-11-25 19:21:06 +05304381 //onuswsections uses only low prioirity tids
4382 tid := oo.GetOnuSwSecNextTid()
4383 logger.Infow(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
4384 "SequNo": strconv.FormatInt(int64(tid), 16),
4385 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest, "sectionNo": aDownloadSectionNo, "sectionData": aSection})
4386
4387 var omciTxReq OmciTransferStructure
4388 msgType := omci.DownloadSectionRequestType
4389
4390 if aAckRequest > 0 {
4391 msgType = omci.DownloadSectionRequestWithResponseType
4392
4393 }
4394 omciLayer := &omci.OMCI{
4395 TransactionID: tid,
4396 MessageType: msgType,
4397 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4398 // Length: 0x28, // Optional, defaults to 40 octets
4399 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004400 if aIsExtendedOmci {
4401 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4402 }
kesavand011d5162021-11-25 19:21:06 +05304403 localSectionData := make([]byte, len(aSection))
4404
4405 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
4406 request := &omci.DownloadSectionRequest{
4407 MeBasePacket: omci.MeBasePacket{
4408 EntityClass: me.SoftwareImageClassID,
4409 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004410 Extended: aIsExtendedOmci,
kesavand011d5162021-11-25 19:21:06 +05304411 },
4412 SectionNumber: aDownloadSectionNo,
4413 SectionData: localSectionData,
4414 }
4415
4416 var options gopacket.SerializeOptions
4417 options.FixLengths = true
4418 buffer := gopacket.NewSerializeBuffer()
4419 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4420 if err != nil {
4421 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
4422 "device-id": oo.deviceID})
4423 return omciTxReq, err
4424 }
4425 outgoingPacket := buffer.Bytes()
4426
4427 omciMsgsPerWindow.Messages = append(omciMsgsPerWindow.Messages, outgoingPacket)
4428
4429 if aAckRequest > 0 {
4430 // only the last section should have a timeout as an ack is required only for the last section of the window
4431 omciTxReq = OmciTransferStructure{
4432 withFramePrint: true,
4433 OnuSwWindow: omciMsgsPerWindow,
4434 }
4435 return omciTxReq, nil
4436 }
4437
4438 return omciTxReq, nil
4439}
4440
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304441// SendOnuSwSectionsWindowWithRxSupervision sends onu swd sections
kesavand011d5162021-11-25 19:21:06 +05304442func (oo *OmciCC) SendOnuSwSectionsWindowWithRxSupervision(ctx context.Context,
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304443 aOmciTxRequest OmciTransferStructure, aTimeout int, rxChan chan Message) error {
kesavand011d5162021-11-25 19:21:06 +05304444 if aOmciTxRequest.OnuSwWindow == nil {
4445 logger.Errorw(ctx, "SendOnuSwSectionsWindowWithRxSupervision: omciTxRequest.OnuSwWindow is nil",
4446 log.Fields{"device-id": oo.deviceID})
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304447 return fmt.Errorf("sendOnuSwSectionsWindowWithRxSupervision: omciTxRequest.OnuSwWindow is nil device-id: %v",
4448 oo.deviceID)
kesavand011d5162021-11-25 19:21:06 +05304449 }
4450
4451 tid := oo.GetOnuSwSecLastTid()
4452 logger.Debugw(ctx, "SendOnuSwSectionsWindowWithRxSupervision tid for the last segment is ", log.Fields{"TID": tid})
4453 omciRxCallbackPair := CallbackPair{CbKey: tid,
4454 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4455 }
4456
4457 aOmciTxRequest.cbPair = omciRxCallbackPair
4458 logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TansCorrId": aOmciTxRequest.cbPair.CbKey})
4459 oo.mutexRxSchedMap.Lock()
4460 // it could be checked, if the callback key is already registered - but simply overwrite may be acceptable ...
4461 oo.rxSchedulerMap[aOmciTxRequest.cbPair.CbKey] = aOmciTxRequest.cbPair.CbEntry
4462 oo.mutexRxSchedMap.Unlock()
4463
4464 chSuccess := make(chan bool)
4465 aOmciTxRequest.chSuccess = chSuccess
4466 aOmciTxRequest.timeout = aTimeout
4467 aOmciTxRequest.retries = CDefaultRetries
4468
4469 //tid := aOmciTxRequest.cbPair.CbKey
4470 oo.mutexMonReq.Lock()
4471 oo.monitoredRequests[tid] = aOmciTxRequest
4472 oo.mutexMonReq.Unlock()
4473
4474 retries := aOmciTxRequest.retries
4475 retryCounter := 0
4476 if aTimeout == 0 {
4477 logger.Errorw(ctx, "no timeout present for last section of window", log.Fields{"device-id": oo.deviceID})
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304478 return fmt.Errorf("no timeout present for last section of window device-id: %v", oo.deviceID)
kesavand011d5162021-11-25 19:21:06 +05304479 }
4480loop:
4481 for retryCounter <= retries {
4482 // the onu sw sections are enqueued only to the low priority queue
4483 oo.mutexLowPrioTxQueue.Lock()
4484 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4485 oo.mutexLowPrioTxQueue.Unlock()
4486
pnalmasc6e916a2025-06-30 11:59:16 +05304487 //Register the call back again as we clean up the Map entry when we failed to send the message
4488 oo.mutexRxSchedMap.Lock()
4489 oo.rxSchedulerMap[aOmciTxRequest.cbPair.CbKey] = aOmciTxRequest.cbPair.CbEntry
4490 oo.mutexRxSchedMap.Unlock()
4491
kesavand011d5162021-11-25 19:21:06 +05304492 go oo.sendQueuedRequests(ctx)
4493
4494 select {
4495 case success := <-chSuccess:
4496 if success {
4497 logger.Debugw(ctx, "reqMon: response received in time",
4498 log.Fields{"tid": tid, "device-id": oo.deviceID})
4499 } else {
4500 logger.Debugw(ctx, "reqMon: wait for response aborted",
4501 log.Fields{"tid": tid, "device-id": oo.deviceID})
4502 }
4503 break loop
4504 case <-time.After(time.Duration(aTimeout) * time.Second):
4505 if retryCounter == retries {
Holger Hildebrandt2b107642022-12-09 07:56:23 +00004506 if oo.pBaseDeviceHandler.IsOltAvailable() {
4507 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - send ONU device event!",
4508 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4509 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationFailureSwUpgrade, OnuOmciCommunicationFailureSwUpgradeDesc)
4510 } else {
4511 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - skip ONU device event: OLT unavailable!",
4512 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4513 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004514 oo.incrementTxTimesouts()
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304515 oo.mutexMonReq.Lock()
4516 delete(oo.monitoredRequests, tid)
4517 oo.mutexMonReq.Unlock()
4518 return fmt.Errorf("reqMon: timeout waiting for response - no of max retries reached device-id: %v", oo.deviceID)
kesavand011d5162021-11-25 19:21:06 +05304519 }
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304520 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
4521 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4522 oo.incrementTxRetries()
4523 case _, ok := <-oo.pBaseDeviceHandler.GetDeviceDeleteCommChan(ctx):
4524 if !ok {
4525 logger.Warnw(ctx, "device deletion channel is closed", log.Fields{"device-id": oo.deviceID})
4526 oo.mutexMonReq.Lock()
4527 delete(oo.monitoredRequests, tid)
4528 oo.mutexMonReq.Unlock()
4529 return fmt.Errorf("device deletion channel is closed device-id: %v", oo.deviceID)
4530 }
4531 oo.mutexMonReq.Lock()
4532 delete(oo.monitoredRequests, tid)
4533 oo.mutexMonReq.Unlock()
4534 return fmt.Errorf("received response from device deletion comm channel while waiting for a OMCI response device-id: %v", oo.deviceID)
kesavand011d5162021-11-25 19:21:06 +05304535 }
4536 retryCounter++
4537 }
4538 oo.mutexMonReq.Lock()
4539 delete(oo.monitoredRequests, tid)
4540 oo.mutexMonReq.Unlock()
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304541 return nil
kesavand011d5162021-11-25 19:21:06 +05304542}
4543
4544func (oo *OmciCC) sendOnuSwSectionsOfWindow(ctx context.Context, omciTxRequest OmciTransferStructure) error {
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004545 var lastSection []byte
4546 if omciTxRequest.OnuSwWindow != nil {
4547 lastSection = omciTxRequest.OnuSwWindow.Messages[len(omciTxRequest.OnuSwWindow.Messages)-1]
4548 } else {
4549 logger.Errorw(ctx, "invalid sw window received", log.Fields{"device-id": oo.deviceID})
4550 return fmt.Errorf("invalid sw window received")
4551 }
4552 if omciTxRequest.withFramePrint {
4553 logger.Debugw(ctx, "sw-section-omci-message-to-send:", log.Fields{
kesavand011d5162021-11-25 19:21:06 +05304554 "TxOmciMessage": hex.EncodeToString(lastSection),
4555 "device-id": oo.deviceID,
4556 "toDeviceType": oo.pBaseDeviceHandler.GetProxyAddressType(),
4557 "proxyDeviceID": oo.pBaseDeviceHandler.GetProxyAddressID(),
4558 "proxyAddress": oo.pBaseDeviceHandler.GetProxyAddress()})
4559 }
4560 sendErr := oo.pBaseDeviceHandler.SendOnuSwSectionsOfWindow(ctx, oo.pBaseDeviceHandler.GetProxyAddress().AdapterEndpoint, omciTxRequest.OnuSwWindow)
4561 if sendErr != nil {
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004562 logger.Errorw(ctx, "send onu sw sections omci request error", log.Fields{"device-id": oo.deviceID, "error": sendErr})
kesavand011d5162021-11-25 19:21:06 +05304563 return sendErr
4564 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004565 numberOfNoArSections := len(omciTxRequest.OnuSwWindow.Messages) - 1 // last section of window is sent with AR expected
4566 if lastSection[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
4567 oo.increaseBaseTxNoArFramesBy(ctx, uint32(numberOfNoArSections))
4568 oo.incrementBaseTxArFrames()
4569 } else {
4570 oo.increaseExtTxNoArFramesBy(ctx, uint32(numberOfNoArSections))
4571 oo.incrementExtTxArFrames()
4572 }
kesavand011d5162021-11-25 19:21:06 +05304573 return nil
4574}
4575
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004576// SendDownloadSection sends DownloadSectionRequestWithResponse
4577func (oo *OmciCC) SendDownloadSection(ctx context.Context, aTimeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004578 rxChan chan Message, aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte, aPrint bool, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004579 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004580 logger.Debugw(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
4581 "SequNo": strconv.FormatInt(int64(tid), 16),
mpagenko15ff4a52021-03-02 10:09:20 +00004582 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest})
mpagenko80622a52021-02-09 16:53:23 +00004583
4584 //TODO!!!: don't know by now on how to generate the possibly needed AR (or enforce it to 0) with current omci-lib
4585 // by now just try to send it as defined by omci-lib
mpagenko15ff4a52021-03-02 10:09:20 +00004586 msgType := omci.DownloadSectionRequestType
mgoudad611f4c2025-10-30 14:49:27 +05304587 var timeout = 0 //default value for no response expected
mpagenko15ff4a52021-03-02 10:09:20 +00004588 if aAckRequest > 0 {
4589 msgType = omci.DownloadSectionRequestWithResponseType
mpagenkoc26d4c02021-05-06 14:27:57 +00004590 timeout = aTimeout
mpagenko15ff4a52021-03-02 10:09:20 +00004591 }
mpagenko80622a52021-02-09 16:53:23 +00004592 omciLayer := &omci.OMCI{
4593 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004594 MessageType: msgType,
mpagenko80622a52021-02-09 16:53:23 +00004595 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4596 // Length: 0x28, // Optional, defaults to 40 octets
4597 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004598 if aIsExtendedOmci {
4599 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4600 }
Himani Chawla43f95ff2021-06-03 00:24:12 +05304601 localSectionData := make([]byte, len(aSection))
4602
mpagenko15ff4a52021-03-02 10:09:20 +00004603 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
mpagenko80622a52021-02-09 16:53:23 +00004604 request := &omci.DownloadSectionRequest{
4605 MeBasePacket: omci.MeBasePacket{
4606 EntityClass: me.SoftwareImageClassID,
4607 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004608 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004609 },
4610 SectionNumber: aDownloadSectionNo,
4611 SectionData: localSectionData,
4612 }
4613
4614 var options gopacket.SerializeOptions
4615 options.FixLengths = true
4616 buffer := gopacket.NewSerializeBuffer()
4617 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4618 if err != nil {
4619 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
4620 "device-id": oo.deviceID})
4621 return err
4622 }
4623 outgoingPacket := buffer.Bytes()
4624
mpagenko15ff4a52021-03-02 10:09:20 +00004625 //for initial debug purpose overrule the requested print state for some frames
4626 printFrame := aPrint
4627 if aAckRequest > 0 || aDownloadSectionNo == 0 {
4628 printFrame = true
4629 }
4630
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004631 omciRxCallbackPair := CallbackPair{CbKey: tid,
mpagenkoc26d4c02021-05-06 14:27:57 +00004632 // the callback is set even though no response might be required here, the tid (key) setting is needed here anyway
4633 // (used to avoid retransmission of frames with the same TID)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004634 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, printFrame /*aPrint*/},
mpagenko80622a52021-02-09 16:53:23 +00004635 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004636 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004637 if err != nil {
4638 logger.Errorw(ctx, "Cannot send DlSectionRequest", log.Fields{"Err": err,
4639 "device-id": oo.deviceID})
4640 return err
4641 }
4642 logger.Debug(ctx, "send DlSectionRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004643 return nil
4644}
4645
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304646// SendEndSoftwareDownload sends EndSoftwareDownloadRequest
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004647func (oo *OmciCC) SendEndSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004648 rxChan chan Message, aImageMeID uint16, aFileLen uint32, aImageCrc uint32, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004649 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004650 logger.Debugw(ctx, "send EndSwDlRequest:", log.Fields{"device-id": oo.deviceID,
4651 "SequNo": strconv.FormatInt(int64(tid), 16),
4652 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4653
mpagenko15ff4a52021-03-02 10:09:20 +00004654 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00004655 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004656 MessageType: omci.EndSoftwareDownloadRequestType,
mpagenko80622a52021-02-09 16:53:23 +00004657 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4658 // Length: 0x28, // Optional, defaults to 40 octets
4659 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004660 if aIsExtendedOmci {
4661 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4662 }
mpagenko15ff4a52021-03-02 10:09:20 +00004663 request := &omci.EndSoftwareDownloadRequest{
mpagenko80622a52021-02-09 16:53:23 +00004664 MeBasePacket: omci.MeBasePacket{
4665 EntityClass: me.SoftwareImageClassID,
4666 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004667 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004668 },
mpagenko15ff4a52021-03-02 10:09:20 +00004669 CRC32: aImageCrc,
4670 ImageSize: aFileLen,
4671 NumberOfInstances: 1, //parallel download to multiple circuit packs not supported
4672 ImageInstances: []uint16{0}, //don't care for NumberOfInstances=1, but probably needed by omci-lib as in startSwDlRequest
mpagenko80622a52021-02-09 16:53:23 +00004673 }
mpagenko15ff4a52021-03-02 10:09:20 +00004674
4675 var options gopacket.SerializeOptions
4676 options.FixLengths = true
4677 buffer := gopacket.NewSerializeBuffer()
4678 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4679 if err != nil {
4680 logger.Errorw(ctx, "Cannot serialize EndSwDlRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00004681 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00004682 return err
mpagenko80622a52021-02-09 16:53:23 +00004683 }
mpagenko15ff4a52021-03-02 10:09:20 +00004684 outgoingPacket := buffer.Bytes()
4685
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004686 omciRxCallbackPair := CallbackPair{CbKey: tid,
4687 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko15ff4a52021-03-02 10:09:20 +00004688 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004689 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00004690 if err != nil {
4691 logger.Errorw(ctx, "Cannot send EndSwDlRequest", log.Fields{"Err": err,
4692 "device-id": oo.deviceID})
4693 return err
4694 }
4695 logger.Debug(ctx, "send EndSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004696 return nil
4697}
4698
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004699// SendActivateSoftware sends ActivateSoftwareRequest
4700func (oo *OmciCC) SendActivateSoftware(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004701 rxChan chan Message, aImageMeID uint16, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004702 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004703 logger.Debugw(ctx, "send ActivateSwRequest:", log.Fields{"device-id": oo.deviceID,
4704 "SequNo": strconv.FormatInt(int64(tid), 16),
4705 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4706
4707 omciLayer := &omci.OMCI{
4708 TransactionID: tid,
4709 MessageType: omci.ActivateSoftwareRequestType,
4710 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4711 // Length: 0x28, // Optional, defaults to 40 octets
4712 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004713 if aIsExtendedOmci {
4714 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4715 }
mpagenko80622a52021-02-09 16:53:23 +00004716 request := &omci.ActivateSoftwareRequest{
4717 MeBasePacket: omci.MeBasePacket{
4718 EntityClass: me.SoftwareImageClassID,
4719 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004720 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004721 },
4722 ActivateFlags: 0, //unconditionally reset as the only relevant option here (regardless of VOIP)
4723 }
4724
4725 var options gopacket.SerializeOptions
4726 options.FixLengths = true
4727 buffer := gopacket.NewSerializeBuffer()
4728 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4729 if err != nil {
4730 logger.Errorw(ctx, "Cannot serialize ActivateSwRequest", log.Fields{"Err": err,
4731 "device-id": oo.deviceID})
4732 return err
4733 }
4734 outgoingPacket := buffer.Bytes()
4735
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004736 omciRxCallbackPair := CallbackPair{CbKey: tid,
4737 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko80622a52021-02-09 16:53:23 +00004738 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004739 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004740 if err != nil {
4741 logger.Errorw(ctx, "Cannot send ActivateSwRequest", log.Fields{"Err": err,
4742 "device-id": oo.deviceID})
4743 return err
4744 }
4745 logger.Debug(ctx, "send ActivateSwRequest done")
mpagenko15ff4a52021-03-02 10:09:20 +00004746 return nil
4747}
mpagenko80622a52021-02-09 16:53:23 +00004748
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004749// SendCommitSoftware sends CommitSoftwareRequest
4750func (oo *OmciCC) SendCommitSoftware(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004751 rxChan chan Message, aImageMeID uint16, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004752 tid := oo.GetNextTid(highPrio)
mpagenko15ff4a52021-03-02 10:09:20 +00004753 logger.Debugw(ctx, "send CommitSwRequest:", log.Fields{"device-id": oo.deviceID,
4754 "SequNo": strconv.FormatInt(int64(tid), 16),
4755 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4756
4757 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00004758 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004759 MessageType: omci.CommitSoftwareRequestType,
mpagenko80622a52021-02-09 16:53:23 +00004760 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4761 // Length: 0x28, // Optional, defaults to 40 octets
4762 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004763 if aIsExtendedOmci {
4764 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4765 }
mpagenko15ff4a52021-03-02 10:09:20 +00004766 request := &omci.CommitSoftwareRequest{
mpagenko80622a52021-02-09 16:53:23 +00004767 MeBasePacket: omci.MeBasePacket{
4768 EntityClass: me.SoftwareImageClassID,
4769 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004770 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004771 },
mpagenko80622a52021-02-09 16:53:23 +00004772 }
mpagenko15ff4a52021-03-02 10:09:20 +00004773
4774 var options gopacket.SerializeOptions
4775 options.FixLengths = true
4776 buffer := gopacket.NewSerializeBuffer()
4777 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4778 if err != nil {
4779 logger.Errorw(ctx, "Cannot serialize CommitSwRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00004780 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00004781 return err
mpagenko80622a52021-02-09 16:53:23 +00004782 }
mpagenko15ff4a52021-03-02 10:09:20 +00004783 outgoingPacket := buffer.Bytes()
4784
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004785 omciRxCallbackPair := CallbackPair{CbKey: tid,
4786 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko15ff4a52021-03-02 10:09:20 +00004787 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004788 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00004789 if err != nil {
4790 logger.Errorw(ctx, "Cannot send CommitSwRequest", log.Fields{"Err": err,
4791 "device-id": oo.deviceID})
4792 return err
4793 }
4794 logger.Debug(ctx, "send CommitSwRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004795 return nil
4796}
4797
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304798// SendSelfTestReq sends TestRequest
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004799func (oo *OmciCC) SendSelfTestReq(ctx context.Context, classID me.ClassID, instdID uint16, timeout int, highPrio bool, rxChan chan Message) error {
4800 tid := oo.GetNextTid(highPrio)
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004801 logger.Debugw(ctx, "send self test request:", log.Fields{"device-id": oo.deviceID,
4802 "SequNo": strconv.FormatInt(int64(tid), 16),
4803 "InstId": strconv.FormatInt(int64(instdID), 16)})
4804 omciLayer := &omci.OMCI{
4805 TransactionID: tid,
4806 MessageType: omci.TestRequestType,
4807 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4808 // Length: 0x28, // Optional, defaults to 40 octets
4809 }
4810
4811 var request *omci.OpticalLineSupervisionTestRequest
4812 switch classID {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004813 case me.AniGClassID:
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004814 request = &omci.OpticalLineSupervisionTestRequest{
4815 MeBasePacket: omci.MeBasePacket{
4816 EntityClass: classID,
4817 EntityInstance: instdID,
4818 },
4819 SelectTest: uint8(7), // self test
4820 GeneralPurposeBuffer: uint16(0),
4821 VendorSpecificParameters: uint16(0),
4822 }
4823 default:
4824 logger.Errorw(ctx, "unsupported class id for self test request", log.Fields{"device-id": oo.deviceID, "classID": classID})
4825 return fmt.Errorf("unsupported-class-id-for-self-test-request-%v", classID)
4826 }
4827 // Test serialization back to former string
4828 var options gopacket.SerializeOptions
4829 options.FixLengths = true
4830
4831 buffer := gopacket.NewSerializeBuffer()
4832 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4833 if err != nil {
4834 logger.Errorw(ctx, "Cannot serialize self test request", log.Fields{"Err": err,
4835 "device-id": oo.deviceID})
4836 return err
4837 }
4838 outgoingPacket := buffer.Bytes()
4839
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004840 omciRxCallbackPair := CallbackPair{CbKey: tid,
4841 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004842 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004843 err = oo.Send(ctx, outgoingPacket, timeout, 0, highPrio, omciRxCallbackPair)
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004844 if err != nil {
4845 logger.Errorw(ctx, "Cannot send self test request", log.Fields{"Err": err,
4846 "device-id": oo.deviceID})
4847 return err
4848 }
4849 logger.Debug(ctx, "send self test request done")
4850 return nil
4851}
4852
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304853// nolint: gocyclo
mgoudad611f4c2025-10-30 14:49:27 +05304854func (oo *OmciCC) isSuccessfulResponseWithMibDataSync(ctx context.Context, omciMsg *omci.OMCI, packet *gopacket.Packet) (bool, error) {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004855
4856 nextLayer, err := omci.MsgTypeToNextLayer(omciMsg.MessageType, false)
4857 if err != nil {
4858 logger.Errorw(ctx, "omci-message: could not map msgType to nextLayer", log.Fields{"device-id": oo.deviceID})
4859 return false, fmt.Errorf("could not map msgType to nextLayer - %s", oo.deviceID)
4860 }
4861 msgLayer := (*packet).Layer(nextLayer)
4862 if msgLayer != nil {
4863 // Note: Due to relaxed decoding, you may now still have a decoding error attached to the layers
4864 if failure := (*packet).ErrorLayer(); failure != nil {
mgoudad611f4c2025-10-30 14:49:27 +05304865 switch nextLayer {
4866 case omci.LayerTypeMibUploadNextResponse:
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004867 // In the case of MibUploadNextResponse, we let the packet pass so that later processing
4868 // can examine for UnkonwnMEs and UnknownAttributes
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304869 logger.Debug(ctx, "omci-message: MibUploadNextResponse packet with ErrorLayer - let it pass",
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004870 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4871 return false, nil
mgoudad611f4c2025-10-30 14:49:27 +05304872 case omci.LayerTypeGetResponse:
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004873 if resp := msgLayer.(*omci.GetResponse); resp != nil {
4874 if resp.NextLayerType() == omci.LayerTypeUnknownAttributes {
4875 unknownAttrLayer := (*packet).Layer(omci.LayerTypeUnknownAttributes)
4876 if unknownAttrLayer != nil {
4877 logger.Errorw(ctx, "omci-message: GetResponse packet contains unknownAttrLayer - skip it!",
4878 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "unknownAttrLayer": unknownAttrLayer})
4879 return false, fmt.Errorf("packet contains unknownAttrLayer - %s", oo.deviceID)
4880 }
4881 }
4882 }
4883 }
4884 // Try to decode any further error information
4885 if decodeFailure, ok := failure.(*gopacket.DecodeFailure); ok && decodeFailure != nil {
4886 logger.Errorw(ctx, "omci-message: packet contains ErrorLayer with further info - skip it!",
4887 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "decodeFailure": decodeFailure.String()})
4888 return false, fmt.Errorf("packet contains ErrorLayer with further info - %s", oo.deviceID)
4889 }
4890 logger.Errorw(ctx, "omci-message: packet contains ErrorLayer - skip it!",
4891 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4892 return false, fmt.Errorf("packet contains ErrorLayer - %s", oo.deviceID)
4893 }
4894 } else if failure := (*packet).ErrorLayer(); failure != nil {
4895 // message layer could not be decoded, but at least check if additional failure information is available
4896 if decodeFailure, ok := failure.(*gopacket.DecodeFailure); ok && decodeFailure != nil {
Holger Hildebrandt93d183f2022-04-22 15:50:26 +00004897 errMsg := decodeFailure.String()
4898 if nextLayer == omci.LayerTypeMibUploadNextResponse {
4899 if strings.Contains(strings.ToLower(errMsg), "table decode") {
4900 // In the case of MibUploadNextResponse with non-standard table attributes, we let the packet pass
4901 // so that later processing can deal with it
4902 logger.Infow(ctx, "omci-message: MibUploadNextResponse packet with table attributes - let it pass",
4903 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4904 return false, nil
4905 }
4906 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004907 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet, further info available - skip it!",
Holger Hildebrandt93d183f2022-04-22 15:50:26 +00004908 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "decodeFailure": errMsg})
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004909 return false, fmt.Errorf("could not decode msgLayer of packet, further info available - %s", oo.deviceID)
4910 }
4911 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet, ErrorLayer available",
4912 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4913 return false, fmt.Errorf("could not decode msgLayer of packet, ErrorLayer available - %s", oo.deviceID)
4914 } else {
4915 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet", log.Fields{"device-id": oo.deviceID})
4916 return false, fmt.Errorf("could not decode msgLayer of packet - %s", oo.deviceID)
4917 }
4918
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004919 for _, v := range responsesWithMibDataSync {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004920 if v == omciMsg.MessageType {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004921 switch nextLayer {
4922 case omci.LayerTypeCreateResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004923 if resp := msgLayer.(*omci.CreateResponse); resp != nil {
4924 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004925 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004926 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004927 }
4928 case omci.LayerTypeDeleteResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004929 if resp := msgLayer.(*omci.DeleteResponse); resp != nil {
4930 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004931 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004932 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004933 }
4934 case omci.LayerTypeSetResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004935 if resp := msgLayer.(*omci.SetResponse); resp != nil {
4936 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004937 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004938 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004939 }
4940 case omci.LayerTypeStartSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004941 if resp := msgLayer.(*omci.StartSoftwareDownloadResponse); resp != nil {
4942 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004943 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004944 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004945 }
4946 case omci.LayerTypeEndSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004947 if resp := msgLayer.(*omci.EndSoftwareDownloadResponse); resp != nil {
4948 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004949 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004950 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004951 }
4952 case omci.LayerTypeActivateSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004953 if resp := msgLayer.(*omci.ActivateSoftwareResponse); resp != nil {
4954 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004955 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004956 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004957 }
4958 case omci.LayerTypeCommitSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004959 if resp := msgLayer.(*omci.CommitSoftwareResponse); resp != nil {
4960 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004961 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004962 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004963 }
4964 }
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004965 }
4966 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004967 return false, nil
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004968}
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004969
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004970func (oo *OmciCC) processRequestMonitoring(ctx context.Context, aOmciTxRequest OmciTransferStructure) {
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004971 timeout := aOmciTxRequest.timeout
mpagenkoc26d4c02021-05-06 14:27:57 +00004972 if timeout == 0 {
4973 //timeout 0 indicates that no response is expected - fire and forget
Holger Hildebrandt34555512021-10-01 16:26:59 +00004974 // enqueue
4975 if aOmciTxRequest.highPrio {
4976 oo.mutexHighPrioTxQueue.Lock()
4977 oo.highPrioTxQueue.PushBack(aOmciTxRequest)
4978 oo.mutexHighPrioTxQueue.Unlock()
4979 } else {
4980 oo.mutexLowPrioTxQueue.Lock()
4981 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4982 oo.mutexLowPrioTxQueue.Unlock()
4983 }
4984 go oo.sendQueuedRequests(ctx)
mpagenkoc26d4c02021-05-06 14:27:57 +00004985 } else {
mpagenko7455fd42021-06-10 16:25:55 +00004986 //the supervised sending with waiting on the response (based on TID) is called in background
4987 // to avoid blocking of the sender for the complete OMCI handshake procedure
4988 // to stay consistent with the processing tested so far, sending of next messages of the same control procedure
4989 // is ensured by the according control instances (FSM's etc.) (by waiting for the respective responses there)
4990 go oo.sendWithRxSupervision(ctx, aOmciTxRequest, timeout)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004991 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004992}
4993
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004994func (oo *OmciCC) sendWithRxSupervision(ctx context.Context, aOmciTxRequest OmciTransferStructure, aTimeout int) {
mpagenko7455fd42021-06-10 16:25:55 +00004995 chSuccess := make(chan bool)
4996 aOmciTxRequest.chSuccess = chSuccess
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004997 tid := aOmciTxRequest.cbPair.CbKey
mpagenko7455fd42021-06-10 16:25:55 +00004998 oo.mutexMonReq.Lock()
4999 oo.monitoredRequests[tid] = aOmciTxRequest
5000 oo.mutexMonReq.Unlock()
5001
5002 retries := aOmciTxRequest.retries
5003 retryCounter := 0
5004loop:
5005 for retryCounter <= retries {
Holger Hildebrandt34555512021-10-01 16:26:59 +00005006 // enqueue
5007 if aOmciTxRequest.highPrio {
5008 oo.mutexHighPrioTxQueue.Lock()
5009 oo.highPrioTxQueue.PushBack(aOmciTxRequest)
5010 oo.mutexHighPrioTxQueue.Unlock()
5011 } else {
5012 oo.mutexLowPrioTxQueue.Lock()
5013 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
5014 oo.mutexLowPrioTxQueue.Unlock()
5015 }
pnalmasc6e916a2025-06-30 11:59:16 +05305016
5017 //Register the call back again as we clean up the Map entry when we failed to send the message .
5018 oo.mutexRxSchedMap.Lock()
5019 oo.rxSchedulerMap[aOmciTxRequest.cbPair.CbKey] = aOmciTxRequest.cbPair.CbEntry
5020 oo.mutexRxSchedMap.Unlock()
5021
Holger Hildebrandt34555512021-10-01 16:26:59 +00005022 go oo.sendQueuedRequests(ctx)
mpagenko7455fd42021-06-10 16:25:55 +00005023
5024 select {
5025 case success := <-chSuccess:
5026 if success {
5027 logger.Debugw(ctx, "reqMon: response received in time",
5028 log.Fields{"tid": tid, "device-id": oo.deviceID})
5029 } else {
5030 logger.Debugw(ctx, "reqMon: wait for response aborted",
5031 log.Fields{"tid": tid, "device-id": oo.deviceID})
5032 }
5033 break loop
5034 case <-time.After(time.Duration(aTimeout) * time.Second):
5035 if retryCounter == retries {
Holger Hildebrandt2b107642022-12-09 07:56:23 +00005036 if oo.pBaseDeviceHandler.IsOltAvailable() {
5037 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - send ONU device event!",
5038 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
5039 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationFailureConfig, OnuOmciCommunicationFailureConfigDesc)
5040 } else {
5041 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - skip ONU device event: OLT unavailable!",
5042 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
5043 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005044 oo.incrementTxTimesouts()
mpagenko7455fd42021-06-10 16:25:55 +00005045 break loop
5046 } else {
5047 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
5048 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005049 oo.incrementTxRetries()
mpagenko7455fd42021-06-10 16:25:55 +00005050 }
balaji.nagarajan3cab2b62025-06-23 15:44:54 +05305051 case _, ok := <-oo.pBaseDeviceHandler.GetDeviceDeleteCommChan(ctx):
5052 if !ok {
5053 logger.Warnw(ctx, "device deletion channel is closed at sendWithRxSupervision", log.Fields{"device-id": oo.deviceID})
5054 break loop
5055 }
mpagenko7455fd42021-06-10 16:25:55 +00005056 }
5057 retryCounter++
5058 }
5059 oo.mutexMonReq.Lock()
5060 delete(oo.monitoredRequests, tid)
5061 oo.mutexMonReq.Unlock()
5062}
5063
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05305064// CancelRequestMonitoring terminates monitoring of outstanding omci requests
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005065func (oo *OmciCC) CancelRequestMonitoring(ctx context.Context) {
Holger Hildebrandt12609a12022-03-25 13:23:25 +00005066 logger.Debugw(ctx, "CancelRequestMonitoring entered", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005067 oo.mutexMonReq.RLock()
5068 for k := range oo.monitoredRequests {
mpagenko8cd1bf72021-06-22 10:11:19 +00005069 //implement non-blocking channel send to avoid blocking on mutexMonReq later
5070 select {
5071 case oo.monitoredRequests[k].chSuccess <- false:
Holger Hildebrandt12609a12022-03-25 13:23:25 +00005072 logger.Debugw(ctx, "send cancellation on omciRespChannel",
5073 log.Fields{"index": k, "device-id": oo.deviceID})
mpagenko8cd1bf72021-06-22 10:11:19 +00005074 default:
Holger Hildebrandt12609a12022-03-25 13:23:25 +00005075 logger.Debugw(ctx, "cancellation could not be send on omciRespChannel (no receiver)",
5076 log.Fields{"index": k, "device-id": oo.deviceID})
mpagenko8cd1bf72021-06-22 10:11:19 +00005077 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005078 }
5079 oo.mutexMonReq.RUnlock()
5080}
5081
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05305082// GetMaxOmciTimeoutWithRetries provides a timeout value greater than the maximum
5083// time consumed for retry processing of a particular OMCI-request
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005084func (oo *OmciCC) GetMaxOmciTimeoutWithRetries() time.Duration {
5085 return time.Duration((CDefaultRetries+1)*oo.pBaseDeviceHandler.GetOmciTimeout() + 1)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005086}
Himani Chawla43f95ff2021-06-03 00:24:12 +05305087
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005088// SendCreateOrDeleteEthernetFrameExtendedPMME deletes EthernetFrameExtendedPm ME instance
5089func (oo *OmciCC) SendCreateOrDeleteEthernetFrameExtendedPMME(ctx context.Context, timeout int, highPrio bool,
Himani Chawla43f95ff2021-06-03 00:24:12 +05305090 upstream bool, create bool, rxChan chan Message, entityID uint16, classID me.ClassID, controlBlock []uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005091 tid := oo.GetNextTid(highPrio)
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05305092 logger.Info(ctx, "send-ethernet-frame-extended-pm-me-msg:", log.Fields{"device-id": oo.deviceID,
Himani Chawla43f95ff2021-06-03 00:24:12 +05305093 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
5094
5095 meParam := me.ParamData{EntityID: entityID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00005096 Attributes: me.AttributeValueMap{me.EthernetFrameExtendedPm_ControlBlock: controlBlock},
Himani Chawla43f95ff2021-06-03 00:24:12 +05305097 }
5098 var meInstance *me.ManagedEntity
5099 var omciErr me.OmciErrors
5100 if classID == me.EthernetFrameExtendedPmClassID {
5101 meInstance, omciErr = me.NewEthernetFrameExtendedPm(meParam)
5102 } else {
5103 meInstance, omciErr = me.NewEthernetFrameExtendedPm64Bit(meParam)
5104 }
5105
5106 if omciErr.GetError() == nil {
5107 var omciLayer *omci.OMCI
5108 var msgLayer gopacket.SerializableLayer
5109 var err error
5110 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00005111 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
5112 oframe.AddDefaults(true))
Himani Chawla43f95ff2021-06-03 00:24:12 +05305113 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00005114 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
5115 oframe.AddDefaults(true))
Himani Chawla43f95ff2021-06-03 00:24:12 +05305116 }
5117 if err != nil {
5118 logger.Errorw(ctx, "cannot-encode-ethernet-frame-extended-pm-me",
5119 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5120 return nil, err
5121 }
5122
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00005123 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Himani Chawla43f95ff2021-06-03 00:24:12 +05305124 if err != nil {
5125 logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me",
5126 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5127 return nil, err
5128 }
5129
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005130 omciRxCallbackPair := CallbackPair{CbKey: tid,
5131 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Himani Chawla43f95ff2021-06-03 00:24:12 +05305132 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005133 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawla43f95ff2021-06-03 00:24:12 +05305134 if err != nil {
5135 logger.Errorw(ctx, "Cannot send ethernet-frame-extended-pm-me",
5136 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5137 return nil, err
5138 }
5139 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-done",
5140 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5141 return meInstance, nil
5142 }
5143 logger.Errorw(ctx, "cannot-generate-ethernet-frame-extended-pm-me-instance",
5144 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5145 return nil, omciErr.GetError()
5146}
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005147
5148// RLockMutexMonReq lock read access to monitoredRequests
5149func (oo *OmciCC) RLockMutexMonReq() {
5150 oo.mutexMonReq.RLock()
5151}
5152
5153// RUnlockMutexMonReq unlock read access to monitoredRequests
5154func (oo *OmciCC) RUnlockMutexMonReq() {
5155 oo.mutexMonReq.RUnlock()
5156}
5157
5158// GetMonitoredRequest get OmciTransferStructure for an omciTransID
5159func (oo *OmciCC) GetMonitoredRequest(omciTransID uint16) (value OmciTransferStructure, exist bool) {
5160 value, exist = oo.monitoredRequests[omciTransID]
5161 return value, exist
5162}
5163
5164// SetChMonitoredRequest sets chSuccess to indicate whether response was received or not
5165func (oo *OmciCC) SetChMonitoredRequest(omciTransID uint16, chVal bool) {
5166 oo.monitoredRequests[omciTransID].chSuccess <- chVal
5167}
Himani Chawlaee10b542021-09-20 16:46:40 +05305168
5169// SendSetEthernetFrameExtendedPMME sends the set request for ethernet frame extended type me
5170func (oo *OmciCC) SendSetEthernetFrameExtendedPMME(ctx context.Context, timeout int, highPrio bool,
5171 rxChan chan Message, entityID uint16, classID me.ClassID, controlBlock []uint16) (*me.ManagedEntity, error) {
5172 tid := oo.GetNextTid(highPrio)
5173 logger.Debugw(ctx, "send-set-ethernet-frame-extended-pm-me-control-block:", log.Fields{"device-id": oo.deviceID,
5174 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16)})
5175
5176 meParams := me.ParamData{EntityID: entityID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00005177 Attributes: me.AttributeValueMap{me.EthernetFrameExtendedPm_ControlBlock: controlBlock},
Himani Chawlaee10b542021-09-20 16:46:40 +05305178 }
5179 var meInstance *me.ManagedEntity
5180 var omciErr me.OmciErrors
5181 if classID == me.EthernetFrameExtendedPmClassID {
5182 meInstance, omciErr = me.NewEthernetFrameExtendedPm(meParams)
5183 } else {
5184 meInstance, omciErr = me.NewEthernetFrameExtendedPm64Bit(meParams)
5185 }
5186
5187 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00005188 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Himani Chawlaee10b542021-09-20 16:46:40 +05305189 if err != nil {
5190 logger.Errorw(ctx, "cannot-encode-ethernet-frame-extended-pm-me",
5191 log.Fields{"err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5192 return nil, err
5193 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00005194 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Himani Chawlaee10b542021-09-20 16:46:40 +05305195 if err != nil {
5196 logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me-set-msg",
5197 log.Fields{"err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5198 return nil, err
5199 }
5200 omciRxCallbackPair := CallbackPair{
5201 CbKey: tid,
5202 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
5203 }
5204 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
5205 if err != nil {
5206 logger.Errorw(ctx, "Cannot send ethernet-frame-extended-pm-me",
5207 log.Fields{"Err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5208 return nil, err
5209 }
5210 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-set-msg-done",
5211 log.Fields{"device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5212 return meInstance, nil
5213 }
5214 logger.Errorw(ctx, "cannot-generate-ethernet-frame-extended-pm-me-instance",
5215 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5216 return nil, omciErr.GetError()
5217}
Holger Hildebrandte7cc6092022-02-01 11:37:03 +00005218
5219// PrepareForGarbageCollection - remove references to prepare for garbage collection
5220func (oo *OmciCC) PrepareForGarbageCollection(ctx context.Context, aDeviceID string) {
5221 logger.Debugw(ctx, "prepare for garbage collection", log.Fields{"device-id": aDeviceID})
5222 oo.pBaseDeviceHandler = nil
5223 oo.pOnuDeviceEntry = nil
5224 oo.pOnuAlarmManager = nil
5225}
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005226
5227// GetOmciCounters - TODO: add comment
5228func (oo *OmciCC) GetOmciCounters() *extension.SingleGetValueResponse {
5229 oo.mutexCounters.RLock()
5230 defer oo.mutexCounters.RUnlock()
5231 resp := extension.SingleGetValueResponse{
5232 Response: &extension.GetValueResponse{
5233 Status: extension.GetValueResponse_OK,
5234 Response: &extension.GetValueResponse_OnuOmciStats{
5235 OnuOmciStats: &extension.GetOnuOmciTxRxStatsResponse{},
5236 },
5237 },
5238 }
5239 resp.Response.GetOnuOmciStats().BaseTxArFrames = oo.countersBase.txArFrames
5240 resp.Response.GetOnuOmciStats().BaseTxNoArFrames = oo.countersBase.txNoArFrames
5241 resp.Response.GetOnuOmciStats().BaseRxAkFrames = oo.countersBase.rxAkFrames
5242 resp.Response.GetOnuOmciStats().BaseRxNoAkFrames = oo.countersBase.rxNoAkFrames
5243 resp.Response.GetOnuOmciStats().ExtTxArFrames = oo.countersExt.txArFrames
5244 resp.Response.GetOnuOmciStats().ExtTxNoArFrames = oo.countersExt.txNoArFrames
5245 resp.Response.GetOnuOmciStats().ExtRxAkFrames = oo.countersExt.rxAkFrames
5246 resp.Response.GetOnuOmciStats().ExtRxNoAkFrames = oo.countersExt.rxNoAkFrames
5247 resp.Response.GetOnuOmciStats().TxOmciCounterRetries = oo.txRetries
5248 resp.Response.GetOnuOmciStats().TxOmciCounterTimeouts = oo.txTimeouts
5249 return &resp
5250}
5251
5252// For more speed, separate functions for each counter
5253
5254func (oo *OmciCC) incrementBaseTxArFrames() {
5255 oo.mutexCounters.Lock()
5256 defer oo.mutexCounters.Unlock()
5257 oo.countersBase.txArFrames++
5258}
5259
5260func (oo *OmciCC) incrementExtTxArFrames() {
5261 oo.mutexCounters.Lock()
5262 defer oo.mutexCounters.Unlock()
5263 oo.countersExt.txArFrames++
5264}
5265
5266func (oo *OmciCC) incrementBaseRxAkFrames() {
5267 oo.mutexCounters.Lock()
5268 defer oo.mutexCounters.Unlock()
5269 oo.countersBase.rxAkFrames++
5270}
5271
5272func (oo *OmciCC) incrementExtRxAkFrames() {
5273 oo.mutexCounters.Lock()
5274 defer oo.mutexCounters.Unlock()
5275 oo.countersExt.rxAkFrames++
5276}
5277
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +05305278//nolint:unparam
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005279func (oo *OmciCC) increaseBaseTxNoArFramesBy(ctx context.Context, value uint32) {
5280 oo.mutexCounters.Lock()
5281 defer oo.mutexCounters.Unlock()
5282 oo.countersBase.txNoArFrames += value
5283}
5284
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +05305285//nolint:unparam
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005286func (oo *OmciCC) increaseExtTxNoArFramesBy(ctx context.Context, value uint32) {
5287 oo.mutexCounters.Lock()
5288 defer oo.mutexCounters.Unlock()
5289 oo.countersExt.txNoArFrames += value
5290}
5291
5292func (oo *OmciCC) incrementBaseRxNoAkFrames() {
5293 oo.mutexCounters.Lock()
5294 defer oo.mutexCounters.Unlock()
5295 oo.countersBase.rxNoAkFrames++
5296}
5297
5298func (oo *OmciCC) incrementExtRxNoAkFrames() {
5299 oo.mutexCounters.Lock()
5300 defer oo.mutexCounters.Unlock()
5301 oo.countersExt.rxNoAkFrames++
5302}
5303
5304func (oo *OmciCC) incrementTxRetries() {
5305 oo.mutexCounters.Lock()
5306 defer oo.mutexCounters.Unlock()
5307 oo.txRetries++
5308}
5309
5310func (oo *OmciCC) incrementTxTimesouts() {
5311 oo.mutexCounters.Lock()
5312 defer oo.mutexCounters.Unlock()
5313 oo.txTimeouts++
5314}
Holger Hildebrandt7e138462023-03-29 12:12:14 +00005315
5316// NotifyAboutOnuConfigFailure - trigger ONU DeviceEvent to notify about ONU config failure
5317func (oo *OmciCC) NotifyAboutOnuConfigFailure(ctx context.Context, errID string, meClassID me.ClassID, meEntityID uint16,
5318 meName string, meResult me.Results) {
5319 var description string
5320 if !oo.confFailMeAlreadyHandled(meClassID) {
5321 switch errID {
5322 case OnuConfigFailureResponseErr:
5323 description = OnuConfigFailureResponseErrDesc + meResult.String() +
5324 ", OMCI ME: " + meName + " / instance: " + fmt.Sprintf("%d", meEntityID) + " (only first instance reported)"
5325 case OnuConfigFailureTimeout:
5326 description = OnuConfigFailureTimeoutDesc + meName + " / instance: " + fmt.Sprintf("%d", meEntityID) +
5327 " (only first instance reported)"
5328 default:
5329 logger.Warnw(ctx, "method called with undefined errID", log.Fields{"errID": errID, "device-id": oo.deviceID})
5330 return
5331 }
5332 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, errID, description)
5333 oo.appendConfFailMe(meClassID)
5334 }
5335}
5336
5337func (oo *OmciCC) confFailMeAlreadyHandled(meClassID me.ClassID) bool {
5338 oo.mutexConfFailMEs.RLock()
5339 defer oo.mutexConfFailMEs.RUnlock()
5340 for _, v := range oo.confFailMEs {
5341 if v == meClassID {
5342 return true
5343 }
5344 }
5345 return false
5346}
5347
5348func (oo *OmciCC) appendConfFailMe(meClassID me.ClassID) {
5349 oo.mutexConfFailMEs.Lock()
5350 defer oo.mutexConfFailMEs.Unlock()
5351 oo.confFailMEs = append(oo.confFailMEs, meClassID)
5352}
5353
5354// ResetConfFailMEs - reset list of stored config failure MEs
5355func (oo *OmciCC) ResetConfFailMEs() {
5356 oo.mutexConfFailMEs.Lock()
5357 defer oo.mutexConfFailMEs.Unlock()
5358 oo.confFailMEs = nil
5359}