blob: 0e08fb286a8aa4eaf99f27c1e0c4a4ff353b6d26 [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})
bseeniva192b26b2026-01-30 17:28:27 +0530419 oo.mutexRxSchedMap.Lock()
420 delete(oo.rxSchedulerMap, omciMsg.TransactionID)
421 oo.mutexRxSchedMap.Unlock()
Andrea Campanella6515c582020-10-05 11:25:00 +0200422 return fmt.Errorf("autonomous Omci Message with TranSCorrId != 0 not acccepted %s", oo.deviceID)
Himani Chawla4d908332020-08-31 12:30:20 +0530423 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000424 //logger.Debug(ctx,"RxMsg is a Omci Response Message: try to schedule it to the requester")
Himani Chawla4d908332020-08-31 12:30:20 +0530425 oo.mutexRxSchedMap.Lock()
426 rxCallbackEntry, ok := oo.rxSchedulerMap[omciMsg.TransactionID]
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000427 if ok && rxCallbackEntry.CbFunction != nil {
Holger Hildebrandt68854a82022-09-05 07:00:21 +0000428
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000429 if rxCallbackEntry.FramePrint {
mpagenko80622a52021-02-09 16:53:23 +0000430 oo.printRxMessage(ctx, rxMsg)
431 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000432 if rxMsg[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
433 oo.incrementBaseRxAkFrames()
434 } else {
435 oo.incrementExtRxAkFrames()
436 }
Himani Chawla4d908332020-08-31 12:30:20 +0530437 //disadvantage of decoupling: error verification made difficult, but anyway the question is
438 // how to react on erroneous frame reception, maybe can simply be ignored
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530439 go func() {
440 _ = rxCallbackEntry.CbFunction(ctx, omciMsg, &packet, rxCallbackEntry.CbRespChannel)
441 }()
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000442 isSuccessfulResponse, err := oo.isSuccessfulResponseWithMibDataSync(ctx, omciMsg, &packet)
443 if err != nil {
444 // qualified error logging already done in function above
445 if !rxCallbackEntry.FramePrint {
446 oo.printRxMessage(ctx, rxMsg)
447 }
448 return fmt.Errorf("could not decode further layers %s", oo.deviceID)
449 }
450 if isSuccessfulResponse {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000451 oo.pOnuDeviceEntry.IncrementMibDataSync(ctx)
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000452 } else {
453 logger.Debugw(ctx, "mibDataSync counter not to be updated for this message type",
454 log.Fields{"omciMsg.MessageType": omciMsg.MessageType, "device-id": oo.deviceID})
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000455 }
mpagenkoc8bba412021-01-15 15:38:44 +0000456
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700457 // If omciMsg.MessageType is omci.TestResponseType, we still expect the TestResult OMCI message,
458 // so do not clean up the TransactionID in that case.
459 if omciMsg.MessageType != omci.TestResponseType {
460 // having posted the response the request is regarded as 'done'
461 delete(oo.rxSchedulerMap, omciMsg.TransactionID)
462 }
Himani Chawla4d908332020-08-31 12:30:20 +0530463 oo.mutexRxSchedMap.Unlock()
mpagenko80622a52021-02-09 16:53:23 +0000464 return nil
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000465 }
mpagenko80622a52021-02-09 16:53:23 +0000466 oo.mutexRxSchedMap.Unlock()
467 logger.Errorw(ctx, "omci-message-response for not registered transCorrId", log.Fields{"device-id": oo.deviceID})
468 oo.printRxMessage(ctx, rxMsg)
469 return fmt.Errorf("could not find registered response handler tor transCorrId %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000470
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000471 /* py code was:
472 Receive and OMCI message from the proxy channel to the OLT.
473
474 Call this from your ONU Adapter on a new OMCI Rx on the proxy channel
475 :param msg: (str) OMCI binary message (used as input to Scapy packet decoder)
476 """
477 if not self.enabled:
478 return
479
480 try:
481 now = arrow.utcnow()
482 d = None
483
484 # NOTE: Since we may need to do an independent ME map on a per-ONU basis
485 # save the current value of the entity_id_to_class_map, then
486 # replace it with our custom one before decode, and then finally
487 # restore it later. Tried other ways but really made the code messy.
488 saved_me_map = omci_entities.entity_id_to_class_map
489 omci_entities.entity_id_to_class_map = self._me_map
490
491 try:
492 rx_frame = msg if isinstance(msg, OmciFrame) else OmciFrame(msg)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000493 self.logger.debug('recv-omci-msg', omci_msg=hexlify(msg))
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000494 except KeyError as e:
495 # Unknown, Unsupported, or vendor-specific ME. Key is the unknown classID
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000496 self.logger.debug('frame-decode-key-error', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000497 rx_frame = self._decode_unknown_me(msg)
498 self._rx_unknown_me += 1
499
500 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000501 self.logger.exception('frame-decode', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000502 return
503
504 finally:
505 omci_entities.entity_id_to_class_map = saved_me_map # Always restore it.
506
507 rx_tid = rx_frame.fields['transaction_id']
508 msg_type = rx_frame.fields['message_type']
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000509 self.logger.debug('Received message for rx_tid', rx_tid = rx_tid, msg_type = msg_type)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000510 # Filter the Test Result frame and route through receive onu
511 # message method.
512 if rx_tid == 0 or msg_type == EntityOperations.TestResult.value:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000513 self.logger.debug('Receive ONU message', rx_tid=0)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000514 return self._receive_onu_message(rx_frame)
515
516 # Previously unreachable if this is the very first round-trip Rx or we
517 # have been running consecutive errors
518 if self._rx_frames == 0 or self._consecutive_errors != 0:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000519 self.logger.debug('Consecutive errors for rx', err = self._consecutive_errors)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000520 self.reactor.callLater(0, self._publish_connectivity_event, True)
521
522 self._rx_frames += 1
523 self._consecutive_errors = 0
524
525 try:
526 high_priority = self._tid_is_high_priority(rx_tid)
527 index = self._get_priority_index(high_priority)
528
529 # (timestamp, defer, frame, timeout, retry, delayedCall)
530 last_tx_tuple = self._tx_request[index]
531
532 if last_tx_tuple is None or \
533 last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id') != rx_tid:
534 # Possible late Rx on a message that timed-out
535 if last_tx_tuple:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000536 self.logger.debug('Unknown message', rx_tid=rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000537 tx_id=last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id'))
538 self._rx_unknown_tid += 1
539 self._rx_late += 1
540 return
541
542 ts, d, tx_frame, timeout, retry, dc = last_tx_tuple
543 if dc is not None and not dc.cancelled and not dc.called:
544 dc.cancel()
545
546 _secs = self._update_rx_tx_stats(now, ts)
547
548 # Late arrival already serviced by a timeout?
549 if d.called:
550 self._rx_late += 1
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000551 self.logger.debug('Serviced by timeout. Late arrival', rx_late = self._rx_late)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000552 return
553
554 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000555 self.logger.exception('frame-match', msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000556 if d is not None:
557 return d.errback(failure.Failure(e))
558 return
559
560 # Publish Rx event to listeners in a different task
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000561 self.logger.debug('Publish rx event', rx_tid = rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000562 tx_tid = tx_frame.fields['transaction_id'])
563 reactor.callLater(0, self._publish_rx_frame, tx_frame, rx_frame)
564
565 # begin success callback chain (will cancel timeout and queue next Tx message)
566 self._rx_response[index] = rx_frame
567 d.callback(rx_frame)
568
569 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000570 self.logger.exception('rx-msg', e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000571 */
572}
573
Himani Chawla6d2ae152020-09-02 13:11:20 +0530574/*
575func (oo *omciCC) publishRxResponseFrame(ctx context.Context, txFrame []byte, rxFrame []byte) error {
Himani Chawla4d908332020-08-31 12:30:20 +0530576 return errors.New("publishRxResponseFrame unimplemented")
Himani Chawla6d2ae152020-09-02 13:11:20 +0530577 //def _publish_rx_frame(self, tx_frame, rx_frame):
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000578}
Himani Chawla6d2ae152020-09-02 13:11:20 +0530579*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000580
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700581// ReleaseTid releases OMCI transaction identifier from rxSchedulerMap
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000582func (oo *OmciCC) ReleaseTid(ctx context.Context, tid uint16) {
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700583 logger.Debugw(ctx, "releasing tid from rxSchedulerMap", log.Fields{"tid": tid})
584 delete(oo.rxSchedulerMap, tid)
585}
586
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000587// Send - Queue the OMCI Frame for a transmit to the ONU via the proxy_channel
588func (oo *OmciCC) Send(ctx context.Context, txFrame []byte, timeout int, retry int, highPrio bool,
589 receiveCallbackPair CallbackPair) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000590
mpagenkoc26d4c02021-05-06 14:27:57 +0000591 if timeout != 0 {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000592 logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TransCorrId": receiveCallbackPair.CbKey})
mpagenkoc26d4c02021-05-06 14:27:57 +0000593 oo.mutexRxSchedMap.Lock()
594 // it could be checked, if the callback key is already registered - but simply overwrite may be acceptable ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000595 oo.rxSchedulerMap[receiveCallbackPair.CbKey] = receiveCallbackPair.CbEntry
mpagenkoc26d4c02021-05-06 14:27:57 +0000596 oo.mutexRxSchedMap.Unlock()
597 } //else timeout 0 indicates that no response is expected - fire and forget
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000598
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000599 printFrame := receiveCallbackPair.CbEntry.FramePrint //printFrame true means debug print of frame is requested
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000600 //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 +0000601 omciTxRequest := OmciTransferStructure{
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530602 chSuccess: make(chan bool),
603 OnuSwWindow: nil,
604 cbPair: receiveCallbackPair,
605 txFrame: txFrame,
606 timeout: timeout,
607 retries: retry,
608 highPrio: highPrio,
609 withFramePrint: printFrame,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000610 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000611 oo.mutexMonReq.Lock()
612 defer oo.mutexMonReq.Unlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000613 if _, exist := oo.monitoredRequests[receiveCallbackPair.CbKey]; !exist {
mpagenko7455fd42021-06-10 16:25:55 +0000614 // do not call processRequestMonitoring in background here to ensure correct sequencing
615 // of requested messages into txQueue (especially for non-response-supervised messages)
616 oo.processRequestMonitoring(ctx, omciTxRequest)
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000617 return nil
618 }
619 logger.Errorw(ctx, "A message with this tid is processed already!",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000620 log.Fields{"tid": receiveCallbackPair.CbKey, "device-id": oo.deviceID})
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000621 return fmt.Errorf("message with tid is processed already %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000622}
623
Holger Hildebrandt34555512021-10-01 16:26:59 +0000624func (oo *OmciCC) sendQueuedRequests(ctx context.Context) {
625 // Avoid accessing the txQueues from parallel send routines to block
626 // parallel omci send requests at least until SendIAP is 'committed'.
627 // To guarantee window size 1 for one ONU it would be necessary to wait
628 // for the corresponding response too (t.b.d.).
629 oo.mutexSendQueuedRequests.Lock()
630 defer oo.mutexSendQueuedRequests.Unlock()
631 if err := oo.sendQueuedHighPrioRequests(ctx); err != nil {
632 logger.Errorw(ctx, "Error during sending high prio requests!",
633 log.Fields{"err": err, "device-id": oo.deviceID})
634 return
635 }
636 if err := oo.sendQueuedLowPrioRequests(ctx); err != nil {
637 logger.Errorw(ctx, "Error during sending low prio requests!",
638 log.Fields{"err": err, "device-id": oo.deviceID})
639 return
640 }
641}
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000642
Holger Hildebrandt34555512021-10-01 16:26:59 +0000643func (oo *OmciCC) sendQueuedHighPrioRequests(ctx context.Context) error {
644 oo.mutexHighPrioTxQueue.Lock()
645 defer oo.mutexHighPrioTxQueue.Unlock()
balaji.nagarajan80f6fb82026-01-13 16:48:05 +0530646
647 if oo.pBaseDeviceHandler == nil {
648 logger.Warnw(ctx, "device handler is nil - abort sendQueuedHighPrioRequests", log.Fields{"device-id": oo.deviceID})
649 return nil
650 } else if oo.pBaseDeviceHandler.GetDeletionInProgress() {
651 logger.Warnw(ctx, "device deletion in progress - abort sendQueuedHighPrioRequests", log.Fields{"device-id": oo.deviceID})
652 return nil
653 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000654 for oo.highPrioTxQueue.Len() > 0 {
balaji.nagarajan3cab2b62025-06-23 15:44:54 +0530655 select {
656 case _, ok := <-oo.pBaseDeviceHandler.GetDeviceDeleteCommChan(ctx):
657 if !ok {
658 return fmt.Errorf("device deletion channel is closed at sendQueuedHighPrioRequests %s", oo.deviceID)
659 }
660 default:
661 queueElement := oo.highPrioTxQueue.Front() // First element
662 if err := oo.sendOMCIRequest(ctx, queueElement.Value.(OmciTransferStructure)); err != nil {
663 // Element will be removed from the queue regardless of the send success, to prevent
664 // an accumulation of send requests for the same message in the event of an error.
665 // In this case, resend attempts for the message are ensured by our retry
666 // mechanism after omci-timeout.
667 oo.highPrioTxQueue.Remove(queueElement) // Dequeue
668 //Remove the call back from the rxSchedulerMap
669 oo.mutexRxSchedMap.Lock()
670 delete(oo.rxSchedulerMap, queueElement.Value.(OmciTransferStructure).cbPair.CbKey)
671 oo.mutexRxSchedMap.Unlock()
672 return err
673 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000674 oo.highPrioTxQueue.Remove(queueElement) // Dequeue
mpagenko80622a52021-02-09 16:53:23 +0000675 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000676 }
677 return nil
678}
679
680func (oo *OmciCC) sendQueuedLowPrioRequests(ctx context.Context) error {
681 oo.mutexLowPrioTxQueue.Lock()
balaji.nagarajan80f6fb82026-01-13 16:48:05 +0530682
683 if oo.pBaseDeviceHandler == nil {
684 logger.Warnw(ctx, "device handler is nil - abort sendQueuedLowPrioRequests", log.Fields{"device-id": oo.deviceID})
685 return nil
686 } else if oo.pBaseDeviceHandler.GetDeletionInProgress() {
687 logger.Warnw(ctx, "device deletion in progress - abort sendQueuedLowPrioRequests", log.Fields{"device-id": oo.deviceID})
688 return nil
689 }
690
Holger Hildebrandt34555512021-10-01 16:26:59 +0000691 for oo.lowPrioTxQueue.Len() > 0 {
balaji.nagarajan3cab2b62025-06-23 15:44:54 +0530692 select {
693 case _, ok := <-oo.pBaseDeviceHandler.GetDeviceDeleteCommChan(ctx):
694 if !ok {
kesavand011d5162021-11-25 19:21:06 +0530695 oo.mutexLowPrioTxQueue.Unlock()
balaji.nagarajan3cab2b62025-06-23 15:44:54 +0530696 return fmt.Errorf("device deletion channel is closed at sendQueuedLowPrioRequests %s", oo.deviceID)
697 }
698 default:
699 queueElement := oo.lowPrioTxQueue.Front() // First element
700 // check if the element is for onu sw section
701 aOmciTxReq := queueElement.Value.(OmciTransferStructure)
702 if aOmciTxReq.OnuSwWindow != nil {
703 if err := oo.sendOnuSwSectionsOfWindow(ctx, aOmciTxReq); err != nil {
704 // Element will be removed from the queue regardless of the send success, to prevent
705 // an accumulation of send requests for the same message in the event of an error.
706 // In this case, resend attempts for the message are ensured by our retry
707 // mechanism after omci-timeout.
708 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
709 oo.mutexLowPrioTxQueue.Unlock()
710 //Remove the call back from the rxSchedulerMap
711 oo.mutexRxSchedMap.Lock()
712 delete(oo.rxSchedulerMap, queueElement.Value.(OmciTransferStructure).cbPair.CbKey)
713 oo.mutexRxSchedMap.Unlock()
714 return err
715 }
716 } else {
717 err := oo.sendOMCIRequest(ctx, queueElement.Value.(OmciTransferStructure))
718 if err != nil {
719 // Element will be removed from the queue regardless of the send success, to prevent
720 // an accumulation of send requests for the same message in the event of an error.
721 // In this case, resend attempts for the message are ensured by our retry
722 // mechanism after omci-timeout.
723 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
724 oo.mutexLowPrioTxQueue.Unlock()
725 oo.mutexRxSchedMap.Lock()
726 delete(oo.rxSchedulerMap, queueElement.Value.(OmciTransferStructure).cbPair.CbKey)
727 oo.mutexRxSchedMap.Unlock()
728 return err
729 }
730 }
731 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
732 // Interrupt the sending of low priority requests to process any high priority requests
733 // that may have arrived in the meantime
734 oo.mutexLowPrioTxQueue.Unlock()
735 if err := oo.sendQueuedHighPrioRequests(ctx); err != nil {
kesavand011d5162021-11-25 19:21:06 +0530736 return err
737 }
balaji.nagarajan3cab2b62025-06-23 15:44:54 +0530738 oo.mutexLowPrioTxQueue.Lock()
amit.ghosh58b704b2021-06-18 03:45:52 +0200739 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000740 }
741
742 oo.mutexLowPrioTxQueue.Unlock()
743 return nil
744}
745
746func (oo *OmciCC) sendOMCIRequest(ctx context.Context, omciTxRequest OmciTransferStructure) error {
747 if omciTxRequest.withFramePrint {
748 logger.Debugw(ctx, "omci-message-to-send:", log.Fields{
749 "TxOmciMessage": hex.EncodeToString(omciTxRequest.txFrame),
750 "device-id": oo.deviceID,
751 "toDeviceType": oo.pBaseDeviceHandler.GetProxyAddressType(),
752 "proxyDeviceID": oo.pBaseDeviceHandler.GetProxyAddressID(),
753 "proxyAddress": oo.pBaseDeviceHandler.GetProxyAddress()})
754 }
khenaidoo42dcdfd2021-10-19 17:34:12 -0400755 omciMsg := &ia.OmciMessage{
Holger Hildebrandt34555512021-10-01 16:26:59 +0000756 ParentDeviceId: oo.pBaseDeviceHandler.GetProxyAddressID(),
757 ChildDeviceId: oo.deviceID,
758 Message: omciTxRequest.txFrame,
759 ProxyAddress: oo.pBaseDeviceHandler.GetProxyAddress(),
760 ConnectStatus: common.ConnectStatus_REACHABLE, // If we are sending OMCI messages means we are connected, else we should not be here
761 }
762 sendErr := oo.pBaseDeviceHandler.SendOMCIRequest(ctx, oo.pBaseDeviceHandler.GetProxyAddress().AdapterEndpoint, omciMsg)
763 if sendErr != nil {
Holger Hildebrandtabfef032022-02-25 12:40:20 +0000764 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 +0000765 return sendErr
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000766 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000767 if omciTxRequest.txFrame[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
768 oo.incrementBaseTxArFrames()
769 } else {
770 oo.incrementExtTxArFrames()
771 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000772 return nil
773}
774
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000775// GetNextTid - TODO: add comment
776func (oo *OmciCC) GetNextTid(highPriority bool) uint16 {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000777 var next uint16
778 if highPriority {
mpagenko900ee4b2020-10-12 11:56:34 +0000779 oo.mutexHpTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000780 next = oo.hpTid
Himani Chawla4d908332020-08-31 12:30:20 +0530781 oo.hpTid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000782 if oo.hpTid < 0x8000 {
783 oo.hpTid = 0x8000
784 }
mpagenko900ee4b2020-10-12 11:56:34 +0000785 oo.mutexHpTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000786 } else {
mpagenko900ee4b2020-10-12 11:56:34 +0000787 oo.mutexTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000788 next = oo.tid
Himani Chawla4d908332020-08-31 12:30:20 +0530789 oo.tid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000790 if oo.tid >= 0x8000 {
791 oo.tid = 1
792 }
mpagenko900ee4b2020-10-12 11:56:34 +0000793 oo.mutexTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000794 }
795 return next
796}
797
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530798// GetOnuSwSecNextTid get the next low prio tid for the onu sw sections
799// onu sw sections uses only low priority tids
800// The mutexTid lock should be taken prior to using this function
kesavand011d5162021-11-25 19:21:06 +0530801func (oo *OmciCC) GetOnuSwSecNextTid() uint16 {
kesavand011d5162021-11-25 19:21:06 +0530802 if oo.tid >= 0x8000 {
803 oo.tid = 1
804 }
bseenivad32c2742024-12-09 11:46:17 +0530805 next := oo.tid
806 oo.tid++
kesavand011d5162021-11-25 19:21:06 +0530807 return next
808}
809
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530810// GetOnuSwSecLastTid gets the last allocated tid
811// The mutexTid lock should be taken prior to using this function
kesavand011d5162021-11-25 19:21:06 +0530812func (oo *OmciCC) GetOnuSwSecLastTid() uint16 {
813 next := oo.tid
814 lastAllocatedTid := next - 1
815 return lastAllocatedTid
816}
817
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530818// LockMutexTID locks mutexTid
kesavand011d5162021-11-25 19:21:06 +0530819func (oo *OmciCC) LockMutexTID() {
820 oo.mutexTid.Lock()
821}
822
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530823// UnLockMutexTID unlocks mutexTid
kesavand011d5162021-11-25 19:21:06 +0530824func (oo *OmciCC) UnLockMutexTID() {
825 oo.mutexTid.Unlock()
826}
827
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000828// ###################################################################################
829// # utility methods provided to work on OMCI messages
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000830
831// Serialize - TODO: add comment
832func Serialize(ctx context.Context, msgType omci.MessageType, request gopacket.SerializableLayer, tid uint16) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000833 omciLayer := &omci.OMCI{
834 TransactionID: tid,
835 MessageType: msgType,
836 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000837 return SerializeOmciLayer(ctx, omciLayer, request)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000838}
839
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000840// SerializeOmciLayer - TODO: add comment
841func SerializeOmciLayer(ctx context.Context, aOmciLayer *omci.OMCI, aRequest gopacket.SerializableLayer) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000842 var options gopacket.SerializeOptions
843 options.FixLengths = true
844
845 buffer := gopacket.NewSerializeBuffer()
Himani Chawla4d908332020-08-31 12:30:20 +0530846 err := gopacket.SerializeLayers(buffer, options, aOmciLayer, aRequest)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000847 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000848 logger.Errorw(ctx, "Could not create goPacket Omci serial buffer", log.Fields{"Err": err})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000849 return nil, err
850 }
851 return buffer.Bytes(), nil
852}
853
Himani Chawla4d908332020-08-31 12:30:20 +0530854/*
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000855func hexEncode(omciPkt []byte) ([]byte, error) {
856 dst := make([]byte, hex.EncodedLen(len(omciPkt)))
857 hex.Encode(dst, omciPkt)
858 return dst, nil
859}
Himani Chawla4d908332020-08-31 12:30:20 +0530860*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000861
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530862// supply a response handler for omci response messages to be transferred to the requested FSM
mgoudad611f4c2025-10-30 14:49:27 +0530863func (oo *OmciCC) receiveOmciResponse(ctx context.Context, omciMsg *omci.OMCI, packet *gopacket.Packet, respChan chan Message) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000864
dbainbri4d3a0dc2020-12-02 00:33:42 +0000865 logger.Debugw(ctx, "omci-message-response - transfer on omciRespChannel", log.Fields{"omciMsgType": omciMsg.MessageType,
divyadesai4d299552020-08-18 07:13:49 +0000866 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000867
868 if oo.pOnuDeviceEntry == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000869 logger.Errorw(ctx, "Abort receiving OMCI response, DeviceEntryPointer is nil", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000870 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200871 return fmt.Errorf("deviceEntryPointer is nil %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000872 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000873 oo.mutexMonReq.RLock()
874 if _, exist := oo.monitoredRequests[omciMsg.TransactionID]; exist {
mpagenko8cd1bf72021-06-22 10:11:19 +0000875 //implement non-blocking channel send to avoid blocking on mutexMonReq later
876 select {
877 case oo.monitoredRequests[omciMsg.TransactionID].chSuccess <- true:
878 default:
879 logger.Debugw(ctx, "response not send on omciRespChannel (no receiver)", log.Fields{
880 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
881 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000882 } else {
883 logger.Infow(ctx, "reqMon: map entry does not exist!",
884 log.Fields{"tid": omciMsg.TransactionID, "device-id": oo.deviceID})
885 }
886 oo.mutexMonReq.RUnlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000887
888 // no further test on SeqNo is done here, assignment from rxScheduler is trusted
889 // MibSync responses are simply transferred via deviceEntry to MibSync, no specific analysis here
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000890 omciRespMsg := Message{
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000891 Type: OMCI,
892 Data: OmciMessage{
893 OmciMsg: omciMsg,
894 OmciPacket: packet,
895 },
896 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000897 //logger.Debugw(ctx,"Message to be sent into channel:", log.Fields{"mibSyncMsg": mibSyncMsg})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000898 respChan <- omciRespMsg
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000899
900 return nil
901}
902
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000903// SendMibReset sends MibResetRequest
904func (oo *OmciCC) SendMibReset(ctx context.Context, timeout int, highPrio bool) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000905
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530906 logger.Infow(ctx, "send MibReset-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000907 request := &omci.MibResetRequest{
908 MeBasePacket: omci.MeBasePacket{
909 EntityClass: me.OnuDataClassID,
910 },
911 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000912 tid := oo.GetNextTid(highPrio)
913 pkt, err := Serialize(ctx, omci.MibResetRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000914 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000915 logger.Errorw(ctx, "Cannot serialize MibResetRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000916 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000917 return err
918 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000919 omciRxCallbackPair := CallbackPair{
920 CbKey: tid,
921 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000922 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000923 return oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000924}
925
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000926// SendReboot sends RebootRequest
927func (oo *OmciCC) SendReboot(ctx context.Context, timeout int, highPrio bool, responseChannel chan Message) error {
928 logger.Debugw(ctx, "send reboot-msg to:", log.Fields{"device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300929 request := &omci.RebootRequest{
930 MeBasePacket: omci.MeBasePacket{
931 EntityClass: me.OnuGClassID,
932 },
933 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000934 tid := oo.GetNextTid(highPrio)
935 pkt, err := Serialize(ctx, omci.RebootRequestType, request, tid)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300936 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000937 logger.Errorw(ctx, "Cannot serialize RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000938 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300939 return err
940 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000941 omciRxCallbackPair := CallbackPair{
942 CbKey: tid,
943 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetOmciRebootMsgRevChan(), oo.receiveOmciResponse, true},
ozgecanetsiae11479f2020-07-06 09:44:47 +0300944 }
945
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000946 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300947 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000948 logger.Errorw(ctx, "Cannot send RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000949 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300950 return err
951 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000952 err = oo.pOnuDeviceEntry.WaitForRebootResponse(ctx, responseChannel)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300953 if err != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000954 logger.Errorw(ctx, "aborting ONU reboot!", log.Fields{
Andrea Campanella6515c582020-10-05 11:25:00 +0200955 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300956 return err
957 }
958 return nil
959}
960
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000961// SendMibUpload sends MibUploadRequest
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000962func (oo *OmciCC) SendMibUpload(ctx context.Context, timeout int, highPrio bool, isExtOmciSupported bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000963 logger.Debugw(ctx, "send MibUpload-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000964
965 tid := oo.GetNextTid(highPrio)
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000966
967 omciLayer := &omci.OMCI{
968 TransactionID: tid,
969 MessageType: omci.MibUploadRequestType,
970 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000971 if isExtOmciSupported {
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000972 omciLayer.DeviceIdentifier = omci.ExtendedIdent
973 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000974 request := &omci.MibUploadRequest{
975 MeBasePacket: omci.MeBasePacket{
976 EntityClass: me.OnuDataClassID,
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000977 Extended: isExtOmciSupported,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000978 },
979 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000980 var options gopacket.SerializeOptions
981 options.FixLengths = true
982
983 buffer := gopacket.NewSerializeBuffer()
984 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000985 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000986 logger.Errorw(ctx, "Cannot serialize MibUploadRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000987 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000988 return err
989 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000990 oo.UploadSequNo = 0
991 oo.UploadNoOfCmds = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000992
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000993 omciRxCallbackPair := CallbackPair{
994 CbKey: tid,
995 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000996 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000997 return oo.Send(ctx, buffer.Bytes(), timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000998}
999
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001000// SendMibUploadNext sends MibUploadNextRequest
Holger Hildebrandt5458d892022-05-31 09:52:06 +00001001func (oo *OmciCC) SendMibUploadNext(ctx context.Context, timeout int, highPrio bool, isExtOmciSupported bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001002 logger.Debugw(ctx, "send MibUploadNext-msg to:", log.Fields{"device-id": oo.deviceID, "UploadSequNo": oo.UploadSequNo})
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +00001003
1004 tid := oo.GetNextTid(highPrio)
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +00001005
1006 omciLayer := &omci.OMCI{
1007 TransactionID: tid,
1008 MessageType: omci.MibUploadNextRequestType,
1009 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00001010 if isExtOmciSupported {
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +00001011 omciLayer.DeviceIdentifier = omci.ExtendedIdent
1012 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001013 request := &omci.MibUploadNextRequest{
1014 MeBasePacket: omci.MeBasePacket{
1015 EntityClass: me.OnuDataClassID,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00001016 Extended: isExtOmciSupported,
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001017 },
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001018 CommandSequenceNumber: oo.UploadSequNo,
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001019 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +00001020 var options gopacket.SerializeOptions
1021 options.FixLengths = true
1022
1023 buffer := gopacket.NewSerializeBuffer()
1024 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001025 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001026 logger.Errorw(ctx, "Cannot serialize MibUploadNextRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001027 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001028 return err
1029 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001030 oo.UploadSequNo++
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001031
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001032 omciRxCallbackPair := CallbackPair{
1033 CbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001034 //frame printing for MibUpload frames disabled now per default to avoid log file abort situations (size/speed?)
1035 // if wanted, rx frame printing should be specifically done within the MibUpload FSM or controlled via extra parameter
1036 // compare also software upgrade download section handling
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001037 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001038 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +00001039 return oo.Send(ctx, buffer.Bytes(), timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001040}
1041
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001042// SendGetAllAlarm gets all alarm ME instances
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001043func (oo *OmciCC) SendGetAllAlarm(ctx context.Context, alarmRetreivalMode uint8, timeout int, highPrio bool, isExtendedOmci bool) error {
Himani Chawlad3dac422021-03-13 02:31:31 +05301044 logger.Debugw(ctx, "send GetAllAlarms-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001045
1046 tid := oo.GetNextTid(highPrio)
1047 omciLayer := &omci.OMCI{
1048 TransactionID: tid,
1049 MessageType: omci.GetAllAlarmsRequestType,
1050 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1051 }
1052 if isExtendedOmci {
1053 omciLayer.DeviceIdentifier = omci.ExtendedIdent
1054 }
Himani Chawlad3dac422021-03-13 02:31:31 +05301055 request := &omci.GetAllAlarmsRequest{
1056 MeBasePacket: omci.MeBasePacket{
1057 EntityClass: me.OnuDataClassID,
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001058 Extended: isExtendedOmci,
Himani Chawlad3dac422021-03-13 02:31:31 +05301059 },
1060 AlarmRetrievalMode: byte(alarmRetreivalMode),
1061 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001062 var options gopacket.SerializeOptions
1063 options.FixLengths = true
1064 buffer := gopacket.NewSerializeBuffer()
1065 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Himani Chawlad3dac422021-03-13 02:31:31 +05301066 if err != nil {
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001067 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsRequest", log.Fields{"Err": err,
1068 "device-id": oo.deviceID})
Himani Chawlad3dac422021-03-13 02:31:31 +05301069 return err
1070 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001071 outgoingPacket := buffer.Bytes()
1072
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001073 oo.pOnuAlarmManager.ResetAlarmUploadCounters()
Himani Chawlad3dac422021-03-13 02:31:31 +05301074
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001075 omciRxCallbackPair := CallbackPair{
1076 CbKey: tid,
1077 CbEntry: CallbackPairEntry{oo.pOnuAlarmManager.GetAlarmMgrEventChannel(), oo.receiveOmciResponse, true},
Himani Chawlad3dac422021-03-13 02:31:31 +05301078 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001079 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
1080 if err != nil {
1081 logger.Errorw(ctx, "Cannot send GetAllAlarmsRequest", log.Fields{"Err": err,
1082 "device-id": oo.deviceID})
1083 return err
1084 }
1085 logger.Debug(ctx, "send GetAllAlarmsRequest done")
1086 return nil
Himani Chawlad3dac422021-03-13 02:31:31 +05301087}
1088
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001089// SendGetAllAlarmNext gets next alarm ME instance
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001090func (oo *OmciCC) SendGetAllAlarmNext(ctx context.Context, timeout int, highPrio bool, isExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001091 alarmUploadSeqNo := oo.pOnuAlarmManager.GetAlarmUploadSeqNo()
1092 logger.Debugw(ctx, "send SendGetAllAlarmNext-msg to:", log.Fields{"device-id": oo.deviceID,
Himani Chawlad3dac422021-03-13 02:31:31 +05301093 "alarmUploadSeqNo": alarmUploadSeqNo})
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001094
1095 tid := oo.GetNextTid(highPrio)
1096 omciLayer := &omci.OMCI{
1097 TransactionID: tid,
1098 MessageType: omci.GetAllAlarmsNextRequestType,
1099 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1100 }
1101 if isExtendedOmci {
1102 omciLayer.DeviceIdentifier = omci.ExtendedIdent
1103 }
Himani Chawlad3dac422021-03-13 02:31:31 +05301104 request := &omci.GetAllAlarmsNextRequest{
1105 MeBasePacket: omci.MeBasePacket{
1106 EntityClass: me.OnuDataClassID,
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001107 Extended: isExtendedOmci,
Himani Chawlad3dac422021-03-13 02:31:31 +05301108 },
1109 CommandSequenceNumber: alarmUploadSeqNo,
1110 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001111 var options gopacket.SerializeOptions
1112 options.FixLengths = true
1113 buffer := gopacket.NewSerializeBuffer()
1114 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Himani Chawlad3dac422021-03-13 02:31:31 +05301115 if err != nil {
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001116 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsNextRequest", log.Fields{"Err": err,
1117 "device-id": oo.deviceID})
Himani Chawlad3dac422021-03-13 02:31:31 +05301118 return err
1119 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001120 outgoingPacket := buffer.Bytes()
1121
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001122 oo.pOnuAlarmManager.IncrementAlarmUploadSeqNo()
Himani Chawlad3dac422021-03-13 02:31:31 +05301123
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001124 omciRxCallbackPair := CallbackPair{
1125 CbKey: tid,
1126 CbEntry: CallbackPairEntry{oo.pOnuAlarmManager.GetAlarmMgrEventChannel(), oo.receiveOmciResponse, true},
Himani Chawlad3dac422021-03-13 02:31:31 +05301127 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001128 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
1129 if err != nil {
1130 logger.Errorw(ctx, "Cannot send GetAllAlarmsNextRequest", log.Fields{"Err": err,
1131 "device-id": oo.deviceID})
1132 return err
1133 }
1134 logger.Debug(ctx, "send GetAllAlarmsNextRequest done")
1135 return nil
Himani Chawlad3dac422021-03-13 02:31:31 +05301136}
1137
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001138// SendCreateGalEthernetProfile creates GalEthernetProfile ME instance
1139func (oo *OmciCC) SendCreateGalEthernetProfile(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1140 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001141 logger.Debugw(ctx, "send GalEnetProfile-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001142 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001143
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001144 meParams := me.ParamData{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001145 EntityID: GalEthernetEID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001146 Attributes: me.AttributeValueMap{me.GalEthernetProfile_MaximumGemPayloadSize: maxGemPayloadSize},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001147 }
1148 meInstance, omciErr := me.NewGalEthernetProfile(meParams)
1149 if omciErr.GetError() == nil {
1150 //all setByCreate parameters already set, no default option required ...
mpagenko836a1fd2021-11-01 16:12:42 +00001151 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001152 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001153 logger.Errorw(ctx, "Cannot encode GalEnetProfileInstance for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001154 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001155 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001156 }
1157
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001158 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001159 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001160 logger.Errorw(ctx, "Cannot serialize GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001161 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001162 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001163 }
1164
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001165 omciRxCallbackPair := CallbackPair{
1166 CbKey: tid,
1167 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001168 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001169 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001170 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001171 logger.Errorw(ctx, "Cannot send GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001172 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001173 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001174 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001175 logger.Debug(ctx, "send GalEnetProfile-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001176 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001177 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001178 logger.Errorw(ctx, "Cannot generate GalEnetProfileInstance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001179 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001180 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001181}
1182
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001183// SendSetOnu2g sets Onu2G ME instance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001184// might be needed to extend for parameter arguments, here just for setting the ConnectivityMode!!
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001185func (oo *OmciCC) SendSetOnu2g(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1186 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001187 logger.Debugw(ctx, "send ONU2-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001188 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001189
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001190 // ONU-G ME-ID is defined to be 0, but we could verify, if the ONU really supports the desired
1191 // connectivity mode 5 (in ConnCap)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001192 // By now we just use fix values to fire - this is anyway what the python adapter does
1193 // read ONU-2G from DB ???? //TODO!!!
1194 meParams := me.ParamData{
1195 EntityID: 0,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001196 Attributes: me.AttributeValueMap{me.Onu2G_CurrentConnectivityMode: connectivityModeValue},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001197 }
1198 meInstance, omciErr := me.NewOnu2G(meParams)
1199 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001200 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001201 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001202 logger.Errorw(ctx, "Cannot encode ONU2-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001203 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001204 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001205 }
1206
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001207 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001208 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001209 logger.Errorw(ctx, "Cannot serialize ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001210 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001211 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001212 }
1213
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001214 omciRxCallbackPair := CallbackPair{
1215 CbKey: tid,
1216 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001217 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001218 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001219 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001220 logger.Errorw(ctx, "Cannot send ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001221 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001222 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001223 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001224 logger.Debug(ctx, "send ONU2-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001225 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001226 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001227 logger.Errorw(ctx, "Cannot generate ONU2-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001228 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001229 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001230}
1231
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001232// SendCreateMBServiceProfile creates MacBridgeServiceProfile ME instance
1233func (oo *OmciCC) SendCreateMBServiceProfile(ctx context.Context,
1234 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1235 tid := oo.GetNextTid(highPrio)
1236 instID := MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001237 logger.Debugw(ctx, "send MBSP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001238 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001239
1240 meParams := me.ParamData{
1241 EntityID: instID,
1242 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001243 me.MacBridgeServiceProfile_Priority: 0x8000,
1244 me.MacBridgeServiceProfile_MaxAge: 20 * 256, //20s
1245 me.MacBridgeServiceProfile_HelloTime: 2 * 256, //2s
1246 me.MacBridgeServiceProfile_ForwardDelay: 15 * 256, //15s
1247 me.MacBridgeServiceProfile_DynamicFilteringAgeingTime: 0,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001248 },
1249 }
1250
1251 meInstance, omciErr := me.NewMacBridgeServiceProfile(meParams)
1252 if omciErr.GetError() == nil {
1253 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001254 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1255 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001256 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001257 logger.Errorw(ctx, "Cannot encode MBSP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001258 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001259 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001260 }
1261
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001262 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001263 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001264 logger.Errorw(ctx, "Cannot serialize MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001265 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001266 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001267 }
1268
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001269 omciRxCallbackPair := CallbackPair{
1270 CbKey: tid,
1271 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001272 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001273 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001274 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001275 logger.Errorw(ctx, "Cannot send MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001276 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001277 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001278 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001279 logger.Debug(ctx, "send MBSP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001280 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001281 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001282 logger.Errorw(ctx, "Cannot generate MBSP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001283 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001284 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001285}
1286
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001287// SendCreateMBPConfigDataUniSide creates MacBridgePortConfigurationData ME instance
1288func (oo *OmciCC) SendCreateMBPConfigDataUniSide(ctx context.Context,
1289 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1290 tid := oo.GetNextTid(highPrio)
1291 instID, idErr := GenerateUNISideMBPCDEID(uint16(aPUniPort.MacBpNo))
Mahir Gunyel6781f962021-05-16 23:30:08 -07001292 if idErr != nil {
1293 logger.Errorw(ctx, "Cannot generate MBPCD entity id", log.Fields{
1294 "Err": idErr, "device-id": oo.deviceID})
1295 return nil, idErr
1296 }
1297 logger.Debugw(ctx, "send MBPCD-Create-msg for uni side:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001298 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16), "macBpNo": aPUniPort.MacBpNo})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001299
1300 meParams := me.ParamData{
1301 EntityID: instID,
1302 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001303 me.MacBridgePortConfigurationData_BridgeIdPointer: MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo),
1304 me.MacBridgePortConfigurationData_PortNum: aPUniPort.MacBpNo,
1305 me.MacBridgePortConfigurationData_TpType: uint8(aPUniPort.PortType),
1306 me.MacBridgePortConfigurationData_TpPointer: aPUniPort.EntityID,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001307 },
1308 }
1309 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
1310 if omciErr.GetError() == nil {
1311 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001312 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1313 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001314 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001315 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001316 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001317 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001318 }
1319
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001320 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001321 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001322 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001323 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001324 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001325 }
1326
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001327 omciRxCallbackPair := CallbackPair{
1328 CbKey: tid,
1329 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001330 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001331 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001332 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001333 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001334 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001335 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001336 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001337 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001338 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001339 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001340 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001341 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001342 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001343}
1344
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001345// SendCreateEVTOConfigData creates ExtendedVlanTaggingOperationConfigurationData ME instance
1346func (oo *OmciCC) SendCreateEVTOConfigData(ctx context.Context,
1347 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1348 tid := oo.GetNextTid(highPrio)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001349 //same entityId is used as for MBSP (see there), but just arbitrary ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001350 instID := MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001351 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001352 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001353
1354 // compare python adapter code WA VOL-1311: this is not done here!
1355 // (setting TPID values for the create would probably anyway be ignored by the omci lib)
1356 // but perhaps we have to be aware of possible problems at get(Next) Request handling for EVTOOCD tables later ...
1357 assType := uint8(2) // default AssociationType is PPTPEthUni
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001358 if aPUniPort.PortType == UniVEIP {
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001359 assType = uint8(10) // for VEIP
1360 }
1361 meParams := me.ParamData{
1362 EntityID: instID,
1363 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001364 me.ExtendedVlanTaggingOperationConfigurationData_AssociationType: assType,
1365 me.ExtendedVlanTaggingOperationConfigurationData_AssociatedMePointer: aPUniPort.EntityID,
mpagenko836a1fd2021-11-01 16:12:42 +00001366 //EnhancedMode not yet supported, used with default options
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001367 },
1368 }
1369 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(meParams)
1370 if omciErr.GetError() == nil {
1371 //all setByCreate parameters already set, no default option required ...
mpagenko836a1fd2021-11-01 16:12:42 +00001372 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1373 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001374 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001375 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001376 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001377 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001378 }
1379
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001380 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001381 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001382 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001383 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001384 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001385 }
1386
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001387 omciRxCallbackPair := CallbackPair{
1388 CbKey: tid,
1389 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001390 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001391 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001392 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001393 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001394 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001395 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001396 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001397 logger.Debug(ctx, "send EVTOCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001398 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001399 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001400 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001401 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001402 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001403}
1404
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001405// SendSetOnuGLS sets OnuG ME instance
1406func (oo *OmciCC) SendSetOnuGLS(ctx context.Context, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001407 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001408 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001409 logger.Debugw(ctx, "send ONU-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001410 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001411
1412 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1413 meParams := me.ParamData{
1414 EntityID: 0,
1415 Attributes: requestedAttributes,
1416 }
1417 meInstance, omciErr := me.NewOnuG(meParams)
1418 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001419 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001420 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001421 logger.Errorw(ctx, "Cannot encode ONU-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001422 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001423 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001424 }
1425
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001426 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001427 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001428 logger.Errorw(ctx, "Cannot serialize ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001429 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001430 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001431 }
1432
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001433 omciRxCallbackPair := CallbackPair{
1434 CbKey: tid,
1435 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001436 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001437 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001438 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001439 logger.Errorw(ctx, "Cannot send ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001440 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001441 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001442 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001443 logger.Debug(ctx, "send ONU-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001444 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001445 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001446 logger.Errorw(ctx, "Cannot generate ONU-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001447 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001448 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001449}
1450
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001451// SendSetPptpEthUniLS sets PhysicalPathTerminationPointEthernetUni ME instance
1452func (oo *OmciCC) SendSetPptpEthUniLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001453 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001454 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001455 logger.Debugw(ctx, "send PPTPEthUni-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001456 "SequNo": strconv.FormatInt(int64(tid), 16)})
1457
1458 // PPTPEthUni ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1459 meParams := me.ParamData{
1460 EntityID: aInstNo,
1461 Attributes: requestedAttributes,
1462 }
1463 meInstance, omciErr := me.NewPhysicalPathTerminationPointEthernetUni(meParams)
1464 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001465 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001466 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001467 logger.Errorw(ctx, "Cannot encode PPTPEthUni instance for set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001468 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001469 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001470 }
1471
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001472 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001473 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001474 logger.Errorw(ctx, "Cannot serialize PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001475 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001476 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001477 }
1478
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001479 omciRxCallbackPair := CallbackPair{
1480 CbKey: tid,
1481 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001482 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001483 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001484 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001485 logger.Errorw(ctx, "Cannot send PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001486 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001487 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001488 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001489 logger.Debug(ctx, "send PPTPEthUni-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001490 return meInstance, nil
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001491 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001492 logger.Errorw(ctx, "Cannot generate PPTPEthUni", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001493 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001494 return nil, omciErr.GetError()
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001495}
1496
1497/* UniG obsolete by now, left here in case it should be needed once again
1498 UniG AdminState anyway should be ignored by ONU acc. to G988
Himani Chawla6d2ae152020-09-02 13:11:20 +05301499func (oo *omciCC) sendSetUniGLS(ctx context.Context, aInstNo uint16, timeout int,
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001500 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) *me.ManagedEntity {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001501 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001502 logger.Debugw(ctx,"send UNI-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001503 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001504
1505 // UNI-G ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1506 meParams := me.ParamData{
1507 EntityID: aInstNo,
1508 Attributes: requestedAttributes,
1509 }
1510 meInstance, omciErr := me.NewUniG(meParams)
1511 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001512 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001513 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001514 logger.Errorw(ctx,"Cannot encode UNI-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001515 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001516 return nil
1517 }
1518
1519 pkt, err := serializeOmciLayer(omciLayer, msgLayer)
1520 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001521 logger.Errorw(ctx,"Cannot serialize UNI-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001522 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001523 return nil
1524 }
1525
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001526 omciRxCallbackPair := CallbackPair{
1527 CbKey: tid,
1528 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001529 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001530 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001531 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001532 logger.Errorw(ctx,"Cannot send UNIG-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001533 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001534 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001535 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001536 logger.Debug(ctx,"send UNI-G-Set-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001537 return meInstance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001538 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001539 logger.Errorw(ctx,"Cannot generate UNI-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001540 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001541 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001542}
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001543*/
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001544
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001545// SendSetVeipLS sets VirtualEthernetInterfacePoint ME instance
1546func (oo *OmciCC) SendSetVeipLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001547 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001548 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001549 logger.Debugw(ctx, "send VEIP-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001550 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001551
1552 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1553 meParams := me.ParamData{
1554 EntityID: aInstNo,
1555 Attributes: requestedAttributes,
1556 }
1557 meInstance, omciErr := me.NewVirtualEthernetInterfacePoint(meParams)
1558 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001559 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001560 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001561 logger.Errorw(ctx, "Cannot encode VEIP instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001562 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001563 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001564 }
1565
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001566 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001567 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001568 logger.Errorw(ctx, "Cannot serialize VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001569 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001570 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001571 }
1572
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001573 omciRxCallbackPair := CallbackPair{
1574 CbKey: tid,
1575 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001576 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001577 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001578 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001579 logger.Errorw(ctx, "Cannot send VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001580 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001581 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001582 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001583 logger.Debug(ctx, "send VEIP-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001584 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001585 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001586 logger.Errorw(ctx, "Cannot generate VEIP", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001587 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001588 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001589}
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001590
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001591// SendGetMe gets ME instance
1592func (oo *OmciCC) SendGetMe(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributes me.AttributeValueMap,
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001593 timeout int, highPrio bool, rxChan chan Message, isExtendedOmci bool) (*me.ManagedEntity, error) {
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001594
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001595 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001596 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001597 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001598
1599 meParams := me.ParamData{
1600 EntityID: entityID,
1601 Attributes: requestedAttributes,
1602 }
mgoudad611f4c2025-10-30 14:49:27 +05301603 var messageSet = omci.BaselineIdent
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001604 if isExtendedOmci {
1605 messageSet = omci.ExtendedIdent
1606 }
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001607 meInstance, omciErr := me.LoadManagedEntityDefinition(classID, meParams)
1608 if omciErr.GetError() == nil {
Himani Chawla4d908332020-08-31 12:30:20 +05301609 meClassIDName := meInstance.GetName()
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001610 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.GetRequestType, oframe.TransactionID(tid), oframe.FrameFormat(messageSet))
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001611 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001612 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 +03001613 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001614 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001615 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001616 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001617 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001618 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001619 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001620 omciRxCallbackPair := CallbackPair{
1621 CbKey: tid,
1622 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001623 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001624 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001625 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001626 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001627 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001628 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001629 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": meClassIDName, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001630 return meInstance, nil
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001631 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001632 logger.Errorw(ctx, "Cannot generate meDefinition", log.Fields{"classID": classID, "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001633 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001634}
1635
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001636// SendGetMeWithAttributeMask gets ME instance with attribute mask
1637func (oo *OmciCC) SendGetMeWithAttributeMask(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributesMask uint16,
Himani Chawla43f95ff2021-06-03 00:24:12 +05301638 timeout int, highPrio bool, rxChan chan Message) error {
1639
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001640 tid := oo.GetNextTid(highPrio)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301641 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
1642 "SequNo": strconv.FormatInt(int64(tid), 16)})
1643
1644 request := &omci.GetRequest{
1645 MeBasePacket: omci.MeBasePacket{
1646 EntityInstance: entityID,
1647 EntityClass: classID,
1648 },
1649 AttributeMask: requestedAttributesMask,
1650 }
1651
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001652 pkt, err := Serialize(ctx, omci.GetRequestType, request, tid)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301653 if err != nil {
1654 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1655 return err
1656 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001657 omciRxCallbackPair := CallbackPair{
1658 CbKey: tid,
1659 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Himani Chawla43f95ff2021-06-03 00:24:12 +05301660 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001661 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301662 if err != nil {
1663 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1664 return err
1665 }
1666 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": classID, "device-id": oo.deviceID})
1667 return nil
1668}
1669
pnalmas6d6b7d72025-10-23 16:34:22 +05301670// SendGetCurrentDataME gets current performance monitoring data from ME instance
1671func (oo *OmciCC) SendGetCurrentDataME(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributes me.AttributeValueMap,
1672 timeout int, highPrio bool, rxChan chan Message, isExtendedOmci bool) (*me.ManagedEntity, error) {
1673
1674 tid := oo.GetNextTid(highPrio)
1675 logger.Debugw(ctx, "send get-current-data-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
1676 "SequNo": strconv.FormatInt(int64(tid), 16)})
1677
1678 meParams := me.ParamData{
1679 EntityID: entityID,
1680 Attributes: requestedAttributes,
1681 }
1682 var messageSet = omci.BaselineIdent
1683 if isExtendedOmci {
1684 messageSet = omci.ExtendedIdent
1685 }
1686 meInstance, omciErr := me.LoadManagedEntityDefinition(classID, meParams)
1687 if omciErr.GetError() == nil {
1688 meClassIDName := meInstance.GetName()
1689 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.GetCurrentDataRequestType, oframe.TransactionID(tid), oframe.FrameFormat(messageSet))
1690 if err != nil {
1691 logger.Errorf(ctx, "Cannot encode instance for get-current-data-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
1692 return nil, err
1693 }
1694 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
1695 if err != nil {
1696 logger.Errorw(ctx, "Cannot serialize get-current-data-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
1697 return nil, err
1698 }
1699 omciRxCallbackPair := CallbackPair{
1700 CbKey: tid,
1701 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
1702 }
1703 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
1704 if err != nil {
1705 logger.Errorw(ctx, "Cannot send get-current-data-request-msg", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
1706 return nil, err
1707 }
1708 logger.Debugw(ctx, "send get-current-data-request-msg done", log.Fields{"meClassIDName": meClassIDName, "device-id": oo.deviceID})
1709 return meInstance, nil
1710 }
1711 logger.Errorw(ctx, "Cannot generate meDefinition", log.Fields{"classID": classID, "Err": omciErr.GetError(), "device-id": oo.deviceID})
1712 return nil, omciErr.GetError()
1713}
1714
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001715// SendCreateDot1PMapper creates Ieee8021PMapperServiceProfile ME instance
1716func (oo *OmciCC) SendCreateDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001717 aInstID uint16, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001718 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001719 logger.Debugw(ctx, "send .1pMapper-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001720 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(aInstID), 16)})
1721
1722 meParams := me.ParamData{
mpagenko8b5fdd22020-12-17 17:58:32 +00001723 EntityID: aInstID,
1724 Attributes: me.AttributeValueMap{
1725 //workaround for unsuitable omci-lib default values, cmp VOL-3729
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001726 me.Ieee8021PMapperServiceProfile_TpPointer: 0xFFFF,
1727 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority0: 0xFFFF,
1728 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority1: 0xFFFF,
1729 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority2: 0xFFFF,
1730 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority3: 0xFFFF,
1731 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority4: 0xFFFF,
1732 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority5: 0xFFFF,
1733 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority6: 0xFFFF,
1734 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority7: 0xFFFF,
mpagenko8b5fdd22020-12-17 17:58:32 +00001735 },
mpagenko3dbcdd22020-07-22 07:38:45 +00001736 }
1737 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
1738 if omciErr.GetError() == nil {
1739 //we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001740 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1741 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001742 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001743 logger.Errorw(ctx, "Cannot encode .1pMapper for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001744 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001745 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001746 }
1747
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001748 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001749 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001750 logger.Errorw(ctx, "Cannot serialize .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001751 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001752 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001753 }
1754
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001755 omciRxCallbackPair := CallbackPair{
1756 CbKey: tid,
1757 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001758 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001759 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001760 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001761 logger.Errorw(ctx, "Cannot send .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001762 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001763 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001764 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001765 logger.Debug(ctx, "send .1pMapper-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001766 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001767 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001768 logger.Errorw(ctx, "Cannot generate .1pMapper", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001769 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001770 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001771}
1772
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001773// SendCreateMBPConfigDataVar creates MacBridgePortConfigurationData ME instance
1774func (oo *OmciCC) SendCreateMBPConfigDataVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001775 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001776 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001777 logger.Debugw(ctx, "send MBPCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001778 "SequNo": strconv.FormatInt(int64(tid), 16),
1779 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1780
1781 meInstance, omciErr := me.NewMacBridgePortConfigurationData(params[0])
1782 if omciErr.GetError() == nil {
1783 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001784 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1785 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001786 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001787 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001788 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001789 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001790 }
1791
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001792 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001793 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001794 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001795 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001796 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001797 }
1798
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001799 omciRxCallbackPair := CallbackPair{
1800 CbKey: tid,
1801 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001802 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001803 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001804 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001805 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001806 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001807 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001808 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001809 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001810 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001811 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001812 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001813 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001814 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001815}
1816
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001817// SendCreateGemNCTPVar creates GemPortNetworkCtp ME instance
1818func (oo *OmciCC) SendCreateGemNCTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001819 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001820 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001821 logger.Debugw(ctx, "send GemNCTP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001822 "SequNo": strconv.FormatInt(int64(tid), 16),
1823 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1824
1825 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1826 if omciErr.GetError() == nil {
1827 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001828 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1829 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001830 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001831 logger.Errorw(ctx, "Cannot encode GemNCTP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001832 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001833 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001834 }
1835
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001836 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001837 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001838 logger.Errorw(ctx, "Cannot serialize GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001839 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001840 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001841 }
1842
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001843 omciRxCallbackPair := CallbackPair{
1844 CbKey: tid,
1845 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001846 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001847 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001848 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001849 logger.Errorw(ctx, "Cannot send GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001850 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001851 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001852 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001853 logger.Debug(ctx, "send GemNCTP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001854 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001855 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001856 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001857 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001858 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001859}
1860
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001861// SendSetGemNCTPVar sets GemPortNetworkCtp ME instance
1862func (oo *OmciCC) SendSetGemNCTPVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
1863 tid := oo.GetNextTid(highPrio)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001864 logger.Debugw(ctx, "send GemNCTP-Set-msg:", log.Fields{"device-id": oo.deviceID,
1865 "SequNo": strconv.FormatInt(int64(tid), 16),
1866 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1867
1868 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1869 if omciErr.GetError() == nil {
1870 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001871 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType,
1872 oframe.TransactionID(tid), oframe.AddDefaults(true))
ozgecanetsia82b91a62021-05-21 18:54:49 +03001873 if err != nil {
1874 logger.Errorw(ctx, "Cannot encode GemNCTP for set", log.Fields{
1875 "Err": err, "device-id": oo.deviceID})
1876 return nil, err
1877 }
1878
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001879 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001880 if err != nil {
1881 logger.Errorw(ctx, "Cannot serialize GemNCTP set", log.Fields{
1882 "Err": err, "device-id": oo.deviceID})
1883 return nil, err
1884 }
1885
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001886 omciRxCallbackPair := CallbackPair{
1887 CbKey: tid,
1888 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia82b91a62021-05-21 18:54:49 +03001889 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001890 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001891 if err != nil {
1892 logger.Errorw(ctx, "Cannot send GemNCTP set", log.Fields{
1893 "Err": err, "device-id": oo.deviceID})
1894 return nil, err
1895 }
1896 logger.Debug(ctx, "send GemNCTP-Set-msg done", log.Fields{"device-id": oo.deviceID})
1897 return meInstance, nil
1898 }
1899 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
1900 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1901 return nil, omciErr.GetError()
1902}
1903
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001904// SendCreateGemIWTPVar creates GemInterworkingTerminationPoint ME instance
1905func (oo *OmciCC) SendCreateGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001906 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001907 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001908 logger.Debugw(ctx, "send GemIwTp-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001909 "SequNo": strconv.FormatInt(int64(tid), 16),
1910 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1911
1912 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(params[0])
1913 if omciErr.GetError() == nil {
1914 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
mpagenko836a1fd2021-11-01 16:12:42 +00001915 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1916 oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001917 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001918 logger.Errorw(ctx, "Cannot encode GemIwTp for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001919 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001920 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001921 }
1922
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001923 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001924 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001925 logger.Errorw(ctx, "Cannot serialize GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001926 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001927 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001928 }
1929
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001930 omciRxCallbackPair := CallbackPair{
1931 CbKey: tid,
1932 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001933 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001934 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001935 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001936 logger.Errorw(ctx, "Cannot send GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001937 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001938 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001939 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001940 logger.Debug(ctx, "send GemIwTp-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001941 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001942 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001943 logger.Errorw(ctx, "Cannot generate GemIwTp Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001944 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001945 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001946}
1947
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001948// SendSetTcontVar sets TCont ME instance
1949func (oo *OmciCC) SendSetTcontVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001950 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001951 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001952 logger.Debugw(ctx, "send TCont-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001953 "SequNo": strconv.FormatInt(int64(tid), 16),
1954 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1955
1956 meInstance, omciErr := me.NewTCont(params[0])
1957 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001958 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001959 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001960 logger.Errorw(ctx, "Cannot encode TCont for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001961 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001962 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001963 }
1964
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001965 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001966 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001967 logger.Errorw(ctx, "Cannot serialize TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001968 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001969 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001970 }
1971
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001972 omciRxCallbackPair := CallbackPair{
1973 CbKey: tid,
1974 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001975 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001976 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001977 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001978 logger.Errorw(ctx, "Cannot send TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001979 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001980 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001981 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001982 logger.Debug(ctx, "send TCont-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001983 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001984 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001985 logger.Errorw(ctx, "Cannot generate TCont Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001986 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001987 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001988}
1989
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001990// SendSetPrioQueueVar sets PriorityQueue ME instance
1991func (oo *OmciCC) SendSetPrioQueueVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001992 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001993 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001994 logger.Debugw(ctx, "send PrioQueue-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001995 "SequNo": strconv.FormatInt(int64(tid), 16),
1996 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1997
1998 meInstance, omciErr := me.NewPriorityQueue(params[0])
1999 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002000 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00002001 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002002 logger.Errorw(ctx, "Cannot encode PrioQueue for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00002003 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002004 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00002005 }
2006
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002007 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00002008 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002009 logger.Errorw(ctx, "Cannot serialize PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00002010 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002011 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00002012 }
2013
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002014 omciRxCallbackPair := CallbackPair{
2015 CbKey: tid,
2016 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00002017 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002018 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00002019 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002020 logger.Errorw(ctx, "Cannot send PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00002021 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002022 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00002023 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002024 logger.Debug(ctx, "send PrioQueue-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002025 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00002026 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002027 logger.Errorw(ctx, "Cannot generate PrioQueue Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00002028 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002029 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00002030}
2031
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002032// SendSetDot1PMapperVar sets Ieee8021PMapperServiceProfile ME instance
2033func (oo *OmciCC) SendSetDot1PMapperVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002034 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002035 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002036 logger.Debugw(ctx, "send 1PMapper-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00002037 "SequNo": strconv.FormatInt(int64(tid), 16),
2038 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2039
2040 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(params[0])
2041 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002042 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00002043 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002044 logger.Errorw(ctx, "Cannot encode 1PMapper for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00002045 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002046 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00002047 }
2048
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002049 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00002050 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002051 logger.Errorw(ctx, "Cannot serialize 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00002052 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002053 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00002054 }
2055
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002056 omciRxCallbackPair := CallbackPair{
2057 CbKey: tid,
2058 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00002059 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002060 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00002061 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002062 logger.Errorw(ctx, "Cannot send 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00002063 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002064 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00002065 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002066 logger.Debug(ctx, "send 1PMapper-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002067 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00002068 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002069 logger.Errorw(ctx, "Cannot generate 1PMapper Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00002070 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002071 return nil, omciErr.GetError()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00002072}
mpagenkodff5dda2020-08-28 11:52:01 +00002073
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002074// SendCreateVtfdVar creates VlanTaggingFilterData ME instance
2075func (oo *OmciCC) SendCreateVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002076 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002077 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002078 logger.Debugw(ctx, "send VTFD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002079 "SequNo": strconv.FormatInt(int64(tid), 16),
2080 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2081
2082 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
2083 if omciErr.GetError() == nil {
2084 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
mpagenko836a1fd2021-11-01 16:12:42 +00002085 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
2086 oframe.TransactionID(tid))
mpagenkodff5dda2020-08-28 11:52:01 +00002087 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002088 logger.Errorw(ctx, "Cannot encode VTFD for create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002089 "Err": err, "device-id": oo.deviceID})
2090 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2091 // return (dual format) error code that can be used at caller for immediate error treatment
2092 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002093 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002094 }
2095
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002096 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00002097 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002098 logger.Errorw(ctx, "Cannot serialize VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002099 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002100 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002101 }
2102
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002103 omciRxCallbackPair := CallbackPair{
2104 CbKey: tid,
2105 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00002106 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002107 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00002108 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002109 logger.Errorw(ctx, "Cannot send VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002110 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002111 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002112 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002113 logger.Debug(ctx, "send VTFD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002114 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00002115 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002116 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002117 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002118 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00002119}
2120
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002121// nolint: unused
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002122func (oo *OmciCC) sendSetVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002123 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002124 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002125 logger.Debugw(ctx, "send VTFD-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002126 "SequNo": strconv.FormatInt(int64(tid), 16),
2127 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2128
2129 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
2130 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002131 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType,
2132 oframe.TransactionID(tid))
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002133 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002134 logger.Errorw(ctx, "Cannot encode VTFD for set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002135 "Err": err, "device-id": oo.deviceID})
2136 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2137 // return (dual format) error code that can be used at caller for immediate error treatment
2138 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002139 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002140 }
2141
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002142 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002143 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002144 logger.Errorw(ctx, "Cannot serialize VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002145 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002146 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002147 }
2148
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002149 omciRxCallbackPair := CallbackPair{
2150 CbKey: tid,
2151 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002152 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002153 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002154 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002155 logger.Errorw(ctx, "Cannot send VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002156 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002157 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002158 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002159 logger.Debug(ctx, "send VTFD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002160 return meInstance, nil
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002161 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002162 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002163 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002164 return nil, omciErr.GetError()
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002165}
2166
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002167// SendCreateEvtocdVar creates ExtendedVlanTaggingOperationConfigurationData ME instance
2168func (oo *OmciCC) SendCreateEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002169 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002170 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002171 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002172 "SequNo": strconv.FormatInt(int64(tid), 16),
2173 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2174
2175 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2176 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002177 //EnhancedMode not yet supported, used with default options
2178 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
2179 oframe.TransactionID(tid), oframe.AddDefaults(true))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002180 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002181 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002182 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002183 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002184 }
2185
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002186 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002187 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002188 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002189 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002190 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002191 }
2192
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002193 omciRxCallbackPair := CallbackPair{
2194 CbKey: tid,
2195 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002196 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002197 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002198 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002199 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002200 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002201 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002202 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002203 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002204 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002205 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002206 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002207 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002208 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002209}
2210
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002211// SendSetEvtocdVar sets ExtendedVlanTaggingOperationConfigurationData ME instance
2212func (oo *OmciCC) SendSetEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002213 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002214 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002215 logger.Debugw(ctx, "send EVTOCD-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002216 "SequNo": strconv.FormatInt(int64(tid), 16),
2217 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2218
2219 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2220 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002221 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenkodff5dda2020-08-28 11:52:01 +00002222 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002223 logger.Errorw(ctx, "Cannot encode EVTOCD for set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002224 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002225 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002226 }
2227
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002228 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00002229 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002230 logger.Errorw(ctx, "Cannot serialize EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002231 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002232 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002233 }
2234
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002235 omciRxCallbackPair := CallbackPair{
2236 CbKey: tid,
2237 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00002238 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002239 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00002240 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002241 logger.Errorw(ctx, "Cannot send EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002242 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002243 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002244 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002245 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002246 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00002247 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002248 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002249 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002250 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00002251}
mpagenko01e726e2020-10-23 09:45:29 +00002252
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002253// SendDeleteEvtocd deletes ExtendedVlanTaggingOperationConfigurationData ME instance
2254func (oo *OmciCC) SendDeleteEvtocd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002255 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002256 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002257 logger.Debugw(ctx, "send EVTOCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002258 "SequNo": strconv.FormatInt(int64(tid), 16),
2259 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2260
2261 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2262 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002263 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002264 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002265 logger.Errorw(ctx, "Cannot encode EVTOCD for delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002266 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002267 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002268 }
2269
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002270 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002271 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002272 logger.Errorw(ctx, "Cannot serialize EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002273 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002274 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002275 }
2276
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002277 omciRxCallbackPair := CallbackPair{
2278 CbKey: tid,
2279 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002280 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002281 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002282 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002283 logger.Errorw(ctx, "Cannot send EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002284 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002285 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002286 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002287 logger.Debug(ctx, "send EVTOCD-delete msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002288 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002289 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002290 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002291 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002292 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002293}
2294
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002295// SendDeleteVtfd deletes VlanTaggingFilterData ME instance
2296func (oo *OmciCC) SendDeleteVtfd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002297 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002298 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002299 logger.Debugw(ctx, "send VTFD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko01e726e2020-10-23 09:45:29 +00002300 "SequNo": strconv.FormatInt(int64(tid), 16),
2301 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2302
2303 meParams := me.ParamData{EntityID: aInstID}
2304 meInstance, omciErr := me.NewVlanTaggingFilterData(meParams)
2305 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002306 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2307 oframe.TransactionID(tid))
mpagenko01e726e2020-10-23 09:45:29 +00002308 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002309 logger.Errorw(ctx, "Cannot encode VTFD for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002310 "Err": err, "device-id": oo.deviceID})
2311 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2312 // return (dual format) error code that can be used at caller for immediate error treatment
2313 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002314 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002315 }
2316
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002317 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko01e726e2020-10-23 09:45:29 +00002318 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002319 logger.Errorw(ctx, "Cannot serialize VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002320 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002321 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002322 }
2323
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002324 omciRxCallbackPair := CallbackPair{
2325 CbKey: tid,
2326 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko01e726e2020-10-23 09:45:29 +00002327 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002328 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko01e726e2020-10-23 09:45:29 +00002329 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002330 logger.Errorw(ctx, "Cannot send VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002331 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002332 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002333 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002334 logger.Debug(ctx, "send VTFD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002335 return meInstance, nil
mpagenko01e726e2020-10-23 09:45:29 +00002336 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002337 logger.Errorw(ctx, "Cannot generate VTFD Instance for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002338 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002339 return nil, omciErr.GetError()
mpagenko01e726e2020-10-23 09:45:29 +00002340}
ozgecanetsia422dbf32020-10-28 14:07:19 +03002341
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002342// SendCreateTDVar creates TrafficDescriptor ME instance
2343func (oo *OmciCC) SendCreateTDVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2344 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002345 logger.Debugw(ctx, "send TD-Create-msg:", log.Fields{"device-id": oo.deviceID,
2346 "SequNo": strconv.FormatInt(int64(tid), 16),
2347 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2348 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2349 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002350 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002351 if err != nil {
2352 logger.Errorw(ctx, "Cannot encode TD for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002353 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002354 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002355 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002356 if err != nil {
2357 logger.Errorw(ctx, "Cannot serialize TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002358 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002359 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002360 omciRxCallbackPair := CallbackPair{
2361 CbKey: tid,
2362 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002363 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002364 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002365 if err != nil {
2366 logger.Errorw(ctx, "Cannot send TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002367 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002368 }
2369 logger.Debug(ctx, "send TD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002370 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002371 }
2372 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002373 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002374}
2375
2376// nolint: unused
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002377func (oo *OmciCC) sendSetTDVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002378 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002379 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002380 logger.Debugw(ctx, "send TD-Set-msg:", log.Fields{"device-id": oo.deviceID,
2381 "SequNo": strconv.FormatInt(int64(tid), 16),
2382 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2383
2384 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2385 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002386 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002387 if err != nil {
2388 logger.Errorw(ctx, "Cannot encode TD for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002389 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002390 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002391 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002392 if err != nil {
2393 logger.Errorw(ctx, "Cannot serialize TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002394 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002395 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002396 omciRxCallbackPair := CallbackPair{
2397 CbKey: tid,
2398 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002399 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002400 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002401 if err != nil {
2402 logger.Errorw(ctx, "Cannot send TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002403 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002404 }
2405 logger.Debug(ctx, "send TD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002406 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002407 }
2408 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002409 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002410
2411}
2412
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002413// SendDeleteTD - TODO: add comment
2414func (oo *OmciCC) SendDeleteTD(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002415 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002416 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002417 logger.Debugw(ctx, "send TD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2418 "SequNo": strconv.FormatInt(int64(tid), 16),
2419 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2420
2421 meParams := me.ParamData{EntityID: aInstID}
2422 meInstance, omciErr := me.NewTrafficDescriptor(meParams)
2423 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002424 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002425 if err != nil {
2426 logger.Errorw(ctx, "Cannot encode TD for delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002427 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002428 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002429 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002430 if err != nil {
2431 logger.Errorw(ctx, "Cannot serialize TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002432 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002433 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002434 omciRxCallbackPair := CallbackPair{
2435 CbKey: tid,
2436 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002437 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002438 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002439 if err != nil {
2440 logger.Errorw(ctx, "Cannot send TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002441 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002442 }
2443 logger.Debug(ctx, "send TD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002444 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002445 }
2446 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002447 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002448
2449}
2450
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002451// SendDeleteGemIWTP deletes GemInterworkingTerminationPoint ME instance
2452func (oo *OmciCC) SendDeleteGemIWTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002453 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002454 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002455 logger.Debugw(ctx, "send GemIwTp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002456 "SequNo": strconv.FormatInt(int64(tid), 16),
2457 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2458
2459 meParams := me.ParamData{EntityID: aInstID}
2460 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(meParams)
2461 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002462 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2463 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002464 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002465 logger.Errorw(ctx, "Cannot encode GemIwTp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002466 "Err": err, "device-id": oo.deviceID})
2467 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2468 // return (dual format) error code that can be used at caller for immediate error treatment
2469 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002470 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002471 }
2472
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002473 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002474 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002475 logger.Errorw(ctx, "Cannot serialize GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002476 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002477 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002478 }
2479
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002480 omciRxCallbackPair := CallbackPair{
2481 CbKey: tid,
2482 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002483 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002484 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002485 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002486 logger.Errorw(ctx, "Cannot send GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002487 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002488 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002489 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002490 logger.Debug(ctx, "send GemIwTp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002491 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002492 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002493 logger.Errorw(ctx, "Cannot generate GemIwTp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002494 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002495 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002496}
2497
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002498// SendDeleteGemNCTP deletes GemPortNetworkCtp ME instance
2499func (oo *OmciCC) SendDeleteGemNCTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002500 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002501 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002502 logger.Debugw(ctx, "send GemNCtp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002503 "SequNo": strconv.FormatInt(int64(tid), 16),
2504 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2505
2506 meParams := me.ParamData{EntityID: aInstID}
2507 meInstance, omciErr := me.NewGemPortNetworkCtp(meParams)
2508 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002509 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2510 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002511 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002512 logger.Errorw(ctx, "Cannot encode GemNCtp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002513 "Err": err, "device-id": oo.deviceID})
2514 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2515 // return (dual format) error code that can be used at caller for immediate error treatment
2516 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002517 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002518 }
2519
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002520 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002521 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002522 logger.Errorw(ctx, "Cannot serialize GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002523 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002524 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002525 }
2526
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002527 omciRxCallbackPair := CallbackPair{
2528 CbKey: tid,
2529 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002530 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002531 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002532 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002533 logger.Errorw(ctx, "Cannot send GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002534 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002535 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002536 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002537 logger.Debug(ctx, "send GemNCtp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002538 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002539 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002540 logger.Errorw(ctx, "Cannot generate GemNCtp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002541 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002542 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002543}
2544
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002545// SendDeleteDot1PMapper deletes Ieee8021PMapperServiceProfile ME instance
2546func (oo *OmciCC) SendDeleteDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002547 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002548 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002549 logger.Debugw(ctx, "send .1pMapper-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002550 "SequNo": strconv.FormatInt(int64(tid), 16),
2551 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2552
2553 meParams := me.ParamData{EntityID: aInstID}
2554 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
2555 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002556 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2557 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002558 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002559 logger.Errorw(ctx, "Cannot encode .1pMapper for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002560 "Err": err, "device-id": oo.deviceID})
2561 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2562 // return (dual format) error code that can be used at caller for immediate error treatment
2563 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002564 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002565 }
2566
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002567 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002568 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002569 logger.Errorw(ctx, "Cannot serialize .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002570 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002571 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002572 }
2573
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002574 omciRxCallbackPair := CallbackPair{
2575 CbKey: tid,
2576 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002577 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002578 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002579 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002580 logger.Errorw(ctx, "Cannot send .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002581 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002582 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002583 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002584 logger.Debug(ctx, "send .1pMapper-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002585 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002586 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002587 logger.Errorw(ctx, "Cannot generate .1pMapper Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002588 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002589 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002590}
2591
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002592// SendDeleteMBPConfigData deletes MacBridgePortConfigurationData ME instance
2593func (oo *OmciCC) SendDeleteMBPConfigData(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002594 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002595 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002596 logger.Debugw(ctx, "send MBPCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002597 "SequNo": strconv.FormatInt(int64(tid), 16),
2598 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2599
2600 meParams := me.ParamData{EntityID: aInstID}
2601 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
2602 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002603 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2604 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002605 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002606 logger.Errorw(ctx, "Cannot encode MBPCD for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002607 "Err": err, "device-id": oo.deviceID})
2608 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2609 // return (dual format) error code that can be used at caller for immediate error treatment
2610 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002611 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002612 }
2613
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002614 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002615 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002616 logger.Errorw(ctx, "Cannot serialize MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002617 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002618 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002619 }
2620
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002621 omciRxCallbackPair := CallbackPair{
2622 CbKey: tid,
2623 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002624 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002625 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002626 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002627 logger.Errorw(ctx, "Cannot send MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002628 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002629 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002630 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002631 logger.Debug(ctx, "send MBPCD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002632 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002633 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002634 logger.Errorw(ctx, "Cannot generate MBPCD Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002635 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002636 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002637}
2638
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002639// SendCreateMulticastGemIWTPVar creates MulticastGemInterworkingTerminationPoint ME instance
2640func (oo *OmciCC) SendCreateMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002641 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002642 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002643 logger.Debugw(ctx, "send MulticastGemIWTP-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002644 "SequNo": strconv.FormatInt(int64(tid), 16),
2645 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2646
2647 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2648 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002649 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2650 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002651 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002652 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002653 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002654 }
2655
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002656 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002657 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002658 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002659 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002660 }
2661
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002662 omciRxCallbackPair := CallbackPair{CbKey: tid,
2663 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002664 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002665 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002666 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002667 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002668 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002669 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002670 logger.Debug(ctx, "send MulticastGEMIWTP-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002671 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002672 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002673 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002674 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002675 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002676}
2677
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002678// SendSetMulticastGemIWTPVar sets MulticastGemInterworkingTerminationPoint ME instance
2679func (oo *OmciCC) SendSetMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002680 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002681 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002682 logger.Debugw(ctx, "send MulticastGemIWTP-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002683 "SequNo": strconv.FormatInt(int64(tid), 16),
2684 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2685
2686 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2687 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002688 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2689 oframe.AddDefaults(true))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002690 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002691 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002692 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002693 }
2694
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002695 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002696 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002697 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002698 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002699 }
2700
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002701 omciRxCallbackPair := CallbackPair{CbKey: tid,
2702 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002703 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002704 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002705 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002706 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002707 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002708 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002709 logger.Debug(ctx, "send MulticastGEMIWTP-set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002710 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002711 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002712 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002713 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002714 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002715}
2716
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002717// SendCreateMulticastOperationProfileVar creates MulticastOperationsProfile ME instance
2718func (oo *OmciCC) SendCreateMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002719 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002720 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002721 logger.Debugw(ctx, "send MulticastOperationProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002722 "SequNo": strconv.FormatInt(int64(tid), 16),
2723 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2724
2725 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2726 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002727 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2728 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002729 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002730 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002731 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002732 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002733 }
2734
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002735 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002736 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002737 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002738 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002739 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002740 }
2741
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002742 omciRxCallbackPair := CallbackPair{CbKey: tid,
2743 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002744 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002745 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002746 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002747 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002748 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002749 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002750 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002751 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002752 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002753 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002754 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002755 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002756 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002757}
2758
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002759// SendSetMulticastOperationProfileVar sets MulticastOperationsProfile ME instance
2760func (oo *OmciCC) SendSetMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002761 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002762 tid := oo.GetNextTid(highPrio)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002763 logger.Debugw(ctx, "send MulticastOperationProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002764 "SequNo": strconv.FormatInt(int64(tid), 16),
2765 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2766
2767 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2768 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002769 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2770 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002771 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002772 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002773 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002774 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002775 }
2776
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002777 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002778 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002779 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002780 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002781 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002782 }
2783
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002784 omciRxCallbackPair := CallbackPair{CbKey: tid,
2785 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002786 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002787 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002788 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002789 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002790 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002791 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002792 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002793 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002794 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002795 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002796 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002797 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002798 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002799}
2800
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002801// SendCreateMulticastSubConfigInfoVar creates MulticastSubscriberConfigInfo ME instance
2802func (oo *OmciCC) SendCreateMulticastSubConfigInfoVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002803 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002804 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002805 logger.Debugw(ctx, "send MulticastSubConfigInfo-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002806 "SequNo": strconv.FormatInt(int64(tid), 16),
2807 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2808
2809 meInstance, omciErr := me.NewMulticastSubscriberConfigInfo(params[0])
2810 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002811 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2812 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002813 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002814 logger.Errorw(ctx, "Cannot encode MulticastSubConfigInfo for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002815 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002816 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002817 }
2818
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002819 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002820 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002821 logger.Errorw(ctx, "Cannot serialize MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002822 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002823 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002824 }
2825
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002826 omciRxCallbackPair := CallbackPair{CbKey: tid,
2827 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002828 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002829 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002830 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002831 logger.Errorw(ctx, "Cannot send MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002832 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002833 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002834 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002835 logger.Debug(ctx, "send MulticastSubConfigInfo-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002836 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002837 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002838 logger.Errorw(ctx, "Cannot generate MulticastSubConfigInfo Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002839 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002840 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002841}
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00002842
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002843// SendCreateVoipVoiceCTP nolint: unused
2844func (oo *OmciCC) SendCreateVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2845 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2846 tid := oo.GetNextTid(highPrio)
2847 logger.Debugw(ctx, "send VoipVoiceCTP-create-msg:", log.Fields{"device-id": oo.deviceID,
2848 "SequNo": strconv.FormatInt(int64(tid), 16),
2849 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2850
2851 meInstance, omciErr := me.NewVoipVoiceCtp(params[0])
2852 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002853 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2854 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002855 if err != nil {
2856 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for create", log.Fields{"Err": err,
2857 "device-id": oo.deviceID})
2858 return nil, err
2859 }
2860
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002861 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002862 if err != nil {
2863 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP create", log.Fields{"Err": err,
2864 "device-id": oo.deviceID})
2865 return nil, err
2866 }
2867
2868 omciRxCallbackPair := CallbackPair{CbKey: tid,
2869 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2870 }
2871 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2872 if err != nil {
2873 logger.Errorw(ctx, "Cannot send VoipVoiceCTP create", log.Fields{"Err": err,
2874 "device-id": oo.deviceID})
2875 return nil, err
2876 }
2877 logger.Debug(ctx, "send VoipVoiceCTP-create-msg done")
2878 return meInstance, nil
2879 }
2880 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance", log.Fields{"Err": omciErr.GetError(),
2881 "device-id": oo.deviceID})
2882 return nil, omciErr.GetError()
2883}
2884
2885// SendSetVoipVoiceCTP nolint: unused
2886func (oo *OmciCC) SendSetVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2887 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2888 tid := oo.GetNextTid(highPrio)
2889 logger.Debugw(ctx, "send VoipVoiceCTP-set-msg:", log.Fields{"device-id": oo.deviceID,
2890 "SequNo": strconv.FormatInt(int64(tid), 16),
2891 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2892
2893 meInstance, omciErr := me.NewVoipVoiceCtp(params[0])
2894 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002895 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2896 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002897 if err != nil {
2898 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for set", log.Fields{"Err": err,
2899 "device-id": oo.deviceID})
2900 return nil, err
2901 }
2902
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002903 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002904 if err != nil {
2905 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP set", log.Fields{"Err": err,
2906 "device-id": oo.deviceID})
2907 return nil, err
2908 }
2909
2910 omciRxCallbackPair := CallbackPair{CbKey: tid,
2911 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2912 }
2913 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2914 if err != nil {
2915 logger.Errorw(ctx, "Cannot send VoipVoiceCTP set", log.Fields{"Err": err,
2916 "device-id": oo.deviceID})
2917 return nil, err
2918 }
2919 logger.Debug(ctx, "send VoipVoiceCTP-set-msg done")
2920 return meInstance, nil
2921 }
2922 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance", log.Fields{"Err": omciErr.GetError(),
2923 "device-id": oo.deviceID})
2924 return nil, omciErr.GetError()
2925}
2926
2927// SendDeleteVoipVoiceCTP nolint: unused
2928func (oo *OmciCC) SendDeleteVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2929 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
2930 tid := oo.GetNextTid(highPrio)
2931 logger.Debugw(ctx, "send VoipVoiceCTP-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2932 "SequNo": strconv.FormatInt(int64(tid), 16),
2933 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2934
2935 meParams := me.ParamData{EntityID: aInstID}
2936 meInstance, omciErr := me.NewVoipVoiceCtp(meParams)
2937 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002938 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2939 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002940 if err != nil {
2941 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for delete", log.Fields{
2942 "Err": err, "device-id": oo.deviceID})
2943 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2944 // return (dual format) error code that can be used at caller for immediate error treatment
2945 // (relevant to all used sendXX() methods and their error conditions)
2946 return nil, err
2947 }
2948
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002949 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002950 if err != nil {
2951 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP delete", log.Fields{
2952 "Err": err, "device-id": oo.deviceID})
2953 return nil, err
2954 }
2955
2956 omciRxCallbackPair := CallbackPair{
2957 CbKey: tid,
2958 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2959 }
2960 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2961 if err != nil {
2962 logger.Errorw(ctx, "Cannot send VoipVoiceCTP delete", log.Fields{
2963 "Err": err, "device-id": oo.deviceID})
2964 return nil, err
2965 }
2966 logger.Debug(ctx, "send VoipVoiceCTP-Delete-msg done")
2967 return meInstance, nil
2968 }
2969 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance for delete", log.Fields{
2970 "Err": omciErr.GetError(), "device-id": oo.deviceID})
2971 return nil, omciErr.GetError()
2972}
2973
2974// SendCreateVoipMediaProfile nolint: unused
2975func (oo *OmciCC) SendCreateVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2976 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2977 tid := oo.GetNextTid(highPrio)
2978 logger.Debugw(ctx, "send VoipMediaProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
2979 "SequNo": strconv.FormatInt(int64(tid), 16),
2980 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2981
2982 meInstance, omciErr := me.NewVoipMediaProfile(params[0])
2983 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002984 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2985 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002986 if err != nil {
2987 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for create", log.Fields{"Err": err,
2988 "device-id": oo.deviceID})
2989 return nil, err
2990 }
2991
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002992 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002993 if err != nil {
2994 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile create", log.Fields{"Err": err,
2995 "device-id": oo.deviceID})
2996 return nil, err
2997 }
2998
2999 omciRxCallbackPair := CallbackPair{CbKey: tid,
3000 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3001 }
3002 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3003 if err != nil {
3004 logger.Errorw(ctx, "Cannot send VoipMediaProfile create", log.Fields{"Err": err,
3005 "device-id": oo.deviceID})
3006 return nil, err
3007 }
3008 logger.Debug(ctx, "send VoipMediaProfile-create-msg done")
3009 return meInstance, nil
3010 }
3011 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance", log.Fields{"Err": omciErr.GetError(),
3012 "device-id": oo.deviceID})
3013 return nil, omciErr.GetError()
3014}
3015
3016// SendSetVoipMediaProfile nolint: unused
3017func (oo *OmciCC) SendSetVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
3018 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3019 tid := oo.GetNextTid(highPrio)
3020 logger.Debugw(ctx, "send VoipMediaProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
3021 "SequNo": strconv.FormatInt(int64(tid), 16),
3022 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3023
3024 meInstance, omciErr := me.NewVoipMediaProfile(params[0])
3025 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003026 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3027 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003028 if err != nil {
3029 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for set", log.Fields{"Err": err,
3030 "device-id": oo.deviceID})
3031 return nil, err
3032 }
3033
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003034 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003035 if err != nil {
3036 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile set", log.Fields{"Err": err,
3037 "device-id": oo.deviceID})
3038 return nil, err
3039 }
3040
3041 omciRxCallbackPair := CallbackPair{CbKey: tid,
3042 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3043 }
3044 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3045 if err != nil {
3046 logger.Errorw(ctx, "Cannot send VoipMediaProfile set", log.Fields{"Err": err,
3047 "device-id": oo.deviceID})
3048 return nil, err
3049 }
3050 logger.Debug(ctx, "send VoipMediaProfile-set-msg done")
3051 return meInstance, nil
3052 }
3053 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance", log.Fields{"Err": omciErr.GetError(),
3054 "device-id": oo.deviceID})
3055 return nil, omciErr.GetError()
3056}
3057
3058// SendDeleteVoipMediaProfile nolint: unused
3059func (oo *OmciCC) SendDeleteVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
3060 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3061 tid := oo.GetNextTid(highPrio)
3062 logger.Debugw(ctx, "send VoipMediaProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3063 "SequNo": strconv.FormatInt(int64(tid), 16),
3064 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3065
3066 meParams := me.ParamData{EntityID: aInstID}
3067 meInstance, omciErr := me.NewVoipMediaProfile(meParams)
3068 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003069 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3070 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003071 if err != nil {
3072 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for delete", log.Fields{
3073 "Err": err, "device-id": oo.deviceID})
3074 return nil, err
3075 }
3076
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003077 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003078 if err != nil {
3079 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile delete", log.Fields{
3080 "Err": err, "device-id": oo.deviceID})
3081 return nil, err
3082 }
3083
3084 omciRxCallbackPair := CallbackPair{
3085 CbKey: tid,
3086 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3087 }
3088 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3089 if err != nil {
3090 logger.Errorw(ctx, "Cannot send VoipMediaProfile delete", log.Fields{
3091 "Err": err, "device-id": oo.deviceID})
3092 return nil, err
3093 }
3094 logger.Debug(ctx, "send VoipMediaProfile-Delete-msg done")
3095 return meInstance, nil
3096 }
3097 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance for delete", log.Fields{
3098 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3099 return nil, omciErr.GetError()
3100}
3101
3102// SendCreateVoiceServiceProfile nolint: unused
3103func (oo *OmciCC) SendCreateVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3104 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3105 tid := oo.GetNextTid(highPrio)
3106 logger.Debugw(ctx, "send VoiceServiceProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
3107 "SequNo": strconv.FormatInt(int64(tid), 16),
3108 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3109
3110 meInstance, omciErr := me.NewVoiceServiceProfile(params[0])
3111 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003112 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3113 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003114 if err != nil {
3115 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for create", log.Fields{"Err": err,
3116 "device-id": oo.deviceID})
3117 return nil, err
3118 }
3119
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003120 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003121 if err != nil {
3122 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile create", log.Fields{"Err": err,
3123 "device-id": oo.deviceID})
3124 return nil, err
3125 }
3126
3127 omciRxCallbackPair := CallbackPair{CbKey: tid,
3128 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3129 }
3130 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3131 if err != nil {
3132 logger.Errorw(ctx, "Cannot send VoiceServiceProfile create", log.Fields{"Err": err,
3133 "device-id": oo.deviceID})
3134 return nil, err
3135 }
3136 logger.Debug(ctx, "send VoiceServiceProfile-create-msg done")
3137 return meInstance, nil
3138 }
3139 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3140 "device-id": oo.deviceID})
3141 return nil, omciErr.GetError()
3142}
3143
3144// SendSetVoiceServiceProfile nolint: unused
3145func (oo *OmciCC) SendSetVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3146 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3147 tid := oo.GetNextTid(highPrio)
3148 logger.Debugw(ctx, "send VoiceServiceProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
3149 "SequNo": strconv.FormatInt(int64(tid), 16),
3150 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3151
3152 meInstance, omciErr := me.NewVoiceServiceProfile(params[0])
3153 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003154 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3155 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003156 if err != nil {
3157 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for set", log.Fields{"Err": err,
3158 "device-id": oo.deviceID})
3159 return nil, err
3160 }
3161
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003162 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003163 if err != nil {
3164 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile set", log.Fields{"Err": err,
3165 "device-id": oo.deviceID})
3166 return nil, err
3167 }
3168
3169 omciRxCallbackPair := CallbackPair{CbKey: tid,
3170 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3171 }
3172 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3173 if err != nil {
3174 logger.Errorw(ctx, "Cannot send VoiceServiceProfile set", log.Fields{"Err": err,
3175 "device-id": oo.deviceID})
3176 return nil, err
3177 }
3178 logger.Debug(ctx, "send VoiceServiceProfile-set-msg done")
3179 return meInstance, nil
3180 }
3181 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3182 "device-id": oo.deviceID})
3183 return nil, omciErr.GetError()
3184}
3185
3186// SendDeleteVoiceServiceProfile nolint: unused
3187func (oo *OmciCC) SendDeleteVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3188 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3189 tid := oo.GetNextTid(highPrio)
3190 logger.Debugw(ctx, "send VoiceServiceProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3191 "SequNo": strconv.FormatInt(int64(tid), 16),
3192 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3193
3194 meParams := me.ParamData{EntityID: aInstID}
3195 meInstance, omciErr := me.NewVoiceServiceProfile(meParams)
3196 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003197 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3198 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003199 if err != nil {
3200 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for delete", log.Fields{
3201 "Err": err, "device-id": oo.deviceID})
3202 return nil, err
3203 }
3204
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003205 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003206 if err != nil {
3207 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile delete", log.Fields{
3208 "Err": err, "device-id": oo.deviceID})
3209 return nil, err
3210 }
3211
3212 omciRxCallbackPair := CallbackPair{
3213 CbKey: tid,
3214 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3215 }
3216 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3217 if err != nil {
3218 logger.Errorw(ctx, "Cannot send VoiceServiceProfile delete", log.Fields{
3219 "Err": err, "device-id": oo.deviceID})
3220 return nil, err
3221 }
3222 logger.Debug(ctx, "send VoiceServiceProfile-Delete-msg done")
3223 return meInstance, nil
3224 }
3225 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance for delete", log.Fields{
3226 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3227 return nil, omciErr.GetError()
3228}
3229
3230// SendCreateSIPUserData nolint: unused
3231func (oo *OmciCC) SendCreateSIPUserData(ctx context.Context, timeout int, highPrio bool,
3232 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3233 tid := oo.GetNextTid(highPrio)
3234 logger.Debugw(ctx, "send SIPUserData-create-msg:", log.Fields{"device-id": oo.deviceID,
3235 "SequNo": strconv.FormatInt(int64(tid), 16),
3236 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3237
3238 meInstance, omciErr := me.NewSipUserData(params[0])
3239 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003240 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3241 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003242 if err != nil {
3243 logger.Errorw(ctx, "Cannot encode SIPUserData for create", log.Fields{"Err": err,
3244 "device-id": oo.deviceID})
3245 return nil, err
3246 }
3247
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003248 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003249 if err != nil {
3250 logger.Errorw(ctx, "Cannot serialize SIPUserData create", log.Fields{"Err": err,
3251 "device-id": oo.deviceID})
3252 return nil, err
3253 }
3254
3255 omciRxCallbackPair := CallbackPair{CbKey: tid,
3256 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3257 }
3258 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3259 if err != nil {
3260 logger.Errorw(ctx, "Cannot send SIPUserData create", log.Fields{"Err": err,
3261 "device-id": oo.deviceID})
3262 return nil, err
3263 }
3264 logger.Debug(ctx, "send SIPUserData-create-msg done")
3265 return meInstance, nil
3266 }
3267 logger.Errorw(ctx, "Cannot generate SIPUserData Instance", log.Fields{"Err": omciErr.GetError(),
3268 "device-id": oo.deviceID})
3269 return nil, omciErr.GetError()
3270}
3271
3272// SendSetSIPUserData nolint: unused
3273func (oo *OmciCC) SendSetSIPUserData(ctx context.Context, timeout int, highPrio bool,
3274 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3275 tid := oo.GetNextTid(highPrio)
3276 logger.Debugw(ctx, "send SIPUserData-set-msg:", log.Fields{"device-id": oo.deviceID,
3277 "SequNo": strconv.FormatInt(int64(tid), 16),
3278 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3279
3280 meInstance, omciErr := me.NewSipUserData(params[0])
3281 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003282 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3283 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003284 if err != nil {
3285 logger.Errorw(ctx, "Cannot encode SIPUserData for set", log.Fields{"Err": err,
3286 "device-id": oo.deviceID})
3287 return nil, err
3288 }
3289
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003290 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003291 if err != nil {
3292 logger.Errorw(ctx, "Cannot serialize SIPUserData set", log.Fields{"Err": err,
3293 "device-id": oo.deviceID})
3294 return nil, err
3295 }
3296
3297 omciRxCallbackPair := CallbackPair{CbKey: tid,
3298 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3299 }
3300 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3301 if err != nil {
3302 logger.Errorw(ctx, "Cannot send SIPUserData set", log.Fields{"Err": err,
3303 "device-id": oo.deviceID})
3304 return nil, err
3305 }
3306 logger.Debug(ctx, "send SIPUserData-set-msg done")
3307 return meInstance, nil
3308 }
3309 logger.Errorw(ctx, "Cannot generate SIPUserData Instance", log.Fields{"Err": omciErr.GetError(),
3310 "device-id": oo.deviceID})
3311 return nil, omciErr.GetError()
3312}
3313
3314// SendDeleteSIPUserData nolint: unused
3315func (oo *OmciCC) SendDeleteSIPUserData(ctx context.Context, timeout int, highPrio bool,
3316 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3317 tid := oo.GetNextTid(highPrio)
3318 logger.Debugw(ctx, "send SIPUserData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3319 "SequNo": strconv.FormatInt(int64(tid), 16),
3320 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3321
3322 meParams := me.ParamData{EntityID: aInstID}
3323 meInstance, omciErr := me.NewSipUserData(meParams)
3324 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003325 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3326 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003327 if err != nil {
3328 logger.Errorw(ctx, "Cannot encode SIPUserData for delete", log.Fields{
3329 "Err": err, "device-id": oo.deviceID})
3330 return nil, err
3331 }
3332
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003333 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003334 if err != nil {
3335 logger.Errorw(ctx, "Cannot serialize SIPUserData delete", log.Fields{
3336 "Err": err, "device-id": oo.deviceID})
3337 return nil, err
3338 }
3339
3340 omciRxCallbackPair := CallbackPair{
3341 CbKey: tid,
3342 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3343 }
3344 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3345 if err != nil {
3346 logger.Errorw(ctx, "Cannot send SIPUserData delete", log.Fields{
3347 "Err": err, "device-id": oo.deviceID})
3348 return nil, err
3349 }
3350 logger.Debug(ctx, "send SIPUserData-Delete-msg done")
3351 return meInstance, nil
3352 }
3353 logger.Errorw(ctx, "Cannot generate SIPUserData Instance for delete", log.Fields{
3354 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3355 return nil, omciErr.GetError()
3356}
3357
3358// SendCreateVoipApplicationServiceProfile nolint: unused
3359func (oo *OmciCC) SendCreateVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3360 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3361 tid := oo.GetNextTid(highPrio)
3362 logger.Debugw(ctx, "send VoipApplicationServiceProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
3363 "SequNo": strconv.FormatInt(int64(tid), 16),
3364 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3365
3366 meInstance, omciErr := me.NewVoipApplicationServiceProfile(params[0])
3367 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003368 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3369 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003370 if err != nil {
3371 logger.Errorw(ctx, "Cannot encode VoipApplicationServiceProfile for create", log.Fields{"Err": err,
3372 "device-id": oo.deviceID})
3373 return nil, err
3374 }
3375
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003376 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003377 if err != nil {
3378 logger.Errorw(ctx, "Cannot serialize VoipApplicationServiceProfile create", log.Fields{"Err": err,
3379 "device-id": oo.deviceID})
3380 return nil, err
3381 }
3382
3383 omciRxCallbackPair := CallbackPair{CbKey: tid,
3384 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3385 }
3386 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3387 if err != nil {
3388 logger.Errorw(ctx, "Cannot send VoipApplicationServiceProfile create", log.Fields{"Err": err,
3389 "device-id": oo.deviceID})
3390 return nil, err
3391 }
3392 logger.Debug(ctx, "send VoipApplicationServiceProfile-create-msg done")
3393 return meInstance, nil
3394 }
3395 logger.Errorw(ctx, "Cannot generate VoipApplicationServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3396 "device-id": oo.deviceID})
3397 return nil, omciErr.GetError()
3398}
3399
3400// SendSetVoipApplicationServiceProfile nolint: unused
3401func (oo *OmciCC) SendSetVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3402 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3403 tid := oo.GetNextTid(highPrio)
3404 logger.Debugw(ctx, "send VoipApplicationServiceProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
3405 "SequNo": strconv.FormatInt(int64(tid), 16),
3406 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3407
3408 meInstance, omciErr := me.NewVoipApplicationServiceProfile(params[0])
3409 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003410 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3411 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003412 if err != nil {
3413 logger.Errorw(ctx, "Cannot encode VoipApplicationServiceProfile for set", log.Fields{"Err": err,
3414 "device-id": oo.deviceID})
3415 return nil, err
3416 }
3417
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003418 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003419 if err != nil {
3420 logger.Errorw(ctx, "Cannot serialize VoipApplicationServiceProfile set", log.Fields{"Err": err,
3421 "device-id": oo.deviceID})
3422 return nil, err
3423 }
3424
3425 omciRxCallbackPair := CallbackPair{CbKey: tid,
3426 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3427 }
3428 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3429 if err != nil {
3430 logger.Errorw(ctx, "Cannot send VoipApplicationServiceProfile set", log.Fields{"Err": err,
3431 "device-id": oo.deviceID})
3432 return nil, err
3433 }
3434 logger.Debug(ctx, "send VoipApplicationServiceProfile-set-msg done")
3435 return meInstance, nil
3436 }
3437 logger.Errorw(ctx, "Cannot generate VoipApplicationServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3438 "device-id": oo.deviceID})
3439 return nil, omciErr.GetError()
3440}
3441
3442// SendDeleteVoipApplicationServiceProfile nolint: unused
3443func (oo *OmciCC) SendDeleteVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3444 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3445 tid := oo.GetNextTid(highPrio)
3446 logger.Debugw(ctx, "send SIPVoipApplicationServiceProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3447 "SequNo": strconv.FormatInt(int64(tid), 16),
3448 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3449
3450 meParams := me.ParamData{EntityID: aInstID}
3451 meInstance, omciErr := me.NewVoipApplicationServiceProfile(meParams)
3452 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003453 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3454 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003455 if err != nil {
3456 logger.Errorw(ctx, "Cannot encode SIPVoipApplicationServiceProfile for delete", log.Fields{
3457 "Err": err, "device-id": oo.deviceID})
3458 return nil, err
3459 }
3460
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003461 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003462 if err != nil {
3463 logger.Errorw(ctx, "Cannot serialize SIPVoipApplicationServiceProfile delete", log.Fields{
3464 "Err": err, "device-id": oo.deviceID})
3465 return nil, err
3466 }
3467
3468 omciRxCallbackPair := CallbackPair{
3469 CbKey: tid,
3470 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3471 }
3472 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3473 if err != nil {
3474 logger.Errorw(ctx, "Cannot send SIPVoipApplicationServiceProfile delete", log.Fields{
3475 "Err": err, "device-id": oo.deviceID})
3476 return nil, err
3477 }
3478 logger.Debug(ctx, "send SIPVoipApplicationServiceProfile-Delete-msg done")
3479 return meInstance, nil
3480 }
3481 logger.Errorw(ctx, "Cannot generate SIPVoipApplicationServiceProfile Instance for delete", log.Fields{
3482 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3483 return nil, omciErr.GetError()
3484}
3485
3486// SendCreateSIPAgentConfigData nolint: unused
3487func (oo *OmciCC) SendCreateSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3488 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3489 tid := oo.GetNextTid(highPrio)
3490 logger.Debugw(ctx, "send SIPAgentConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3491 "SequNo": strconv.FormatInt(int64(tid), 16),
3492 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3493
3494 meInstance, omciErr := me.NewSipAgentConfigData(params[0])
3495 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003496 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3497 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003498 if err != nil {
3499 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for create", log.Fields{"Err": err,
3500 "device-id": oo.deviceID})
3501 return nil, err
3502 }
3503
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003504 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003505 if err != nil {
3506 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData create", log.Fields{"Err": err,
3507 "device-id": oo.deviceID})
3508 return nil, err
3509 }
3510
3511 omciRxCallbackPair := CallbackPair{CbKey: tid,
3512 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3513 }
3514 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3515 if err != nil {
3516 logger.Errorw(ctx, "Cannot send SIPAgentConfigData create", log.Fields{"Err": err,
3517 "device-id": oo.deviceID})
3518 return nil, err
3519 }
3520 logger.Debug(ctx, "send SIPAgentConfigData-create-msg done")
3521 return meInstance, nil
3522 }
3523 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3524 "device-id": oo.deviceID})
3525 return nil, omciErr.GetError()
3526}
3527
3528// SendSetSIPAgentConfigData nolint: unused
3529func (oo *OmciCC) SendSetSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3530 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3531 tid := oo.GetNextTid(highPrio)
3532 logger.Debugw(ctx, "send SIPAgentConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3533 "SequNo": strconv.FormatInt(int64(tid), 16),
3534 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3535
3536 meInstance, omciErr := me.NewSipAgentConfigData(params[0])
3537 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003538 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3539 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003540 if err != nil {
3541 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for set", log.Fields{"Err": err,
3542 "device-id": oo.deviceID})
3543 return nil, err
3544 }
3545
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003546 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003547 if err != nil {
3548 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData set", log.Fields{"Err": err,
3549 "device-id": oo.deviceID})
3550 return nil, err
3551 }
3552
3553 omciRxCallbackPair := CallbackPair{CbKey: tid,
3554 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3555 }
3556 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3557 if err != nil {
3558 logger.Errorw(ctx, "Cannot send SIPAgentConfigData set", log.Fields{"Err": err,
3559 "device-id": oo.deviceID})
3560 return nil, err
3561 }
3562 logger.Debug(ctx, "send SIPAgentConfigData-set-msg done")
3563 return meInstance, nil
3564 }
3565 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3566 "device-id": oo.deviceID})
3567 return nil, omciErr.GetError()
3568}
3569
3570// SendDeleteSIPAgentConfigData nolint: unused
3571func (oo *OmciCC) SendDeleteSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3572 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3573 tid := oo.GetNextTid(highPrio)
3574 logger.Debugw(ctx, "send SIPAgentConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3575 "SequNo": strconv.FormatInt(int64(tid), 16),
3576 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3577
3578 meParams := me.ParamData{EntityID: aInstID}
3579 meInstance, omciErr := me.NewSipAgentConfigData(meParams)
3580 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003581 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3582 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003583 if err != nil {
3584 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for delete", log.Fields{
3585 "Err": err, "device-id": oo.deviceID})
3586 return nil, err
3587 }
3588
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003589 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003590 if err != nil {
3591 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData delete", log.Fields{
3592 "Err": err, "device-id": oo.deviceID})
3593 return nil, err
3594 }
3595
3596 omciRxCallbackPair := CallbackPair{
3597 CbKey: tid,
3598 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3599 }
3600 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3601 if err != nil {
3602 logger.Errorw(ctx, "Cannot send SIPAgentConfigData delete", log.Fields{
3603 "Err": err, "device-id": oo.deviceID})
3604 return nil, err
3605 }
3606 logger.Debug(ctx, "send SIPAgentConfigData-Delete-msg done")
3607 return meInstance, nil
3608 }
3609 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance for delete", log.Fields{
3610 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3611 return nil, omciErr.GetError()
3612}
3613
3614// SendCreateTCPUDPConfigData nolint: unused
3615func (oo *OmciCC) SendCreateTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3616 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3617 tid := oo.GetNextTid(highPrio)
3618 logger.Debugw(ctx, "send TCPUDPConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3619 "SequNo": strconv.FormatInt(int64(tid), 16),
3620 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3621
3622 meInstance, omciErr := me.NewTcpUdpConfigData(params[0])
3623 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003624 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3625 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003626 if err != nil {
3627 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for create", log.Fields{"Err": err,
3628 "device-id": oo.deviceID})
3629 return nil, err
3630 }
3631
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003632 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003633 if err != nil {
3634 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData create", log.Fields{"Err": err,
3635 "device-id": oo.deviceID})
3636 return nil, err
3637 }
3638
3639 omciRxCallbackPair := CallbackPair{CbKey: tid,
3640 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3641 }
3642 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3643 if err != nil {
3644 logger.Errorw(ctx, "Cannot send TCPUDPConfigData create", log.Fields{"Err": err,
3645 "device-id": oo.deviceID})
3646 return nil, err
3647 }
3648 logger.Debug(ctx, "send TCPUDPConfigData-create-msg done")
3649 return meInstance, nil
3650 }
3651 logger.Errorw(ctx, "Cannot generate TCPUDPConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3652 "device-id": oo.deviceID})
3653 return nil, omciErr.GetError()
3654}
3655
3656// SendSetTCPUDPConfigData nolint: unused
3657func (oo *OmciCC) SendSetTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3658 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3659 tid := oo.GetNextTid(highPrio)
3660 logger.Debugw(ctx, "send TCPUDPConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3661 "SequNo": strconv.FormatInt(int64(tid), 16),
3662 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3663
3664 meInstance, omciErr := me.NewTcpUdpConfigData(params[0])
3665 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003666 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3667 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003668 if err != nil {
3669 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for set", log.Fields{"Err": err,
3670 "device-id": oo.deviceID})
3671 return nil, err
3672 }
3673
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003674 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003675 if err != nil {
3676 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData set", log.Fields{"Err": err,
3677 "device-id": oo.deviceID})
3678 return nil, err
3679 }
3680
3681 omciRxCallbackPair := CallbackPair{CbKey: tid,
3682 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3683 }
3684 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3685 if err != nil {
3686 logger.Errorw(ctx, "Cannot send TCPUDPConfigData set", log.Fields{"Err": err,
3687 "device-id": oo.deviceID})
3688 return nil, err
3689 }
3690 logger.Debug(ctx, "send TCPUDPConfigData-set-msg done")
3691 return meInstance, nil
3692 }
3693 logger.Errorw(ctx, "Cannot generate TCPUDPConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3694 "device-id": oo.deviceID})
3695 return nil, omciErr.GetError()
3696}
3697
3698// SendDeleteTCPUDPConfigData nolint: unused
3699func (oo *OmciCC) SendDeleteTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3700 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3701 tid := oo.GetNextTid(highPrio)
3702 logger.Debugw(ctx, "send TCPUDPConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3703 "SequNo": strconv.FormatInt(int64(tid), 16),
3704 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3705
3706 meParams := me.ParamData{EntityID: aInstID}
3707 meInstance, omciErr := me.NewTcpUdpConfigData(meParams)
3708 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003709 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3710 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003711 if err != nil {
3712 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for delete", log.Fields{
3713 "Err": err, "device-id": oo.deviceID})
3714 return nil, err
3715 }
3716
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003717 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003718 if err != nil {
3719 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData delete", log.Fields{
3720 "Err": err, "device-id": oo.deviceID})
3721 return nil, err
3722 }
3723
3724 omciRxCallbackPair := CallbackPair{
3725 CbKey: tid,
3726 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3727 }
3728 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3729 if err != nil {
3730 logger.Errorw(ctx, "Cannot send TCPUDPConfigData delete", log.Fields{
3731 "Err": err, "device-id": oo.deviceID})
3732 return nil, err
3733 }
3734 logger.Debug(ctx, "send TCPUDPConfigData-Delete-msg done")
3735 return meInstance, nil
3736 }
3737 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance for delete", log.Fields{
3738 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3739 return nil, omciErr.GetError()
3740}
3741
3742// SendCreateIPHostConfigData nolint: unused
3743func (oo *OmciCC) SendCreateIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3744 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3745 tid := oo.GetNextTid(highPrio)
3746 logger.Debugw(ctx, "send IPHostConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3747 "SequNo": strconv.FormatInt(int64(tid), 16),
3748 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3749
3750 meInstance, omciErr := me.NewIpHostConfigData(params[0])
3751 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003752 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3753 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003754 if err != nil {
3755 logger.Errorw(ctx, "Cannot encode IPHostConfigData for create", log.Fields{"Err": err,
3756 "device-id": oo.deviceID})
3757 return nil, err
3758 }
3759
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003760 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003761 if err != nil {
3762 logger.Errorw(ctx, "Cannot serialize IPHostConfigData create", log.Fields{"Err": err,
3763 "device-id": oo.deviceID})
3764 return nil, err
3765 }
3766
3767 omciRxCallbackPair := CallbackPair{CbKey: tid,
3768 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3769 }
3770 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3771 if err != nil {
3772 logger.Errorw(ctx, "Cannot send IPHostConfigData create", log.Fields{"Err": err,
3773 "device-id": oo.deviceID})
3774 return nil, err
3775 }
3776 logger.Debug(ctx, "send IPHostConfigData-create-msg done")
3777 return meInstance, nil
3778 }
3779 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3780 "device-id": oo.deviceID})
3781 return nil, omciErr.GetError()
3782}
3783
3784// SendSetIPHostConfigData nolint: unused
3785func (oo *OmciCC) SendSetIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3786 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3787 tid := oo.GetNextTid(highPrio)
3788 logger.Debugw(ctx, "send IPHostConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3789 "SequNo": strconv.FormatInt(int64(tid), 16),
3790 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3791
3792 meInstance, omciErr := me.NewIpHostConfigData(params[0])
3793 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003794 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3795 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003796 if err != nil {
3797 logger.Errorw(ctx, "Cannot encode IPHostConfigData for set", log.Fields{"Err": err,
3798 "device-id": oo.deviceID})
3799 return nil, err
3800 }
3801
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003802 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003803 if err != nil {
3804 logger.Errorw(ctx, "Cannot serialize IPHostConfigData set", log.Fields{"Err": err,
3805 "device-id": oo.deviceID})
3806 return nil, err
3807 }
3808
3809 omciRxCallbackPair := CallbackPair{CbKey: tid,
3810 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3811 }
3812 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3813 if err != nil {
3814 logger.Errorw(ctx, "Cannot send IPHostConfigData set", log.Fields{"Err": err,
3815 "device-id": oo.deviceID})
3816 return nil, err
3817 }
3818 logger.Debug(ctx, "send IPHostConfigData-set-msg done")
3819 return meInstance, nil
3820 }
3821 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3822 "device-id": oo.deviceID})
3823 return nil, omciErr.GetError()
3824}
3825
3826// SendDeleteIPHostConfigData nolint: unused
3827func (oo *OmciCC) SendDeleteIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3828 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3829 tid := oo.GetNextTid(highPrio)
3830 logger.Debugw(ctx, "send IPHostConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3831 "SequNo": strconv.FormatInt(int64(tid), 16),
3832 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3833
3834 meParams := me.ParamData{EntityID: aInstID}
3835 meInstance, omciErr := me.NewIpHostConfigData(meParams)
3836 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003837 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3838 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003839 if err != nil {
3840 logger.Errorw(ctx, "Cannot encode IPHostConfigData for delete", log.Fields{
3841 "Err": err, "device-id": oo.deviceID})
3842 return nil, err
3843 }
3844
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003845 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003846 if err != nil {
3847 logger.Errorw(ctx, "Cannot serialize IPHostConfigData delete", log.Fields{
3848 "Err": err, "device-id": oo.deviceID})
3849 return nil, err
3850 }
3851
3852 omciRxCallbackPair := CallbackPair{
3853 CbKey: tid,
3854 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3855 }
3856 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3857 if err != nil {
3858 logger.Errorw(ctx, "Cannot send IPHostConfigData delete", log.Fields{
3859 "Err": err, "device-id": oo.deviceID})
3860 return nil, err
3861 }
3862 logger.Debug(ctx, "send IPHostConfigData-Delete-msg done")
3863 return meInstance, nil
3864 }
3865 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance for delete", log.Fields{
3866 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3867 return nil, omciErr.GetError()
3868}
3869
3870// SendCreateRTPProfileData nolint: unused
3871func (oo *OmciCC) SendCreateRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3872 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3873 tid := oo.GetNextTid(highPrio)
3874 logger.Debugw(ctx, "send RTPProfileData-create-msg:", log.Fields{"device-id": oo.deviceID,
3875 "SequNo": strconv.FormatInt(int64(tid), 16),
3876 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3877
3878 meInstance, omciErr := me.NewRtpProfileData(params[0])
3879 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003880 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3881 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003882 if err != nil {
3883 logger.Errorw(ctx, "Cannot encode RTPProfileData for create", log.Fields{"Err": err,
3884 "device-id": oo.deviceID})
3885 return nil, err
3886 }
3887
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003888 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003889 if err != nil {
3890 logger.Errorw(ctx, "Cannot serialize RTPProfileData create", log.Fields{"Err": err,
3891 "device-id": oo.deviceID})
3892 return nil, err
3893 }
3894
3895 omciRxCallbackPair := CallbackPair{CbKey: tid,
3896 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3897 }
3898 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3899 if err != nil {
3900 logger.Errorw(ctx, "Cannot send RTPProfileData create", log.Fields{"Err": err,
3901 "device-id": oo.deviceID})
3902 return nil, err
3903 }
3904 logger.Debug(ctx, "send RTPProfileData-create-msg done")
3905 return meInstance, nil
3906 }
3907 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance", log.Fields{"Err": omciErr.GetError(),
3908 "device-id": oo.deviceID})
3909 return nil, omciErr.GetError()
3910}
3911
3912// SendSetRTPProfileData nolint: unused
3913func (oo *OmciCC) SendSetRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3914 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3915 tid := oo.GetNextTid(highPrio)
3916 logger.Debugw(ctx, "send RTPProfileData-set-msg:", log.Fields{"device-id": oo.deviceID,
3917 "SequNo": strconv.FormatInt(int64(tid), 16),
3918 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3919
3920 meInstance, omciErr := me.NewRtpProfileData(params[0])
3921 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003922 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3923 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003924 if err != nil {
3925 logger.Errorw(ctx, "Cannot encode RTPProfileData for set", log.Fields{"Err": err,
3926 "device-id": oo.deviceID})
3927 return nil, err
3928 }
3929
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003930 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003931 if err != nil {
3932 logger.Errorw(ctx, "Cannot serialize RTPProfileData set", log.Fields{"Err": err,
3933 "device-id": oo.deviceID})
3934 return nil, err
3935 }
3936
3937 omciRxCallbackPair := CallbackPair{CbKey: tid,
3938 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3939 }
3940 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3941 if err != nil {
3942 logger.Errorw(ctx, "Cannot send RTPProfileData set", log.Fields{"Err": err,
3943 "device-id": oo.deviceID})
3944 return nil, err
3945 }
3946 logger.Debug(ctx, "send RTPProfileData-set-msg done")
3947 return meInstance, nil
3948 }
3949 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance", log.Fields{"Err": omciErr.GetError(),
3950 "device-id": oo.deviceID})
3951 return nil, omciErr.GetError()
3952}
3953
3954// SendDeleteRTPProfileData nolint: unused
3955func (oo *OmciCC) SendDeleteRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3956 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3957 tid := oo.GetNextTid(highPrio)
3958 logger.Debugw(ctx, "send RTPProfileData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3959 "SequNo": strconv.FormatInt(int64(tid), 16),
3960 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3961
3962 meParams := me.ParamData{EntityID: aInstID}
3963 meInstance, omciErr := me.NewRtpProfileData(meParams)
3964 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003965 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3966 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003967 if err != nil {
3968 logger.Errorw(ctx, "Cannot encode RTPProfileData for delete", log.Fields{
3969 "Err": err, "device-id": oo.deviceID})
3970 return nil, err
3971 }
3972
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003973 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003974 if err != nil {
3975 logger.Errorw(ctx, "Cannot serialize RTPProfileData delete", log.Fields{
3976 "Err": err, "device-id": oo.deviceID})
3977 return nil, err
3978 }
3979
3980 omciRxCallbackPair := CallbackPair{
3981 CbKey: tid,
3982 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3983 }
3984 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3985 if err != nil {
3986 logger.Errorw(ctx, "Cannot send RTPProfileData delete", log.Fields{
3987 "Err": err, "device-id": oo.deviceID})
3988 return nil, err
3989 }
3990 logger.Debug(ctx, "send RTPProfileData-Delete-msg done")
3991 return meInstance, nil
3992 }
3993 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance for delete", log.Fields{
3994 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3995 return nil, omciErr.GetError()
3996}
3997
3998// SendCreateNetworkDialPlanTable nolint: unused
3999func (oo *OmciCC) SendCreateNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
4000 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
4001 tid := oo.GetNextTid(highPrio)
4002 logger.Debugw(ctx, "send NetworkDialPlanTable-create-msg:", log.Fields{"device-id": oo.deviceID,
4003 "SequNo": strconv.FormatInt(int64(tid), 16),
4004 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
4005
4006 meInstance, omciErr := me.NewNetworkDialPlanTable(params[0])
4007 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00004008 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4009 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004010 if err != nil {
4011 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for create", log.Fields{"Err": err,
4012 "device-id": oo.deviceID})
4013 return nil, err
4014 }
4015
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004016 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004017 if err != nil {
4018 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable create", log.Fields{"Err": err,
4019 "device-id": oo.deviceID})
4020 return nil, err
4021 }
4022
4023 omciRxCallbackPair := CallbackPair{CbKey: tid,
4024 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4025 }
4026 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
4027 if err != nil {
4028 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable create", log.Fields{"Err": err,
4029 "device-id": oo.deviceID})
4030 return nil, err
4031 }
4032 logger.Debug(ctx, "send NetworkDialPlanTable-create-msg done")
4033 return meInstance, nil
4034 }
4035 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance", log.Fields{"Err": omciErr.GetError(),
4036 "device-id": oo.deviceID})
4037 return nil, omciErr.GetError()
4038}
4039
4040// SendSetNetworkDialPlanTable nolint: unused
4041func (oo *OmciCC) SendSetNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
4042 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
4043 tid := oo.GetNextTid(highPrio)
4044 logger.Debugw(ctx, "send NetworkDialPlanTable-set-msg:", log.Fields{"device-id": oo.deviceID,
4045 "SequNo": strconv.FormatInt(int64(tid), 16),
4046 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
4047
4048 meInstance, omciErr := me.NewNetworkDialPlanTable(params[0])
4049 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00004050 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
4051 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004052 if err != nil {
4053 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for set", log.Fields{"Err": err,
4054 "device-id": oo.deviceID})
4055 return nil, err
4056 }
4057
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004058 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004059 if err != nil {
4060 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable set", log.Fields{"Err": err,
4061 "device-id": oo.deviceID})
4062 return nil, err
4063 }
4064
4065 omciRxCallbackPair := CallbackPair{CbKey: tid,
4066 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4067 }
4068 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
4069 if err != nil {
4070 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable set", log.Fields{"Err": err,
4071 "device-id": oo.deviceID})
4072 return nil, err
4073 }
4074 logger.Debug(ctx, "send NetworkDialPlanTable-set-msg done")
4075 return meInstance, nil
4076 }
4077 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance", log.Fields{"Err": omciErr.GetError(),
4078 "device-id": oo.deviceID})
4079 return nil, omciErr.GetError()
4080}
4081
4082// SendDeleteNetworkDialPlanTable nolint: unused
4083func (oo *OmciCC) SendDeleteNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
4084 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
4085 tid := oo.GetNextTid(highPrio)
4086 logger.Debugw(ctx, "send NetworkDialPlanTable-Delete-msg:", log.Fields{"device-id": oo.deviceID,
4087 "SequNo": strconv.FormatInt(int64(tid), 16),
4088 "InstId": strconv.FormatInt(int64(aInstID), 16)})
4089
4090 meParams := me.ParamData{EntityID: aInstID}
4091 meInstance, omciErr := me.NewNetworkDialPlanTable(meParams)
4092 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00004093 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
4094 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004095 if err != nil {
4096 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for delete", log.Fields{
4097 "Err": err, "device-id": oo.deviceID})
4098 return nil, err
4099 }
4100
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004101 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004102 if err != nil {
4103 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable delete", log.Fields{
4104 "Err": err, "device-id": oo.deviceID})
4105 return nil, err
4106 }
4107
4108 omciRxCallbackPair := CallbackPair{
4109 CbKey: tid,
4110 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4111 }
4112 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
4113 if err != nil {
4114 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable delete", log.Fields{
4115 "Err": err, "device-id": oo.deviceID})
4116 return nil, err
4117 }
4118 logger.Debug(ctx, "send NetworkDialPlanTable-Delete-msg done")
4119 return meInstance, nil
4120 }
4121 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance for delete", log.Fields{
4122 "Err": omciErr.GetError(), "device-id": oo.deviceID})
4123 return nil, omciErr.GetError()
4124}
4125
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004126// SendSyncTime sends SynchronizeTimeRequest
4127func (oo *OmciCC) SendSyncTime(ctx context.Context, timeout int, highPrio bool, rxChan chan Message) error {
4128 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004129 logger.Debugw(ctx, "send synchronize time request:", log.Fields{"device-id": oo.deviceID,
4130 "SequNo": strconv.FormatInt(int64(tid), 16)})
4131
4132 omciLayer := &omci.OMCI{
4133 TransactionID: tid,
4134 MessageType: omci.SynchronizeTimeRequestType,
4135 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4136 // Length: 0x28, // Optional, defaults to 40 octets
4137 }
4138 utcTime := time.Now().UTC()
4139 request := &omci.SynchronizeTimeRequest{
4140 MeBasePacket: omci.MeBasePacket{
4141 EntityClass: me.OnuGClassID,
4142 // Default Instance ID is 0
4143 },
4144 Year: uint16(utcTime.Year()),
4145 Month: uint8(utcTime.Month()),
4146 Day: uint8(utcTime.Day()),
4147 Hour: uint8(utcTime.Hour()),
4148 Minute: uint8(utcTime.Minute()),
4149 Second: uint8(utcTime.Second()),
4150 }
4151
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004152 pkt, err := SerializeOmciLayer(ctx, omciLayer, request)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004153 if err != nil {
4154 logger.Errorw(ctx, "Cannot serialize synchronize time request", log.Fields{"Err": err,
4155 "device-id": oo.deviceID})
4156 return err
4157 }
4158
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004159 omciRxCallbackPair := CallbackPair{CbKey: tid,
4160 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004161 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004162 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004163 if err != nil {
4164 logger.Errorw(ctx, "Cannot send synchronize time request", log.Fields{"Err": err,
4165 "device-id": oo.deviceID})
4166 return err
4167 }
4168 logger.Debug(ctx, "send synchronize time request done")
4169 return nil
4170}
4171
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004172// SendCreateOrDeleteEthernetPerformanceMonitoringHistoryME creates or deletes EthernetFramePerformanceMonitoringHistoryData ME instance
4173func (oo *OmciCC) SendCreateOrDeleteEthernetPerformanceMonitoringHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004174 upstream bool, create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004175 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004176 logger.Debugw(ctx, "send ethernet-performance-monitoring-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4177 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
4178 meParam := me.ParamData{EntityID: entityID}
4179 var meInstance *me.ManagedEntity
4180 var omciErr me.OmciErrors
4181 if upstream {
4182 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataUpstream(meParam)
4183 } else {
4184 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataDownstream(meParam)
4185 }
4186 if omciErr.GetError() == nil {
4187 var omciLayer *omci.OMCI
4188 var msgLayer gopacket.SerializableLayer
4189 var err error
4190 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004191 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4192 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004193 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004194 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4195 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004196 }
4197 if err != nil {
4198 logger.Errorw(ctx, "Cannot encode ethernet frame performance monitoring history data ME",
4199 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004200 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004201 }
4202
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004203 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004204 if err != nil {
4205 logger.Errorw(ctx, "Cannot serialize ethernet frame performance monitoring history data ME",
4206 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004207 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004208 }
4209
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004210 omciRxCallbackPair := CallbackPair{CbKey: tid,
4211 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004212 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004213 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004214 if err != nil {
4215 logger.Errorw(ctx, "Cannot send ethernet frame performance monitoring history data ME",
4216 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004217 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004218 }
4219 logger.Debugw(ctx, "send ethernet frame performance monitoring history data ME done",
4220 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004221 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08004222 }
4223 logger.Errorw(ctx, "Cannot generate ethernet frame performance monitoring history data ME Instance",
4224 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 +03004225 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08004226}
4227
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004228// SendCreateOrDeleteEthernetUniHistoryME creates or deletes EthernetPerformanceMonitoringHistoryData ME instance
4229func (oo *OmciCC) SendCreateOrDeleteEthernetUniHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004230 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004231 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004232 logger.Debugw(ctx, "send ethernet-uni-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4233 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4234 meParam := me.ParamData{EntityID: entityID}
4235 var meInstance *me.ManagedEntity
4236 var omciErr me.OmciErrors
4237 meInstance, omciErr = me.NewEthernetPerformanceMonitoringHistoryData(meParam)
4238
4239 if omciErr.GetError() == nil {
4240 var omciLayer *omci.OMCI
4241 var msgLayer gopacket.SerializableLayer
4242 var err error
4243 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004244 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4245 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004246 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004247 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4248 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004249 }
4250 if err != nil {
4251 logger.Errorw(ctx, "Cannot encode ethernet uni history data ME",
4252 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004253 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004254 }
4255
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004256 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004257 if err != nil {
4258 logger.Errorw(ctx, "Cannot serialize ethernet uni history data ME",
4259 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004260 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004261 }
4262
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004263 omciRxCallbackPair := CallbackPair{CbKey: tid,
4264 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004265 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004266 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004267 if err != nil {
4268 logger.Errorw(ctx, "Cannot send ethernet uni history data ME",
4269 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004270 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004271 }
4272 logger.Debugw(ctx, "send ethernet uni history data ME done",
4273 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004274 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08004275 }
4276 logger.Errorw(ctx, "Cannot generate ethernet uni history data ME Instance",
4277 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004278 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08004279}
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004280
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004281// SendCreateOrDeleteFecHistoryME creates or deletes FecPerformanceMonitoringHistoryData ME instance
4282func (oo *OmciCC) SendCreateOrDeleteFecHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004283 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004284 tid := oo.GetNextTid(highPrio)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004285 logger.Debugw(ctx, "send fec-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4286 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4287 meParam := me.ParamData{EntityID: entityID}
4288 var meInstance *me.ManagedEntity
4289 var omciErr me.OmciErrors
4290 meInstance, omciErr = me.NewFecPerformanceMonitoringHistoryData(meParam)
4291
4292 if omciErr.GetError() == nil {
4293 var omciLayer *omci.OMCI
4294 var msgLayer gopacket.SerializableLayer
4295 var err error
4296 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004297 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4298 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004299 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004300 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4301 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004302 }
4303 if err != nil {
4304 logger.Errorw(ctx, "Cannot encode fec history data ME",
4305 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004306 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004307 }
4308
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004309 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004310 if err != nil {
4311 logger.Errorw(ctx, "Cannot serialize fec history data ME",
4312 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004313 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004314 }
4315
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004316 omciRxCallbackPair := CallbackPair{CbKey: tid,
4317 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004318 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004319 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004320 if err != nil {
4321 logger.Errorw(ctx, "Cannot send fec history data ME",
4322 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004323 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004324 }
4325 logger.Debugw(ctx, "send fec history data ME done",
4326 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004327 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004328 }
4329 logger.Errorw(ctx, "Cannot generate fec history data ME Instance",
4330 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004331 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004332}
4333
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004334// SendCreateOrDeleteGemPortHistoryME deletes GemPortNetworkCtpPerformanceMonitoringHistoryData ME instance
4335func (oo *OmciCC) SendCreateOrDeleteGemPortHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004336 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004337 tid := oo.GetNextTid(highPrio)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004338 logger.Debugw(ctx, "send gemport-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4339 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4340 meParam := me.ParamData{EntityID: entityID}
4341 var meInstance *me.ManagedEntity
4342 var omciErr me.OmciErrors
4343 meInstance, omciErr = me.NewGemPortNetworkCtpPerformanceMonitoringHistoryData(meParam)
4344
4345 if omciErr.GetError() == nil {
4346 var omciLayer *omci.OMCI
4347 var msgLayer gopacket.SerializableLayer
4348 var err error
4349 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004350 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4351 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004352 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004353 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4354 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004355 }
4356 if err != nil {
4357 logger.Errorw(ctx, "Cannot encode gemport history data ME",
4358 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004359 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004360 }
4361
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004362 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004363 if err != nil {
4364 logger.Errorw(ctx, "Cannot serialize gemport history data ME",
4365 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004366 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004367 }
4368
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004369 omciRxCallbackPair := CallbackPair{CbKey: tid,
4370 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004371 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004372 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004373 if err != nil {
4374 logger.Errorw(ctx, "Cannot send gemport history data ME",
4375 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004376 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004377 }
4378 logger.Debugw(ctx, "send gemport history data ME done",
4379 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004380 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004381 }
4382 logger.Errorw(ctx, "Cannot generate gemport history data ME Instance",
4383 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004384 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004385}
4386
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004387// SendStartSoftwareDownload sends StartSoftwareDownloadRequest
4388func (oo *OmciCC) SendStartSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004389 rxChan chan Message, aImageMeID uint16, aDownloadWindowSize uint8, aFileLen uint32, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004390 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004391 logger.Debugw(ctx, "send StartSwDlRequest:", log.Fields{"device-id": oo.deviceID,
4392 "SequNo": strconv.FormatInt(int64(tid), 16),
4393 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4394
4395 omciLayer := &omci.OMCI{
4396 TransactionID: tid,
4397 MessageType: omci.StartSoftwareDownloadRequestType,
4398 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4399 // Length: 0x28, // Optional, defaults to 40 octets
4400 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004401 if aIsExtendedOmci {
4402 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4403 }
mpagenko80622a52021-02-09 16:53:23 +00004404 request := &omci.StartSoftwareDownloadRequest{
4405 MeBasePacket: omci.MeBasePacket{
4406 EntityClass: me.SoftwareImageClassID,
4407 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004408 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004409 },
4410 WindowSize: aDownloadWindowSize,
4411 ImageSize: aFileLen,
4412 NumberOfCircuitPacks: 1, //parallel download to multiple circuit packs not supported
4413 CircuitPacks: []uint16{0}, //circuit pack indication don't care for NumberOfCircuitPacks=1, but needed by omci-lib
4414 }
4415
4416 var options gopacket.SerializeOptions
4417 options.FixLengths = true
4418 buffer := gopacket.NewSerializeBuffer()
4419 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4420 if err != nil {
4421 logger.Errorw(ctx, "Cannot serialize StartSwDlRequest", log.Fields{"Err": err,
4422 "device-id": oo.deviceID})
4423 return err
4424 }
4425 outgoingPacket := buffer.Bytes()
4426
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004427 omciRxCallbackPair := CallbackPair{CbKey: tid,
4428 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko80622a52021-02-09 16:53:23 +00004429 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004430 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004431 if err != nil {
4432 logger.Errorw(ctx, "Cannot send StartSwDlRequest", log.Fields{"Err": err,
4433 "device-id": oo.deviceID})
4434 return err
4435 }
4436 logger.Debug(ctx, "send StartSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004437 return nil
4438}
4439
kesavand011d5162021-11-25 19:21:06 +05304440// PrepareOnuSectionsOfWindow prepares a list of sections for each window
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304441// Before invoking this function the oo.mutexTid needs to be be locked so that
4442// GetOnuSwSecNextTid can be invoked without further locking
kesavand011d5162021-11-25 19:21:06 +05304443func (oo *OmciCC) PrepareOnuSectionsOfWindow(ctx context.Context,
4444 aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004445 omciMsgsPerWindow *ia.OmciMessages, aIsExtendedOmci bool) (OmciTransferStructure, error) {
kesavand011d5162021-11-25 19:21:06 +05304446 //onuswsections uses only low prioirity tids
4447 tid := oo.GetOnuSwSecNextTid()
bseenivabbec1dd2026-01-30 12:08:14 +05304448 logger.Debugw(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
kesavand011d5162021-11-25 19:21:06 +05304449 "SequNo": strconv.FormatInt(int64(tid), 16),
4450 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest, "sectionNo": aDownloadSectionNo, "sectionData": aSection})
4451
4452 var omciTxReq OmciTransferStructure
4453 msgType := omci.DownloadSectionRequestType
4454
4455 if aAckRequest > 0 {
4456 msgType = omci.DownloadSectionRequestWithResponseType
4457
4458 }
4459 omciLayer := &omci.OMCI{
4460 TransactionID: tid,
4461 MessageType: msgType,
4462 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4463 // Length: 0x28, // Optional, defaults to 40 octets
4464 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004465 if aIsExtendedOmci {
4466 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4467 }
kesavand011d5162021-11-25 19:21:06 +05304468 localSectionData := make([]byte, len(aSection))
4469
4470 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
4471 request := &omci.DownloadSectionRequest{
4472 MeBasePacket: omci.MeBasePacket{
4473 EntityClass: me.SoftwareImageClassID,
4474 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004475 Extended: aIsExtendedOmci,
kesavand011d5162021-11-25 19:21:06 +05304476 },
4477 SectionNumber: aDownloadSectionNo,
4478 SectionData: localSectionData,
4479 }
4480
4481 var options gopacket.SerializeOptions
4482 options.FixLengths = true
4483 buffer := gopacket.NewSerializeBuffer()
4484 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4485 if err != nil {
4486 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
4487 "device-id": oo.deviceID})
4488 return omciTxReq, err
4489 }
4490 outgoingPacket := buffer.Bytes()
4491
4492 omciMsgsPerWindow.Messages = append(omciMsgsPerWindow.Messages, outgoingPacket)
4493
4494 if aAckRequest > 0 {
4495 // only the last section should have a timeout as an ack is required only for the last section of the window
4496 omciTxReq = OmciTransferStructure{
4497 withFramePrint: true,
4498 OnuSwWindow: omciMsgsPerWindow,
4499 }
4500 return omciTxReq, nil
4501 }
4502
4503 return omciTxReq, nil
4504}
4505
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304506// SendOnuSwSectionsWindowWithRxSupervision sends onu swd sections
kesavand011d5162021-11-25 19:21:06 +05304507func (oo *OmciCC) SendOnuSwSectionsWindowWithRxSupervision(ctx context.Context,
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304508 aOmciTxRequest OmciTransferStructure, aTimeout int, rxChan chan Message) error {
kesavand011d5162021-11-25 19:21:06 +05304509 if aOmciTxRequest.OnuSwWindow == nil {
4510 logger.Errorw(ctx, "SendOnuSwSectionsWindowWithRxSupervision: omciTxRequest.OnuSwWindow is nil",
4511 log.Fields{"device-id": oo.deviceID})
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304512 return fmt.Errorf("sendOnuSwSectionsWindowWithRxSupervision: omciTxRequest.OnuSwWindow is nil device-id: %v",
4513 oo.deviceID)
kesavand011d5162021-11-25 19:21:06 +05304514 }
4515
4516 tid := oo.GetOnuSwSecLastTid()
4517 logger.Debugw(ctx, "SendOnuSwSectionsWindowWithRxSupervision tid for the last segment is ", log.Fields{"TID": tid})
4518 omciRxCallbackPair := CallbackPair{CbKey: tid,
4519 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4520 }
4521
4522 aOmciTxRequest.cbPair = omciRxCallbackPair
4523 logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TansCorrId": aOmciTxRequest.cbPair.CbKey})
4524 oo.mutexRxSchedMap.Lock()
4525 // it could be checked, if the callback key is already registered - but simply overwrite may be acceptable ...
4526 oo.rxSchedulerMap[aOmciTxRequest.cbPair.CbKey] = aOmciTxRequest.cbPair.CbEntry
4527 oo.mutexRxSchedMap.Unlock()
4528
4529 chSuccess := make(chan bool)
4530 aOmciTxRequest.chSuccess = chSuccess
4531 aOmciTxRequest.timeout = aTimeout
4532 aOmciTxRequest.retries = CDefaultRetries
4533
4534 //tid := aOmciTxRequest.cbPair.CbKey
4535 oo.mutexMonReq.Lock()
4536 oo.monitoredRequests[tid] = aOmciTxRequest
4537 oo.mutexMonReq.Unlock()
4538
4539 retries := aOmciTxRequest.retries
4540 retryCounter := 0
4541 if aTimeout == 0 {
4542 logger.Errorw(ctx, "no timeout present for last section of window", log.Fields{"device-id": oo.deviceID})
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304543 return fmt.Errorf("no timeout present for last section of window device-id: %v", oo.deviceID)
kesavand011d5162021-11-25 19:21:06 +05304544 }
4545loop:
4546 for retryCounter <= retries {
4547 // the onu sw sections are enqueued only to the low priority queue
4548 oo.mutexLowPrioTxQueue.Lock()
4549 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4550 oo.mutexLowPrioTxQueue.Unlock()
4551
pnalmasc6e916a2025-06-30 11:59:16 +05304552 //Register the call back again as we clean up the Map entry when we failed to send the message
4553 oo.mutexRxSchedMap.Lock()
4554 oo.rxSchedulerMap[aOmciTxRequest.cbPair.CbKey] = aOmciTxRequest.cbPair.CbEntry
4555 oo.mutexRxSchedMap.Unlock()
4556
kesavand011d5162021-11-25 19:21:06 +05304557 go oo.sendQueuedRequests(ctx)
4558
4559 select {
4560 case success := <-chSuccess:
4561 if success {
4562 logger.Debugw(ctx, "reqMon: response received in time",
4563 log.Fields{"tid": tid, "device-id": oo.deviceID})
4564 } else {
4565 logger.Debugw(ctx, "reqMon: wait for response aborted",
4566 log.Fields{"tid": tid, "device-id": oo.deviceID})
4567 }
4568 break loop
4569 case <-time.After(time.Duration(aTimeout) * time.Second):
4570 if retryCounter == retries {
Holger Hildebrandt2b107642022-12-09 07:56:23 +00004571 if oo.pBaseDeviceHandler.IsOltAvailable() {
4572 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - send ONU device event!",
4573 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4574 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationFailureSwUpgrade, OnuOmciCommunicationFailureSwUpgradeDesc)
4575 } else {
4576 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - skip ONU device event: OLT unavailable!",
4577 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4578 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004579 oo.incrementTxTimesouts()
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304580 oo.mutexMonReq.Lock()
4581 delete(oo.monitoredRequests, tid)
4582 oo.mutexMonReq.Unlock()
4583 return fmt.Errorf("reqMon: timeout waiting for response - no of max retries reached device-id: %v", oo.deviceID)
kesavand011d5162021-11-25 19:21:06 +05304584 }
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304585 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
4586 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4587 oo.incrementTxRetries()
4588 case _, ok := <-oo.pBaseDeviceHandler.GetDeviceDeleteCommChan(ctx):
4589 if !ok {
4590 logger.Warnw(ctx, "device deletion channel is closed", log.Fields{"device-id": oo.deviceID})
4591 oo.mutexMonReq.Lock()
4592 delete(oo.monitoredRequests, tid)
4593 oo.mutexMonReq.Unlock()
4594 return fmt.Errorf("device deletion channel is closed device-id: %v", oo.deviceID)
4595 }
4596 oo.mutexMonReq.Lock()
4597 delete(oo.monitoredRequests, tid)
4598 oo.mutexMonReq.Unlock()
4599 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 +05304600 }
4601 retryCounter++
4602 }
4603 oo.mutexMonReq.Lock()
4604 delete(oo.monitoredRequests, tid)
4605 oo.mutexMonReq.Unlock()
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304606 return nil
kesavand011d5162021-11-25 19:21:06 +05304607}
4608
4609func (oo *OmciCC) sendOnuSwSectionsOfWindow(ctx context.Context, omciTxRequest OmciTransferStructure) error {
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004610 var lastSection []byte
4611 if omciTxRequest.OnuSwWindow != nil {
4612 lastSection = omciTxRequest.OnuSwWindow.Messages[len(omciTxRequest.OnuSwWindow.Messages)-1]
4613 } else {
4614 logger.Errorw(ctx, "invalid sw window received", log.Fields{"device-id": oo.deviceID})
4615 return fmt.Errorf("invalid sw window received")
4616 }
4617 if omciTxRequest.withFramePrint {
4618 logger.Debugw(ctx, "sw-section-omci-message-to-send:", log.Fields{
kesavand011d5162021-11-25 19:21:06 +05304619 "TxOmciMessage": hex.EncodeToString(lastSection),
4620 "device-id": oo.deviceID,
4621 "toDeviceType": oo.pBaseDeviceHandler.GetProxyAddressType(),
4622 "proxyDeviceID": oo.pBaseDeviceHandler.GetProxyAddressID(),
4623 "proxyAddress": oo.pBaseDeviceHandler.GetProxyAddress()})
4624 }
4625 sendErr := oo.pBaseDeviceHandler.SendOnuSwSectionsOfWindow(ctx, oo.pBaseDeviceHandler.GetProxyAddress().AdapterEndpoint, omciTxRequest.OnuSwWindow)
4626 if sendErr != nil {
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004627 logger.Errorw(ctx, "send onu sw sections omci request error", log.Fields{"device-id": oo.deviceID, "error": sendErr})
kesavand011d5162021-11-25 19:21:06 +05304628 return sendErr
4629 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004630 numberOfNoArSections := len(omciTxRequest.OnuSwWindow.Messages) - 1 // last section of window is sent with AR expected
4631 if lastSection[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
4632 oo.increaseBaseTxNoArFramesBy(ctx, uint32(numberOfNoArSections))
4633 oo.incrementBaseTxArFrames()
4634 } else {
4635 oo.increaseExtTxNoArFramesBy(ctx, uint32(numberOfNoArSections))
4636 oo.incrementExtTxArFrames()
4637 }
kesavand011d5162021-11-25 19:21:06 +05304638 return nil
4639}
4640
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004641// SendDownloadSection sends DownloadSectionRequestWithResponse
4642func (oo *OmciCC) SendDownloadSection(ctx context.Context, aTimeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004643 rxChan chan Message, aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte, aPrint bool, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004644 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004645 logger.Debugw(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
4646 "SequNo": strconv.FormatInt(int64(tid), 16),
mpagenko15ff4a52021-03-02 10:09:20 +00004647 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest})
mpagenko80622a52021-02-09 16:53:23 +00004648
4649 //TODO!!!: don't know by now on how to generate the possibly needed AR (or enforce it to 0) with current omci-lib
4650 // by now just try to send it as defined by omci-lib
mpagenko15ff4a52021-03-02 10:09:20 +00004651 msgType := omci.DownloadSectionRequestType
mgoudad611f4c2025-10-30 14:49:27 +05304652 var timeout = 0 //default value for no response expected
mpagenko15ff4a52021-03-02 10:09:20 +00004653 if aAckRequest > 0 {
4654 msgType = omci.DownloadSectionRequestWithResponseType
mpagenkoc26d4c02021-05-06 14:27:57 +00004655 timeout = aTimeout
mpagenko15ff4a52021-03-02 10:09:20 +00004656 }
mpagenko80622a52021-02-09 16:53:23 +00004657 omciLayer := &omci.OMCI{
4658 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004659 MessageType: msgType,
mpagenko80622a52021-02-09 16:53:23 +00004660 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4661 // Length: 0x28, // Optional, defaults to 40 octets
4662 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004663 if aIsExtendedOmci {
4664 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4665 }
Himani Chawla43f95ff2021-06-03 00:24:12 +05304666 localSectionData := make([]byte, len(aSection))
4667
mpagenko15ff4a52021-03-02 10:09:20 +00004668 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
mpagenko80622a52021-02-09 16:53:23 +00004669 request := &omci.DownloadSectionRequest{
4670 MeBasePacket: omci.MeBasePacket{
4671 EntityClass: me.SoftwareImageClassID,
4672 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004673 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004674 },
4675 SectionNumber: aDownloadSectionNo,
4676 SectionData: localSectionData,
4677 }
4678
4679 var options gopacket.SerializeOptions
4680 options.FixLengths = true
4681 buffer := gopacket.NewSerializeBuffer()
4682 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4683 if err != nil {
4684 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
4685 "device-id": oo.deviceID})
4686 return err
4687 }
4688 outgoingPacket := buffer.Bytes()
4689
mpagenko15ff4a52021-03-02 10:09:20 +00004690 //for initial debug purpose overrule the requested print state for some frames
4691 printFrame := aPrint
4692 if aAckRequest > 0 || aDownloadSectionNo == 0 {
4693 printFrame = true
4694 }
4695
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004696 omciRxCallbackPair := CallbackPair{CbKey: tid,
mpagenkoc26d4c02021-05-06 14:27:57 +00004697 // the callback is set even though no response might be required here, the tid (key) setting is needed here anyway
4698 // (used to avoid retransmission of frames with the same TID)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004699 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, printFrame /*aPrint*/},
mpagenko80622a52021-02-09 16:53:23 +00004700 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004701 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004702 if err != nil {
4703 logger.Errorw(ctx, "Cannot send DlSectionRequest", log.Fields{"Err": err,
4704 "device-id": oo.deviceID})
4705 return err
4706 }
4707 logger.Debug(ctx, "send DlSectionRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004708 return nil
4709}
4710
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304711// SendEndSoftwareDownload sends EndSoftwareDownloadRequest
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004712func (oo *OmciCC) SendEndSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004713 rxChan chan Message, aImageMeID uint16, aFileLen uint32, aImageCrc uint32, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004714 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004715 logger.Debugw(ctx, "send EndSwDlRequest:", log.Fields{"device-id": oo.deviceID,
4716 "SequNo": strconv.FormatInt(int64(tid), 16),
4717 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4718
mpagenko15ff4a52021-03-02 10:09:20 +00004719 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00004720 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004721 MessageType: omci.EndSoftwareDownloadRequestType,
mpagenko80622a52021-02-09 16:53:23 +00004722 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4723 // Length: 0x28, // Optional, defaults to 40 octets
4724 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004725 if aIsExtendedOmci {
4726 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4727 }
mpagenko15ff4a52021-03-02 10:09:20 +00004728 request := &omci.EndSoftwareDownloadRequest{
mpagenko80622a52021-02-09 16:53:23 +00004729 MeBasePacket: omci.MeBasePacket{
4730 EntityClass: me.SoftwareImageClassID,
4731 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004732 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004733 },
mpagenko15ff4a52021-03-02 10:09:20 +00004734 CRC32: aImageCrc,
4735 ImageSize: aFileLen,
4736 NumberOfInstances: 1, //parallel download to multiple circuit packs not supported
4737 ImageInstances: []uint16{0}, //don't care for NumberOfInstances=1, but probably needed by omci-lib as in startSwDlRequest
mpagenko80622a52021-02-09 16:53:23 +00004738 }
mpagenko15ff4a52021-03-02 10:09:20 +00004739
4740 var options gopacket.SerializeOptions
4741 options.FixLengths = true
4742 buffer := gopacket.NewSerializeBuffer()
4743 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4744 if err != nil {
4745 logger.Errorw(ctx, "Cannot serialize EndSwDlRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00004746 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00004747 return err
mpagenko80622a52021-02-09 16:53:23 +00004748 }
mpagenko15ff4a52021-03-02 10:09:20 +00004749 outgoingPacket := buffer.Bytes()
4750
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004751 omciRxCallbackPair := CallbackPair{CbKey: tid,
4752 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko15ff4a52021-03-02 10:09:20 +00004753 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004754 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00004755 if err != nil {
4756 logger.Errorw(ctx, "Cannot send EndSwDlRequest", log.Fields{"Err": err,
4757 "device-id": oo.deviceID})
4758 return err
4759 }
4760 logger.Debug(ctx, "send EndSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004761 return nil
4762}
4763
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004764// SendActivateSoftware sends ActivateSoftwareRequest
4765func (oo *OmciCC) SendActivateSoftware(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004766 rxChan chan Message, aImageMeID uint16, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004767 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004768 logger.Debugw(ctx, "send ActivateSwRequest:", log.Fields{"device-id": oo.deviceID,
4769 "SequNo": strconv.FormatInt(int64(tid), 16),
4770 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4771
4772 omciLayer := &omci.OMCI{
4773 TransactionID: tid,
4774 MessageType: omci.ActivateSoftwareRequestType,
4775 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4776 // Length: 0x28, // Optional, defaults to 40 octets
4777 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004778 if aIsExtendedOmci {
4779 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4780 }
mpagenko80622a52021-02-09 16:53:23 +00004781 request := &omci.ActivateSoftwareRequest{
4782 MeBasePacket: omci.MeBasePacket{
4783 EntityClass: me.SoftwareImageClassID,
4784 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004785 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004786 },
4787 ActivateFlags: 0, //unconditionally reset as the only relevant option here (regardless of VOIP)
4788 }
4789
4790 var options gopacket.SerializeOptions
4791 options.FixLengths = true
4792 buffer := gopacket.NewSerializeBuffer()
4793 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4794 if err != nil {
4795 logger.Errorw(ctx, "Cannot serialize ActivateSwRequest", log.Fields{"Err": err,
4796 "device-id": oo.deviceID})
4797 return err
4798 }
4799 outgoingPacket := buffer.Bytes()
4800
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004801 omciRxCallbackPair := CallbackPair{CbKey: tid,
4802 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko80622a52021-02-09 16:53:23 +00004803 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004804 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004805 if err != nil {
4806 logger.Errorw(ctx, "Cannot send ActivateSwRequest", log.Fields{"Err": err,
4807 "device-id": oo.deviceID})
4808 return err
4809 }
4810 logger.Debug(ctx, "send ActivateSwRequest done")
mpagenko15ff4a52021-03-02 10:09:20 +00004811 return nil
4812}
mpagenko80622a52021-02-09 16:53:23 +00004813
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004814// SendCommitSoftware sends CommitSoftwareRequest
4815func (oo *OmciCC) SendCommitSoftware(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004816 rxChan chan Message, aImageMeID uint16, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004817 tid := oo.GetNextTid(highPrio)
mpagenko15ff4a52021-03-02 10:09:20 +00004818 logger.Debugw(ctx, "send CommitSwRequest:", log.Fields{"device-id": oo.deviceID,
4819 "SequNo": strconv.FormatInt(int64(tid), 16),
4820 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4821
4822 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00004823 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004824 MessageType: omci.CommitSoftwareRequestType,
mpagenko80622a52021-02-09 16:53:23 +00004825 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4826 // Length: 0x28, // Optional, defaults to 40 octets
4827 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004828 if aIsExtendedOmci {
4829 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4830 }
mpagenko15ff4a52021-03-02 10:09:20 +00004831 request := &omci.CommitSoftwareRequest{
mpagenko80622a52021-02-09 16:53:23 +00004832 MeBasePacket: omci.MeBasePacket{
4833 EntityClass: me.SoftwareImageClassID,
4834 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004835 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004836 },
mpagenko80622a52021-02-09 16:53:23 +00004837 }
mpagenko15ff4a52021-03-02 10:09:20 +00004838
4839 var options gopacket.SerializeOptions
4840 options.FixLengths = true
4841 buffer := gopacket.NewSerializeBuffer()
4842 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4843 if err != nil {
4844 logger.Errorw(ctx, "Cannot serialize CommitSwRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00004845 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00004846 return err
mpagenko80622a52021-02-09 16:53:23 +00004847 }
mpagenko15ff4a52021-03-02 10:09:20 +00004848 outgoingPacket := buffer.Bytes()
4849
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004850 omciRxCallbackPair := CallbackPair{CbKey: tid,
4851 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko15ff4a52021-03-02 10:09:20 +00004852 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004853 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00004854 if err != nil {
4855 logger.Errorw(ctx, "Cannot send CommitSwRequest", log.Fields{"Err": err,
4856 "device-id": oo.deviceID})
4857 return err
4858 }
4859 logger.Debug(ctx, "send CommitSwRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004860 return nil
4861}
4862
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304863// SendSelfTestReq sends TestRequest
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004864func (oo *OmciCC) SendSelfTestReq(ctx context.Context, classID me.ClassID, instdID uint16, timeout int, highPrio bool, rxChan chan Message) error {
4865 tid := oo.GetNextTid(highPrio)
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004866 logger.Debugw(ctx, "send self test request:", log.Fields{"device-id": oo.deviceID,
4867 "SequNo": strconv.FormatInt(int64(tid), 16),
4868 "InstId": strconv.FormatInt(int64(instdID), 16)})
4869 omciLayer := &omci.OMCI{
4870 TransactionID: tid,
4871 MessageType: omci.TestRequestType,
4872 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4873 // Length: 0x28, // Optional, defaults to 40 octets
4874 }
4875
4876 var request *omci.OpticalLineSupervisionTestRequest
4877 switch classID {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004878 case me.AniGClassID:
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004879 request = &omci.OpticalLineSupervisionTestRequest{
4880 MeBasePacket: omci.MeBasePacket{
4881 EntityClass: classID,
4882 EntityInstance: instdID,
4883 },
4884 SelectTest: uint8(7), // self test
4885 GeneralPurposeBuffer: uint16(0),
4886 VendorSpecificParameters: uint16(0),
4887 }
4888 default:
4889 logger.Errorw(ctx, "unsupported class id for self test request", log.Fields{"device-id": oo.deviceID, "classID": classID})
4890 return fmt.Errorf("unsupported-class-id-for-self-test-request-%v", classID)
4891 }
4892 // Test serialization back to former string
4893 var options gopacket.SerializeOptions
4894 options.FixLengths = true
4895
4896 buffer := gopacket.NewSerializeBuffer()
4897 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4898 if err != nil {
4899 logger.Errorw(ctx, "Cannot serialize self test request", log.Fields{"Err": err,
4900 "device-id": oo.deviceID})
4901 return err
4902 }
4903 outgoingPacket := buffer.Bytes()
4904
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004905 omciRxCallbackPair := CallbackPair{CbKey: tid,
4906 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004907 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004908 err = oo.Send(ctx, outgoingPacket, timeout, 0, highPrio, omciRxCallbackPair)
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004909 if err != nil {
4910 logger.Errorw(ctx, "Cannot send self test request", log.Fields{"Err": err,
4911 "device-id": oo.deviceID})
4912 return err
4913 }
4914 logger.Debug(ctx, "send self test request done")
4915 return nil
4916}
4917
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304918// nolint: gocyclo
mgoudad611f4c2025-10-30 14:49:27 +05304919func (oo *OmciCC) isSuccessfulResponseWithMibDataSync(ctx context.Context, omciMsg *omci.OMCI, packet *gopacket.Packet) (bool, error) {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004920
4921 nextLayer, err := omci.MsgTypeToNextLayer(omciMsg.MessageType, false)
4922 if err != nil {
4923 logger.Errorw(ctx, "omci-message: could not map msgType to nextLayer", log.Fields{"device-id": oo.deviceID})
4924 return false, fmt.Errorf("could not map msgType to nextLayer - %s", oo.deviceID)
4925 }
4926 msgLayer := (*packet).Layer(nextLayer)
4927 if msgLayer != nil {
4928 // Note: Due to relaxed decoding, you may now still have a decoding error attached to the layers
4929 if failure := (*packet).ErrorLayer(); failure != nil {
mgoudad611f4c2025-10-30 14:49:27 +05304930 switch nextLayer {
4931 case omci.LayerTypeMibUploadNextResponse:
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004932 // In the case of MibUploadNextResponse, we let the packet pass so that later processing
4933 // can examine for UnkonwnMEs and UnknownAttributes
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304934 logger.Debug(ctx, "omci-message: MibUploadNextResponse packet with ErrorLayer - let it pass",
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004935 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4936 return false, nil
mgoudad611f4c2025-10-30 14:49:27 +05304937 case omci.LayerTypeGetResponse:
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004938 if resp := msgLayer.(*omci.GetResponse); resp != nil {
4939 if resp.NextLayerType() == omci.LayerTypeUnknownAttributes {
4940 unknownAttrLayer := (*packet).Layer(omci.LayerTypeUnknownAttributes)
4941 if unknownAttrLayer != nil {
4942 logger.Errorw(ctx, "omci-message: GetResponse packet contains unknownAttrLayer - skip it!",
4943 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "unknownAttrLayer": unknownAttrLayer})
4944 return false, fmt.Errorf("packet contains unknownAttrLayer - %s", oo.deviceID)
4945 }
4946 }
4947 }
4948 }
4949 // Try to decode any further error information
4950 if decodeFailure, ok := failure.(*gopacket.DecodeFailure); ok && decodeFailure != nil {
4951 logger.Errorw(ctx, "omci-message: packet contains ErrorLayer with further info - skip it!",
4952 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "decodeFailure": decodeFailure.String()})
4953 return false, fmt.Errorf("packet contains ErrorLayer with further info - %s", oo.deviceID)
4954 }
4955 logger.Errorw(ctx, "omci-message: packet contains ErrorLayer - skip it!",
4956 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4957 return false, fmt.Errorf("packet contains ErrorLayer - %s", oo.deviceID)
4958 }
4959 } else if failure := (*packet).ErrorLayer(); failure != nil {
4960 // message layer could not be decoded, but at least check if additional failure information is available
4961 if decodeFailure, ok := failure.(*gopacket.DecodeFailure); ok && decodeFailure != nil {
Holger Hildebrandt93d183f2022-04-22 15:50:26 +00004962 errMsg := decodeFailure.String()
4963 if nextLayer == omci.LayerTypeMibUploadNextResponse {
4964 if strings.Contains(strings.ToLower(errMsg), "table decode") {
4965 // In the case of MibUploadNextResponse with non-standard table attributes, we let the packet pass
4966 // so that later processing can deal with it
4967 logger.Infow(ctx, "omci-message: MibUploadNextResponse packet with table attributes - let it pass",
4968 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4969 return false, nil
4970 }
4971 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004972 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet, further info available - skip it!",
Holger Hildebrandt93d183f2022-04-22 15:50:26 +00004973 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "decodeFailure": errMsg})
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004974 return false, fmt.Errorf("could not decode msgLayer of packet, further info available - %s", oo.deviceID)
4975 }
4976 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet, ErrorLayer available",
4977 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4978 return false, fmt.Errorf("could not decode msgLayer of packet, ErrorLayer available - %s", oo.deviceID)
4979 } else {
4980 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet", log.Fields{"device-id": oo.deviceID})
4981 return false, fmt.Errorf("could not decode msgLayer of packet - %s", oo.deviceID)
4982 }
4983
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004984 for _, v := range responsesWithMibDataSync {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004985 if v == omciMsg.MessageType {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004986 switch nextLayer {
4987 case omci.LayerTypeCreateResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004988 if resp := msgLayer.(*omci.CreateResponse); resp != nil {
4989 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004990 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004991 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004992 }
4993 case omci.LayerTypeDeleteResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004994 if resp := msgLayer.(*omci.DeleteResponse); resp != nil {
4995 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004996 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004997 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004998 }
4999 case omci.LayerTypeSetResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00005000 if resp := msgLayer.(*omci.SetResponse); resp != nil {
5001 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00005002 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00005003 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00005004 }
5005 case omci.LayerTypeStartSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00005006 if resp := msgLayer.(*omci.StartSoftwareDownloadResponse); resp != nil {
5007 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00005008 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00005009 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00005010 }
5011 case omci.LayerTypeEndSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00005012 if resp := msgLayer.(*omci.EndSoftwareDownloadResponse); resp != nil {
5013 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00005014 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00005015 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00005016 }
5017 case omci.LayerTypeActivateSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00005018 if resp := msgLayer.(*omci.ActivateSoftwareResponse); resp != nil {
5019 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00005020 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00005021 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00005022 }
5023 case omci.LayerTypeCommitSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00005024 if resp := msgLayer.(*omci.CommitSoftwareResponse); resp != nil {
5025 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00005026 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00005027 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00005028 }
5029 }
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00005030 }
5031 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00005032 return false, nil
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00005033}
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005034
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005035func (oo *OmciCC) processRequestMonitoring(ctx context.Context, aOmciTxRequest OmciTransferStructure) {
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005036 timeout := aOmciTxRequest.timeout
mpagenkoc26d4c02021-05-06 14:27:57 +00005037 if timeout == 0 {
5038 //timeout 0 indicates that no response is expected - fire and forget
Holger Hildebrandt34555512021-10-01 16:26:59 +00005039 // enqueue
5040 if aOmciTxRequest.highPrio {
5041 oo.mutexHighPrioTxQueue.Lock()
5042 oo.highPrioTxQueue.PushBack(aOmciTxRequest)
5043 oo.mutexHighPrioTxQueue.Unlock()
5044 } else {
5045 oo.mutexLowPrioTxQueue.Lock()
5046 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
5047 oo.mutexLowPrioTxQueue.Unlock()
5048 }
5049 go oo.sendQueuedRequests(ctx)
mpagenkoc26d4c02021-05-06 14:27:57 +00005050 } else {
mpagenko7455fd42021-06-10 16:25:55 +00005051 //the supervised sending with waiting on the response (based on TID) is called in background
5052 // to avoid blocking of the sender for the complete OMCI handshake procedure
5053 // to stay consistent with the processing tested so far, sending of next messages of the same control procedure
5054 // is ensured by the according control instances (FSM's etc.) (by waiting for the respective responses there)
5055 go oo.sendWithRxSupervision(ctx, aOmciTxRequest, timeout)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005056 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005057}
5058
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005059func (oo *OmciCC) sendWithRxSupervision(ctx context.Context, aOmciTxRequest OmciTransferStructure, aTimeout int) {
mpagenko7455fd42021-06-10 16:25:55 +00005060 chSuccess := make(chan bool)
5061 aOmciTxRequest.chSuccess = chSuccess
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005062 tid := aOmciTxRequest.cbPair.CbKey
mpagenko7455fd42021-06-10 16:25:55 +00005063 oo.mutexMonReq.Lock()
5064 oo.monitoredRequests[tid] = aOmciTxRequest
5065 oo.mutexMonReq.Unlock()
5066
5067 retries := aOmciTxRequest.retries
5068 retryCounter := 0
5069loop:
5070 for retryCounter <= retries {
balaji.nagarajan80f6fb82026-01-13 16:48:05 +05305071 if oo.pBaseDeviceHandler == nil {
5072 logger.Warnw(ctx, "pBaseDeviceHandler is nil - abort sendWithRxSupervision", log.Fields{"device-id": oo.deviceID})
5073 break loop
5074 } else if oo.pBaseDeviceHandler.GetDeletionInProgress() {
5075 logger.Warnw(ctx, "device deletion in progress - abort sendWithRxSupervision", log.Fields{"device-id": oo.deviceID})
5076 break loop
5077 }
Holger Hildebrandt34555512021-10-01 16:26:59 +00005078 // enqueue
5079 if aOmciTxRequest.highPrio {
5080 oo.mutexHighPrioTxQueue.Lock()
5081 oo.highPrioTxQueue.PushBack(aOmciTxRequest)
5082 oo.mutexHighPrioTxQueue.Unlock()
5083 } else {
5084 oo.mutexLowPrioTxQueue.Lock()
5085 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
5086 oo.mutexLowPrioTxQueue.Unlock()
5087 }
pnalmasc6e916a2025-06-30 11:59:16 +05305088
5089 //Register the call back again as we clean up the Map entry when we failed to send the message .
5090 oo.mutexRxSchedMap.Lock()
5091 oo.rxSchedulerMap[aOmciTxRequest.cbPair.CbKey] = aOmciTxRequest.cbPair.CbEntry
5092 oo.mutexRxSchedMap.Unlock()
5093
Holger Hildebrandt34555512021-10-01 16:26:59 +00005094 go oo.sendQueuedRequests(ctx)
mpagenko7455fd42021-06-10 16:25:55 +00005095
5096 select {
5097 case success := <-chSuccess:
5098 if success {
5099 logger.Debugw(ctx, "reqMon: response received in time",
5100 log.Fields{"tid": tid, "device-id": oo.deviceID})
5101 } else {
5102 logger.Debugw(ctx, "reqMon: wait for response aborted",
5103 log.Fields{"tid": tid, "device-id": oo.deviceID})
5104 }
5105 break loop
5106 case <-time.After(time.Duration(aTimeout) * time.Second):
5107 if retryCounter == retries {
Holger Hildebrandt2b107642022-12-09 07:56:23 +00005108 if oo.pBaseDeviceHandler.IsOltAvailable() {
5109 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - send ONU device event!",
5110 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
5111 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationFailureConfig, OnuOmciCommunicationFailureConfigDesc)
5112 } else {
5113 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - skip ONU device event: OLT unavailable!",
5114 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
5115 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005116 oo.incrementTxTimesouts()
mpagenko7455fd42021-06-10 16:25:55 +00005117 break loop
5118 } else {
5119 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
5120 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005121 oo.incrementTxRetries()
mpagenko7455fd42021-06-10 16:25:55 +00005122 }
balaji.nagarajan3cab2b62025-06-23 15:44:54 +05305123 case _, ok := <-oo.pBaseDeviceHandler.GetDeviceDeleteCommChan(ctx):
5124 if !ok {
5125 logger.Warnw(ctx, "device deletion channel is closed at sendWithRxSupervision", log.Fields{"device-id": oo.deviceID})
5126 break loop
5127 }
mpagenko7455fd42021-06-10 16:25:55 +00005128 }
5129 retryCounter++
5130 }
5131 oo.mutexMonReq.Lock()
5132 delete(oo.monitoredRequests, tid)
5133 oo.mutexMonReq.Unlock()
5134}
5135
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05305136// CancelRequestMonitoring terminates monitoring of outstanding omci requests
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005137func (oo *OmciCC) CancelRequestMonitoring(ctx context.Context) {
Holger Hildebrandt12609a12022-03-25 13:23:25 +00005138 logger.Debugw(ctx, "CancelRequestMonitoring entered", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005139 oo.mutexMonReq.RLock()
5140 for k := range oo.monitoredRequests {
mpagenko8cd1bf72021-06-22 10:11:19 +00005141 //implement non-blocking channel send to avoid blocking on mutexMonReq later
5142 select {
5143 case oo.monitoredRequests[k].chSuccess <- false:
Holger Hildebrandt12609a12022-03-25 13:23:25 +00005144 logger.Debugw(ctx, "send cancellation on omciRespChannel",
5145 log.Fields{"index": k, "device-id": oo.deviceID})
mpagenko8cd1bf72021-06-22 10:11:19 +00005146 default:
Holger Hildebrandt12609a12022-03-25 13:23:25 +00005147 logger.Debugw(ctx, "cancellation could not be send on omciRespChannel (no receiver)",
5148 log.Fields{"index": k, "device-id": oo.deviceID})
mpagenko8cd1bf72021-06-22 10:11:19 +00005149 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005150 }
5151 oo.mutexMonReq.RUnlock()
5152}
5153
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05305154// GetMaxOmciTimeoutWithRetries provides a timeout value greater than the maximum
5155// time consumed for retry processing of a particular OMCI-request
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005156func (oo *OmciCC) GetMaxOmciTimeoutWithRetries() time.Duration {
5157 return time.Duration((CDefaultRetries+1)*oo.pBaseDeviceHandler.GetOmciTimeout() + 1)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005158}
Himani Chawla43f95ff2021-06-03 00:24:12 +05305159
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005160// SendCreateOrDeleteEthernetFrameExtendedPMME deletes EthernetFrameExtendedPm ME instance
5161func (oo *OmciCC) SendCreateOrDeleteEthernetFrameExtendedPMME(ctx context.Context, timeout int, highPrio bool,
Himani Chawla43f95ff2021-06-03 00:24:12 +05305162 upstream bool, create bool, rxChan chan Message, entityID uint16, classID me.ClassID, controlBlock []uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005163 tid := oo.GetNextTid(highPrio)
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05305164 logger.Info(ctx, "send-ethernet-frame-extended-pm-me-msg:", log.Fields{"device-id": oo.deviceID,
Himani Chawla43f95ff2021-06-03 00:24:12 +05305165 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
5166
5167 meParam := me.ParamData{EntityID: entityID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00005168 Attributes: me.AttributeValueMap{me.EthernetFrameExtendedPm_ControlBlock: controlBlock},
Himani Chawla43f95ff2021-06-03 00:24:12 +05305169 }
5170 var meInstance *me.ManagedEntity
5171 var omciErr me.OmciErrors
5172 if classID == me.EthernetFrameExtendedPmClassID {
5173 meInstance, omciErr = me.NewEthernetFrameExtendedPm(meParam)
5174 } else {
5175 meInstance, omciErr = me.NewEthernetFrameExtendedPm64Bit(meParam)
5176 }
5177
5178 if omciErr.GetError() == nil {
5179 var omciLayer *omci.OMCI
5180 var msgLayer gopacket.SerializableLayer
5181 var err error
5182 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00005183 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
5184 oframe.AddDefaults(true))
Himani Chawla43f95ff2021-06-03 00:24:12 +05305185 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00005186 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
5187 oframe.AddDefaults(true))
Himani Chawla43f95ff2021-06-03 00:24:12 +05305188 }
5189 if err != nil {
5190 logger.Errorw(ctx, "cannot-encode-ethernet-frame-extended-pm-me",
5191 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5192 return nil, err
5193 }
5194
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00005195 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Himani Chawla43f95ff2021-06-03 00:24:12 +05305196 if err != nil {
5197 logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me",
5198 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5199 return nil, err
5200 }
5201
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005202 omciRxCallbackPair := CallbackPair{CbKey: tid,
5203 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Himani Chawla43f95ff2021-06-03 00:24:12 +05305204 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005205 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawla43f95ff2021-06-03 00:24:12 +05305206 if err != nil {
5207 logger.Errorw(ctx, "Cannot send ethernet-frame-extended-pm-me",
5208 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5209 return nil, err
5210 }
5211 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-done",
5212 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5213 return meInstance, nil
5214 }
5215 logger.Errorw(ctx, "cannot-generate-ethernet-frame-extended-pm-me-instance",
5216 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5217 return nil, omciErr.GetError()
5218}
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005219
5220// RLockMutexMonReq lock read access to monitoredRequests
5221func (oo *OmciCC) RLockMutexMonReq() {
5222 oo.mutexMonReq.RLock()
5223}
5224
5225// RUnlockMutexMonReq unlock read access to monitoredRequests
5226func (oo *OmciCC) RUnlockMutexMonReq() {
5227 oo.mutexMonReq.RUnlock()
5228}
5229
5230// GetMonitoredRequest get OmciTransferStructure for an omciTransID
5231func (oo *OmciCC) GetMonitoredRequest(omciTransID uint16) (value OmciTransferStructure, exist bool) {
5232 value, exist = oo.monitoredRequests[omciTransID]
5233 return value, exist
5234}
5235
5236// SetChMonitoredRequest sets chSuccess to indicate whether response was received or not
5237func (oo *OmciCC) SetChMonitoredRequest(omciTransID uint16, chVal bool) {
5238 oo.monitoredRequests[omciTransID].chSuccess <- chVal
5239}
Himani Chawlaee10b542021-09-20 16:46:40 +05305240
5241// SendSetEthernetFrameExtendedPMME sends the set request for ethernet frame extended type me
5242func (oo *OmciCC) SendSetEthernetFrameExtendedPMME(ctx context.Context, timeout int, highPrio bool,
5243 rxChan chan Message, entityID uint16, classID me.ClassID, controlBlock []uint16) (*me.ManagedEntity, error) {
5244 tid := oo.GetNextTid(highPrio)
5245 logger.Debugw(ctx, "send-set-ethernet-frame-extended-pm-me-control-block:", log.Fields{"device-id": oo.deviceID,
5246 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16)})
5247
5248 meParams := me.ParamData{EntityID: entityID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00005249 Attributes: me.AttributeValueMap{me.EthernetFrameExtendedPm_ControlBlock: controlBlock},
Himani Chawlaee10b542021-09-20 16:46:40 +05305250 }
5251 var meInstance *me.ManagedEntity
5252 var omciErr me.OmciErrors
5253 if classID == me.EthernetFrameExtendedPmClassID {
5254 meInstance, omciErr = me.NewEthernetFrameExtendedPm(meParams)
5255 } else {
5256 meInstance, omciErr = me.NewEthernetFrameExtendedPm64Bit(meParams)
5257 }
5258
5259 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00005260 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Himani Chawlaee10b542021-09-20 16:46:40 +05305261 if err != nil {
5262 logger.Errorw(ctx, "cannot-encode-ethernet-frame-extended-pm-me",
5263 log.Fields{"err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5264 return nil, err
5265 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00005266 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Himani Chawlaee10b542021-09-20 16:46:40 +05305267 if err != nil {
5268 logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me-set-msg",
5269 log.Fields{"err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5270 return nil, err
5271 }
5272 omciRxCallbackPair := CallbackPair{
5273 CbKey: tid,
5274 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
5275 }
5276 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
5277 if err != nil {
5278 logger.Errorw(ctx, "Cannot send ethernet-frame-extended-pm-me",
5279 log.Fields{"Err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5280 return nil, err
5281 }
5282 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-set-msg-done",
5283 log.Fields{"device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5284 return meInstance, nil
5285 }
5286 logger.Errorw(ctx, "cannot-generate-ethernet-frame-extended-pm-me-instance",
5287 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5288 return nil, omciErr.GetError()
5289}
Holger Hildebrandte7cc6092022-02-01 11:37:03 +00005290
5291// PrepareForGarbageCollection - remove references to prepare for garbage collection
5292func (oo *OmciCC) PrepareForGarbageCollection(ctx context.Context, aDeviceID string) {
5293 logger.Debugw(ctx, "prepare for garbage collection", log.Fields{"device-id": aDeviceID})
5294 oo.pBaseDeviceHandler = nil
5295 oo.pOnuDeviceEntry = nil
5296 oo.pOnuAlarmManager = nil
5297}
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005298
5299// GetOmciCounters - TODO: add comment
5300func (oo *OmciCC) GetOmciCounters() *extension.SingleGetValueResponse {
5301 oo.mutexCounters.RLock()
5302 defer oo.mutexCounters.RUnlock()
5303 resp := extension.SingleGetValueResponse{
5304 Response: &extension.GetValueResponse{
5305 Status: extension.GetValueResponse_OK,
5306 Response: &extension.GetValueResponse_OnuOmciStats{
5307 OnuOmciStats: &extension.GetOnuOmciTxRxStatsResponse{},
5308 },
5309 },
5310 }
5311 resp.Response.GetOnuOmciStats().BaseTxArFrames = oo.countersBase.txArFrames
5312 resp.Response.GetOnuOmciStats().BaseTxNoArFrames = oo.countersBase.txNoArFrames
5313 resp.Response.GetOnuOmciStats().BaseRxAkFrames = oo.countersBase.rxAkFrames
5314 resp.Response.GetOnuOmciStats().BaseRxNoAkFrames = oo.countersBase.rxNoAkFrames
5315 resp.Response.GetOnuOmciStats().ExtTxArFrames = oo.countersExt.txArFrames
5316 resp.Response.GetOnuOmciStats().ExtTxNoArFrames = oo.countersExt.txNoArFrames
5317 resp.Response.GetOnuOmciStats().ExtRxAkFrames = oo.countersExt.rxAkFrames
5318 resp.Response.GetOnuOmciStats().ExtRxNoAkFrames = oo.countersExt.rxNoAkFrames
5319 resp.Response.GetOnuOmciStats().TxOmciCounterRetries = oo.txRetries
5320 resp.Response.GetOnuOmciStats().TxOmciCounterTimeouts = oo.txTimeouts
5321 return &resp
5322}
5323
5324// For more speed, separate functions for each counter
5325
5326func (oo *OmciCC) incrementBaseTxArFrames() {
5327 oo.mutexCounters.Lock()
5328 defer oo.mutexCounters.Unlock()
5329 oo.countersBase.txArFrames++
5330}
5331
5332func (oo *OmciCC) incrementExtTxArFrames() {
5333 oo.mutexCounters.Lock()
5334 defer oo.mutexCounters.Unlock()
5335 oo.countersExt.txArFrames++
5336}
5337
5338func (oo *OmciCC) incrementBaseRxAkFrames() {
5339 oo.mutexCounters.Lock()
5340 defer oo.mutexCounters.Unlock()
5341 oo.countersBase.rxAkFrames++
5342}
5343
5344func (oo *OmciCC) incrementExtRxAkFrames() {
5345 oo.mutexCounters.Lock()
5346 defer oo.mutexCounters.Unlock()
5347 oo.countersExt.rxAkFrames++
5348}
5349
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +05305350//nolint:unparam
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005351func (oo *OmciCC) increaseBaseTxNoArFramesBy(ctx context.Context, value uint32) {
5352 oo.mutexCounters.Lock()
5353 defer oo.mutexCounters.Unlock()
5354 oo.countersBase.txNoArFrames += value
5355}
5356
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +05305357//nolint:unparam
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005358func (oo *OmciCC) increaseExtTxNoArFramesBy(ctx context.Context, value uint32) {
5359 oo.mutexCounters.Lock()
5360 defer oo.mutexCounters.Unlock()
5361 oo.countersExt.txNoArFrames += value
5362}
5363
5364func (oo *OmciCC) incrementBaseRxNoAkFrames() {
5365 oo.mutexCounters.Lock()
5366 defer oo.mutexCounters.Unlock()
5367 oo.countersBase.rxNoAkFrames++
5368}
5369
5370func (oo *OmciCC) incrementExtRxNoAkFrames() {
5371 oo.mutexCounters.Lock()
5372 defer oo.mutexCounters.Unlock()
5373 oo.countersExt.rxNoAkFrames++
5374}
5375
5376func (oo *OmciCC) incrementTxRetries() {
5377 oo.mutexCounters.Lock()
5378 defer oo.mutexCounters.Unlock()
5379 oo.txRetries++
5380}
5381
5382func (oo *OmciCC) incrementTxTimesouts() {
5383 oo.mutexCounters.Lock()
5384 defer oo.mutexCounters.Unlock()
5385 oo.txTimeouts++
5386}
Holger Hildebrandt7e138462023-03-29 12:12:14 +00005387
5388// NotifyAboutOnuConfigFailure - trigger ONU DeviceEvent to notify about ONU config failure
5389func (oo *OmciCC) NotifyAboutOnuConfigFailure(ctx context.Context, errID string, meClassID me.ClassID, meEntityID uint16,
5390 meName string, meResult me.Results) {
5391 var description string
5392 if !oo.confFailMeAlreadyHandled(meClassID) {
5393 switch errID {
5394 case OnuConfigFailureResponseErr:
5395 description = OnuConfigFailureResponseErrDesc + meResult.String() +
5396 ", OMCI ME: " + meName + " / instance: " + fmt.Sprintf("%d", meEntityID) + " (only first instance reported)"
5397 case OnuConfigFailureTimeout:
5398 description = OnuConfigFailureTimeoutDesc + meName + " / instance: " + fmt.Sprintf("%d", meEntityID) +
5399 " (only first instance reported)"
5400 default:
5401 logger.Warnw(ctx, "method called with undefined errID", log.Fields{"errID": errID, "device-id": oo.deviceID})
5402 return
5403 }
5404 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, errID, description)
5405 oo.appendConfFailMe(meClassID)
5406 }
5407}
5408
5409func (oo *OmciCC) confFailMeAlreadyHandled(meClassID me.ClassID) bool {
5410 oo.mutexConfFailMEs.RLock()
5411 defer oo.mutexConfFailMEs.RUnlock()
5412 for _, v := range oo.confFailMEs {
5413 if v == meClassID {
5414 return true
5415 }
5416 }
5417 return false
5418}
5419
5420func (oo *OmciCC) appendConfFailMe(meClassID me.ClassID) {
5421 oo.mutexConfFailMEs.Lock()
5422 defer oo.mutexConfFailMEs.Unlock()
5423 oo.confFailMEs = append(oo.confFailMEs, meClassID)
5424}
5425
5426// ResetConfFailMEs - reset list of stored config failure MEs
5427func (oo *OmciCC) ResetConfFailMEs() {
5428 oo.mutexConfFailMEs.Lock()
5429 defer oo.mutexConfFailMEs.Unlock()
5430 oo.confFailMEs = nil
5431}