blob: 5984c3d2b7cf21865844febc9535b22e79241c2a [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()
balaji.nagarajan80f6fb82026-01-13 16:48:05 +0530643
644 if oo.pBaseDeviceHandler == nil {
645 logger.Warnw(ctx, "device handler is nil - abort sendQueuedHighPrioRequests", log.Fields{"device-id": oo.deviceID})
646 return nil
647 } else if oo.pBaseDeviceHandler.GetDeletionInProgress() {
648 logger.Warnw(ctx, "device deletion in progress - abort sendQueuedHighPrioRequests", log.Fields{"device-id": oo.deviceID})
649 return nil
650 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000651 for oo.highPrioTxQueue.Len() > 0 {
balaji.nagarajan3cab2b62025-06-23 15:44:54 +0530652 select {
653 case _, ok := <-oo.pBaseDeviceHandler.GetDeviceDeleteCommChan(ctx):
654 if !ok {
655 return fmt.Errorf("device deletion channel is closed at sendQueuedHighPrioRequests %s", oo.deviceID)
656 }
657 default:
658 queueElement := oo.highPrioTxQueue.Front() // First element
659 if err := oo.sendOMCIRequest(ctx, queueElement.Value.(OmciTransferStructure)); err != nil {
660 // Element will be removed from the queue regardless of the send success, to prevent
661 // an accumulation of send requests for the same message in the event of an error.
662 // In this case, resend attempts for the message are ensured by our retry
663 // mechanism after omci-timeout.
664 oo.highPrioTxQueue.Remove(queueElement) // Dequeue
665 //Remove the call back from the rxSchedulerMap
666 oo.mutexRxSchedMap.Lock()
667 delete(oo.rxSchedulerMap, queueElement.Value.(OmciTransferStructure).cbPair.CbKey)
668 oo.mutexRxSchedMap.Unlock()
669 return err
670 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000671 oo.highPrioTxQueue.Remove(queueElement) // Dequeue
mpagenko80622a52021-02-09 16:53:23 +0000672 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000673 }
674 return nil
675}
676
677func (oo *OmciCC) sendQueuedLowPrioRequests(ctx context.Context) error {
678 oo.mutexLowPrioTxQueue.Lock()
balaji.nagarajan80f6fb82026-01-13 16:48:05 +0530679
680 if oo.pBaseDeviceHandler == nil {
681 logger.Warnw(ctx, "device handler is nil - abort sendQueuedLowPrioRequests", log.Fields{"device-id": oo.deviceID})
682 return nil
683 } else if oo.pBaseDeviceHandler.GetDeletionInProgress() {
684 logger.Warnw(ctx, "device deletion in progress - abort sendQueuedLowPrioRequests", log.Fields{"device-id": oo.deviceID})
685 return nil
686 }
687
Holger Hildebrandt34555512021-10-01 16:26:59 +0000688 for oo.lowPrioTxQueue.Len() > 0 {
balaji.nagarajan3cab2b62025-06-23 15:44:54 +0530689 select {
690 case _, ok := <-oo.pBaseDeviceHandler.GetDeviceDeleteCommChan(ctx):
691 if !ok {
kesavand011d5162021-11-25 19:21:06 +0530692 oo.mutexLowPrioTxQueue.Unlock()
balaji.nagarajan3cab2b62025-06-23 15:44:54 +0530693 return fmt.Errorf("device deletion channel is closed at sendQueuedLowPrioRequests %s", oo.deviceID)
694 }
695 default:
696 queueElement := oo.lowPrioTxQueue.Front() // First element
697 // check if the element is for onu sw section
698 aOmciTxReq := queueElement.Value.(OmciTransferStructure)
699 if aOmciTxReq.OnuSwWindow != nil {
700 if err := oo.sendOnuSwSectionsOfWindow(ctx, aOmciTxReq); err != nil {
701 // Element will be removed from the queue regardless of the send success, to prevent
702 // an accumulation of send requests for the same message in the event of an error.
703 // In this case, resend attempts for the message are ensured by our retry
704 // mechanism after omci-timeout.
705 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
706 oo.mutexLowPrioTxQueue.Unlock()
707 //Remove the call back from the rxSchedulerMap
708 oo.mutexRxSchedMap.Lock()
709 delete(oo.rxSchedulerMap, queueElement.Value.(OmciTransferStructure).cbPair.CbKey)
710 oo.mutexRxSchedMap.Unlock()
711 return err
712 }
713 } else {
714 err := oo.sendOMCIRequest(ctx, queueElement.Value.(OmciTransferStructure))
715 if err != nil {
716 // Element will be removed from the queue regardless of the send success, to prevent
717 // an accumulation of send requests for the same message in the event of an error.
718 // In this case, resend attempts for the message are ensured by our retry
719 // mechanism after omci-timeout.
720 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
721 oo.mutexLowPrioTxQueue.Unlock()
722 oo.mutexRxSchedMap.Lock()
723 delete(oo.rxSchedulerMap, queueElement.Value.(OmciTransferStructure).cbPair.CbKey)
724 oo.mutexRxSchedMap.Unlock()
725 return err
726 }
727 }
728 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
729 // Interrupt the sending of low priority requests to process any high priority requests
730 // that may have arrived in the meantime
731 oo.mutexLowPrioTxQueue.Unlock()
732 if err := oo.sendQueuedHighPrioRequests(ctx); err != nil {
kesavand011d5162021-11-25 19:21:06 +0530733 return err
734 }
balaji.nagarajan3cab2b62025-06-23 15:44:54 +0530735 oo.mutexLowPrioTxQueue.Lock()
amit.ghosh58b704b2021-06-18 03:45:52 +0200736 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000737 }
738
739 oo.mutexLowPrioTxQueue.Unlock()
740 return nil
741}
742
743func (oo *OmciCC) sendOMCIRequest(ctx context.Context, omciTxRequest OmciTransferStructure) error {
744 if omciTxRequest.withFramePrint {
745 logger.Debugw(ctx, "omci-message-to-send:", log.Fields{
746 "TxOmciMessage": hex.EncodeToString(omciTxRequest.txFrame),
747 "device-id": oo.deviceID,
748 "toDeviceType": oo.pBaseDeviceHandler.GetProxyAddressType(),
749 "proxyDeviceID": oo.pBaseDeviceHandler.GetProxyAddressID(),
750 "proxyAddress": oo.pBaseDeviceHandler.GetProxyAddress()})
751 }
khenaidoo42dcdfd2021-10-19 17:34:12 -0400752 omciMsg := &ia.OmciMessage{
Holger Hildebrandt34555512021-10-01 16:26:59 +0000753 ParentDeviceId: oo.pBaseDeviceHandler.GetProxyAddressID(),
754 ChildDeviceId: oo.deviceID,
755 Message: omciTxRequest.txFrame,
756 ProxyAddress: oo.pBaseDeviceHandler.GetProxyAddress(),
757 ConnectStatus: common.ConnectStatus_REACHABLE, // If we are sending OMCI messages means we are connected, else we should not be here
758 }
759 sendErr := oo.pBaseDeviceHandler.SendOMCIRequest(ctx, oo.pBaseDeviceHandler.GetProxyAddress().AdapterEndpoint, omciMsg)
760 if sendErr != nil {
Holger Hildebrandtabfef032022-02-25 12:40:20 +0000761 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 +0000762 return sendErr
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000763 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000764 if omciTxRequest.txFrame[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
765 oo.incrementBaseTxArFrames()
766 } else {
767 oo.incrementExtTxArFrames()
768 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000769 return nil
770}
771
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000772// GetNextTid - TODO: add comment
773func (oo *OmciCC) GetNextTid(highPriority bool) uint16 {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000774 var next uint16
775 if highPriority {
mpagenko900ee4b2020-10-12 11:56:34 +0000776 oo.mutexHpTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000777 next = oo.hpTid
Himani Chawla4d908332020-08-31 12:30:20 +0530778 oo.hpTid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000779 if oo.hpTid < 0x8000 {
780 oo.hpTid = 0x8000
781 }
mpagenko900ee4b2020-10-12 11:56:34 +0000782 oo.mutexHpTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000783 } else {
mpagenko900ee4b2020-10-12 11:56:34 +0000784 oo.mutexTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000785 next = oo.tid
Himani Chawla4d908332020-08-31 12:30:20 +0530786 oo.tid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000787 if oo.tid >= 0x8000 {
788 oo.tid = 1
789 }
mpagenko900ee4b2020-10-12 11:56:34 +0000790 oo.mutexTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000791 }
792 return next
793}
794
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530795// GetOnuSwSecNextTid get the next low prio tid for the onu sw sections
796// onu sw sections uses only low priority tids
797// The mutexTid lock should be taken prior to using this function
kesavand011d5162021-11-25 19:21:06 +0530798func (oo *OmciCC) GetOnuSwSecNextTid() uint16 {
kesavand011d5162021-11-25 19:21:06 +0530799 if oo.tid >= 0x8000 {
800 oo.tid = 1
801 }
bseenivad32c2742024-12-09 11:46:17 +0530802 next := oo.tid
803 oo.tid++
kesavand011d5162021-11-25 19:21:06 +0530804 return next
805}
806
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530807// GetOnuSwSecLastTid gets the last allocated tid
808// The mutexTid lock should be taken prior to using this function
kesavand011d5162021-11-25 19:21:06 +0530809func (oo *OmciCC) GetOnuSwSecLastTid() uint16 {
810 next := oo.tid
811 lastAllocatedTid := next - 1
812 return lastAllocatedTid
813}
814
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530815// LockMutexTID locks mutexTid
kesavand011d5162021-11-25 19:21:06 +0530816func (oo *OmciCC) LockMutexTID() {
817 oo.mutexTid.Lock()
818}
819
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530820// UnLockMutexTID unlocks mutexTid
kesavand011d5162021-11-25 19:21:06 +0530821func (oo *OmciCC) UnLockMutexTID() {
822 oo.mutexTid.Unlock()
823}
824
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000825// ###################################################################################
826// # utility methods provided to work on OMCI messages
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000827
828// Serialize - TODO: add comment
829func Serialize(ctx context.Context, msgType omci.MessageType, request gopacket.SerializableLayer, tid uint16) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000830 omciLayer := &omci.OMCI{
831 TransactionID: tid,
832 MessageType: msgType,
833 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000834 return SerializeOmciLayer(ctx, omciLayer, request)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000835}
836
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000837// SerializeOmciLayer - TODO: add comment
838func SerializeOmciLayer(ctx context.Context, aOmciLayer *omci.OMCI, aRequest gopacket.SerializableLayer) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000839 var options gopacket.SerializeOptions
840 options.FixLengths = true
841
842 buffer := gopacket.NewSerializeBuffer()
Himani Chawla4d908332020-08-31 12:30:20 +0530843 err := gopacket.SerializeLayers(buffer, options, aOmciLayer, aRequest)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000844 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000845 logger.Errorw(ctx, "Could not create goPacket Omci serial buffer", log.Fields{"Err": err})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000846 return nil, err
847 }
848 return buffer.Bytes(), nil
849}
850
Himani Chawla4d908332020-08-31 12:30:20 +0530851/*
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000852func hexEncode(omciPkt []byte) ([]byte, error) {
853 dst := make([]byte, hex.EncodedLen(len(omciPkt)))
854 hex.Encode(dst, omciPkt)
855 return dst, nil
856}
Himani Chawla4d908332020-08-31 12:30:20 +0530857*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000858
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530859// supply a response handler for omci response messages to be transferred to the requested FSM
mgoudad611f4c2025-10-30 14:49:27 +0530860func (oo *OmciCC) receiveOmciResponse(ctx context.Context, omciMsg *omci.OMCI, packet *gopacket.Packet, respChan chan Message) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000861
dbainbri4d3a0dc2020-12-02 00:33:42 +0000862 logger.Debugw(ctx, "omci-message-response - transfer on omciRespChannel", log.Fields{"omciMsgType": omciMsg.MessageType,
divyadesai4d299552020-08-18 07:13:49 +0000863 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000864
865 if oo.pOnuDeviceEntry == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000866 logger.Errorw(ctx, "Abort receiving OMCI response, DeviceEntryPointer is nil", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000867 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200868 return fmt.Errorf("deviceEntryPointer is nil %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000869 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000870 oo.mutexMonReq.RLock()
871 if _, exist := oo.monitoredRequests[omciMsg.TransactionID]; exist {
mpagenko8cd1bf72021-06-22 10:11:19 +0000872 //implement non-blocking channel send to avoid blocking on mutexMonReq later
873 select {
874 case oo.monitoredRequests[omciMsg.TransactionID].chSuccess <- true:
875 default:
876 logger.Debugw(ctx, "response not send on omciRespChannel (no receiver)", log.Fields{
877 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
878 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000879 } else {
880 logger.Infow(ctx, "reqMon: map entry does not exist!",
881 log.Fields{"tid": omciMsg.TransactionID, "device-id": oo.deviceID})
882 }
883 oo.mutexMonReq.RUnlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000884
885 // no further test on SeqNo is done here, assignment from rxScheduler is trusted
886 // MibSync responses are simply transferred via deviceEntry to MibSync, no specific analysis here
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000887 omciRespMsg := Message{
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000888 Type: OMCI,
889 Data: OmciMessage{
890 OmciMsg: omciMsg,
891 OmciPacket: packet,
892 },
893 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000894 //logger.Debugw(ctx,"Message to be sent into channel:", log.Fields{"mibSyncMsg": mibSyncMsg})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000895 respChan <- omciRespMsg
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000896
897 return nil
898}
899
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000900// SendMibReset sends MibResetRequest
901func (oo *OmciCC) SendMibReset(ctx context.Context, timeout int, highPrio bool) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000902
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530903 logger.Infow(ctx, "send MibReset-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000904 request := &omci.MibResetRequest{
905 MeBasePacket: omci.MeBasePacket{
906 EntityClass: me.OnuDataClassID,
907 },
908 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000909 tid := oo.GetNextTid(highPrio)
910 pkt, err := Serialize(ctx, omci.MibResetRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000911 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000912 logger.Errorw(ctx, "Cannot serialize MibResetRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000913 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000914 return err
915 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000916 omciRxCallbackPair := CallbackPair{
917 CbKey: tid,
918 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000919 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000920 return oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000921}
922
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000923// SendReboot sends RebootRequest
924func (oo *OmciCC) SendReboot(ctx context.Context, timeout int, highPrio bool, responseChannel chan Message) error {
925 logger.Debugw(ctx, "send reboot-msg to:", log.Fields{"device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300926 request := &omci.RebootRequest{
927 MeBasePacket: omci.MeBasePacket{
928 EntityClass: me.OnuGClassID,
929 },
930 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000931 tid := oo.GetNextTid(highPrio)
932 pkt, err := Serialize(ctx, omci.RebootRequestType, request, tid)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300933 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000934 logger.Errorw(ctx, "Cannot serialize RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000935 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300936 return err
937 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000938 omciRxCallbackPair := CallbackPair{
939 CbKey: tid,
940 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetOmciRebootMsgRevChan(), oo.receiveOmciResponse, true},
ozgecanetsiae11479f2020-07-06 09:44:47 +0300941 }
942
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000943 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300944 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000945 logger.Errorw(ctx, "Cannot send RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000946 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300947 return err
948 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000949 err = oo.pOnuDeviceEntry.WaitForRebootResponse(ctx, responseChannel)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300950 if err != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000951 logger.Errorw(ctx, "aborting ONU reboot!", log.Fields{
Andrea Campanella6515c582020-10-05 11:25:00 +0200952 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300953 return err
954 }
955 return nil
956}
957
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000958// SendMibUpload sends MibUploadRequest
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000959func (oo *OmciCC) SendMibUpload(ctx context.Context, timeout int, highPrio bool, isExtOmciSupported bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000960 logger.Debugw(ctx, "send MibUpload-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000961
962 tid := oo.GetNextTid(highPrio)
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000963
964 omciLayer := &omci.OMCI{
965 TransactionID: tid,
966 MessageType: omci.MibUploadRequestType,
967 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000968 if isExtOmciSupported {
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000969 omciLayer.DeviceIdentifier = omci.ExtendedIdent
970 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000971 request := &omci.MibUploadRequest{
972 MeBasePacket: omci.MeBasePacket{
973 EntityClass: me.OnuDataClassID,
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000974 Extended: isExtOmciSupported,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000975 },
976 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000977 var options gopacket.SerializeOptions
978 options.FixLengths = true
979
980 buffer := gopacket.NewSerializeBuffer()
981 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000982 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000983 logger.Errorw(ctx, "Cannot serialize MibUploadRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000984 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000985 return err
986 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000987 oo.UploadSequNo = 0
988 oo.UploadNoOfCmds = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000989
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000990 omciRxCallbackPair := CallbackPair{
991 CbKey: tid,
992 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000993 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000994 return oo.Send(ctx, buffer.Bytes(), timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000995}
996
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000997// SendMibUploadNext sends MibUploadNextRequest
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000998func (oo *OmciCC) SendMibUploadNext(ctx context.Context, timeout int, highPrio bool, isExtOmciSupported bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000999 logger.Debugw(ctx, "send MibUploadNext-msg to:", log.Fields{"device-id": oo.deviceID, "UploadSequNo": oo.UploadSequNo})
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +00001000
1001 tid := oo.GetNextTid(highPrio)
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +00001002
1003 omciLayer := &omci.OMCI{
1004 TransactionID: tid,
1005 MessageType: omci.MibUploadNextRequestType,
1006 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00001007 if isExtOmciSupported {
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +00001008 omciLayer.DeviceIdentifier = omci.ExtendedIdent
1009 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001010 request := &omci.MibUploadNextRequest{
1011 MeBasePacket: omci.MeBasePacket{
1012 EntityClass: me.OnuDataClassID,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00001013 Extended: isExtOmciSupported,
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001014 },
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001015 CommandSequenceNumber: oo.UploadSequNo,
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001016 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +00001017 var options gopacket.SerializeOptions
1018 options.FixLengths = true
1019
1020 buffer := gopacket.NewSerializeBuffer()
1021 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001022 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001023 logger.Errorw(ctx, "Cannot serialize MibUploadNextRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001024 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001025 return err
1026 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001027 oo.UploadSequNo++
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001028
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001029 omciRxCallbackPair := CallbackPair{
1030 CbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001031 //frame printing for MibUpload frames disabled now per default to avoid log file abort situations (size/speed?)
1032 // if wanted, rx frame printing should be specifically done within the MibUpload FSM or controlled via extra parameter
1033 // compare also software upgrade download section handling
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001034 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001035 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +00001036 return oo.Send(ctx, buffer.Bytes(), timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001037}
1038
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001039// SendGetAllAlarm gets all alarm ME instances
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001040func (oo *OmciCC) SendGetAllAlarm(ctx context.Context, alarmRetreivalMode uint8, timeout int, highPrio bool, isExtendedOmci bool) error {
Himani Chawlad3dac422021-03-13 02:31:31 +05301041 logger.Debugw(ctx, "send GetAllAlarms-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001042
1043 tid := oo.GetNextTid(highPrio)
1044 omciLayer := &omci.OMCI{
1045 TransactionID: tid,
1046 MessageType: omci.GetAllAlarmsRequestType,
1047 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1048 }
1049 if isExtendedOmci {
1050 omciLayer.DeviceIdentifier = omci.ExtendedIdent
1051 }
Himani Chawlad3dac422021-03-13 02:31:31 +05301052 request := &omci.GetAllAlarmsRequest{
1053 MeBasePacket: omci.MeBasePacket{
1054 EntityClass: me.OnuDataClassID,
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001055 Extended: isExtendedOmci,
Himani Chawlad3dac422021-03-13 02:31:31 +05301056 },
1057 AlarmRetrievalMode: byte(alarmRetreivalMode),
1058 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001059 var options gopacket.SerializeOptions
1060 options.FixLengths = true
1061 buffer := gopacket.NewSerializeBuffer()
1062 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Himani Chawlad3dac422021-03-13 02:31:31 +05301063 if err != nil {
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001064 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsRequest", log.Fields{"Err": err,
1065 "device-id": oo.deviceID})
Himani Chawlad3dac422021-03-13 02:31:31 +05301066 return err
1067 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001068 outgoingPacket := buffer.Bytes()
1069
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001070 oo.pOnuAlarmManager.ResetAlarmUploadCounters()
Himani Chawlad3dac422021-03-13 02:31:31 +05301071
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001072 omciRxCallbackPair := CallbackPair{
1073 CbKey: tid,
1074 CbEntry: CallbackPairEntry{oo.pOnuAlarmManager.GetAlarmMgrEventChannel(), oo.receiveOmciResponse, true},
Himani Chawlad3dac422021-03-13 02:31:31 +05301075 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001076 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
1077 if err != nil {
1078 logger.Errorw(ctx, "Cannot send GetAllAlarmsRequest", log.Fields{"Err": err,
1079 "device-id": oo.deviceID})
1080 return err
1081 }
1082 logger.Debug(ctx, "send GetAllAlarmsRequest done")
1083 return nil
Himani Chawlad3dac422021-03-13 02:31:31 +05301084}
1085
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001086// SendGetAllAlarmNext gets next alarm ME instance
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001087func (oo *OmciCC) SendGetAllAlarmNext(ctx context.Context, timeout int, highPrio bool, isExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001088 alarmUploadSeqNo := oo.pOnuAlarmManager.GetAlarmUploadSeqNo()
1089 logger.Debugw(ctx, "send SendGetAllAlarmNext-msg to:", log.Fields{"device-id": oo.deviceID,
Himani Chawlad3dac422021-03-13 02:31:31 +05301090 "alarmUploadSeqNo": alarmUploadSeqNo})
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001091
1092 tid := oo.GetNextTid(highPrio)
1093 omciLayer := &omci.OMCI{
1094 TransactionID: tid,
1095 MessageType: omci.GetAllAlarmsNextRequestType,
1096 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1097 }
1098 if isExtendedOmci {
1099 omciLayer.DeviceIdentifier = omci.ExtendedIdent
1100 }
Himani Chawlad3dac422021-03-13 02:31:31 +05301101 request := &omci.GetAllAlarmsNextRequest{
1102 MeBasePacket: omci.MeBasePacket{
1103 EntityClass: me.OnuDataClassID,
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001104 Extended: isExtendedOmci,
Himani Chawlad3dac422021-03-13 02:31:31 +05301105 },
1106 CommandSequenceNumber: alarmUploadSeqNo,
1107 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001108 var options gopacket.SerializeOptions
1109 options.FixLengths = true
1110 buffer := gopacket.NewSerializeBuffer()
1111 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Himani Chawlad3dac422021-03-13 02:31:31 +05301112 if err != nil {
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001113 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsNextRequest", log.Fields{"Err": err,
1114 "device-id": oo.deviceID})
Himani Chawlad3dac422021-03-13 02:31:31 +05301115 return err
1116 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001117 outgoingPacket := buffer.Bytes()
1118
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001119 oo.pOnuAlarmManager.IncrementAlarmUploadSeqNo()
Himani Chawlad3dac422021-03-13 02:31:31 +05301120
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001121 omciRxCallbackPair := CallbackPair{
1122 CbKey: tid,
1123 CbEntry: CallbackPairEntry{oo.pOnuAlarmManager.GetAlarmMgrEventChannel(), oo.receiveOmciResponse, true},
Himani Chawlad3dac422021-03-13 02:31:31 +05301124 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001125 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
1126 if err != nil {
1127 logger.Errorw(ctx, "Cannot send GetAllAlarmsNextRequest", log.Fields{"Err": err,
1128 "device-id": oo.deviceID})
1129 return err
1130 }
1131 logger.Debug(ctx, "send GetAllAlarmsNextRequest done")
1132 return nil
Himani Chawlad3dac422021-03-13 02:31:31 +05301133}
1134
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001135// SendCreateGalEthernetProfile creates GalEthernetProfile ME instance
1136func (oo *OmciCC) SendCreateGalEthernetProfile(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1137 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001138 logger.Debugw(ctx, "send GalEnetProfile-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001139 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001140
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001141 meParams := me.ParamData{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001142 EntityID: GalEthernetEID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001143 Attributes: me.AttributeValueMap{me.GalEthernetProfile_MaximumGemPayloadSize: maxGemPayloadSize},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001144 }
1145 meInstance, omciErr := me.NewGalEthernetProfile(meParams)
1146 if omciErr.GetError() == nil {
1147 //all setByCreate parameters already set, no default option required ...
mpagenko836a1fd2021-11-01 16:12:42 +00001148 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001149 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001150 logger.Errorw(ctx, "Cannot encode GalEnetProfileInstance for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001151 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001152 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001153 }
1154
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001155 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001156 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001157 logger.Errorw(ctx, "Cannot serialize GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001158 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001159 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001160 }
1161
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001162 omciRxCallbackPair := CallbackPair{
1163 CbKey: tid,
1164 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001165 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001166 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001167 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001168 logger.Errorw(ctx, "Cannot send GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001169 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001170 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001171 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001172 logger.Debug(ctx, "send GalEnetProfile-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001173 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001174 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001175 logger.Errorw(ctx, "Cannot generate GalEnetProfileInstance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001176 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001177 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001178}
1179
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001180// SendSetOnu2g sets Onu2G ME instance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001181// might be needed to extend for parameter arguments, here just for setting the ConnectivityMode!!
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001182func (oo *OmciCC) SendSetOnu2g(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1183 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001184 logger.Debugw(ctx, "send ONU2-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001185 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001186
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001187 // ONU-G ME-ID is defined to be 0, but we could verify, if the ONU really supports the desired
1188 // connectivity mode 5 (in ConnCap)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001189 // By now we just use fix values to fire - this is anyway what the python adapter does
1190 // read ONU-2G from DB ???? //TODO!!!
1191 meParams := me.ParamData{
1192 EntityID: 0,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001193 Attributes: me.AttributeValueMap{me.Onu2G_CurrentConnectivityMode: connectivityModeValue},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001194 }
1195 meInstance, omciErr := me.NewOnu2G(meParams)
1196 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001197 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001198 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001199 logger.Errorw(ctx, "Cannot encode ONU2-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001200 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001201 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001202 }
1203
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001204 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001205 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001206 logger.Errorw(ctx, "Cannot serialize ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001207 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001208 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001209 }
1210
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001211 omciRxCallbackPair := CallbackPair{
1212 CbKey: tid,
1213 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001214 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001215 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001216 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001217 logger.Errorw(ctx, "Cannot send ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001218 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001219 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001220 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001221 logger.Debug(ctx, "send ONU2-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001222 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001223 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001224 logger.Errorw(ctx, "Cannot generate ONU2-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001225 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001226 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001227}
1228
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001229// SendCreateMBServiceProfile creates MacBridgeServiceProfile ME instance
1230func (oo *OmciCC) SendCreateMBServiceProfile(ctx context.Context,
1231 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1232 tid := oo.GetNextTid(highPrio)
1233 instID := MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001234 logger.Debugw(ctx, "send MBSP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001235 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001236
1237 meParams := me.ParamData{
1238 EntityID: instID,
1239 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001240 me.MacBridgeServiceProfile_Priority: 0x8000,
1241 me.MacBridgeServiceProfile_MaxAge: 20 * 256, //20s
1242 me.MacBridgeServiceProfile_HelloTime: 2 * 256, //2s
1243 me.MacBridgeServiceProfile_ForwardDelay: 15 * 256, //15s
1244 me.MacBridgeServiceProfile_DynamicFilteringAgeingTime: 0,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001245 },
1246 }
1247
1248 meInstance, omciErr := me.NewMacBridgeServiceProfile(meParams)
1249 if omciErr.GetError() == nil {
1250 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001251 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1252 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001253 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001254 logger.Errorw(ctx, "Cannot encode MBSP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001255 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001256 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001257 }
1258
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001259 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001260 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001261 logger.Errorw(ctx, "Cannot serialize MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001262 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001263 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001264 }
1265
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001266 omciRxCallbackPair := CallbackPair{
1267 CbKey: tid,
1268 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001269 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001270 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001271 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001272 logger.Errorw(ctx, "Cannot send MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001273 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001274 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001275 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001276 logger.Debug(ctx, "send MBSP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001277 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001278 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001279 logger.Errorw(ctx, "Cannot generate MBSP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001280 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001281 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001282}
1283
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001284// SendCreateMBPConfigDataUniSide creates MacBridgePortConfigurationData ME instance
1285func (oo *OmciCC) SendCreateMBPConfigDataUniSide(ctx context.Context,
1286 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1287 tid := oo.GetNextTid(highPrio)
1288 instID, idErr := GenerateUNISideMBPCDEID(uint16(aPUniPort.MacBpNo))
Mahir Gunyel6781f962021-05-16 23:30:08 -07001289 if idErr != nil {
1290 logger.Errorw(ctx, "Cannot generate MBPCD entity id", log.Fields{
1291 "Err": idErr, "device-id": oo.deviceID})
1292 return nil, idErr
1293 }
1294 logger.Debugw(ctx, "send MBPCD-Create-msg for uni side:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001295 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16), "macBpNo": aPUniPort.MacBpNo})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001296
1297 meParams := me.ParamData{
1298 EntityID: instID,
1299 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001300 me.MacBridgePortConfigurationData_BridgeIdPointer: MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo),
1301 me.MacBridgePortConfigurationData_PortNum: aPUniPort.MacBpNo,
1302 me.MacBridgePortConfigurationData_TpType: uint8(aPUniPort.PortType),
1303 me.MacBridgePortConfigurationData_TpPointer: aPUniPort.EntityID,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001304 },
1305 }
1306 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
1307 if omciErr.GetError() == nil {
1308 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001309 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1310 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001311 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001312 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001313 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001314 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001315 }
1316
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001317 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001318 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001319 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001320 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001321 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001322 }
1323
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001324 omciRxCallbackPair := CallbackPair{
1325 CbKey: tid,
1326 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001327 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001328 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001329 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001330 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001331 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001332 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001333 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001334 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001335 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001336 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001337 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001338 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001339 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001340}
1341
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001342// SendCreateEVTOConfigData creates ExtendedVlanTaggingOperationConfigurationData ME instance
1343func (oo *OmciCC) SendCreateEVTOConfigData(ctx context.Context,
1344 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1345 tid := oo.GetNextTid(highPrio)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001346 //same entityId is used as for MBSP (see there), but just arbitrary ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001347 instID := MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001348 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001349 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001350
1351 // compare python adapter code WA VOL-1311: this is not done here!
1352 // (setting TPID values for the create would probably anyway be ignored by the omci lib)
1353 // but perhaps we have to be aware of possible problems at get(Next) Request handling for EVTOOCD tables later ...
1354 assType := uint8(2) // default AssociationType is PPTPEthUni
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001355 if aPUniPort.PortType == UniVEIP {
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001356 assType = uint8(10) // for VEIP
1357 }
1358 meParams := me.ParamData{
1359 EntityID: instID,
1360 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001361 me.ExtendedVlanTaggingOperationConfigurationData_AssociationType: assType,
1362 me.ExtendedVlanTaggingOperationConfigurationData_AssociatedMePointer: aPUniPort.EntityID,
mpagenko836a1fd2021-11-01 16:12:42 +00001363 //EnhancedMode not yet supported, used with default options
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001364 },
1365 }
1366 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(meParams)
1367 if omciErr.GetError() == nil {
1368 //all setByCreate parameters already set, no default option required ...
mpagenko836a1fd2021-11-01 16:12:42 +00001369 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1370 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001371 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001372 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001373 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001374 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001375 }
1376
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001377 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001378 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001379 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001380 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001381 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001382 }
1383
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001384 omciRxCallbackPair := CallbackPair{
1385 CbKey: tid,
1386 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001387 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001388 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001389 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001390 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001391 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001392 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001393 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001394 logger.Debug(ctx, "send EVTOCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001395 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001396 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001397 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001398 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001399 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001400}
1401
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001402// SendSetOnuGLS sets OnuG ME instance
1403func (oo *OmciCC) SendSetOnuGLS(ctx context.Context, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001404 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001405 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001406 logger.Debugw(ctx, "send ONU-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001407 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001408
1409 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1410 meParams := me.ParamData{
1411 EntityID: 0,
1412 Attributes: requestedAttributes,
1413 }
1414 meInstance, omciErr := me.NewOnuG(meParams)
1415 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001416 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001417 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001418 logger.Errorw(ctx, "Cannot encode ONU-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001419 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001420 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001421 }
1422
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001423 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001424 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001425 logger.Errorw(ctx, "Cannot serialize ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001426 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001427 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001428 }
1429
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001430 omciRxCallbackPair := CallbackPair{
1431 CbKey: tid,
1432 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001433 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001434 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001435 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001436 logger.Errorw(ctx, "Cannot send ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001437 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001438 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001439 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001440 logger.Debug(ctx, "send ONU-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001441 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001442 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001443 logger.Errorw(ctx, "Cannot generate ONU-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001444 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001445 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001446}
1447
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001448// SendSetPptpEthUniLS sets PhysicalPathTerminationPointEthernetUni ME instance
1449func (oo *OmciCC) SendSetPptpEthUniLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001450 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001451 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001452 logger.Debugw(ctx, "send PPTPEthUni-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001453 "SequNo": strconv.FormatInt(int64(tid), 16)})
1454
1455 // PPTPEthUni ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1456 meParams := me.ParamData{
1457 EntityID: aInstNo,
1458 Attributes: requestedAttributes,
1459 }
1460 meInstance, omciErr := me.NewPhysicalPathTerminationPointEthernetUni(meParams)
1461 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001462 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001463 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001464 logger.Errorw(ctx, "Cannot encode PPTPEthUni instance for set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001465 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001466 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001467 }
1468
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001469 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001470 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001471 logger.Errorw(ctx, "Cannot serialize PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001472 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001473 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001474 }
1475
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001476 omciRxCallbackPair := CallbackPair{
1477 CbKey: tid,
1478 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001479 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001480 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001481 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001482 logger.Errorw(ctx, "Cannot send PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001483 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001484 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001485 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001486 logger.Debug(ctx, "send PPTPEthUni-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001487 return meInstance, nil
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001488 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001489 logger.Errorw(ctx, "Cannot generate PPTPEthUni", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001490 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001491 return nil, omciErr.GetError()
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001492}
1493
1494/* UniG obsolete by now, left here in case it should be needed once again
1495 UniG AdminState anyway should be ignored by ONU acc. to G988
Himani Chawla6d2ae152020-09-02 13:11:20 +05301496func (oo *omciCC) sendSetUniGLS(ctx context.Context, aInstNo uint16, timeout int,
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001497 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) *me.ManagedEntity {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001498 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001499 logger.Debugw(ctx,"send UNI-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001500 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001501
1502 // UNI-G ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1503 meParams := me.ParamData{
1504 EntityID: aInstNo,
1505 Attributes: requestedAttributes,
1506 }
1507 meInstance, omciErr := me.NewUniG(meParams)
1508 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001509 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001510 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001511 logger.Errorw(ctx,"Cannot encode UNI-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001512 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001513 return nil
1514 }
1515
1516 pkt, err := serializeOmciLayer(omciLayer, msgLayer)
1517 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001518 logger.Errorw(ctx,"Cannot serialize UNI-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001519 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001520 return nil
1521 }
1522
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001523 omciRxCallbackPair := CallbackPair{
1524 CbKey: tid,
1525 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001526 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001527 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001528 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001529 logger.Errorw(ctx,"Cannot send UNIG-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001530 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001531 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001532 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001533 logger.Debug(ctx,"send UNI-G-Set-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001534 return meInstance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001535 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001536 logger.Errorw(ctx,"Cannot generate UNI-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001537 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001538 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001539}
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001540*/
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001541
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001542// SendSetVeipLS sets VirtualEthernetInterfacePoint ME instance
1543func (oo *OmciCC) SendSetVeipLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001544 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001545 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001546 logger.Debugw(ctx, "send VEIP-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001547 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001548
1549 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1550 meParams := me.ParamData{
1551 EntityID: aInstNo,
1552 Attributes: requestedAttributes,
1553 }
1554 meInstance, omciErr := me.NewVirtualEthernetInterfacePoint(meParams)
1555 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001556 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001557 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001558 logger.Errorw(ctx, "Cannot encode VEIP instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001559 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001560 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001561 }
1562
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001563 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001564 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001565 logger.Errorw(ctx, "Cannot serialize VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001566 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001567 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001568 }
1569
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001570 omciRxCallbackPair := CallbackPair{
1571 CbKey: tid,
1572 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001573 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001574 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001575 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001576 logger.Errorw(ctx, "Cannot send VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001577 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001578 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001579 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001580 logger.Debug(ctx, "send VEIP-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001581 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001582 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001583 logger.Errorw(ctx, "Cannot generate VEIP", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001584 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001585 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001586}
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001587
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001588// SendGetMe gets ME instance
1589func (oo *OmciCC) SendGetMe(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributes me.AttributeValueMap,
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001590 timeout int, highPrio bool, rxChan chan Message, isExtendedOmci bool) (*me.ManagedEntity, error) {
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001591
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001592 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001593 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001594 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001595
1596 meParams := me.ParamData{
1597 EntityID: entityID,
1598 Attributes: requestedAttributes,
1599 }
mgoudad611f4c2025-10-30 14:49:27 +05301600 var messageSet = omci.BaselineIdent
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001601 if isExtendedOmci {
1602 messageSet = omci.ExtendedIdent
1603 }
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001604 meInstance, omciErr := me.LoadManagedEntityDefinition(classID, meParams)
1605 if omciErr.GetError() == nil {
Himani Chawla4d908332020-08-31 12:30:20 +05301606 meClassIDName := meInstance.GetName()
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001607 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.GetRequestType, oframe.TransactionID(tid), oframe.FrameFormat(messageSet))
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001608 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001609 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 +03001610 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001611 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001612 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001613 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001614 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001615 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001616 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001617 omciRxCallbackPair := CallbackPair{
1618 CbKey: tid,
1619 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001620 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001621 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001622 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001623 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001624 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001625 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001626 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": meClassIDName, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001627 return meInstance, nil
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001628 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001629 logger.Errorw(ctx, "Cannot generate meDefinition", log.Fields{"classID": classID, "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001630 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001631}
1632
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001633// SendGetMeWithAttributeMask gets ME instance with attribute mask
1634func (oo *OmciCC) SendGetMeWithAttributeMask(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributesMask uint16,
Himani Chawla43f95ff2021-06-03 00:24:12 +05301635 timeout int, highPrio bool, rxChan chan Message) error {
1636
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001637 tid := oo.GetNextTid(highPrio)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301638 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
1639 "SequNo": strconv.FormatInt(int64(tid), 16)})
1640
1641 request := &omci.GetRequest{
1642 MeBasePacket: omci.MeBasePacket{
1643 EntityInstance: entityID,
1644 EntityClass: classID,
1645 },
1646 AttributeMask: requestedAttributesMask,
1647 }
1648
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001649 pkt, err := Serialize(ctx, omci.GetRequestType, request, tid)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301650 if err != nil {
1651 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1652 return err
1653 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001654 omciRxCallbackPair := CallbackPair{
1655 CbKey: tid,
1656 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Himani Chawla43f95ff2021-06-03 00:24:12 +05301657 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001658 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301659 if err != nil {
1660 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1661 return err
1662 }
1663 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": classID, "device-id": oo.deviceID})
1664 return nil
1665}
1666
pnalmas6d6b7d72025-10-23 16:34:22 +05301667// SendGetCurrentDataME gets current performance monitoring data from ME instance
1668func (oo *OmciCC) SendGetCurrentDataME(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributes me.AttributeValueMap,
1669 timeout int, highPrio bool, rxChan chan Message, isExtendedOmci bool) (*me.ManagedEntity, error) {
1670
1671 tid := oo.GetNextTid(highPrio)
1672 logger.Debugw(ctx, "send get-current-data-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
1673 "SequNo": strconv.FormatInt(int64(tid), 16)})
1674
1675 meParams := me.ParamData{
1676 EntityID: entityID,
1677 Attributes: requestedAttributes,
1678 }
1679 var messageSet = omci.BaselineIdent
1680 if isExtendedOmci {
1681 messageSet = omci.ExtendedIdent
1682 }
1683 meInstance, omciErr := me.LoadManagedEntityDefinition(classID, meParams)
1684 if omciErr.GetError() == nil {
1685 meClassIDName := meInstance.GetName()
1686 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.GetCurrentDataRequestType, oframe.TransactionID(tid), oframe.FrameFormat(messageSet))
1687 if err != nil {
1688 logger.Errorf(ctx, "Cannot encode instance for get-current-data-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
1689 return nil, err
1690 }
1691 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
1692 if err != nil {
1693 logger.Errorw(ctx, "Cannot serialize get-current-data-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
1694 return nil, err
1695 }
1696 omciRxCallbackPair := CallbackPair{
1697 CbKey: tid,
1698 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
1699 }
1700 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
1701 if err != nil {
1702 logger.Errorw(ctx, "Cannot send get-current-data-request-msg", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
1703 return nil, err
1704 }
1705 logger.Debugw(ctx, "send get-current-data-request-msg done", log.Fields{"meClassIDName": meClassIDName, "device-id": oo.deviceID})
1706 return meInstance, nil
1707 }
1708 logger.Errorw(ctx, "Cannot generate meDefinition", log.Fields{"classID": classID, "Err": omciErr.GetError(), "device-id": oo.deviceID})
1709 return nil, omciErr.GetError()
1710}
1711
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001712// SendCreateDot1PMapper creates Ieee8021PMapperServiceProfile ME instance
1713func (oo *OmciCC) SendCreateDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001714 aInstID uint16, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001715 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001716 logger.Debugw(ctx, "send .1pMapper-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001717 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(aInstID), 16)})
1718
1719 meParams := me.ParamData{
mpagenko8b5fdd22020-12-17 17:58:32 +00001720 EntityID: aInstID,
1721 Attributes: me.AttributeValueMap{
1722 //workaround for unsuitable omci-lib default values, cmp VOL-3729
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001723 me.Ieee8021PMapperServiceProfile_TpPointer: 0xFFFF,
1724 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority0: 0xFFFF,
1725 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority1: 0xFFFF,
1726 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority2: 0xFFFF,
1727 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority3: 0xFFFF,
1728 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority4: 0xFFFF,
1729 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority5: 0xFFFF,
1730 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority6: 0xFFFF,
1731 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority7: 0xFFFF,
mpagenko8b5fdd22020-12-17 17:58:32 +00001732 },
mpagenko3dbcdd22020-07-22 07:38:45 +00001733 }
1734 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
1735 if omciErr.GetError() == nil {
1736 //we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001737 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1738 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001739 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001740 logger.Errorw(ctx, "Cannot encode .1pMapper for 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 }
1744
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001745 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001746 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001747 logger.Errorw(ctx, "Cannot serialize .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001748 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001749 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001750 }
1751
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001752 omciRxCallbackPair := CallbackPair{
1753 CbKey: tid,
1754 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001755 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001756 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001757 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001758 logger.Errorw(ctx, "Cannot send .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001759 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001760 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001761 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001762 logger.Debug(ctx, "send .1pMapper-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001763 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001764 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001765 logger.Errorw(ctx, "Cannot generate .1pMapper", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001766 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001767 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001768}
1769
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001770// SendCreateMBPConfigDataVar creates MacBridgePortConfigurationData ME instance
1771func (oo *OmciCC) SendCreateMBPConfigDataVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001772 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001773 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001774 logger.Debugw(ctx, "send MBPCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001775 "SequNo": strconv.FormatInt(int64(tid), 16),
1776 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1777
1778 meInstance, omciErr := me.NewMacBridgePortConfigurationData(params[0])
1779 if omciErr.GetError() == nil {
1780 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001781 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1782 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001783 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001784 logger.Errorw(ctx, "Cannot encode MBPCD for 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 }
1788
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001789 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001790 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001791 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001792 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001793 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001794 }
1795
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001796 omciRxCallbackPair := CallbackPair{
1797 CbKey: tid,
1798 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001799 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001800 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001801 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001802 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001803 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001804 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001805 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001806 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001807 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001808 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001809 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001810 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001811 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001812}
1813
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001814// SendCreateGemNCTPVar creates GemPortNetworkCtp ME instance
1815func (oo *OmciCC) SendCreateGemNCTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001816 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001817 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001818 logger.Debugw(ctx, "send GemNCTP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001819 "SequNo": strconv.FormatInt(int64(tid), 16),
1820 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1821
1822 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1823 if omciErr.GetError() == nil {
1824 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001825 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1826 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001827 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001828 logger.Errorw(ctx, "Cannot encode GemNCTP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001829 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001830 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001831 }
1832
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001833 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001834 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001835 logger.Errorw(ctx, "Cannot serialize GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001836 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001837 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001838 }
1839
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001840 omciRxCallbackPair := CallbackPair{
1841 CbKey: tid,
1842 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001843 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001844 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001845 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001846 logger.Errorw(ctx, "Cannot send GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001847 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001848 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001849 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001850 logger.Debug(ctx, "send GemNCTP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001851 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001852 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001853 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001854 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001855 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001856}
1857
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001858// SendSetGemNCTPVar sets GemPortNetworkCtp ME instance
1859func (oo *OmciCC) SendSetGemNCTPVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
1860 tid := oo.GetNextTid(highPrio)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001861 logger.Debugw(ctx, "send GemNCTP-Set-msg:", log.Fields{"device-id": oo.deviceID,
1862 "SequNo": strconv.FormatInt(int64(tid), 16),
1863 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1864
1865 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1866 if omciErr.GetError() == nil {
1867 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001868 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType,
1869 oframe.TransactionID(tid), oframe.AddDefaults(true))
ozgecanetsia82b91a62021-05-21 18:54:49 +03001870 if err != nil {
1871 logger.Errorw(ctx, "Cannot encode GemNCTP for set", log.Fields{
1872 "Err": err, "device-id": oo.deviceID})
1873 return nil, err
1874 }
1875
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001876 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001877 if err != nil {
1878 logger.Errorw(ctx, "Cannot serialize GemNCTP set", log.Fields{
1879 "Err": err, "device-id": oo.deviceID})
1880 return nil, err
1881 }
1882
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001883 omciRxCallbackPair := CallbackPair{
1884 CbKey: tid,
1885 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia82b91a62021-05-21 18:54:49 +03001886 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001887 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001888 if err != nil {
1889 logger.Errorw(ctx, "Cannot send GemNCTP set", log.Fields{
1890 "Err": err, "device-id": oo.deviceID})
1891 return nil, err
1892 }
1893 logger.Debug(ctx, "send GemNCTP-Set-msg done", log.Fields{"device-id": oo.deviceID})
1894 return meInstance, nil
1895 }
1896 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
1897 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1898 return nil, omciErr.GetError()
1899}
1900
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001901// SendCreateGemIWTPVar creates GemInterworkingTerminationPoint ME instance
1902func (oo *OmciCC) SendCreateGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001903 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001904 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001905 logger.Debugw(ctx, "send GemIwTp-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001906 "SequNo": strconv.FormatInt(int64(tid), 16),
1907 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1908
1909 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(params[0])
1910 if omciErr.GetError() == nil {
1911 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
mpagenko836a1fd2021-11-01 16:12:42 +00001912 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1913 oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001914 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001915 logger.Errorw(ctx, "Cannot encode GemIwTp for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001916 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001917 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001918 }
1919
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001920 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001921 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001922 logger.Errorw(ctx, "Cannot serialize GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001923 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001924 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001925 }
1926
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001927 omciRxCallbackPair := CallbackPair{
1928 CbKey: tid,
1929 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001930 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001931 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001932 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001933 logger.Errorw(ctx, "Cannot send GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001934 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001935 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001936 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001937 logger.Debug(ctx, "send GemIwTp-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001938 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001939 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001940 logger.Errorw(ctx, "Cannot generate GemIwTp Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001941 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001942 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001943}
1944
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001945// SendSetTcontVar sets TCont ME instance
1946func (oo *OmciCC) SendSetTcontVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001947 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001948 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001949 logger.Debugw(ctx, "send TCont-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001950 "SequNo": strconv.FormatInt(int64(tid), 16),
1951 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1952
1953 meInstance, omciErr := me.NewTCont(params[0])
1954 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001955 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001956 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001957 logger.Errorw(ctx, "Cannot encode TCont for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001958 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001959 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001960 }
1961
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001962 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001963 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001964 logger.Errorw(ctx, "Cannot serialize TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001965 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001966 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001967 }
1968
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001969 omciRxCallbackPair := CallbackPair{
1970 CbKey: tid,
1971 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001972 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001973 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001974 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001975 logger.Errorw(ctx, "Cannot send TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001976 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001977 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001978 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001979 logger.Debug(ctx, "send TCont-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001980 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001981 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001982 logger.Errorw(ctx, "Cannot generate TCont Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001983 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001984 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001985}
1986
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001987// SendSetPrioQueueVar sets PriorityQueue ME instance
1988func (oo *OmciCC) SendSetPrioQueueVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001989 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001990 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001991 logger.Debugw(ctx, "send PrioQueue-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001992 "SequNo": strconv.FormatInt(int64(tid), 16),
1993 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1994
1995 meInstance, omciErr := me.NewPriorityQueue(params[0])
1996 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001997 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001998 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001999 logger.Errorw(ctx, "Cannot encode PrioQueue for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00002000 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002001 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00002002 }
2003
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002004 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00002005 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002006 logger.Errorw(ctx, "Cannot serialize PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00002007 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002008 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00002009 }
2010
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002011 omciRxCallbackPair := CallbackPair{
2012 CbKey: tid,
2013 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00002014 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002015 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00002016 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002017 logger.Errorw(ctx, "Cannot send PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00002018 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002019 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00002020 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002021 logger.Debug(ctx, "send PrioQueue-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002022 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00002023 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002024 logger.Errorw(ctx, "Cannot generate PrioQueue Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00002025 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002026 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00002027}
2028
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002029// SendSetDot1PMapperVar sets Ieee8021PMapperServiceProfile ME instance
2030func (oo *OmciCC) SendSetDot1PMapperVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002031 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002032 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002033 logger.Debugw(ctx, "send 1PMapper-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00002034 "SequNo": strconv.FormatInt(int64(tid), 16),
2035 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2036
2037 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(params[0])
2038 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002039 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00002040 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002041 logger.Errorw(ctx, "Cannot encode 1PMapper for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00002042 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002043 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00002044 }
2045
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002046 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00002047 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002048 logger.Errorw(ctx, "Cannot serialize 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00002049 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002050 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00002051 }
2052
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002053 omciRxCallbackPair := CallbackPair{
2054 CbKey: tid,
2055 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00002056 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002057 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00002058 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002059 logger.Errorw(ctx, "Cannot send 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00002060 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002061 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00002062 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002063 logger.Debug(ctx, "send 1PMapper-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002064 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00002065 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002066 logger.Errorw(ctx, "Cannot generate 1PMapper Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00002067 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002068 return nil, omciErr.GetError()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00002069}
mpagenkodff5dda2020-08-28 11:52:01 +00002070
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002071// SendCreateVtfdVar creates VlanTaggingFilterData ME instance
2072func (oo *OmciCC) SendCreateVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002073 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002074 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002075 logger.Debugw(ctx, "send VTFD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002076 "SequNo": strconv.FormatInt(int64(tid), 16),
2077 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2078
2079 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
2080 if omciErr.GetError() == nil {
2081 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
mpagenko836a1fd2021-11-01 16:12:42 +00002082 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
2083 oframe.TransactionID(tid))
mpagenkodff5dda2020-08-28 11:52:01 +00002084 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002085 logger.Errorw(ctx, "Cannot encode VTFD for create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002086 "Err": err, "device-id": oo.deviceID})
2087 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2088 // return (dual format) error code that can be used at caller for immediate error treatment
2089 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002090 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002091 }
2092
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002093 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00002094 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002095 logger.Errorw(ctx, "Cannot serialize VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002096 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002097 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002098 }
2099
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002100 omciRxCallbackPair := CallbackPair{
2101 CbKey: tid,
2102 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00002103 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002104 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00002105 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002106 logger.Errorw(ctx, "Cannot send VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002107 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002108 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002109 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002110 logger.Debug(ctx, "send VTFD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002111 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00002112 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002113 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002114 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002115 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00002116}
2117
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002118// nolint: unused
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002119func (oo *OmciCC) sendSetVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002120 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002121 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002122 logger.Debugw(ctx, "send VTFD-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002123 "SequNo": strconv.FormatInt(int64(tid), 16),
2124 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2125
2126 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
2127 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002128 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType,
2129 oframe.TransactionID(tid))
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002130 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002131 logger.Errorw(ctx, "Cannot encode VTFD for set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002132 "Err": err, "device-id": oo.deviceID})
2133 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2134 // return (dual format) error code that can be used at caller for immediate error treatment
2135 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002136 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002137 }
2138
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002139 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002140 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002141 logger.Errorw(ctx, "Cannot serialize VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002142 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002143 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002144 }
2145
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002146 omciRxCallbackPair := CallbackPair{
2147 CbKey: tid,
2148 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002149 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002150 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002151 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002152 logger.Errorw(ctx, "Cannot send VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002153 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002154 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002155 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002156 logger.Debug(ctx, "send VTFD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002157 return meInstance, nil
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002158 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002159 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002160 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002161 return nil, omciErr.GetError()
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002162}
2163
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002164// SendCreateEvtocdVar creates ExtendedVlanTaggingOperationConfigurationData ME instance
2165func (oo *OmciCC) SendCreateEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002166 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002167 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002168 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002169 "SequNo": strconv.FormatInt(int64(tid), 16),
2170 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2171
2172 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2173 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002174 //EnhancedMode not yet supported, used with default options
2175 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
2176 oframe.TransactionID(tid), oframe.AddDefaults(true))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002177 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002178 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002179 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002180 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002181 }
2182
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002183 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002184 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002185 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002186 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002187 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002188 }
2189
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002190 omciRxCallbackPair := CallbackPair{
2191 CbKey: tid,
2192 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002193 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002194 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002195 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002196 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002197 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002198 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002199 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002200 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002201 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002202 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002203 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002204 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002205 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002206}
2207
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002208// SendSetEvtocdVar sets ExtendedVlanTaggingOperationConfigurationData ME instance
2209func (oo *OmciCC) SendSetEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002210 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002211 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002212 logger.Debugw(ctx, "send EVTOCD-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002213 "SequNo": strconv.FormatInt(int64(tid), 16),
2214 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2215
2216 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2217 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002218 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenkodff5dda2020-08-28 11:52:01 +00002219 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002220 logger.Errorw(ctx, "Cannot encode EVTOCD for set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002221 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002222 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002223 }
2224
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002225 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00002226 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002227 logger.Errorw(ctx, "Cannot serialize EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002228 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002229 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002230 }
2231
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002232 omciRxCallbackPair := CallbackPair{
2233 CbKey: tid,
2234 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00002235 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002236 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00002237 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002238 logger.Errorw(ctx, "Cannot send EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002239 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002240 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002241 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002242 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002243 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00002244 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002245 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002246 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002247 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00002248}
mpagenko01e726e2020-10-23 09:45:29 +00002249
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002250// SendDeleteEvtocd deletes ExtendedVlanTaggingOperationConfigurationData ME instance
2251func (oo *OmciCC) SendDeleteEvtocd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002252 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002253 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002254 logger.Debugw(ctx, "send EVTOCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002255 "SequNo": strconv.FormatInt(int64(tid), 16),
2256 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2257
2258 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2259 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002260 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002261 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002262 logger.Errorw(ctx, "Cannot encode EVTOCD for delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002263 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002264 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002265 }
2266
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002267 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002268 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002269 logger.Errorw(ctx, "Cannot serialize EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002270 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002271 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002272 }
2273
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002274 omciRxCallbackPair := CallbackPair{
2275 CbKey: tid,
2276 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002277 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002278 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002279 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002280 logger.Errorw(ctx, "Cannot send EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002281 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002282 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002283 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002284 logger.Debug(ctx, "send EVTOCD-delete msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002285 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002286 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002287 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002288 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002289 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002290}
2291
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002292// SendDeleteVtfd deletes VlanTaggingFilterData ME instance
2293func (oo *OmciCC) SendDeleteVtfd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002294 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002295 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002296 logger.Debugw(ctx, "send VTFD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko01e726e2020-10-23 09:45:29 +00002297 "SequNo": strconv.FormatInt(int64(tid), 16),
2298 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2299
2300 meParams := me.ParamData{EntityID: aInstID}
2301 meInstance, omciErr := me.NewVlanTaggingFilterData(meParams)
2302 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002303 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2304 oframe.TransactionID(tid))
mpagenko01e726e2020-10-23 09:45:29 +00002305 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002306 logger.Errorw(ctx, "Cannot encode VTFD for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002307 "Err": err, "device-id": oo.deviceID})
2308 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2309 // return (dual format) error code that can be used at caller for immediate error treatment
2310 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002311 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002312 }
2313
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002314 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko01e726e2020-10-23 09:45:29 +00002315 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002316 logger.Errorw(ctx, "Cannot serialize VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002317 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002318 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002319 }
2320
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002321 omciRxCallbackPair := CallbackPair{
2322 CbKey: tid,
2323 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko01e726e2020-10-23 09:45:29 +00002324 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002325 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko01e726e2020-10-23 09:45:29 +00002326 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002327 logger.Errorw(ctx, "Cannot send VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002328 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002329 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002330 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002331 logger.Debug(ctx, "send VTFD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002332 return meInstance, nil
mpagenko01e726e2020-10-23 09:45:29 +00002333 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002334 logger.Errorw(ctx, "Cannot generate VTFD Instance for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002335 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002336 return nil, omciErr.GetError()
mpagenko01e726e2020-10-23 09:45:29 +00002337}
ozgecanetsia422dbf32020-10-28 14:07:19 +03002338
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002339// SendCreateTDVar creates TrafficDescriptor ME instance
2340func (oo *OmciCC) SendCreateTDVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2341 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002342 logger.Debugw(ctx, "send TD-Create-msg:", log.Fields{"device-id": oo.deviceID,
2343 "SequNo": strconv.FormatInt(int64(tid), 16),
2344 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2345 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2346 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002347 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002348 if err != nil {
2349 logger.Errorw(ctx, "Cannot encode TD for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002350 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002351 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002352 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002353 if err != nil {
2354 logger.Errorw(ctx, "Cannot serialize TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002355 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002356 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002357 omciRxCallbackPair := CallbackPair{
2358 CbKey: tid,
2359 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002360 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002361 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002362 if err != nil {
2363 logger.Errorw(ctx, "Cannot send TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002364 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002365 }
2366 logger.Debug(ctx, "send TD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002367 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002368 }
2369 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002370 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002371}
2372
2373// nolint: unused
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002374func (oo *OmciCC) sendSetTDVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002375 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002376 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002377 logger.Debugw(ctx, "send TD-Set-msg:", log.Fields{"device-id": oo.deviceID,
2378 "SequNo": strconv.FormatInt(int64(tid), 16),
2379 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2380
2381 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2382 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002383 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002384 if err != nil {
2385 logger.Errorw(ctx, "Cannot encode TD for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002386 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002387 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002388 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002389 if err != nil {
2390 logger.Errorw(ctx, "Cannot serialize TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002391 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002392 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002393 omciRxCallbackPair := CallbackPair{
2394 CbKey: tid,
2395 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002396 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002397 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002398 if err != nil {
2399 logger.Errorw(ctx, "Cannot send TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002400 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002401 }
2402 logger.Debug(ctx, "send TD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002403 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002404 }
2405 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002406 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002407
2408}
2409
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002410// SendDeleteTD - TODO: add comment
2411func (oo *OmciCC) SendDeleteTD(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002412 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002413 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002414 logger.Debugw(ctx, "send TD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2415 "SequNo": strconv.FormatInt(int64(tid), 16),
2416 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2417
2418 meParams := me.ParamData{EntityID: aInstID}
2419 meInstance, omciErr := me.NewTrafficDescriptor(meParams)
2420 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002421 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002422 if err != nil {
2423 logger.Errorw(ctx, "Cannot encode TD for delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002424 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002425 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002426 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002427 if err != nil {
2428 logger.Errorw(ctx, "Cannot serialize TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002429 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002430 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002431 omciRxCallbackPair := CallbackPair{
2432 CbKey: tid,
2433 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002434 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002435 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002436 if err != nil {
2437 logger.Errorw(ctx, "Cannot send TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002438 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002439 }
2440 logger.Debug(ctx, "send TD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002441 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002442 }
2443 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002444 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002445
2446}
2447
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002448// SendDeleteGemIWTP deletes GemInterworkingTerminationPoint ME instance
2449func (oo *OmciCC) SendDeleteGemIWTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002450 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002451 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002452 logger.Debugw(ctx, "send GemIwTp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002453 "SequNo": strconv.FormatInt(int64(tid), 16),
2454 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2455
2456 meParams := me.ParamData{EntityID: aInstID}
2457 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(meParams)
2458 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002459 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2460 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002461 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002462 logger.Errorw(ctx, "Cannot encode GemIwTp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002463 "Err": err, "device-id": oo.deviceID})
2464 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2465 // return (dual format) error code that can be used at caller for immediate error treatment
2466 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002467 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002468 }
2469
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002470 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002471 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002472 logger.Errorw(ctx, "Cannot serialize GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002473 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002474 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002475 }
2476
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002477 omciRxCallbackPair := CallbackPair{
2478 CbKey: tid,
2479 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002480 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002481 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002482 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002483 logger.Errorw(ctx, "Cannot send GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002484 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002485 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002486 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002487 logger.Debug(ctx, "send GemIwTp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002488 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002489 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002490 logger.Errorw(ctx, "Cannot generate GemIwTp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002491 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002492 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002493}
2494
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002495// SendDeleteGemNCTP deletes GemPortNetworkCtp ME instance
2496func (oo *OmciCC) SendDeleteGemNCTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002497 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002498 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002499 logger.Debugw(ctx, "send GemNCtp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002500 "SequNo": strconv.FormatInt(int64(tid), 16),
2501 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2502
2503 meParams := me.ParamData{EntityID: aInstID}
2504 meInstance, omciErr := me.NewGemPortNetworkCtp(meParams)
2505 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002506 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2507 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002508 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002509 logger.Errorw(ctx, "Cannot encode GemNCtp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002510 "Err": err, "device-id": oo.deviceID})
2511 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2512 // return (dual format) error code that can be used at caller for immediate error treatment
2513 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002514 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002515 }
2516
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002517 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002518 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002519 logger.Errorw(ctx, "Cannot serialize GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002520 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002521 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002522 }
2523
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002524 omciRxCallbackPair := CallbackPair{
2525 CbKey: tid,
2526 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002527 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002528 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002529 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002530 logger.Errorw(ctx, "Cannot send GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002531 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002532 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002533 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002534 logger.Debug(ctx, "send GemNCtp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002535 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002536 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002537 logger.Errorw(ctx, "Cannot generate GemNCtp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002538 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002539 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002540}
2541
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002542// SendDeleteDot1PMapper deletes Ieee8021PMapperServiceProfile ME instance
2543func (oo *OmciCC) SendDeleteDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002544 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002545 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002546 logger.Debugw(ctx, "send .1pMapper-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002547 "SequNo": strconv.FormatInt(int64(tid), 16),
2548 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2549
2550 meParams := me.ParamData{EntityID: aInstID}
2551 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
2552 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002553 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2554 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002555 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002556 logger.Errorw(ctx, "Cannot encode .1pMapper for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002557 "Err": err, "device-id": oo.deviceID})
2558 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2559 // return (dual format) error code that can be used at caller for immediate error treatment
2560 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002561 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002562 }
2563
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002564 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002565 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002566 logger.Errorw(ctx, "Cannot serialize .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002567 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002568 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002569 }
2570
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002571 omciRxCallbackPair := CallbackPair{
2572 CbKey: tid,
2573 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002574 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002575 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002576 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002577 logger.Errorw(ctx, "Cannot send .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002578 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002579 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002580 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002581 logger.Debug(ctx, "send .1pMapper-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002582 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002583 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002584 logger.Errorw(ctx, "Cannot generate .1pMapper Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002585 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002586 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002587}
2588
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002589// SendDeleteMBPConfigData deletes MacBridgePortConfigurationData ME instance
2590func (oo *OmciCC) SendDeleteMBPConfigData(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002591 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002592 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002593 logger.Debugw(ctx, "send MBPCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002594 "SequNo": strconv.FormatInt(int64(tid), 16),
2595 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2596
2597 meParams := me.ParamData{EntityID: aInstID}
2598 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
2599 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002600 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2601 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002602 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002603 logger.Errorw(ctx, "Cannot encode MBPCD for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002604 "Err": err, "device-id": oo.deviceID})
2605 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2606 // return (dual format) error code that can be used at caller for immediate error treatment
2607 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002608 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002609 }
2610
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002611 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002612 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002613 logger.Errorw(ctx, "Cannot serialize MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002614 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002615 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002616 }
2617
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002618 omciRxCallbackPair := CallbackPair{
2619 CbKey: tid,
2620 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002621 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002622 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002623 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002624 logger.Errorw(ctx, "Cannot send MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002625 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002626 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002627 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002628 logger.Debug(ctx, "send MBPCD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002629 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002630 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002631 logger.Errorw(ctx, "Cannot generate MBPCD Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002632 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002633 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002634}
2635
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002636// SendCreateMulticastGemIWTPVar creates MulticastGemInterworkingTerminationPoint ME instance
2637func (oo *OmciCC) SendCreateMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002638 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002639 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002640 logger.Debugw(ctx, "send MulticastGemIWTP-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002641 "SequNo": strconv.FormatInt(int64(tid), 16),
2642 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2643
2644 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2645 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002646 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2647 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002648 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002649 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002650 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002651 }
2652
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002653 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002654 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002655 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002656 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002657 }
2658
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002659 omciRxCallbackPair := CallbackPair{CbKey: tid,
2660 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002661 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002662 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002663 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002664 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002665 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002666 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002667 logger.Debug(ctx, "send MulticastGEMIWTP-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002668 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002669 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002670 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002671 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002672 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002673}
2674
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002675// SendSetMulticastGemIWTPVar sets MulticastGemInterworkingTerminationPoint ME instance
2676func (oo *OmciCC) SendSetMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002677 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002678 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002679 logger.Debugw(ctx, "send MulticastGemIWTP-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002680 "SequNo": strconv.FormatInt(int64(tid), 16),
2681 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2682
2683 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2684 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002685 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2686 oframe.AddDefaults(true))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002687 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002688 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002689 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002690 }
2691
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002692 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002693 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002694 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002695 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002696 }
2697
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002698 omciRxCallbackPair := CallbackPair{CbKey: tid,
2699 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002700 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002701 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002702 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002703 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002704 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002705 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002706 logger.Debug(ctx, "send MulticastGEMIWTP-set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002707 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002708 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002709 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002710 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002711 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002712}
2713
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002714// SendCreateMulticastOperationProfileVar creates MulticastOperationsProfile ME instance
2715func (oo *OmciCC) SendCreateMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002716 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002717 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002718 logger.Debugw(ctx, "send MulticastOperationProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002719 "SequNo": strconv.FormatInt(int64(tid), 16),
2720 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2721
2722 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2723 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002724 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2725 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002726 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002727 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002728 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002729 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002730 }
2731
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002732 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002733 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002734 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002735 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002736 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002737 }
2738
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002739 omciRxCallbackPair := CallbackPair{CbKey: tid,
2740 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002741 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002742 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002743 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002744 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002745 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002746 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002747 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002748 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002749 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002750 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002751 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002752 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002753 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002754}
2755
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002756// SendSetMulticastOperationProfileVar sets MulticastOperationsProfile ME instance
2757func (oo *OmciCC) SendSetMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002758 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002759 tid := oo.GetNextTid(highPrio)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002760 logger.Debugw(ctx, "send MulticastOperationProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002761 "SequNo": strconv.FormatInt(int64(tid), 16),
2762 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2763
2764 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2765 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002766 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2767 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002768 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002769 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002770 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002771 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002772 }
2773
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002774 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002775 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002776 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002777 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002778 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002779 }
2780
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002781 omciRxCallbackPair := CallbackPair{CbKey: tid,
2782 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002783 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002784 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002785 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002786 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002787 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002788 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002789 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002790 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002791 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002792 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002793 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002794 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002795 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002796}
2797
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002798// SendCreateMulticastSubConfigInfoVar creates MulticastSubscriberConfigInfo ME instance
2799func (oo *OmciCC) SendCreateMulticastSubConfigInfoVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002800 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002801 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002802 logger.Debugw(ctx, "send MulticastSubConfigInfo-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002803 "SequNo": strconv.FormatInt(int64(tid), 16),
2804 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2805
2806 meInstance, omciErr := me.NewMulticastSubscriberConfigInfo(params[0])
2807 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002808 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2809 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002810 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002811 logger.Errorw(ctx, "Cannot encode MulticastSubConfigInfo for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002812 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002813 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002814 }
2815
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002816 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002817 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002818 logger.Errorw(ctx, "Cannot serialize MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002819 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002820 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002821 }
2822
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002823 omciRxCallbackPair := CallbackPair{CbKey: tid,
2824 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002825 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002826 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002827 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002828 logger.Errorw(ctx, "Cannot send MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002829 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002830 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002831 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002832 logger.Debug(ctx, "send MulticastSubConfigInfo-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002833 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002834 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002835 logger.Errorw(ctx, "Cannot generate MulticastSubConfigInfo Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002836 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002837 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002838}
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00002839
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002840// SendCreateVoipVoiceCTP nolint: unused
2841func (oo *OmciCC) SendCreateVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2842 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2843 tid := oo.GetNextTid(highPrio)
2844 logger.Debugw(ctx, "send VoipVoiceCTP-create-msg:", log.Fields{"device-id": oo.deviceID,
2845 "SequNo": strconv.FormatInt(int64(tid), 16),
2846 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2847
2848 meInstance, omciErr := me.NewVoipVoiceCtp(params[0])
2849 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002850 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2851 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002852 if err != nil {
2853 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for create", log.Fields{"Err": err,
2854 "device-id": oo.deviceID})
2855 return nil, err
2856 }
2857
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002858 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002859 if err != nil {
2860 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP create", log.Fields{"Err": err,
2861 "device-id": oo.deviceID})
2862 return nil, err
2863 }
2864
2865 omciRxCallbackPair := CallbackPair{CbKey: tid,
2866 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2867 }
2868 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2869 if err != nil {
2870 logger.Errorw(ctx, "Cannot send VoipVoiceCTP create", log.Fields{"Err": err,
2871 "device-id": oo.deviceID})
2872 return nil, err
2873 }
2874 logger.Debug(ctx, "send VoipVoiceCTP-create-msg done")
2875 return meInstance, nil
2876 }
2877 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance", log.Fields{"Err": omciErr.GetError(),
2878 "device-id": oo.deviceID})
2879 return nil, omciErr.GetError()
2880}
2881
2882// SendSetVoipVoiceCTP nolint: unused
2883func (oo *OmciCC) SendSetVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2884 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2885 tid := oo.GetNextTid(highPrio)
2886 logger.Debugw(ctx, "send VoipVoiceCTP-set-msg:", log.Fields{"device-id": oo.deviceID,
2887 "SequNo": strconv.FormatInt(int64(tid), 16),
2888 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2889
2890 meInstance, omciErr := me.NewVoipVoiceCtp(params[0])
2891 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002892 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2893 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002894 if err != nil {
2895 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for set", log.Fields{"Err": err,
2896 "device-id": oo.deviceID})
2897 return nil, err
2898 }
2899
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002900 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002901 if err != nil {
2902 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP set", log.Fields{"Err": err,
2903 "device-id": oo.deviceID})
2904 return nil, err
2905 }
2906
2907 omciRxCallbackPair := CallbackPair{CbKey: tid,
2908 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2909 }
2910 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2911 if err != nil {
2912 logger.Errorw(ctx, "Cannot send VoipVoiceCTP set", log.Fields{"Err": err,
2913 "device-id": oo.deviceID})
2914 return nil, err
2915 }
2916 logger.Debug(ctx, "send VoipVoiceCTP-set-msg done")
2917 return meInstance, nil
2918 }
2919 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance", log.Fields{"Err": omciErr.GetError(),
2920 "device-id": oo.deviceID})
2921 return nil, omciErr.GetError()
2922}
2923
2924// SendDeleteVoipVoiceCTP nolint: unused
2925func (oo *OmciCC) SendDeleteVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2926 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
2927 tid := oo.GetNextTid(highPrio)
2928 logger.Debugw(ctx, "send VoipVoiceCTP-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2929 "SequNo": strconv.FormatInt(int64(tid), 16),
2930 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2931
2932 meParams := me.ParamData{EntityID: aInstID}
2933 meInstance, omciErr := me.NewVoipVoiceCtp(meParams)
2934 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002935 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2936 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002937 if err != nil {
2938 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for delete", log.Fields{
2939 "Err": err, "device-id": oo.deviceID})
2940 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2941 // return (dual format) error code that can be used at caller for immediate error treatment
2942 // (relevant to all used sendXX() methods and their error conditions)
2943 return nil, err
2944 }
2945
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002946 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002947 if err != nil {
2948 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP delete", log.Fields{
2949 "Err": err, "device-id": oo.deviceID})
2950 return nil, err
2951 }
2952
2953 omciRxCallbackPair := CallbackPair{
2954 CbKey: tid,
2955 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2956 }
2957 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2958 if err != nil {
2959 logger.Errorw(ctx, "Cannot send VoipVoiceCTP delete", log.Fields{
2960 "Err": err, "device-id": oo.deviceID})
2961 return nil, err
2962 }
2963 logger.Debug(ctx, "send VoipVoiceCTP-Delete-msg done")
2964 return meInstance, nil
2965 }
2966 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance for delete", log.Fields{
2967 "Err": omciErr.GetError(), "device-id": oo.deviceID})
2968 return nil, omciErr.GetError()
2969}
2970
2971// SendCreateVoipMediaProfile nolint: unused
2972func (oo *OmciCC) SendCreateVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2973 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2974 tid := oo.GetNextTid(highPrio)
2975 logger.Debugw(ctx, "send VoipMediaProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
2976 "SequNo": strconv.FormatInt(int64(tid), 16),
2977 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2978
2979 meInstance, omciErr := me.NewVoipMediaProfile(params[0])
2980 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002981 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2982 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002983 if err != nil {
2984 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for create", log.Fields{"Err": err,
2985 "device-id": oo.deviceID})
2986 return nil, err
2987 }
2988
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002989 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002990 if err != nil {
2991 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile create", log.Fields{"Err": err,
2992 "device-id": oo.deviceID})
2993 return nil, err
2994 }
2995
2996 omciRxCallbackPair := CallbackPair{CbKey: tid,
2997 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2998 }
2999 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3000 if err != nil {
3001 logger.Errorw(ctx, "Cannot send VoipMediaProfile create", log.Fields{"Err": err,
3002 "device-id": oo.deviceID})
3003 return nil, err
3004 }
3005 logger.Debug(ctx, "send VoipMediaProfile-create-msg done")
3006 return meInstance, nil
3007 }
3008 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance", log.Fields{"Err": omciErr.GetError(),
3009 "device-id": oo.deviceID})
3010 return nil, omciErr.GetError()
3011}
3012
3013// SendSetVoipMediaProfile nolint: unused
3014func (oo *OmciCC) SendSetVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
3015 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3016 tid := oo.GetNextTid(highPrio)
3017 logger.Debugw(ctx, "send VoipMediaProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
3018 "SequNo": strconv.FormatInt(int64(tid), 16),
3019 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3020
3021 meInstance, omciErr := me.NewVoipMediaProfile(params[0])
3022 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003023 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3024 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003025 if err != nil {
3026 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for set", log.Fields{"Err": err,
3027 "device-id": oo.deviceID})
3028 return nil, err
3029 }
3030
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003031 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003032 if err != nil {
3033 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile set", log.Fields{"Err": err,
3034 "device-id": oo.deviceID})
3035 return nil, err
3036 }
3037
3038 omciRxCallbackPair := CallbackPair{CbKey: tid,
3039 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3040 }
3041 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3042 if err != nil {
3043 logger.Errorw(ctx, "Cannot send VoipMediaProfile set", log.Fields{"Err": err,
3044 "device-id": oo.deviceID})
3045 return nil, err
3046 }
3047 logger.Debug(ctx, "send VoipMediaProfile-set-msg done")
3048 return meInstance, nil
3049 }
3050 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance", log.Fields{"Err": omciErr.GetError(),
3051 "device-id": oo.deviceID})
3052 return nil, omciErr.GetError()
3053}
3054
3055// SendDeleteVoipMediaProfile nolint: unused
3056func (oo *OmciCC) SendDeleteVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
3057 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3058 tid := oo.GetNextTid(highPrio)
3059 logger.Debugw(ctx, "send VoipMediaProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3060 "SequNo": strconv.FormatInt(int64(tid), 16),
3061 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3062
3063 meParams := me.ParamData{EntityID: aInstID}
3064 meInstance, omciErr := me.NewVoipMediaProfile(meParams)
3065 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003066 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3067 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003068 if err != nil {
3069 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for delete", log.Fields{
3070 "Err": err, "device-id": oo.deviceID})
3071 return nil, err
3072 }
3073
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003074 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003075 if err != nil {
3076 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile delete", log.Fields{
3077 "Err": err, "device-id": oo.deviceID})
3078 return nil, err
3079 }
3080
3081 omciRxCallbackPair := CallbackPair{
3082 CbKey: tid,
3083 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3084 }
3085 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3086 if err != nil {
3087 logger.Errorw(ctx, "Cannot send VoipMediaProfile delete", log.Fields{
3088 "Err": err, "device-id": oo.deviceID})
3089 return nil, err
3090 }
3091 logger.Debug(ctx, "send VoipMediaProfile-Delete-msg done")
3092 return meInstance, nil
3093 }
3094 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance for delete", log.Fields{
3095 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3096 return nil, omciErr.GetError()
3097}
3098
3099// SendCreateVoiceServiceProfile nolint: unused
3100func (oo *OmciCC) SendCreateVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3101 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3102 tid := oo.GetNextTid(highPrio)
3103 logger.Debugw(ctx, "send VoiceServiceProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
3104 "SequNo": strconv.FormatInt(int64(tid), 16),
3105 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3106
3107 meInstance, omciErr := me.NewVoiceServiceProfile(params[0])
3108 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003109 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3110 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003111 if err != nil {
3112 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for create", log.Fields{"Err": err,
3113 "device-id": oo.deviceID})
3114 return nil, err
3115 }
3116
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003117 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003118 if err != nil {
3119 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile create", log.Fields{"Err": err,
3120 "device-id": oo.deviceID})
3121 return nil, err
3122 }
3123
3124 omciRxCallbackPair := CallbackPair{CbKey: tid,
3125 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3126 }
3127 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3128 if err != nil {
3129 logger.Errorw(ctx, "Cannot send VoiceServiceProfile create", log.Fields{"Err": err,
3130 "device-id": oo.deviceID})
3131 return nil, err
3132 }
3133 logger.Debug(ctx, "send VoiceServiceProfile-create-msg done")
3134 return meInstance, nil
3135 }
3136 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3137 "device-id": oo.deviceID})
3138 return nil, omciErr.GetError()
3139}
3140
3141// SendSetVoiceServiceProfile nolint: unused
3142func (oo *OmciCC) SendSetVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3143 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3144 tid := oo.GetNextTid(highPrio)
3145 logger.Debugw(ctx, "send VoiceServiceProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
3146 "SequNo": strconv.FormatInt(int64(tid), 16),
3147 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3148
3149 meInstance, omciErr := me.NewVoiceServiceProfile(params[0])
3150 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003151 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3152 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003153 if err != nil {
3154 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for set", log.Fields{"Err": err,
3155 "device-id": oo.deviceID})
3156 return nil, err
3157 }
3158
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003159 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003160 if err != nil {
3161 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile set", log.Fields{"Err": err,
3162 "device-id": oo.deviceID})
3163 return nil, err
3164 }
3165
3166 omciRxCallbackPair := CallbackPair{CbKey: tid,
3167 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3168 }
3169 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3170 if err != nil {
3171 logger.Errorw(ctx, "Cannot send VoiceServiceProfile set", log.Fields{"Err": err,
3172 "device-id": oo.deviceID})
3173 return nil, err
3174 }
3175 logger.Debug(ctx, "send VoiceServiceProfile-set-msg done")
3176 return meInstance, nil
3177 }
3178 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3179 "device-id": oo.deviceID})
3180 return nil, omciErr.GetError()
3181}
3182
3183// SendDeleteVoiceServiceProfile nolint: unused
3184func (oo *OmciCC) SendDeleteVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3185 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3186 tid := oo.GetNextTid(highPrio)
3187 logger.Debugw(ctx, "send VoiceServiceProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3188 "SequNo": strconv.FormatInt(int64(tid), 16),
3189 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3190
3191 meParams := me.ParamData{EntityID: aInstID}
3192 meInstance, omciErr := me.NewVoiceServiceProfile(meParams)
3193 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003194 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3195 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003196 if err != nil {
3197 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for delete", log.Fields{
3198 "Err": err, "device-id": oo.deviceID})
3199 return nil, err
3200 }
3201
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003202 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003203 if err != nil {
3204 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile delete", log.Fields{
3205 "Err": err, "device-id": oo.deviceID})
3206 return nil, err
3207 }
3208
3209 omciRxCallbackPair := CallbackPair{
3210 CbKey: tid,
3211 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3212 }
3213 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3214 if err != nil {
3215 logger.Errorw(ctx, "Cannot send VoiceServiceProfile delete", log.Fields{
3216 "Err": err, "device-id": oo.deviceID})
3217 return nil, err
3218 }
3219 logger.Debug(ctx, "send VoiceServiceProfile-Delete-msg done")
3220 return meInstance, nil
3221 }
3222 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance for delete", log.Fields{
3223 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3224 return nil, omciErr.GetError()
3225}
3226
3227// SendCreateSIPUserData nolint: unused
3228func (oo *OmciCC) SendCreateSIPUserData(ctx context.Context, timeout int, highPrio bool,
3229 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3230 tid := oo.GetNextTid(highPrio)
3231 logger.Debugw(ctx, "send SIPUserData-create-msg:", log.Fields{"device-id": oo.deviceID,
3232 "SequNo": strconv.FormatInt(int64(tid), 16),
3233 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3234
3235 meInstance, omciErr := me.NewSipUserData(params[0])
3236 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003237 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3238 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003239 if err != nil {
3240 logger.Errorw(ctx, "Cannot encode SIPUserData for create", log.Fields{"Err": err,
3241 "device-id": oo.deviceID})
3242 return nil, err
3243 }
3244
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003245 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003246 if err != nil {
3247 logger.Errorw(ctx, "Cannot serialize SIPUserData create", log.Fields{"Err": err,
3248 "device-id": oo.deviceID})
3249 return nil, err
3250 }
3251
3252 omciRxCallbackPair := CallbackPair{CbKey: tid,
3253 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3254 }
3255 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3256 if err != nil {
3257 logger.Errorw(ctx, "Cannot send SIPUserData create", log.Fields{"Err": err,
3258 "device-id": oo.deviceID})
3259 return nil, err
3260 }
3261 logger.Debug(ctx, "send SIPUserData-create-msg done")
3262 return meInstance, nil
3263 }
3264 logger.Errorw(ctx, "Cannot generate SIPUserData Instance", log.Fields{"Err": omciErr.GetError(),
3265 "device-id": oo.deviceID})
3266 return nil, omciErr.GetError()
3267}
3268
3269// SendSetSIPUserData nolint: unused
3270func (oo *OmciCC) SendSetSIPUserData(ctx context.Context, timeout int, highPrio bool,
3271 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3272 tid := oo.GetNextTid(highPrio)
3273 logger.Debugw(ctx, "send SIPUserData-set-msg:", log.Fields{"device-id": oo.deviceID,
3274 "SequNo": strconv.FormatInt(int64(tid), 16),
3275 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3276
3277 meInstance, omciErr := me.NewSipUserData(params[0])
3278 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003279 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3280 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003281 if err != nil {
3282 logger.Errorw(ctx, "Cannot encode SIPUserData for set", log.Fields{"Err": err,
3283 "device-id": oo.deviceID})
3284 return nil, err
3285 }
3286
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003287 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003288 if err != nil {
3289 logger.Errorw(ctx, "Cannot serialize SIPUserData set", log.Fields{"Err": err,
3290 "device-id": oo.deviceID})
3291 return nil, err
3292 }
3293
3294 omciRxCallbackPair := CallbackPair{CbKey: tid,
3295 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3296 }
3297 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3298 if err != nil {
3299 logger.Errorw(ctx, "Cannot send SIPUserData set", log.Fields{"Err": err,
3300 "device-id": oo.deviceID})
3301 return nil, err
3302 }
3303 logger.Debug(ctx, "send SIPUserData-set-msg done")
3304 return meInstance, nil
3305 }
3306 logger.Errorw(ctx, "Cannot generate SIPUserData Instance", log.Fields{"Err": omciErr.GetError(),
3307 "device-id": oo.deviceID})
3308 return nil, omciErr.GetError()
3309}
3310
3311// SendDeleteSIPUserData nolint: unused
3312func (oo *OmciCC) SendDeleteSIPUserData(ctx context.Context, timeout int, highPrio bool,
3313 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3314 tid := oo.GetNextTid(highPrio)
3315 logger.Debugw(ctx, "send SIPUserData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3316 "SequNo": strconv.FormatInt(int64(tid), 16),
3317 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3318
3319 meParams := me.ParamData{EntityID: aInstID}
3320 meInstance, omciErr := me.NewSipUserData(meParams)
3321 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003322 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3323 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003324 if err != nil {
3325 logger.Errorw(ctx, "Cannot encode SIPUserData for delete", log.Fields{
3326 "Err": err, "device-id": oo.deviceID})
3327 return nil, err
3328 }
3329
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003330 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003331 if err != nil {
3332 logger.Errorw(ctx, "Cannot serialize SIPUserData delete", log.Fields{
3333 "Err": err, "device-id": oo.deviceID})
3334 return nil, err
3335 }
3336
3337 omciRxCallbackPair := CallbackPair{
3338 CbKey: tid,
3339 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3340 }
3341 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3342 if err != nil {
3343 logger.Errorw(ctx, "Cannot send SIPUserData delete", log.Fields{
3344 "Err": err, "device-id": oo.deviceID})
3345 return nil, err
3346 }
3347 logger.Debug(ctx, "send SIPUserData-Delete-msg done")
3348 return meInstance, nil
3349 }
3350 logger.Errorw(ctx, "Cannot generate SIPUserData Instance for delete", log.Fields{
3351 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3352 return nil, omciErr.GetError()
3353}
3354
3355// SendCreateVoipApplicationServiceProfile nolint: unused
3356func (oo *OmciCC) SendCreateVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3357 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3358 tid := oo.GetNextTid(highPrio)
3359 logger.Debugw(ctx, "send VoipApplicationServiceProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
3360 "SequNo": strconv.FormatInt(int64(tid), 16),
3361 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3362
3363 meInstance, omciErr := me.NewVoipApplicationServiceProfile(params[0])
3364 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003365 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3366 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003367 if err != nil {
3368 logger.Errorw(ctx, "Cannot encode VoipApplicationServiceProfile for create", log.Fields{"Err": err,
3369 "device-id": oo.deviceID})
3370 return nil, err
3371 }
3372
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003373 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003374 if err != nil {
3375 logger.Errorw(ctx, "Cannot serialize VoipApplicationServiceProfile create", log.Fields{"Err": err,
3376 "device-id": oo.deviceID})
3377 return nil, err
3378 }
3379
3380 omciRxCallbackPair := CallbackPair{CbKey: tid,
3381 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3382 }
3383 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3384 if err != nil {
3385 logger.Errorw(ctx, "Cannot send VoipApplicationServiceProfile create", log.Fields{"Err": err,
3386 "device-id": oo.deviceID})
3387 return nil, err
3388 }
3389 logger.Debug(ctx, "send VoipApplicationServiceProfile-create-msg done")
3390 return meInstance, nil
3391 }
3392 logger.Errorw(ctx, "Cannot generate VoipApplicationServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3393 "device-id": oo.deviceID})
3394 return nil, omciErr.GetError()
3395}
3396
3397// SendSetVoipApplicationServiceProfile nolint: unused
3398func (oo *OmciCC) SendSetVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3399 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3400 tid := oo.GetNextTid(highPrio)
3401 logger.Debugw(ctx, "send VoipApplicationServiceProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
3402 "SequNo": strconv.FormatInt(int64(tid), 16),
3403 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3404
3405 meInstance, omciErr := me.NewVoipApplicationServiceProfile(params[0])
3406 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003407 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3408 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003409 if err != nil {
3410 logger.Errorw(ctx, "Cannot encode VoipApplicationServiceProfile for set", log.Fields{"Err": err,
3411 "device-id": oo.deviceID})
3412 return nil, err
3413 }
3414
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003415 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003416 if err != nil {
3417 logger.Errorw(ctx, "Cannot serialize VoipApplicationServiceProfile set", log.Fields{"Err": err,
3418 "device-id": oo.deviceID})
3419 return nil, err
3420 }
3421
3422 omciRxCallbackPair := CallbackPair{CbKey: tid,
3423 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3424 }
3425 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3426 if err != nil {
3427 logger.Errorw(ctx, "Cannot send VoipApplicationServiceProfile set", log.Fields{"Err": err,
3428 "device-id": oo.deviceID})
3429 return nil, err
3430 }
3431 logger.Debug(ctx, "send VoipApplicationServiceProfile-set-msg done")
3432 return meInstance, nil
3433 }
3434 logger.Errorw(ctx, "Cannot generate VoipApplicationServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3435 "device-id": oo.deviceID})
3436 return nil, omciErr.GetError()
3437}
3438
3439// SendDeleteVoipApplicationServiceProfile nolint: unused
3440func (oo *OmciCC) SendDeleteVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3441 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3442 tid := oo.GetNextTid(highPrio)
3443 logger.Debugw(ctx, "send SIPVoipApplicationServiceProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3444 "SequNo": strconv.FormatInt(int64(tid), 16),
3445 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3446
3447 meParams := me.ParamData{EntityID: aInstID}
3448 meInstance, omciErr := me.NewVoipApplicationServiceProfile(meParams)
3449 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003450 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3451 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003452 if err != nil {
3453 logger.Errorw(ctx, "Cannot encode SIPVoipApplicationServiceProfile for delete", log.Fields{
3454 "Err": err, "device-id": oo.deviceID})
3455 return nil, err
3456 }
3457
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003458 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003459 if err != nil {
3460 logger.Errorw(ctx, "Cannot serialize SIPVoipApplicationServiceProfile delete", log.Fields{
3461 "Err": err, "device-id": oo.deviceID})
3462 return nil, err
3463 }
3464
3465 omciRxCallbackPair := CallbackPair{
3466 CbKey: tid,
3467 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3468 }
3469 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3470 if err != nil {
3471 logger.Errorw(ctx, "Cannot send SIPVoipApplicationServiceProfile delete", log.Fields{
3472 "Err": err, "device-id": oo.deviceID})
3473 return nil, err
3474 }
3475 logger.Debug(ctx, "send SIPVoipApplicationServiceProfile-Delete-msg done")
3476 return meInstance, nil
3477 }
3478 logger.Errorw(ctx, "Cannot generate SIPVoipApplicationServiceProfile Instance for delete", log.Fields{
3479 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3480 return nil, omciErr.GetError()
3481}
3482
3483// SendCreateSIPAgentConfigData nolint: unused
3484func (oo *OmciCC) SendCreateSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3485 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3486 tid := oo.GetNextTid(highPrio)
3487 logger.Debugw(ctx, "send SIPAgentConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3488 "SequNo": strconv.FormatInt(int64(tid), 16),
3489 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3490
3491 meInstance, omciErr := me.NewSipAgentConfigData(params[0])
3492 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003493 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3494 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003495 if err != nil {
3496 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for create", log.Fields{"Err": err,
3497 "device-id": oo.deviceID})
3498 return nil, err
3499 }
3500
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003501 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003502 if err != nil {
3503 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData create", log.Fields{"Err": err,
3504 "device-id": oo.deviceID})
3505 return nil, err
3506 }
3507
3508 omciRxCallbackPair := CallbackPair{CbKey: tid,
3509 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3510 }
3511 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3512 if err != nil {
3513 logger.Errorw(ctx, "Cannot send SIPAgentConfigData create", log.Fields{"Err": err,
3514 "device-id": oo.deviceID})
3515 return nil, err
3516 }
3517 logger.Debug(ctx, "send SIPAgentConfigData-create-msg done")
3518 return meInstance, nil
3519 }
3520 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3521 "device-id": oo.deviceID})
3522 return nil, omciErr.GetError()
3523}
3524
3525// SendSetSIPAgentConfigData nolint: unused
3526func (oo *OmciCC) SendSetSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3527 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3528 tid := oo.GetNextTid(highPrio)
3529 logger.Debugw(ctx, "send SIPAgentConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3530 "SequNo": strconv.FormatInt(int64(tid), 16),
3531 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3532
3533 meInstance, omciErr := me.NewSipAgentConfigData(params[0])
3534 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003535 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3536 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003537 if err != nil {
3538 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for set", log.Fields{"Err": err,
3539 "device-id": oo.deviceID})
3540 return nil, err
3541 }
3542
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003543 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003544 if err != nil {
3545 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData set", log.Fields{"Err": err,
3546 "device-id": oo.deviceID})
3547 return nil, err
3548 }
3549
3550 omciRxCallbackPair := CallbackPair{CbKey: tid,
3551 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3552 }
3553 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3554 if err != nil {
3555 logger.Errorw(ctx, "Cannot send SIPAgentConfigData set", log.Fields{"Err": err,
3556 "device-id": oo.deviceID})
3557 return nil, err
3558 }
3559 logger.Debug(ctx, "send SIPAgentConfigData-set-msg done")
3560 return meInstance, nil
3561 }
3562 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3563 "device-id": oo.deviceID})
3564 return nil, omciErr.GetError()
3565}
3566
3567// SendDeleteSIPAgentConfigData nolint: unused
3568func (oo *OmciCC) SendDeleteSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3569 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3570 tid := oo.GetNextTid(highPrio)
3571 logger.Debugw(ctx, "send SIPAgentConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3572 "SequNo": strconv.FormatInt(int64(tid), 16),
3573 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3574
3575 meParams := me.ParamData{EntityID: aInstID}
3576 meInstance, omciErr := me.NewSipAgentConfigData(meParams)
3577 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003578 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3579 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003580 if err != nil {
3581 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for delete", log.Fields{
3582 "Err": err, "device-id": oo.deviceID})
3583 return nil, err
3584 }
3585
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003586 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003587 if err != nil {
3588 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData delete", log.Fields{
3589 "Err": err, "device-id": oo.deviceID})
3590 return nil, err
3591 }
3592
3593 omciRxCallbackPair := CallbackPair{
3594 CbKey: tid,
3595 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3596 }
3597 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3598 if err != nil {
3599 logger.Errorw(ctx, "Cannot send SIPAgentConfigData delete", log.Fields{
3600 "Err": err, "device-id": oo.deviceID})
3601 return nil, err
3602 }
3603 logger.Debug(ctx, "send SIPAgentConfigData-Delete-msg done")
3604 return meInstance, nil
3605 }
3606 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance for delete", log.Fields{
3607 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3608 return nil, omciErr.GetError()
3609}
3610
3611// SendCreateTCPUDPConfigData nolint: unused
3612func (oo *OmciCC) SendCreateTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3613 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3614 tid := oo.GetNextTid(highPrio)
3615 logger.Debugw(ctx, "send TCPUDPConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3616 "SequNo": strconv.FormatInt(int64(tid), 16),
3617 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3618
3619 meInstance, omciErr := me.NewTcpUdpConfigData(params[0])
3620 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003621 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3622 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003623 if err != nil {
3624 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for create", log.Fields{"Err": err,
3625 "device-id": oo.deviceID})
3626 return nil, err
3627 }
3628
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003629 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003630 if err != nil {
3631 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData create", log.Fields{"Err": err,
3632 "device-id": oo.deviceID})
3633 return nil, err
3634 }
3635
3636 omciRxCallbackPair := CallbackPair{CbKey: tid,
3637 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3638 }
3639 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3640 if err != nil {
3641 logger.Errorw(ctx, "Cannot send TCPUDPConfigData create", log.Fields{"Err": err,
3642 "device-id": oo.deviceID})
3643 return nil, err
3644 }
3645 logger.Debug(ctx, "send TCPUDPConfigData-create-msg done")
3646 return meInstance, nil
3647 }
3648 logger.Errorw(ctx, "Cannot generate TCPUDPConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3649 "device-id": oo.deviceID})
3650 return nil, omciErr.GetError()
3651}
3652
3653// SendSetTCPUDPConfigData nolint: unused
3654func (oo *OmciCC) SendSetTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3655 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3656 tid := oo.GetNextTid(highPrio)
3657 logger.Debugw(ctx, "send TCPUDPConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3658 "SequNo": strconv.FormatInt(int64(tid), 16),
3659 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3660
3661 meInstance, omciErr := me.NewTcpUdpConfigData(params[0])
3662 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003663 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3664 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003665 if err != nil {
3666 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for set", log.Fields{"Err": err,
3667 "device-id": oo.deviceID})
3668 return nil, err
3669 }
3670
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003671 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003672 if err != nil {
3673 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData set", log.Fields{"Err": err,
3674 "device-id": oo.deviceID})
3675 return nil, err
3676 }
3677
3678 omciRxCallbackPair := CallbackPair{CbKey: tid,
3679 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3680 }
3681 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3682 if err != nil {
3683 logger.Errorw(ctx, "Cannot send TCPUDPConfigData set", log.Fields{"Err": err,
3684 "device-id": oo.deviceID})
3685 return nil, err
3686 }
3687 logger.Debug(ctx, "send TCPUDPConfigData-set-msg done")
3688 return meInstance, nil
3689 }
3690 logger.Errorw(ctx, "Cannot generate TCPUDPConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3691 "device-id": oo.deviceID})
3692 return nil, omciErr.GetError()
3693}
3694
3695// SendDeleteTCPUDPConfigData nolint: unused
3696func (oo *OmciCC) SendDeleteTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3697 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3698 tid := oo.GetNextTid(highPrio)
3699 logger.Debugw(ctx, "send TCPUDPConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3700 "SequNo": strconv.FormatInt(int64(tid), 16),
3701 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3702
3703 meParams := me.ParamData{EntityID: aInstID}
3704 meInstance, omciErr := me.NewTcpUdpConfigData(meParams)
3705 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003706 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3707 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003708 if err != nil {
3709 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for delete", log.Fields{
3710 "Err": err, "device-id": oo.deviceID})
3711 return nil, err
3712 }
3713
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003714 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003715 if err != nil {
3716 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData delete", log.Fields{
3717 "Err": err, "device-id": oo.deviceID})
3718 return nil, err
3719 }
3720
3721 omciRxCallbackPair := CallbackPair{
3722 CbKey: tid,
3723 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3724 }
3725 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3726 if err != nil {
3727 logger.Errorw(ctx, "Cannot send TCPUDPConfigData delete", log.Fields{
3728 "Err": err, "device-id": oo.deviceID})
3729 return nil, err
3730 }
3731 logger.Debug(ctx, "send TCPUDPConfigData-Delete-msg done")
3732 return meInstance, nil
3733 }
3734 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance for delete", log.Fields{
3735 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3736 return nil, omciErr.GetError()
3737}
3738
3739// SendCreateIPHostConfigData nolint: unused
3740func (oo *OmciCC) SendCreateIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3741 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3742 tid := oo.GetNextTid(highPrio)
3743 logger.Debugw(ctx, "send IPHostConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3744 "SequNo": strconv.FormatInt(int64(tid), 16),
3745 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3746
3747 meInstance, omciErr := me.NewIpHostConfigData(params[0])
3748 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003749 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3750 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003751 if err != nil {
3752 logger.Errorw(ctx, "Cannot encode IPHostConfigData for create", log.Fields{"Err": err,
3753 "device-id": oo.deviceID})
3754 return nil, err
3755 }
3756
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003757 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003758 if err != nil {
3759 logger.Errorw(ctx, "Cannot serialize IPHostConfigData create", log.Fields{"Err": err,
3760 "device-id": oo.deviceID})
3761 return nil, err
3762 }
3763
3764 omciRxCallbackPair := CallbackPair{CbKey: tid,
3765 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3766 }
3767 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3768 if err != nil {
3769 logger.Errorw(ctx, "Cannot send IPHostConfigData create", log.Fields{"Err": err,
3770 "device-id": oo.deviceID})
3771 return nil, err
3772 }
3773 logger.Debug(ctx, "send IPHostConfigData-create-msg done")
3774 return meInstance, nil
3775 }
3776 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3777 "device-id": oo.deviceID})
3778 return nil, omciErr.GetError()
3779}
3780
3781// SendSetIPHostConfigData nolint: unused
3782func (oo *OmciCC) SendSetIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3783 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3784 tid := oo.GetNextTid(highPrio)
3785 logger.Debugw(ctx, "send IPHostConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3786 "SequNo": strconv.FormatInt(int64(tid), 16),
3787 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3788
3789 meInstance, omciErr := me.NewIpHostConfigData(params[0])
3790 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003791 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3792 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003793 if err != nil {
3794 logger.Errorw(ctx, "Cannot encode IPHostConfigData for set", log.Fields{"Err": err,
3795 "device-id": oo.deviceID})
3796 return nil, err
3797 }
3798
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003799 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003800 if err != nil {
3801 logger.Errorw(ctx, "Cannot serialize IPHostConfigData set", log.Fields{"Err": err,
3802 "device-id": oo.deviceID})
3803 return nil, err
3804 }
3805
3806 omciRxCallbackPair := CallbackPair{CbKey: tid,
3807 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3808 }
3809 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3810 if err != nil {
3811 logger.Errorw(ctx, "Cannot send IPHostConfigData set", log.Fields{"Err": err,
3812 "device-id": oo.deviceID})
3813 return nil, err
3814 }
3815 logger.Debug(ctx, "send IPHostConfigData-set-msg done")
3816 return meInstance, nil
3817 }
3818 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3819 "device-id": oo.deviceID})
3820 return nil, omciErr.GetError()
3821}
3822
3823// SendDeleteIPHostConfigData nolint: unused
3824func (oo *OmciCC) SendDeleteIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3825 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3826 tid := oo.GetNextTid(highPrio)
3827 logger.Debugw(ctx, "send IPHostConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3828 "SequNo": strconv.FormatInt(int64(tid), 16),
3829 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3830
3831 meParams := me.ParamData{EntityID: aInstID}
3832 meInstance, omciErr := me.NewIpHostConfigData(meParams)
3833 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003834 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3835 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003836 if err != nil {
3837 logger.Errorw(ctx, "Cannot encode IPHostConfigData for delete", log.Fields{
3838 "Err": err, "device-id": oo.deviceID})
3839 return nil, err
3840 }
3841
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003842 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003843 if err != nil {
3844 logger.Errorw(ctx, "Cannot serialize IPHostConfigData delete", log.Fields{
3845 "Err": err, "device-id": oo.deviceID})
3846 return nil, err
3847 }
3848
3849 omciRxCallbackPair := CallbackPair{
3850 CbKey: tid,
3851 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3852 }
3853 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3854 if err != nil {
3855 logger.Errorw(ctx, "Cannot send IPHostConfigData delete", log.Fields{
3856 "Err": err, "device-id": oo.deviceID})
3857 return nil, err
3858 }
3859 logger.Debug(ctx, "send IPHostConfigData-Delete-msg done")
3860 return meInstance, nil
3861 }
3862 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance for delete", log.Fields{
3863 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3864 return nil, omciErr.GetError()
3865}
3866
3867// SendCreateRTPProfileData nolint: unused
3868func (oo *OmciCC) SendCreateRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3869 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3870 tid := oo.GetNextTid(highPrio)
3871 logger.Debugw(ctx, "send RTPProfileData-create-msg:", log.Fields{"device-id": oo.deviceID,
3872 "SequNo": strconv.FormatInt(int64(tid), 16),
3873 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3874
3875 meInstance, omciErr := me.NewRtpProfileData(params[0])
3876 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003877 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3878 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003879 if err != nil {
3880 logger.Errorw(ctx, "Cannot encode RTPProfileData for create", log.Fields{"Err": err,
3881 "device-id": oo.deviceID})
3882 return nil, err
3883 }
3884
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003885 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003886 if err != nil {
3887 logger.Errorw(ctx, "Cannot serialize RTPProfileData create", log.Fields{"Err": err,
3888 "device-id": oo.deviceID})
3889 return nil, err
3890 }
3891
3892 omciRxCallbackPair := CallbackPair{CbKey: tid,
3893 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3894 }
3895 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3896 if err != nil {
3897 logger.Errorw(ctx, "Cannot send RTPProfileData create", log.Fields{"Err": err,
3898 "device-id": oo.deviceID})
3899 return nil, err
3900 }
3901 logger.Debug(ctx, "send RTPProfileData-create-msg done")
3902 return meInstance, nil
3903 }
3904 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance", log.Fields{"Err": omciErr.GetError(),
3905 "device-id": oo.deviceID})
3906 return nil, omciErr.GetError()
3907}
3908
3909// SendSetRTPProfileData nolint: unused
3910func (oo *OmciCC) SendSetRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3911 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3912 tid := oo.GetNextTid(highPrio)
3913 logger.Debugw(ctx, "send RTPProfileData-set-msg:", log.Fields{"device-id": oo.deviceID,
3914 "SequNo": strconv.FormatInt(int64(tid), 16),
3915 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3916
3917 meInstance, omciErr := me.NewRtpProfileData(params[0])
3918 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003919 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3920 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003921 if err != nil {
3922 logger.Errorw(ctx, "Cannot encode RTPProfileData for set", log.Fields{"Err": err,
3923 "device-id": oo.deviceID})
3924 return nil, err
3925 }
3926
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003927 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003928 if err != nil {
3929 logger.Errorw(ctx, "Cannot serialize RTPProfileData set", log.Fields{"Err": err,
3930 "device-id": oo.deviceID})
3931 return nil, err
3932 }
3933
3934 omciRxCallbackPair := CallbackPair{CbKey: tid,
3935 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3936 }
3937 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3938 if err != nil {
3939 logger.Errorw(ctx, "Cannot send RTPProfileData set", log.Fields{"Err": err,
3940 "device-id": oo.deviceID})
3941 return nil, err
3942 }
3943 logger.Debug(ctx, "send RTPProfileData-set-msg done")
3944 return meInstance, nil
3945 }
3946 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance", log.Fields{"Err": omciErr.GetError(),
3947 "device-id": oo.deviceID})
3948 return nil, omciErr.GetError()
3949}
3950
3951// SendDeleteRTPProfileData nolint: unused
3952func (oo *OmciCC) SendDeleteRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3953 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3954 tid := oo.GetNextTid(highPrio)
3955 logger.Debugw(ctx, "send RTPProfileData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3956 "SequNo": strconv.FormatInt(int64(tid), 16),
3957 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3958
3959 meParams := me.ParamData{EntityID: aInstID}
3960 meInstance, omciErr := me.NewRtpProfileData(meParams)
3961 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003962 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3963 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003964 if err != nil {
3965 logger.Errorw(ctx, "Cannot encode RTPProfileData for delete", log.Fields{
3966 "Err": err, "device-id": oo.deviceID})
3967 return nil, err
3968 }
3969
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003970 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003971 if err != nil {
3972 logger.Errorw(ctx, "Cannot serialize RTPProfileData delete", log.Fields{
3973 "Err": err, "device-id": oo.deviceID})
3974 return nil, err
3975 }
3976
3977 omciRxCallbackPair := CallbackPair{
3978 CbKey: tid,
3979 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3980 }
3981 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3982 if err != nil {
3983 logger.Errorw(ctx, "Cannot send RTPProfileData delete", log.Fields{
3984 "Err": err, "device-id": oo.deviceID})
3985 return nil, err
3986 }
3987 logger.Debug(ctx, "send RTPProfileData-Delete-msg done")
3988 return meInstance, nil
3989 }
3990 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance for delete", log.Fields{
3991 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3992 return nil, omciErr.GetError()
3993}
3994
3995// SendCreateNetworkDialPlanTable nolint: unused
3996func (oo *OmciCC) SendCreateNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
3997 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3998 tid := oo.GetNextTid(highPrio)
3999 logger.Debugw(ctx, "send NetworkDialPlanTable-create-msg:", log.Fields{"device-id": oo.deviceID,
4000 "SequNo": strconv.FormatInt(int64(tid), 16),
4001 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
4002
4003 meInstance, omciErr := me.NewNetworkDialPlanTable(params[0])
4004 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00004005 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4006 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004007 if err != nil {
4008 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for create", log.Fields{"Err": err,
4009 "device-id": oo.deviceID})
4010 return nil, err
4011 }
4012
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004013 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004014 if err != nil {
4015 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable create", log.Fields{"Err": err,
4016 "device-id": oo.deviceID})
4017 return nil, err
4018 }
4019
4020 omciRxCallbackPair := CallbackPair{CbKey: tid,
4021 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4022 }
4023 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
4024 if err != nil {
4025 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable create", log.Fields{"Err": err,
4026 "device-id": oo.deviceID})
4027 return nil, err
4028 }
4029 logger.Debug(ctx, "send NetworkDialPlanTable-create-msg done")
4030 return meInstance, nil
4031 }
4032 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance", log.Fields{"Err": omciErr.GetError(),
4033 "device-id": oo.deviceID})
4034 return nil, omciErr.GetError()
4035}
4036
4037// SendSetNetworkDialPlanTable nolint: unused
4038func (oo *OmciCC) SendSetNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
4039 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
4040 tid := oo.GetNextTid(highPrio)
4041 logger.Debugw(ctx, "send NetworkDialPlanTable-set-msg:", log.Fields{"device-id": oo.deviceID,
4042 "SequNo": strconv.FormatInt(int64(tid), 16),
4043 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
4044
4045 meInstance, omciErr := me.NewNetworkDialPlanTable(params[0])
4046 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00004047 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
4048 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004049 if err != nil {
4050 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for set", log.Fields{"Err": err,
4051 "device-id": oo.deviceID})
4052 return nil, err
4053 }
4054
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004055 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004056 if err != nil {
4057 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable set", log.Fields{"Err": err,
4058 "device-id": oo.deviceID})
4059 return nil, err
4060 }
4061
4062 omciRxCallbackPair := CallbackPair{CbKey: tid,
4063 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4064 }
4065 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
4066 if err != nil {
4067 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable set", log.Fields{"Err": err,
4068 "device-id": oo.deviceID})
4069 return nil, err
4070 }
4071 logger.Debug(ctx, "send NetworkDialPlanTable-set-msg done")
4072 return meInstance, nil
4073 }
4074 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance", log.Fields{"Err": omciErr.GetError(),
4075 "device-id": oo.deviceID})
4076 return nil, omciErr.GetError()
4077}
4078
4079// SendDeleteNetworkDialPlanTable nolint: unused
4080func (oo *OmciCC) SendDeleteNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
4081 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
4082 tid := oo.GetNextTid(highPrio)
4083 logger.Debugw(ctx, "send NetworkDialPlanTable-Delete-msg:", log.Fields{"device-id": oo.deviceID,
4084 "SequNo": strconv.FormatInt(int64(tid), 16),
4085 "InstId": strconv.FormatInt(int64(aInstID), 16)})
4086
4087 meParams := me.ParamData{EntityID: aInstID}
4088 meInstance, omciErr := me.NewNetworkDialPlanTable(meParams)
4089 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00004090 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
4091 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004092 if err != nil {
4093 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for delete", log.Fields{
4094 "Err": err, "device-id": oo.deviceID})
4095 return nil, err
4096 }
4097
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004098 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004099 if err != nil {
4100 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable delete", log.Fields{
4101 "Err": err, "device-id": oo.deviceID})
4102 return nil, err
4103 }
4104
4105 omciRxCallbackPair := CallbackPair{
4106 CbKey: tid,
4107 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4108 }
4109 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
4110 if err != nil {
4111 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable delete", log.Fields{
4112 "Err": err, "device-id": oo.deviceID})
4113 return nil, err
4114 }
4115 logger.Debug(ctx, "send NetworkDialPlanTable-Delete-msg done")
4116 return meInstance, nil
4117 }
4118 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance for delete", log.Fields{
4119 "Err": omciErr.GetError(), "device-id": oo.deviceID})
4120 return nil, omciErr.GetError()
4121}
4122
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004123// SendSyncTime sends SynchronizeTimeRequest
4124func (oo *OmciCC) SendSyncTime(ctx context.Context, timeout int, highPrio bool, rxChan chan Message) error {
4125 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004126 logger.Debugw(ctx, "send synchronize time request:", log.Fields{"device-id": oo.deviceID,
4127 "SequNo": strconv.FormatInt(int64(tid), 16)})
4128
4129 omciLayer := &omci.OMCI{
4130 TransactionID: tid,
4131 MessageType: omci.SynchronizeTimeRequestType,
4132 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4133 // Length: 0x28, // Optional, defaults to 40 octets
4134 }
4135 utcTime := time.Now().UTC()
4136 request := &omci.SynchronizeTimeRequest{
4137 MeBasePacket: omci.MeBasePacket{
4138 EntityClass: me.OnuGClassID,
4139 // Default Instance ID is 0
4140 },
4141 Year: uint16(utcTime.Year()),
4142 Month: uint8(utcTime.Month()),
4143 Day: uint8(utcTime.Day()),
4144 Hour: uint8(utcTime.Hour()),
4145 Minute: uint8(utcTime.Minute()),
4146 Second: uint8(utcTime.Second()),
4147 }
4148
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004149 pkt, err := SerializeOmciLayer(ctx, omciLayer, request)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004150 if err != nil {
4151 logger.Errorw(ctx, "Cannot serialize synchronize time request", log.Fields{"Err": err,
4152 "device-id": oo.deviceID})
4153 return err
4154 }
4155
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004156 omciRxCallbackPair := CallbackPair{CbKey: tid,
4157 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004158 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004159 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004160 if err != nil {
4161 logger.Errorw(ctx, "Cannot send synchronize time request", log.Fields{"Err": err,
4162 "device-id": oo.deviceID})
4163 return err
4164 }
4165 logger.Debug(ctx, "send synchronize time request done")
4166 return nil
4167}
4168
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004169// SendCreateOrDeleteEthernetPerformanceMonitoringHistoryME creates or deletes EthernetFramePerformanceMonitoringHistoryData ME instance
4170func (oo *OmciCC) SendCreateOrDeleteEthernetPerformanceMonitoringHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004171 upstream bool, create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004172 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004173 logger.Debugw(ctx, "send ethernet-performance-monitoring-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4174 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
4175 meParam := me.ParamData{EntityID: entityID}
4176 var meInstance *me.ManagedEntity
4177 var omciErr me.OmciErrors
4178 if upstream {
4179 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataUpstream(meParam)
4180 } else {
4181 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataDownstream(meParam)
4182 }
4183 if omciErr.GetError() == nil {
4184 var omciLayer *omci.OMCI
4185 var msgLayer gopacket.SerializableLayer
4186 var err error
4187 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004188 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4189 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004190 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004191 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4192 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004193 }
4194 if err != nil {
4195 logger.Errorw(ctx, "Cannot encode ethernet frame performance monitoring history data ME",
4196 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004197 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004198 }
4199
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004200 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004201 if err != nil {
4202 logger.Errorw(ctx, "Cannot serialize ethernet frame performance monitoring history data ME",
4203 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004204 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004205 }
4206
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004207 omciRxCallbackPair := CallbackPair{CbKey: tid,
4208 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004209 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004210 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004211 if err != nil {
4212 logger.Errorw(ctx, "Cannot send ethernet frame performance monitoring history data ME",
4213 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004214 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004215 }
4216 logger.Debugw(ctx, "send ethernet frame performance monitoring history data ME done",
4217 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004218 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08004219 }
4220 logger.Errorw(ctx, "Cannot generate ethernet frame performance monitoring history data ME Instance",
4221 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 +03004222 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08004223}
4224
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004225// SendCreateOrDeleteEthernetUniHistoryME creates or deletes EthernetPerformanceMonitoringHistoryData ME instance
4226func (oo *OmciCC) SendCreateOrDeleteEthernetUniHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004227 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004228 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004229 logger.Debugw(ctx, "send ethernet-uni-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4230 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4231 meParam := me.ParamData{EntityID: entityID}
4232 var meInstance *me.ManagedEntity
4233 var omciErr me.OmciErrors
4234 meInstance, omciErr = me.NewEthernetPerformanceMonitoringHistoryData(meParam)
4235
4236 if omciErr.GetError() == nil {
4237 var omciLayer *omci.OMCI
4238 var msgLayer gopacket.SerializableLayer
4239 var err error
4240 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004241 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4242 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004243 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004244 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4245 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004246 }
4247 if err != nil {
4248 logger.Errorw(ctx, "Cannot encode ethernet uni history data ME",
4249 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004250 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004251 }
4252
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004253 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004254 if err != nil {
4255 logger.Errorw(ctx, "Cannot serialize ethernet uni history data ME",
4256 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004257 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004258 }
4259
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004260 omciRxCallbackPair := CallbackPair{CbKey: tid,
4261 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004262 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004263 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004264 if err != nil {
4265 logger.Errorw(ctx, "Cannot send ethernet uni history data ME",
4266 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004267 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004268 }
4269 logger.Debugw(ctx, "send ethernet uni history data ME done",
4270 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004271 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08004272 }
4273 logger.Errorw(ctx, "Cannot generate ethernet uni history data ME Instance",
4274 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004275 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08004276}
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004277
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004278// SendCreateOrDeleteFecHistoryME creates or deletes FecPerformanceMonitoringHistoryData ME instance
4279func (oo *OmciCC) SendCreateOrDeleteFecHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004280 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004281 tid := oo.GetNextTid(highPrio)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004282 logger.Debugw(ctx, "send fec-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4283 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4284 meParam := me.ParamData{EntityID: entityID}
4285 var meInstance *me.ManagedEntity
4286 var omciErr me.OmciErrors
4287 meInstance, omciErr = me.NewFecPerformanceMonitoringHistoryData(meParam)
4288
4289 if omciErr.GetError() == nil {
4290 var omciLayer *omci.OMCI
4291 var msgLayer gopacket.SerializableLayer
4292 var err error
4293 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004294 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4295 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004296 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004297 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4298 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004299 }
4300 if err != nil {
4301 logger.Errorw(ctx, "Cannot encode fec history data ME",
4302 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004303 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004304 }
4305
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004306 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004307 if err != nil {
4308 logger.Errorw(ctx, "Cannot serialize fec history data ME",
4309 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004310 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004311 }
4312
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004313 omciRxCallbackPair := CallbackPair{CbKey: tid,
4314 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004315 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004316 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004317 if err != nil {
4318 logger.Errorw(ctx, "Cannot send fec history data ME",
4319 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004320 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004321 }
4322 logger.Debugw(ctx, "send fec history data ME done",
4323 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004324 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004325 }
4326 logger.Errorw(ctx, "Cannot generate fec history data ME Instance",
4327 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004328 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004329}
4330
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004331// SendCreateOrDeleteGemPortHistoryME deletes GemPortNetworkCtpPerformanceMonitoringHistoryData ME instance
4332func (oo *OmciCC) SendCreateOrDeleteGemPortHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004333 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004334 tid := oo.GetNextTid(highPrio)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004335 logger.Debugw(ctx, "send gemport-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4336 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4337 meParam := me.ParamData{EntityID: entityID}
4338 var meInstance *me.ManagedEntity
4339 var omciErr me.OmciErrors
4340 meInstance, omciErr = me.NewGemPortNetworkCtpPerformanceMonitoringHistoryData(meParam)
4341
4342 if omciErr.GetError() == nil {
4343 var omciLayer *omci.OMCI
4344 var msgLayer gopacket.SerializableLayer
4345 var err error
4346 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004347 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4348 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004349 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004350 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4351 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004352 }
4353 if err != nil {
4354 logger.Errorw(ctx, "Cannot encode gemport history data ME",
4355 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004356 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004357 }
4358
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004359 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004360 if err != nil {
4361 logger.Errorw(ctx, "Cannot serialize gemport history data ME",
4362 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004363 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004364 }
4365
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004366 omciRxCallbackPair := CallbackPair{CbKey: tid,
4367 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004368 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004369 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004370 if err != nil {
4371 logger.Errorw(ctx, "Cannot send gemport history data ME",
4372 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004373 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004374 }
4375 logger.Debugw(ctx, "send gemport history data ME done",
4376 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004377 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004378 }
4379 logger.Errorw(ctx, "Cannot generate gemport history data ME Instance",
4380 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004381 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004382}
4383
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004384// SendStartSoftwareDownload sends StartSoftwareDownloadRequest
4385func (oo *OmciCC) SendStartSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004386 rxChan chan Message, aImageMeID uint16, aDownloadWindowSize uint8, aFileLen uint32, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004387 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004388 logger.Debugw(ctx, "send StartSwDlRequest:", log.Fields{"device-id": oo.deviceID,
4389 "SequNo": strconv.FormatInt(int64(tid), 16),
4390 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4391
4392 omciLayer := &omci.OMCI{
4393 TransactionID: tid,
4394 MessageType: omci.StartSoftwareDownloadRequestType,
4395 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4396 // Length: 0x28, // Optional, defaults to 40 octets
4397 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004398 if aIsExtendedOmci {
4399 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4400 }
mpagenko80622a52021-02-09 16:53:23 +00004401 request := &omci.StartSoftwareDownloadRequest{
4402 MeBasePacket: omci.MeBasePacket{
4403 EntityClass: me.SoftwareImageClassID,
4404 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004405 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004406 },
4407 WindowSize: aDownloadWindowSize,
4408 ImageSize: aFileLen,
4409 NumberOfCircuitPacks: 1, //parallel download to multiple circuit packs not supported
4410 CircuitPacks: []uint16{0}, //circuit pack indication don't care for NumberOfCircuitPacks=1, but needed by omci-lib
4411 }
4412
4413 var options gopacket.SerializeOptions
4414 options.FixLengths = true
4415 buffer := gopacket.NewSerializeBuffer()
4416 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4417 if err != nil {
4418 logger.Errorw(ctx, "Cannot serialize StartSwDlRequest", log.Fields{"Err": err,
4419 "device-id": oo.deviceID})
4420 return err
4421 }
4422 outgoingPacket := buffer.Bytes()
4423
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004424 omciRxCallbackPair := CallbackPair{CbKey: tid,
4425 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko80622a52021-02-09 16:53:23 +00004426 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004427 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004428 if err != nil {
4429 logger.Errorw(ctx, "Cannot send StartSwDlRequest", log.Fields{"Err": err,
4430 "device-id": oo.deviceID})
4431 return err
4432 }
4433 logger.Debug(ctx, "send StartSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004434 return nil
4435}
4436
kesavand011d5162021-11-25 19:21:06 +05304437// PrepareOnuSectionsOfWindow prepares a list of sections for each window
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304438// Before invoking this function the oo.mutexTid needs to be be locked so that
4439// GetOnuSwSecNextTid can be invoked without further locking
kesavand011d5162021-11-25 19:21:06 +05304440func (oo *OmciCC) PrepareOnuSectionsOfWindow(ctx context.Context,
4441 aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004442 omciMsgsPerWindow *ia.OmciMessages, aIsExtendedOmci bool) (OmciTransferStructure, error) {
kesavand011d5162021-11-25 19:21:06 +05304443 //onuswsections uses only low prioirity tids
4444 tid := oo.GetOnuSwSecNextTid()
4445 logger.Infow(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
4446 "SequNo": strconv.FormatInt(int64(tid), 16),
4447 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest, "sectionNo": aDownloadSectionNo, "sectionData": aSection})
4448
4449 var omciTxReq OmciTransferStructure
4450 msgType := omci.DownloadSectionRequestType
4451
4452 if aAckRequest > 0 {
4453 msgType = omci.DownloadSectionRequestWithResponseType
4454
4455 }
4456 omciLayer := &omci.OMCI{
4457 TransactionID: tid,
4458 MessageType: msgType,
4459 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4460 // Length: 0x28, // Optional, defaults to 40 octets
4461 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004462 if aIsExtendedOmci {
4463 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4464 }
kesavand011d5162021-11-25 19:21:06 +05304465 localSectionData := make([]byte, len(aSection))
4466
4467 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
4468 request := &omci.DownloadSectionRequest{
4469 MeBasePacket: omci.MeBasePacket{
4470 EntityClass: me.SoftwareImageClassID,
4471 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004472 Extended: aIsExtendedOmci,
kesavand011d5162021-11-25 19:21:06 +05304473 },
4474 SectionNumber: aDownloadSectionNo,
4475 SectionData: localSectionData,
4476 }
4477
4478 var options gopacket.SerializeOptions
4479 options.FixLengths = true
4480 buffer := gopacket.NewSerializeBuffer()
4481 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4482 if err != nil {
4483 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
4484 "device-id": oo.deviceID})
4485 return omciTxReq, err
4486 }
4487 outgoingPacket := buffer.Bytes()
4488
4489 omciMsgsPerWindow.Messages = append(omciMsgsPerWindow.Messages, outgoingPacket)
4490
4491 if aAckRequest > 0 {
4492 // only the last section should have a timeout as an ack is required only for the last section of the window
4493 omciTxReq = OmciTransferStructure{
4494 withFramePrint: true,
4495 OnuSwWindow: omciMsgsPerWindow,
4496 }
4497 return omciTxReq, nil
4498 }
4499
4500 return omciTxReq, nil
4501}
4502
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304503// SendOnuSwSectionsWindowWithRxSupervision sends onu swd sections
kesavand011d5162021-11-25 19:21:06 +05304504func (oo *OmciCC) SendOnuSwSectionsWindowWithRxSupervision(ctx context.Context,
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304505 aOmciTxRequest OmciTransferStructure, aTimeout int, rxChan chan Message) error {
kesavand011d5162021-11-25 19:21:06 +05304506 if aOmciTxRequest.OnuSwWindow == nil {
4507 logger.Errorw(ctx, "SendOnuSwSectionsWindowWithRxSupervision: omciTxRequest.OnuSwWindow is nil",
4508 log.Fields{"device-id": oo.deviceID})
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304509 return fmt.Errorf("sendOnuSwSectionsWindowWithRxSupervision: omciTxRequest.OnuSwWindow is nil device-id: %v",
4510 oo.deviceID)
kesavand011d5162021-11-25 19:21:06 +05304511 }
4512
4513 tid := oo.GetOnuSwSecLastTid()
4514 logger.Debugw(ctx, "SendOnuSwSectionsWindowWithRxSupervision tid for the last segment is ", log.Fields{"TID": tid})
4515 omciRxCallbackPair := CallbackPair{CbKey: tid,
4516 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4517 }
4518
4519 aOmciTxRequest.cbPair = omciRxCallbackPair
4520 logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TansCorrId": aOmciTxRequest.cbPair.CbKey})
4521 oo.mutexRxSchedMap.Lock()
4522 // it could be checked, if the callback key is already registered - but simply overwrite may be acceptable ...
4523 oo.rxSchedulerMap[aOmciTxRequest.cbPair.CbKey] = aOmciTxRequest.cbPair.CbEntry
4524 oo.mutexRxSchedMap.Unlock()
4525
4526 chSuccess := make(chan bool)
4527 aOmciTxRequest.chSuccess = chSuccess
4528 aOmciTxRequest.timeout = aTimeout
4529 aOmciTxRequest.retries = CDefaultRetries
4530
4531 //tid := aOmciTxRequest.cbPair.CbKey
4532 oo.mutexMonReq.Lock()
4533 oo.monitoredRequests[tid] = aOmciTxRequest
4534 oo.mutexMonReq.Unlock()
4535
4536 retries := aOmciTxRequest.retries
4537 retryCounter := 0
4538 if aTimeout == 0 {
4539 logger.Errorw(ctx, "no timeout present for last section of window", log.Fields{"device-id": oo.deviceID})
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304540 return fmt.Errorf("no timeout present for last section of window device-id: %v", oo.deviceID)
kesavand011d5162021-11-25 19:21:06 +05304541 }
4542loop:
4543 for retryCounter <= retries {
4544 // the onu sw sections are enqueued only to the low priority queue
4545 oo.mutexLowPrioTxQueue.Lock()
4546 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4547 oo.mutexLowPrioTxQueue.Unlock()
4548
pnalmasc6e916a2025-06-30 11:59:16 +05304549 //Register the call back again as we clean up the Map entry when we failed to send the message
4550 oo.mutexRxSchedMap.Lock()
4551 oo.rxSchedulerMap[aOmciTxRequest.cbPair.CbKey] = aOmciTxRequest.cbPair.CbEntry
4552 oo.mutexRxSchedMap.Unlock()
4553
kesavand011d5162021-11-25 19:21:06 +05304554 go oo.sendQueuedRequests(ctx)
4555
4556 select {
4557 case success := <-chSuccess:
4558 if success {
4559 logger.Debugw(ctx, "reqMon: response received in time",
4560 log.Fields{"tid": tid, "device-id": oo.deviceID})
4561 } else {
4562 logger.Debugw(ctx, "reqMon: wait for response aborted",
4563 log.Fields{"tid": tid, "device-id": oo.deviceID})
4564 }
4565 break loop
4566 case <-time.After(time.Duration(aTimeout) * time.Second):
4567 if retryCounter == retries {
Holger Hildebrandt2b107642022-12-09 07:56:23 +00004568 if oo.pBaseDeviceHandler.IsOltAvailable() {
4569 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - send ONU device event!",
4570 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4571 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationFailureSwUpgrade, OnuOmciCommunicationFailureSwUpgradeDesc)
4572 } else {
4573 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - skip ONU device event: OLT unavailable!",
4574 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4575 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004576 oo.incrementTxTimesouts()
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304577 oo.mutexMonReq.Lock()
4578 delete(oo.monitoredRequests, tid)
4579 oo.mutexMonReq.Unlock()
4580 return fmt.Errorf("reqMon: timeout waiting for response - no of max retries reached device-id: %v", oo.deviceID)
kesavand011d5162021-11-25 19:21:06 +05304581 }
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304582 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
4583 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4584 oo.incrementTxRetries()
4585 case _, ok := <-oo.pBaseDeviceHandler.GetDeviceDeleteCommChan(ctx):
4586 if !ok {
4587 logger.Warnw(ctx, "device deletion channel is closed", log.Fields{"device-id": oo.deviceID})
4588 oo.mutexMonReq.Lock()
4589 delete(oo.monitoredRequests, tid)
4590 oo.mutexMonReq.Unlock()
4591 return fmt.Errorf("device deletion channel is closed device-id: %v", oo.deviceID)
4592 }
4593 oo.mutexMonReq.Lock()
4594 delete(oo.monitoredRequests, tid)
4595 oo.mutexMonReq.Unlock()
4596 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 +05304597 }
4598 retryCounter++
4599 }
4600 oo.mutexMonReq.Lock()
4601 delete(oo.monitoredRequests, tid)
4602 oo.mutexMonReq.Unlock()
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304603 return nil
kesavand011d5162021-11-25 19:21:06 +05304604}
4605
4606func (oo *OmciCC) sendOnuSwSectionsOfWindow(ctx context.Context, omciTxRequest OmciTransferStructure) error {
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004607 var lastSection []byte
4608 if omciTxRequest.OnuSwWindow != nil {
4609 lastSection = omciTxRequest.OnuSwWindow.Messages[len(omciTxRequest.OnuSwWindow.Messages)-1]
4610 } else {
4611 logger.Errorw(ctx, "invalid sw window received", log.Fields{"device-id": oo.deviceID})
4612 return fmt.Errorf("invalid sw window received")
4613 }
4614 if omciTxRequest.withFramePrint {
4615 logger.Debugw(ctx, "sw-section-omci-message-to-send:", log.Fields{
kesavand011d5162021-11-25 19:21:06 +05304616 "TxOmciMessage": hex.EncodeToString(lastSection),
4617 "device-id": oo.deviceID,
4618 "toDeviceType": oo.pBaseDeviceHandler.GetProxyAddressType(),
4619 "proxyDeviceID": oo.pBaseDeviceHandler.GetProxyAddressID(),
4620 "proxyAddress": oo.pBaseDeviceHandler.GetProxyAddress()})
4621 }
4622 sendErr := oo.pBaseDeviceHandler.SendOnuSwSectionsOfWindow(ctx, oo.pBaseDeviceHandler.GetProxyAddress().AdapterEndpoint, omciTxRequest.OnuSwWindow)
4623 if sendErr != nil {
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004624 logger.Errorw(ctx, "send onu sw sections omci request error", log.Fields{"device-id": oo.deviceID, "error": sendErr})
kesavand011d5162021-11-25 19:21:06 +05304625 return sendErr
4626 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004627 numberOfNoArSections := len(omciTxRequest.OnuSwWindow.Messages) - 1 // last section of window is sent with AR expected
4628 if lastSection[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
4629 oo.increaseBaseTxNoArFramesBy(ctx, uint32(numberOfNoArSections))
4630 oo.incrementBaseTxArFrames()
4631 } else {
4632 oo.increaseExtTxNoArFramesBy(ctx, uint32(numberOfNoArSections))
4633 oo.incrementExtTxArFrames()
4634 }
kesavand011d5162021-11-25 19:21:06 +05304635 return nil
4636}
4637
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004638// SendDownloadSection sends DownloadSectionRequestWithResponse
4639func (oo *OmciCC) SendDownloadSection(ctx context.Context, aTimeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004640 rxChan chan Message, aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte, aPrint bool, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004641 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004642 logger.Debugw(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
4643 "SequNo": strconv.FormatInt(int64(tid), 16),
mpagenko15ff4a52021-03-02 10:09:20 +00004644 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest})
mpagenko80622a52021-02-09 16:53:23 +00004645
4646 //TODO!!!: don't know by now on how to generate the possibly needed AR (or enforce it to 0) with current omci-lib
4647 // by now just try to send it as defined by omci-lib
mpagenko15ff4a52021-03-02 10:09:20 +00004648 msgType := omci.DownloadSectionRequestType
mgoudad611f4c2025-10-30 14:49:27 +05304649 var timeout = 0 //default value for no response expected
mpagenko15ff4a52021-03-02 10:09:20 +00004650 if aAckRequest > 0 {
4651 msgType = omci.DownloadSectionRequestWithResponseType
mpagenkoc26d4c02021-05-06 14:27:57 +00004652 timeout = aTimeout
mpagenko15ff4a52021-03-02 10:09:20 +00004653 }
mpagenko80622a52021-02-09 16:53:23 +00004654 omciLayer := &omci.OMCI{
4655 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004656 MessageType: msgType,
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 }
Himani Chawla43f95ff2021-06-03 00:24:12 +05304663 localSectionData := make([]byte, len(aSection))
4664
mpagenko15ff4a52021-03-02 10:09:20 +00004665 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
mpagenko80622a52021-02-09 16:53:23 +00004666 request := &omci.DownloadSectionRequest{
4667 MeBasePacket: omci.MeBasePacket{
4668 EntityClass: me.SoftwareImageClassID,
4669 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004670 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004671 },
4672 SectionNumber: aDownloadSectionNo,
4673 SectionData: localSectionData,
4674 }
4675
4676 var options gopacket.SerializeOptions
4677 options.FixLengths = true
4678 buffer := gopacket.NewSerializeBuffer()
4679 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4680 if err != nil {
4681 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
4682 "device-id": oo.deviceID})
4683 return err
4684 }
4685 outgoingPacket := buffer.Bytes()
4686
mpagenko15ff4a52021-03-02 10:09:20 +00004687 //for initial debug purpose overrule the requested print state for some frames
4688 printFrame := aPrint
4689 if aAckRequest > 0 || aDownloadSectionNo == 0 {
4690 printFrame = true
4691 }
4692
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004693 omciRxCallbackPair := CallbackPair{CbKey: tid,
mpagenkoc26d4c02021-05-06 14:27:57 +00004694 // the callback is set even though no response might be required here, the tid (key) setting is needed here anyway
4695 // (used to avoid retransmission of frames with the same TID)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004696 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, printFrame /*aPrint*/},
mpagenko80622a52021-02-09 16:53:23 +00004697 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004698 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004699 if err != nil {
4700 logger.Errorw(ctx, "Cannot send DlSectionRequest", log.Fields{"Err": err,
4701 "device-id": oo.deviceID})
4702 return err
4703 }
4704 logger.Debug(ctx, "send DlSectionRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004705 return nil
4706}
4707
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304708// SendEndSoftwareDownload sends EndSoftwareDownloadRequest
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004709func (oo *OmciCC) SendEndSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004710 rxChan chan Message, aImageMeID uint16, aFileLen uint32, aImageCrc uint32, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004711 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004712 logger.Debugw(ctx, "send EndSwDlRequest:", log.Fields{"device-id": oo.deviceID,
4713 "SequNo": strconv.FormatInt(int64(tid), 16),
4714 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4715
mpagenko15ff4a52021-03-02 10:09:20 +00004716 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00004717 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004718 MessageType: omci.EndSoftwareDownloadRequestType,
mpagenko80622a52021-02-09 16:53:23 +00004719 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4720 // Length: 0x28, // Optional, defaults to 40 octets
4721 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004722 if aIsExtendedOmci {
4723 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4724 }
mpagenko15ff4a52021-03-02 10:09:20 +00004725 request := &omci.EndSoftwareDownloadRequest{
mpagenko80622a52021-02-09 16:53:23 +00004726 MeBasePacket: omci.MeBasePacket{
4727 EntityClass: me.SoftwareImageClassID,
4728 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004729 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004730 },
mpagenko15ff4a52021-03-02 10:09:20 +00004731 CRC32: aImageCrc,
4732 ImageSize: aFileLen,
4733 NumberOfInstances: 1, //parallel download to multiple circuit packs not supported
4734 ImageInstances: []uint16{0}, //don't care for NumberOfInstances=1, but probably needed by omci-lib as in startSwDlRequest
mpagenko80622a52021-02-09 16:53:23 +00004735 }
mpagenko15ff4a52021-03-02 10:09:20 +00004736
4737 var options gopacket.SerializeOptions
4738 options.FixLengths = true
4739 buffer := gopacket.NewSerializeBuffer()
4740 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4741 if err != nil {
4742 logger.Errorw(ctx, "Cannot serialize EndSwDlRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00004743 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00004744 return err
mpagenko80622a52021-02-09 16:53:23 +00004745 }
mpagenko15ff4a52021-03-02 10:09:20 +00004746 outgoingPacket := buffer.Bytes()
4747
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004748 omciRxCallbackPair := CallbackPair{CbKey: tid,
4749 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko15ff4a52021-03-02 10:09:20 +00004750 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004751 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00004752 if err != nil {
4753 logger.Errorw(ctx, "Cannot send EndSwDlRequest", log.Fields{"Err": err,
4754 "device-id": oo.deviceID})
4755 return err
4756 }
4757 logger.Debug(ctx, "send EndSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004758 return nil
4759}
4760
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004761// SendActivateSoftware sends ActivateSoftwareRequest
4762func (oo *OmciCC) SendActivateSoftware(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004763 rxChan chan Message, aImageMeID uint16, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004764 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004765 logger.Debugw(ctx, "send ActivateSwRequest:", log.Fields{"device-id": oo.deviceID,
4766 "SequNo": strconv.FormatInt(int64(tid), 16),
4767 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4768
4769 omciLayer := &omci.OMCI{
4770 TransactionID: tid,
4771 MessageType: omci.ActivateSoftwareRequestType,
4772 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4773 // Length: 0x28, // Optional, defaults to 40 octets
4774 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004775 if aIsExtendedOmci {
4776 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4777 }
mpagenko80622a52021-02-09 16:53:23 +00004778 request := &omci.ActivateSoftwareRequest{
4779 MeBasePacket: omci.MeBasePacket{
4780 EntityClass: me.SoftwareImageClassID,
4781 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004782 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004783 },
4784 ActivateFlags: 0, //unconditionally reset as the only relevant option here (regardless of VOIP)
4785 }
4786
4787 var options gopacket.SerializeOptions
4788 options.FixLengths = true
4789 buffer := gopacket.NewSerializeBuffer()
4790 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4791 if err != nil {
4792 logger.Errorw(ctx, "Cannot serialize ActivateSwRequest", log.Fields{"Err": err,
4793 "device-id": oo.deviceID})
4794 return err
4795 }
4796 outgoingPacket := buffer.Bytes()
4797
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004798 omciRxCallbackPair := CallbackPair{CbKey: tid,
4799 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko80622a52021-02-09 16:53:23 +00004800 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004801 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004802 if err != nil {
4803 logger.Errorw(ctx, "Cannot send ActivateSwRequest", log.Fields{"Err": err,
4804 "device-id": oo.deviceID})
4805 return err
4806 }
4807 logger.Debug(ctx, "send ActivateSwRequest done")
mpagenko15ff4a52021-03-02 10:09:20 +00004808 return nil
4809}
mpagenko80622a52021-02-09 16:53:23 +00004810
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004811// SendCommitSoftware sends CommitSoftwareRequest
4812func (oo *OmciCC) SendCommitSoftware(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004813 rxChan chan Message, aImageMeID uint16, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004814 tid := oo.GetNextTid(highPrio)
mpagenko15ff4a52021-03-02 10:09:20 +00004815 logger.Debugw(ctx, "send CommitSwRequest:", log.Fields{"device-id": oo.deviceID,
4816 "SequNo": strconv.FormatInt(int64(tid), 16),
4817 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4818
4819 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00004820 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004821 MessageType: omci.CommitSoftwareRequestType,
mpagenko80622a52021-02-09 16:53:23 +00004822 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4823 // Length: 0x28, // Optional, defaults to 40 octets
4824 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004825 if aIsExtendedOmci {
4826 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4827 }
mpagenko15ff4a52021-03-02 10:09:20 +00004828 request := &omci.CommitSoftwareRequest{
mpagenko80622a52021-02-09 16:53:23 +00004829 MeBasePacket: omci.MeBasePacket{
4830 EntityClass: me.SoftwareImageClassID,
4831 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004832 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004833 },
mpagenko80622a52021-02-09 16:53:23 +00004834 }
mpagenko15ff4a52021-03-02 10:09:20 +00004835
4836 var options gopacket.SerializeOptions
4837 options.FixLengths = true
4838 buffer := gopacket.NewSerializeBuffer()
4839 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4840 if err != nil {
4841 logger.Errorw(ctx, "Cannot serialize CommitSwRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00004842 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00004843 return err
mpagenko80622a52021-02-09 16:53:23 +00004844 }
mpagenko15ff4a52021-03-02 10:09:20 +00004845 outgoingPacket := buffer.Bytes()
4846
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004847 omciRxCallbackPair := CallbackPair{CbKey: tid,
4848 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko15ff4a52021-03-02 10:09:20 +00004849 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004850 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00004851 if err != nil {
4852 logger.Errorw(ctx, "Cannot send CommitSwRequest", log.Fields{"Err": err,
4853 "device-id": oo.deviceID})
4854 return err
4855 }
4856 logger.Debug(ctx, "send CommitSwRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004857 return nil
4858}
4859
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304860// SendSelfTestReq sends TestRequest
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004861func (oo *OmciCC) SendSelfTestReq(ctx context.Context, classID me.ClassID, instdID uint16, timeout int, highPrio bool, rxChan chan Message) error {
4862 tid := oo.GetNextTid(highPrio)
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004863 logger.Debugw(ctx, "send self test request:", log.Fields{"device-id": oo.deviceID,
4864 "SequNo": strconv.FormatInt(int64(tid), 16),
4865 "InstId": strconv.FormatInt(int64(instdID), 16)})
4866 omciLayer := &omci.OMCI{
4867 TransactionID: tid,
4868 MessageType: omci.TestRequestType,
4869 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4870 // Length: 0x28, // Optional, defaults to 40 octets
4871 }
4872
4873 var request *omci.OpticalLineSupervisionTestRequest
4874 switch classID {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004875 case me.AniGClassID:
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004876 request = &omci.OpticalLineSupervisionTestRequest{
4877 MeBasePacket: omci.MeBasePacket{
4878 EntityClass: classID,
4879 EntityInstance: instdID,
4880 },
4881 SelectTest: uint8(7), // self test
4882 GeneralPurposeBuffer: uint16(0),
4883 VendorSpecificParameters: uint16(0),
4884 }
4885 default:
4886 logger.Errorw(ctx, "unsupported class id for self test request", log.Fields{"device-id": oo.deviceID, "classID": classID})
4887 return fmt.Errorf("unsupported-class-id-for-self-test-request-%v", classID)
4888 }
4889 // Test serialization back to former string
4890 var options gopacket.SerializeOptions
4891 options.FixLengths = true
4892
4893 buffer := gopacket.NewSerializeBuffer()
4894 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4895 if err != nil {
4896 logger.Errorw(ctx, "Cannot serialize self test request", log.Fields{"Err": err,
4897 "device-id": oo.deviceID})
4898 return err
4899 }
4900 outgoingPacket := buffer.Bytes()
4901
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004902 omciRxCallbackPair := CallbackPair{CbKey: tid,
4903 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004904 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004905 err = oo.Send(ctx, outgoingPacket, timeout, 0, highPrio, omciRxCallbackPair)
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004906 if err != nil {
4907 logger.Errorw(ctx, "Cannot send self test request", log.Fields{"Err": err,
4908 "device-id": oo.deviceID})
4909 return err
4910 }
4911 logger.Debug(ctx, "send self test request done")
4912 return nil
4913}
4914
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304915// nolint: gocyclo
mgoudad611f4c2025-10-30 14:49:27 +05304916func (oo *OmciCC) isSuccessfulResponseWithMibDataSync(ctx context.Context, omciMsg *omci.OMCI, packet *gopacket.Packet) (bool, error) {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004917
4918 nextLayer, err := omci.MsgTypeToNextLayer(omciMsg.MessageType, false)
4919 if err != nil {
4920 logger.Errorw(ctx, "omci-message: could not map msgType to nextLayer", log.Fields{"device-id": oo.deviceID})
4921 return false, fmt.Errorf("could not map msgType to nextLayer - %s", oo.deviceID)
4922 }
4923 msgLayer := (*packet).Layer(nextLayer)
4924 if msgLayer != nil {
4925 // Note: Due to relaxed decoding, you may now still have a decoding error attached to the layers
4926 if failure := (*packet).ErrorLayer(); failure != nil {
mgoudad611f4c2025-10-30 14:49:27 +05304927 switch nextLayer {
4928 case omci.LayerTypeMibUploadNextResponse:
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004929 // In the case of MibUploadNextResponse, we let the packet pass so that later processing
4930 // can examine for UnkonwnMEs and UnknownAttributes
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304931 logger.Debug(ctx, "omci-message: MibUploadNextResponse packet with ErrorLayer - let it pass",
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004932 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4933 return false, nil
mgoudad611f4c2025-10-30 14:49:27 +05304934 case omci.LayerTypeGetResponse:
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004935 if resp := msgLayer.(*omci.GetResponse); resp != nil {
4936 if resp.NextLayerType() == omci.LayerTypeUnknownAttributes {
4937 unknownAttrLayer := (*packet).Layer(omci.LayerTypeUnknownAttributes)
4938 if unknownAttrLayer != nil {
4939 logger.Errorw(ctx, "omci-message: GetResponse packet contains unknownAttrLayer - skip it!",
4940 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "unknownAttrLayer": unknownAttrLayer})
4941 return false, fmt.Errorf("packet contains unknownAttrLayer - %s", oo.deviceID)
4942 }
4943 }
4944 }
4945 }
4946 // Try to decode any further error information
4947 if decodeFailure, ok := failure.(*gopacket.DecodeFailure); ok && decodeFailure != nil {
4948 logger.Errorw(ctx, "omci-message: packet contains ErrorLayer with further info - skip it!",
4949 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "decodeFailure": decodeFailure.String()})
4950 return false, fmt.Errorf("packet contains ErrorLayer with further info - %s", oo.deviceID)
4951 }
4952 logger.Errorw(ctx, "omci-message: packet contains ErrorLayer - skip it!",
4953 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4954 return false, fmt.Errorf("packet contains ErrorLayer - %s", oo.deviceID)
4955 }
4956 } else if failure := (*packet).ErrorLayer(); failure != nil {
4957 // message layer could not be decoded, but at least check if additional failure information is available
4958 if decodeFailure, ok := failure.(*gopacket.DecodeFailure); ok && decodeFailure != nil {
Holger Hildebrandt93d183f2022-04-22 15:50:26 +00004959 errMsg := decodeFailure.String()
4960 if nextLayer == omci.LayerTypeMibUploadNextResponse {
4961 if strings.Contains(strings.ToLower(errMsg), "table decode") {
4962 // In the case of MibUploadNextResponse with non-standard table attributes, we let the packet pass
4963 // so that later processing can deal with it
4964 logger.Infow(ctx, "omci-message: MibUploadNextResponse packet with table attributes - let it pass",
4965 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4966 return false, nil
4967 }
4968 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004969 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet, further info available - skip it!",
Holger Hildebrandt93d183f2022-04-22 15:50:26 +00004970 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "decodeFailure": errMsg})
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004971 return false, fmt.Errorf("could not decode msgLayer of packet, further info available - %s", oo.deviceID)
4972 }
4973 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet, ErrorLayer available",
4974 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4975 return false, fmt.Errorf("could not decode msgLayer of packet, ErrorLayer available - %s", oo.deviceID)
4976 } else {
4977 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet", log.Fields{"device-id": oo.deviceID})
4978 return false, fmt.Errorf("could not decode msgLayer of packet - %s", oo.deviceID)
4979 }
4980
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004981 for _, v := range responsesWithMibDataSync {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004982 if v == omciMsg.MessageType {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004983 switch nextLayer {
4984 case omci.LayerTypeCreateResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004985 if resp := msgLayer.(*omci.CreateResponse); resp != nil {
4986 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004987 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004988 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004989 }
4990 case omci.LayerTypeDeleteResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004991 if resp := msgLayer.(*omci.DeleteResponse); resp != nil {
4992 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004993 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004994 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004995 }
4996 case omci.LayerTypeSetResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004997 if resp := msgLayer.(*omci.SetResponse); resp != nil {
4998 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004999 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00005000 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00005001 }
5002 case omci.LayerTypeStartSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00005003 if resp := msgLayer.(*omci.StartSoftwareDownloadResponse); resp != nil {
5004 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00005005 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00005006 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00005007 }
5008 case omci.LayerTypeEndSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00005009 if resp := msgLayer.(*omci.EndSoftwareDownloadResponse); resp != nil {
5010 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00005011 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00005012 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00005013 }
5014 case omci.LayerTypeActivateSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00005015 if resp := msgLayer.(*omci.ActivateSoftwareResponse); resp != nil {
5016 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00005017 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00005018 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00005019 }
5020 case omci.LayerTypeCommitSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00005021 if resp := msgLayer.(*omci.CommitSoftwareResponse); resp != nil {
5022 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00005023 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00005024 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00005025 }
5026 }
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00005027 }
5028 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00005029 return false, nil
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00005030}
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005031
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005032func (oo *OmciCC) processRequestMonitoring(ctx context.Context, aOmciTxRequest OmciTransferStructure) {
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005033 timeout := aOmciTxRequest.timeout
mpagenkoc26d4c02021-05-06 14:27:57 +00005034 if timeout == 0 {
5035 //timeout 0 indicates that no response is expected - fire and forget
Holger Hildebrandt34555512021-10-01 16:26:59 +00005036 // enqueue
5037 if aOmciTxRequest.highPrio {
5038 oo.mutexHighPrioTxQueue.Lock()
5039 oo.highPrioTxQueue.PushBack(aOmciTxRequest)
5040 oo.mutexHighPrioTxQueue.Unlock()
5041 } else {
5042 oo.mutexLowPrioTxQueue.Lock()
5043 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
5044 oo.mutexLowPrioTxQueue.Unlock()
5045 }
5046 go oo.sendQueuedRequests(ctx)
mpagenkoc26d4c02021-05-06 14:27:57 +00005047 } else {
mpagenko7455fd42021-06-10 16:25:55 +00005048 //the supervised sending with waiting on the response (based on TID) is called in background
5049 // to avoid blocking of the sender for the complete OMCI handshake procedure
5050 // to stay consistent with the processing tested so far, sending of next messages of the same control procedure
5051 // is ensured by the according control instances (FSM's etc.) (by waiting for the respective responses there)
5052 go oo.sendWithRxSupervision(ctx, aOmciTxRequest, timeout)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005053 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005054}
5055
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005056func (oo *OmciCC) sendWithRxSupervision(ctx context.Context, aOmciTxRequest OmciTransferStructure, aTimeout int) {
mpagenko7455fd42021-06-10 16:25:55 +00005057 chSuccess := make(chan bool)
5058 aOmciTxRequest.chSuccess = chSuccess
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005059 tid := aOmciTxRequest.cbPair.CbKey
mpagenko7455fd42021-06-10 16:25:55 +00005060 oo.mutexMonReq.Lock()
5061 oo.monitoredRequests[tid] = aOmciTxRequest
5062 oo.mutexMonReq.Unlock()
5063
5064 retries := aOmciTxRequest.retries
5065 retryCounter := 0
5066loop:
5067 for retryCounter <= retries {
balaji.nagarajan80f6fb82026-01-13 16:48:05 +05305068 if oo.pBaseDeviceHandler == nil {
5069 logger.Warnw(ctx, "pBaseDeviceHandler is nil - abort sendWithRxSupervision", log.Fields{"device-id": oo.deviceID})
5070 break loop
5071 } else if oo.pBaseDeviceHandler.GetDeletionInProgress() {
5072 logger.Warnw(ctx, "device deletion in progress - abort sendWithRxSupervision", log.Fields{"device-id": oo.deviceID})
5073 break loop
5074 }
Holger Hildebrandt34555512021-10-01 16:26:59 +00005075 // enqueue
5076 if aOmciTxRequest.highPrio {
5077 oo.mutexHighPrioTxQueue.Lock()
5078 oo.highPrioTxQueue.PushBack(aOmciTxRequest)
5079 oo.mutexHighPrioTxQueue.Unlock()
5080 } else {
5081 oo.mutexLowPrioTxQueue.Lock()
5082 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
5083 oo.mutexLowPrioTxQueue.Unlock()
5084 }
pnalmasc6e916a2025-06-30 11:59:16 +05305085
5086 //Register the call back again as we clean up the Map entry when we failed to send the message .
5087 oo.mutexRxSchedMap.Lock()
5088 oo.rxSchedulerMap[aOmciTxRequest.cbPair.CbKey] = aOmciTxRequest.cbPair.CbEntry
5089 oo.mutexRxSchedMap.Unlock()
5090
Holger Hildebrandt34555512021-10-01 16:26:59 +00005091 go oo.sendQueuedRequests(ctx)
mpagenko7455fd42021-06-10 16:25:55 +00005092
5093 select {
5094 case success := <-chSuccess:
5095 if success {
5096 logger.Debugw(ctx, "reqMon: response received in time",
5097 log.Fields{"tid": tid, "device-id": oo.deviceID})
5098 } else {
5099 logger.Debugw(ctx, "reqMon: wait for response aborted",
5100 log.Fields{"tid": tid, "device-id": oo.deviceID})
5101 }
5102 break loop
5103 case <-time.After(time.Duration(aTimeout) * time.Second):
5104 if retryCounter == retries {
Holger Hildebrandt2b107642022-12-09 07:56:23 +00005105 if oo.pBaseDeviceHandler.IsOltAvailable() {
5106 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - send ONU device event!",
5107 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
5108 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationFailureConfig, OnuOmciCommunicationFailureConfigDesc)
5109 } else {
5110 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - skip ONU device event: OLT unavailable!",
5111 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
5112 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005113 oo.incrementTxTimesouts()
mpagenko7455fd42021-06-10 16:25:55 +00005114 break loop
5115 } else {
5116 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
5117 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005118 oo.incrementTxRetries()
mpagenko7455fd42021-06-10 16:25:55 +00005119 }
balaji.nagarajan3cab2b62025-06-23 15:44:54 +05305120 case _, ok := <-oo.pBaseDeviceHandler.GetDeviceDeleteCommChan(ctx):
5121 if !ok {
5122 logger.Warnw(ctx, "device deletion channel is closed at sendWithRxSupervision", log.Fields{"device-id": oo.deviceID})
5123 break loop
5124 }
mpagenko7455fd42021-06-10 16:25:55 +00005125 }
5126 retryCounter++
5127 }
5128 oo.mutexMonReq.Lock()
5129 delete(oo.monitoredRequests, tid)
5130 oo.mutexMonReq.Unlock()
5131}
5132
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05305133// CancelRequestMonitoring terminates monitoring of outstanding omci requests
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005134func (oo *OmciCC) CancelRequestMonitoring(ctx context.Context) {
Holger Hildebrandt12609a12022-03-25 13:23:25 +00005135 logger.Debugw(ctx, "CancelRequestMonitoring entered", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005136 oo.mutexMonReq.RLock()
5137 for k := range oo.monitoredRequests {
mpagenko8cd1bf72021-06-22 10:11:19 +00005138 //implement non-blocking channel send to avoid blocking on mutexMonReq later
5139 select {
5140 case oo.monitoredRequests[k].chSuccess <- false:
Holger Hildebrandt12609a12022-03-25 13:23:25 +00005141 logger.Debugw(ctx, "send cancellation on omciRespChannel",
5142 log.Fields{"index": k, "device-id": oo.deviceID})
mpagenko8cd1bf72021-06-22 10:11:19 +00005143 default:
Holger Hildebrandt12609a12022-03-25 13:23:25 +00005144 logger.Debugw(ctx, "cancellation could not be send on omciRespChannel (no receiver)",
5145 log.Fields{"index": k, "device-id": oo.deviceID})
mpagenko8cd1bf72021-06-22 10:11:19 +00005146 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005147 }
5148 oo.mutexMonReq.RUnlock()
5149}
5150
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05305151// GetMaxOmciTimeoutWithRetries provides a timeout value greater than the maximum
5152// time consumed for retry processing of a particular OMCI-request
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005153func (oo *OmciCC) GetMaxOmciTimeoutWithRetries() time.Duration {
5154 return time.Duration((CDefaultRetries+1)*oo.pBaseDeviceHandler.GetOmciTimeout() + 1)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005155}
Himani Chawla43f95ff2021-06-03 00:24:12 +05305156
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005157// SendCreateOrDeleteEthernetFrameExtendedPMME deletes EthernetFrameExtendedPm ME instance
5158func (oo *OmciCC) SendCreateOrDeleteEthernetFrameExtendedPMME(ctx context.Context, timeout int, highPrio bool,
Himani Chawla43f95ff2021-06-03 00:24:12 +05305159 upstream bool, create bool, rxChan chan Message, entityID uint16, classID me.ClassID, controlBlock []uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005160 tid := oo.GetNextTid(highPrio)
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05305161 logger.Info(ctx, "send-ethernet-frame-extended-pm-me-msg:", log.Fields{"device-id": oo.deviceID,
Himani Chawla43f95ff2021-06-03 00:24:12 +05305162 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
5163
5164 meParam := me.ParamData{EntityID: entityID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00005165 Attributes: me.AttributeValueMap{me.EthernetFrameExtendedPm_ControlBlock: controlBlock},
Himani Chawla43f95ff2021-06-03 00:24:12 +05305166 }
5167 var meInstance *me.ManagedEntity
5168 var omciErr me.OmciErrors
5169 if classID == me.EthernetFrameExtendedPmClassID {
5170 meInstance, omciErr = me.NewEthernetFrameExtendedPm(meParam)
5171 } else {
5172 meInstance, omciErr = me.NewEthernetFrameExtendedPm64Bit(meParam)
5173 }
5174
5175 if omciErr.GetError() == nil {
5176 var omciLayer *omci.OMCI
5177 var msgLayer gopacket.SerializableLayer
5178 var err error
5179 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00005180 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
5181 oframe.AddDefaults(true))
Himani Chawla43f95ff2021-06-03 00:24:12 +05305182 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00005183 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
5184 oframe.AddDefaults(true))
Himani Chawla43f95ff2021-06-03 00:24:12 +05305185 }
5186 if err != nil {
5187 logger.Errorw(ctx, "cannot-encode-ethernet-frame-extended-pm-me",
5188 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5189 return nil, err
5190 }
5191
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00005192 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Himani Chawla43f95ff2021-06-03 00:24:12 +05305193 if err != nil {
5194 logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me",
5195 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5196 return nil, err
5197 }
5198
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005199 omciRxCallbackPair := CallbackPair{CbKey: tid,
5200 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Himani Chawla43f95ff2021-06-03 00:24:12 +05305201 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005202 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawla43f95ff2021-06-03 00:24:12 +05305203 if err != nil {
5204 logger.Errorw(ctx, "Cannot send ethernet-frame-extended-pm-me",
5205 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5206 return nil, err
5207 }
5208 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-done",
5209 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5210 return meInstance, nil
5211 }
5212 logger.Errorw(ctx, "cannot-generate-ethernet-frame-extended-pm-me-instance",
5213 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5214 return nil, omciErr.GetError()
5215}
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005216
5217// RLockMutexMonReq lock read access to monitoredRequests
5218func (oo *OmciCC) RLockMutexMonReq() {
5219 oo.mutexMonReq.RLock()
5220}
5221
5222// RUnlockMutexMonReq unlock read access to monitoredRequests
5223func (oo *OmciCC) RUnlockMutexMonReq() {
5224 oo.mutexMonReq.RUnlock()
5225}
5226
5227// GetMonitoredRequest get OmciTransferStructure for an omciTransID
5228func (oo *OmciCC) GetMonitoredRequest(omciTransID uint16) (value OmciTransferStructure, exist bool) {
5229 value, exist = oo.monitoredRequests[omciTransID]
5230 return value, exist
5231}
5232
5233// SetChMonitoredRequest sets chSuccess to indicate whether response was received or not
5234func (oo *OmciCC) SetChMonitoredRequest(omciTransID uint16, chVal bool) {
5235 oo.monitoredRequests[omciTransID].chSuccess <- chVal
5236}
Himani Chawlaee10b542021-09-20 16:46:40 +05305237
5238// SendSetEthernetFrameExtendedPMME sends the set request for ethernet frame extended type me
5239func (oo *OmciCC) SendSetEthernetFrameExtendedPMME(ctx context.Context, timeout int, highPrio bool,
5240 rxChan chan Message, entityID uint16, classID me.ClassID, controlBlock []uint16) (*me.ManagedEntity, error) {
5241 tid := oo.GetNextTid(highPrio)
5242 logger.Debugw(ctx, "send-set-ethernet-frame-extended-pm-me-control-block:", log.Fields{"device-id": oo.deviceID,
5243 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16)})
5244
5245 meParams := me.ParamData{EntityID: entityID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00005246 Attributes: me.AttributeValueMap{me.EthernetFrameExtendedPm_ControlBlock: controlBlock},
Himani Chawlaee10b542021-09-20 16:46:40 +05305247 }
5248 var meInstance *me.ManagedEntity
5249 var omciErr me.OmciErrors
5250 if classID == me.EthernetFrameExtendedPmClassID {
5251 meInstance, omciErr = me.NewEthernetFrameExtendedPm(meParams)
5252 } else {
5253 meInstance, omciErr = me.NewEthernetFrameExtendedPm64Bit(meParams)
5254 }
5255
5256 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00005257 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Himani Chawlaee10b542021-09-20 16:46:40 +05305258 if err != nil {
5259 logger.Errorw(ctx, "cannot-encode-ethernet-frame-extended-pm-me",
5260 log.Fields{"err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5261 return nil, err
5262 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00005263 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Himani Chawlaee10b542021-09-20 16:46:40 +05305264 if err != nil {
5265 logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me-set-msg",
5266 log.Fields{"err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5267 return nil, err
5268 }
5269 omciRxCallbackPair := CallbackPair{
5270 CbKey: tid,
5271 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
5272 }
5273 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
5274 if err != nil {
5275 logger.Errorw(ctx, "Cannot send ethernet-frame-extended-pm-me",
5276 log.Fields{"Err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5277 return nil, err
5278 }
5279 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-set-msg-done",
5280 log.Fields{"device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5281 return meInstance, nil
5282 }
5283 logger.Errorw(ctx, "cannot-generate-ethernet-frame-extended-pm-me-instance",
5284 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5285 return nil, omciErr.GetError()
5286}
Holger Hildebrandte7cc6092022-02-01 11:37:03 +00005287
5288// PrepareForGarbageCollection - remove references to prepare for garbage collection
5289func (oo *OmciCC) PrepareForGarbageCollection(ctx context.Context, aDeviceID string) {
5290 logger.Debugw(ctx, "prepare for garbage collection", log.Fields{"device-id": aDeviceID})
5291 oo.pBaseDeviceHandler = nil
5292 oo.pOnuDeviceEntry = nil
5293 oo.pOnuAlarmManager = nil
5294}
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005295
5296// GetOmciCounters - TODO: add comment
5297func (oo *OmciCC) GetOmciCounters() *extension.SingleGetValueResponse {
5298 oo.mutexCounters.RLock()
5299 defer oo.mutexCounters.RUnlock()
5300 resp := extension.SingleGetValueResponse{
5301 Response: &extension.GetValueResponse{
5302 Status: extension.GetValueResponse_OK,
5303 Response: &extension.GetValueResponse_OnuOmciStats{
5304 OnuOmciStats: &extension.GetOnuOmciTxRxStatsResponse{},
5305 },
5306 },
5307 }
5308 resp.Response.GetOnuOmciStats().BaseTxArFrames = oo.countersBase.txArFrames
5309 resp.Response.GetOnuOmciStats().BaseTxNoArFrames = oo.countersBase.txNoArFrames
5310 resp.Response.GetOnuOmciStats().BaseRxAkFrames = oo.countersBase.rxAkFrames
5311 resp.Response.GetOnuOmciStats().BaseRxNoAkFrames = oo.countersBase.rxNoAkFrames
5312 resp.Response.GetOnuOmciStats().ExtTxArFrames = oo.countersExt.txArFrames
5313 resp.Response.GetOnuOmciStats().ExtTxNoArFrames = oo.countersExt.txNoArFrames
5314 resp.Response.GetOnuOmciStats().ExtRxAkFrames = oo.countersExt.rxAkFrames
5315 resp.Response.GetOnuOmciStats().ExtRxNoAkFrames = oo.countersExt.rxNoAkFrames
5316 resp.Response.GetOnuOmciStats().TxOmciCounterRetries = oo.txRetries
5317 resp.Response.GetOnuOmciStats().TxOmciCounterTimeouts = oo.txTimeouts
5318 return &resp
5319}
5320
5321// For more speed, separate functions for each counter
5322
5323func (oo *OmciCC) incrementBaseTxArFrames() {
5324 oo.mutexCounters.Lock()
5325 defer oo.mutexCounters.Unlock()
5326 oo.countersBase.txArFrames++
5327}
5328
5329func (oo *OmciCC) incrementExtTxArFrames() {
5330 oo.mutexCounters.Lock()
5331 defer oo.mutexCounters.Unlock()
5332 oo.countersExt.txArFrames++
5333}
5334
5335func (oo *OmciCC) incrementBaseRxAkFrames() {
5336 oo.mutexCounters.Lock()
5337 defer oo.mutexCounters.Unlock()
5338 oo.countersBase.rxAkFrames++
5339}
5340
5341func (oo *OmciCC) incrementExtRxAkFrames() {
5342 oo.mutexCounters.Lock()
5343 defer oo.mutexCounters.Unlock()
5344 oo.countersExt.rxAkFrames++
5345}
5346
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +05305347//nolint:unparam
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005348func (oo *OmciCC) increaseBaseTxNoArFramesBy(ctx context.Context, value uint32) {
5349 oo.mutexCounters.Lock()
5350 defer oo.mutexCounters.Unlock()
5351 oo.countersBase.txNoArFrames += value
5352}
5353
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +05305354//nolint:unparam
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005355func (oo *OmciCC) increaseExtTxNoArFramesBy(ctx context.Context, value uint32) {
5356 oo.mutexCounters.Lock()
5357 defer oo.mutexCounters.Unlock()
5358 oo.countersExt.txNoArFrames += value
5359}
5360
5361func (oo *OmciCC) incrementBaseRxNoAkFrames() {
5362 oo.mutexCounters.Lock()
5363 defer oo.mutexCounters.Unlock()
5364 oo.countersBase.rxNoAkFrames++
5365}
5366
5367func (oo *OmciCC) incrementExtRxNoAkFrames() {
5368 oo.mutexCounters.Lock()
5369 defer oo.mutexCounters.Unlock()
5370 oo.countersExt.rxNoAkFrames++
5371}
5372
5373func (oo *OmciCC) incrementTxRetries() {
5374 oo.mutexCounters.Lock()
5375 defer oo.mutexCounters.Unlock()
5376 oo.txRetries++
5377}
5378
5379func (oo *OmciCC) incrementTxTimesouts() {
5380 oo.mutexCounters.Lock()
5381 defer oo.mutexCounters.Unlock()
5382 oo.txTimeouts++
5383}
Holger Hildebrandt7e138462023-03-29 12:12:14 +00005384
5385// NotifyAboutOnuConfigFailure - trigger ONU DeviceEvent to notify about ONU config failure
5386func (oo *OmciCC) NotifyAboutOnuConfigFailure(ctx context.Context, errID string, meClassID me.ClassID, meEntityID uint16,
5387 meName string, meResult me.Results) {
5388 var description string
5389 if !oo.confFailMeAlreadyHandled(meClassID) {
5390 switch errID {
5391 case OnuConfigFailureResponseErr:
5392 description = OnuConfigFailureResponseErrDesc + meResult.String() +
5393 ", OMCI ME: " + meName + " / instance: " + fmt.Sprintf("%d", meEntityID) + " (only first instance reported)"
5394 case OnuConfigFailureTimeout:
5395 description = OnuConfigFailureTimeoutDesc + meName + " / instance: " + fmt.Sprintf("%d", meEntityID) +
5396 " (only first instance reported)"
5397 default:
5398 logger.Warnw(ctx, "method called with undefined errID", log.Fields{"errID": errID, "device-id": oo.deviceID})
5399 return
5400 }
5401 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, errID, description)
5402 oo.appendConfFailMe(meClassID)
5403 }
5404}
5405
5406func (oo *OmciCC) confFailMeAlreadyHandled(meClassID me.ClassID) bool {
5407 oo.mutexConfFailMEs.RLock()
5408 defer oo.mutexConfFailMEs.RUnlock()
5409 for _, v := range oo.confFailMEs {
5410 if v == meClassID {
5411 return true
5412 }
5413 }
5414 return false
5415}
5416
5417func (oo *OmciCC) appendConfFailMe(meClassID me.ClassID) {
5418 oo.mutexConfFailMEs.Lock()
5419 defer oo.mutexConfFailMEs.Unlock()
5420 oo.confFailMEs = append(oo.confFailMEs, meClassID)
5421}
5422
5423// ResetConfFailMEs - reset list of stored config failure MEs
5424func (oo *OmciCC) ResetConfFailMEs() {
5425 oo.mutexConfFailMEs.Lock()
5426 defer oo.mutexConfFailMEs.Unlock()
5427 oo.confFailMEs = nil
5428}