blob: 5fbe0e7f96fdc185a7a927b61226c6e66ebeb7b2 [file] [log] [blame]
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001/*
Joey Armstrong89c812c2024-01-12 19:00:20 -05002 * Copyright 2020-2024 Open Networking Foundation (ONF) and the ONF Contributors
Holger Hildebrandtfa074992020-03-27 15:42:06 +00003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
nikesh.krishnan1ffb8132023-05-23 03:44:13 +053017// Package common provides global definitions
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000018package common
Holger Hildebrandtfa074992020-03-27 15:42:06 +000019
20import (
21 "container/list"
22 "context"
23 "encoding/binary"
24 "encoding/hex"
Andrea Campanella6515c582020-10-05 11:25:00 +020025 "fmt"
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000026 "strconv"
Holger Hildebrandt93d183f2022-04-22 15:50:26 +000027 "strings"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000028 "sync"
mpagenko80622a52021-02-09 16:53:23 +000029 "time" //by now for testing
Holger Hildebrandtfa074992020-03-27 15:42:06 +000030
31 "github.com/google/gopacket"
32 // TODO!!! Some references could be resolved auto, but some need specific context ....
Holger Hildebrandtfa074992020-03-27 15:42:06 +000033
mpagenko836a1fd2021-11-01 16:12:42 +000034 "github.com/opencord/omci-lib-go/v2"
35 me "github.com/opencord/omci-lib-go/v2/generated"
36 oframe "github.com/opencord/omci-lib-go/v2/meframe"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000037
khenaidoo7d3c5582021-08-11 18:09:44 -040038 vgrpc "github.com/opencord/voltha-lib-go/v7/pkg/grpc"
39
khenaidoo7d3c5582021-08-11 18:09:44 -040040 "github.com/opencord/voltha-lib-go/v7/pkg/log"
khenaidoo42dcdfd2021-10-19 17:34:12 -040041 "github.com/opencord/voltha-protos/v5/go/common"
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +000042 "github.com/opencord/voltha-protos/v5/go/extension"
khenaidoo42dcdfd2021-10-19 17:34:12 -040043 ia "github.com/opencord/voltha-protos/v5/go/inter_adapter"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000044)
45
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000046// ### OMCI related definitions - retrieved from Python adapter code/trace ####
Himani Chawla6d2ae152020-09-02 13:11:20 +053047
Holger Hildebrandt9b64e0b2022-04-21 08:02:00 +000048const maxGemPayloadSize = uint16(2048)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000049const connectivityModeValue = uint8(5)
Himani Chawla4d908332020-08-31 12:30:20 +053050
51//const defaultTPID = uint16(0x8100)
52//const broadComDefaultVID = uint16(4091)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000053
54// UnusedTcontAllocID - TODO: add comment
55const UnusedTcontAllocID = uint16(0xFFFF) //common unused AllocId for G.984 and G.987 systems
mpagenko8b07c1b2020-11-26 10:36:31 +000056
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +000057const cOmciDeviceIdentifierPos = 3
mpagenkoc8bba412021-01-15 15:38:44 +000058const cOmciBaseMessageTrailerLen = 40
59
60// tOmciReceiveError - enum type for detected problems/errors in the received OMCI message (format)
61type tOmciReceiveError uint8
62
63const (
64 // cOmciMessageReceiveNoError - default start state
65 cOmciMessageReceiveNoError tOmciReceiveError = iota
66 // Error indication wrong trailer length within the message
67 cOmciMessageReceiveErrorTrailerLen
68 // Error indication missing trailer within the message
69 cOmciMessageReceiveErrorMissTrailer
70)
71
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000072// CDefaultRetries - TODO: add comment
73const CDefaultRetries = 2
Holger Hildebrandt366ef192021-05-05 11:07:44 +000074
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000075// ### OMCI related definitions - end
76
nikesh.krishnan1ffb8132023-05-23 03:44:13 +053077// CallbackPairEntry to be used for OMCI send/receive correlation
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000078type CallbackPairEntry struct {
79 CbRespChannel chan Message
mgoudad611f4c2025-10-30 14:49:27 +053080 CbFunction func(context.Context, *omci.OMCI, *gopacket.Packet, chan Message) error
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000081 FramePrint bool //true for printing
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000082}
83
nikesh.krishnan1ffb8132023-05-23 03:44:13 +053084// CallbackPair to be used for ReceiveCallback init
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000085type CallbackPair struct {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000086 CbEntry CallbackPairEntry
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +053087 CbKey uint16
Holger Hildebrandtfa074992020-03-27 15:42:06 +000088}
89
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000090// OmciTransferStructure - TODO: add comment
91type OmciTransferStructure struct {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +053092 chSuccess chan bool
93 OnuSwWindow *ia.OmciMessages
94 cbPair CallbackPair
mpagenko80622a52021-02-09 16:53:23 +000095 txFrame []byte
96 timeout int
Holger Hildebrandt366ef192021-05-05 11:07:44 +000097 retries int
mpagenko80622a52021-02-09 16:53:23 +000098 highPrio bool
99 withFramePrint bool
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000100}
101
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000102type txRxCounters struct {
103 txArFrames uint32
104 txNoArFrames uint32
105 rxAkFrames uint32
106 rxNoAkFrames uint32
107}
108
Joey Armstrong89c812c2024-01-12 19:00:20 -0500109// OmciCC structure holds information needed for OMCI communication (to/from OLT Adapter)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000110type OmciCC struct {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000111 pBaseDeviceHandler IdeviceHandler
112 pOnuDeviceEntry IonuDeviceEntry
113 pOnuAlarmManager IonuAlarmManager
khenaidoo7d3c5582021-08-11 18:09:44 -0400114 coreClient *vgrpc.Client
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530115 lowPrioTxQueue *list.List
116 highPrioTxQueue *list.List
117 rxSchedulerMap map[uint16]CallbackPairEntry
118 monitoredRequests map[uint16]OmciTransferStructure
119 deviceID string
Holger Hildebrandt7e138462023-03-29 12:12:14 +0000120 confFailMEs []me.ClassID
121 mutexConfFailMEs sync.RWMutex
mpagenkoc8bba412021-01-15 15:38:44 +0000122
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000123 mutexCounters sync.RWMutex
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530124 mutexMonReq sync.RWMutex
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000125 countersBase txRxCounters
126 countersExt txRxCounters
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000127
128 // OMCI params
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530129 mutexTid sync.Mutex
130 mutexHpTid sync.Mutex
131
132 mutexSendQueuedRequests sync.Mutex
133 mutexLowPrioTxQueue sync.Mutex
134 mutexHighPrioTxQueue sync.Mutex
135 mutexRxSchedMap sync.Mutex
136 txRetries uint32
137 txTimeouts uint32
138
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000139 tid uint16
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000140 hpTid uint16
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000141 UploadSequNo uint16
142 UploadNoOfCmds uint16
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000143
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530144 enabled bool
145 supportExtMsg bool
146 rxOmciFrameError tOmciReceiveError
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000147}
148
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000149var responsesWithMibDataSync = []omci.MessageType{
150 omci.CreateResponseType,
151 omci.DeleteResponseType,
152 omci.SetResponseType,
153 omci.StartSoftwareDownloadResponseType,
154 omci.EndSoftwareDownloadResponseType,
155 omci.ActivateSoftwareResponseType,
156 omci.CommitSoftwareResponseType,
157}
158
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530159// NewOmciCC constructor returns a new instance of a OmciCC
160// mib_db (as well as not inluded alarm_db not really used in this code? VERIFY!!)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000161func NewOmciCC(ctx context.Context, deviceID string, deviceHandler IdeviceHandler,
162 onuDeviceEntry IonuDeviceEntry, onuAlarmManager IonuAlarmManager,
163 coreClient *vgrpc.Client) *OmciCC {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000164 logger.Debugw(ctx, "init-omciCC", log.Fields{"device-id": deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000165 var omciCC OmciCC
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000166 omciCC.enabled = false
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000167 omciCC.pBaseDeviceHandler = deviceHandler
168 omciCC.pOnuAlarmManager = onuAlarmManager
Himani Chawla4d908332020-08-31 12:30:20 +0530169 omciCC.pOnuDeviceEntry = onuDeviceEntry
170 omciCC.deviceID = deviceID
khenaidoo7d3c5582021-08-11 18:09:44 -0400171 omciCC.coreClient = coreClient
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000172 omciCC.supportExtMsg = false
mpagenkoc8bba412021-01-15 15:38:44 +0000173 omciCC.rxOmciFrameError = cOmciMessageReceiveNoError
Holger Hildebrandt7e138462023-03-29 12:12:14 +0000174 omciCC.confFailMEs = nil
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000175 omciCC.countersBase = txRxCounters{0, 0, 0, 0}
176 omciCC.countersExt = txRxCounters{0, 0, 0, 0}
177 omciCC.txRetries = 0
178 omciCC.txTimeouts = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000179 omciCC.tid = 0x1
180 omciCC.hpTid = 0x8000
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000181 omciCC.UploadSequNo = 0
182 omciCC.UploadNoOfCmds = 0
Holger Hildebrandt34555512021-10-01 16:26:59 +0000183 omciCC.lowPrioTxQueue = list.New()
184 omciCC.highPrioTxQueue = list.New()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000185 omciCC.rxSchedulerMap = make(map[uint16]CallbackPairEntry)
186 omciCC.monitoredRequests = make(map[uint16]OmciTransferStructure)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000187 return &omciCC
188}
189
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530190// Stop stops/resets the omciCC
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000191func (oo *OmciCC) Stop(ctx context.Context) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000192 logger.Debugw(ctx, "omciCC-stopping", log.Fields{"device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000193 //reseting all internal data, which might also be helpful for discarding any lingering tx/rx requests
mpagenko8cd1bf72021-06-22 10:11:19 +0000194 oo.CancelRequestMonitoring(ctx)
Holger Hildebrandt34555512021-10-01 16:26:59 +0000195 // clear the tx queues
196 oo.mutexHighPrioTxQueue.Lock()
197 oo.highPrioTxQueue.Init()
198 oo.mutexHighPrioTxQueue.Unlock()
199 oo.mutexLowPrioTxQueue.Lock()
200 oo.lowPrioTxQueue.Init()
201 oo.mutexLowPrioTxQueue.Unlock()
202 //clear the scheduler map
mpagenko900ee4b2020-10-12 11:56:34 +0000203 oo.mutexRxSchedMap.Lock()
204 for k := range oo.rxSchedulerMap {
Holger Hildebrandt34555512021-10-01 16:26:59 +0000205 delete(oo.rxSchedulerMap, k)
mpagenko900ee4b2020-10-12 11:56:34 +0000206 }
207 oo.mutexRxSchedMap.Unlock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000208 //reset the high prio transactionId
mpagenko900ee4b2020-10-12 11:56:34 +0000209 oo.mutexHpTid.Lock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000210 oo.hpTid = 0x8000
mpagenko900ee4b2020-10-12 11:56:34 +0000211 oo.mutexHpTid.Unlock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000212 //reset the low prio transactionId
mpagenko900ee4b2020-10-12 11:56:34 +0000213 oo.mutexTid.Lock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000214 oo.tid = 1
mpagenko900ee4b2020-10-12 11:56:34 +0000215 oo.mutexTid.Unlock()
216 //reset control values
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000217 oo.UploadSequNo = 0
218 oo.UploadNoOfCmds = 0
mpagenkoc8bba412021-01-15 15:38:44 +0000219 oo.rxOmciFrameError = cOmciMessageReceiveNoError
Holger Hildebrandt7e138462023-03-29 12:12:14 +0000220 oo.ResetConfFailMEs()
mpagenko900ee4b2020-10-12 11:56:34 +0000221
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000222 //reset the stats counter
223 oo.mutexCounters.Lock()
224 oo.countersBase = txRxCounters{0, 0, 0, 0}
225 oo.countersExt = txRxCounters{0, 0, 0, 0}
226 oo.txRetries = 0
227 oo.txTimeouts = 0
228 oo.mutexCounters.Unlock()
mpagenko900ee4b2020-10-12 11:56:34 +0000229 return nil
230}
231
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000232// Rx handler for omci messages
mgoudad611f4c2025-10-30 14:49:27 +0530233func (oo *OmciCC) receiveOnuMessage(ctx context.Context, omciMsg *omci.OMCI, packet *gopacket.Packet) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000234 logger.Debugw(ctx, "rx-onu-autonomous-message", log.Fields{"omciMsgType": omciMsg.MessageType,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000235 "payload": hex.EncodeToString(omciMsg.Payload)})
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530236 switch omciMsg.MessageType {
237 case omci.AlarmNotificationType:
238 data := OmciMessage{
239 OmciMsg: omciMsg,
240 OmciPacket: packet,
241 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000242 go oo.pOnuAlarmManager.HandleOmciAlarmNotificationMessage(ctx, data)
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530243 return nil
244 default:
245 return fmt.Errorf("receiveOnuMessageType %s unimplemented", omciMsg.MessageType.String())
246 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000247 /*
248 msgType = rxFrame.fields["message_type"] //assumed OmciOperationsValue
249 rxOnuFrames++
250
251 switch msgType {
252 case AlarmNotification:
253 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000254 logger.Info("Unhandled: received-onu-alarm-message")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000255 // python code was:
256 //if msg_type == EntityOperations.AlarmNotification.value:
257 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.Alarm_Notification)
258 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
259 //
260 return errors.New("RxAlarmNotification unimplemented")
261 }
262 case AttributeValueChange:
263 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000264 logger.Info("Unhandled: received-attribute-value-change")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000265 // python code was:
266 //elif msg_type == EntityOperations.AttributeValueChange.value:
267 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.AVC_Notification)
268 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
269 //
270 return errors.New("RxAttributeValueChange unimplemented")
271 }
272 case TestResult:
273 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000274 logger.Info("Unhandled: received-test-result")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000275 // python code was:
276 //elif msg_type == EntityOperations.TestResult.value:
277 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.Test_Result)
278 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
279 //
280 return errors.New("RxTestResult unimplemented")
281 }
282 default:
283 {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000284 logger.Errorw(ctx,"rx-onu-unsupported-autonomous-message", log.Fields{"msgType": msgType})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000285 rxOnuDiscards++
286 return errors.New("RxOnuMsgType unimplemented")
287 }
288 }
289 */
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000290}
291
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000292func (oo *OmciCC) printRxMessage(ctx context.Context, rxMsg []byte) {
mpagenko80622a52021-02-09 16:53:23 +0000293 //assuming omci message content is hex coded!
294 // with restricted output of 16bytes would be ...rxMsg[:16]
295 logger.Debugw(ctx, "omci-message-received:", log.Fields{
296 "RxOmciMessage": hex.EncodeToString(rxMsg),
297 "device-id": oo.deviceID})
298}
299
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000300// ReceiveMessage - Rx handler for onu messages
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530301//
302// e.g. would call ReceiveOnuMessage() in case of TID=0 or Action=test ...
303//
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000304// nolint: gocyclo
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000305func (oo *OmciCC) ReceiveMessage(ctx context.Context, rxMsg []byte) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000306 //logger.Debugw(ctx,"cc-receive-omci-message", log.Fields{"RxOmciMessage-x2s": hex.EncodeToString(rxMsg)})
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000307
308 if len(rxMsg) < 10 {
309 logger.Errorw(ctx, "rxOmciMessage has wrong length in general - abort",
310 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
311 if len(rxMsg) > 0 {
312 oo.printRxMessage(ctx, rxMsg)
mpagenkoc8bba412021-01-15 15:38:44 +0000313 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000314 return fmt.Errorf("rxOmciMessage has wrong length in general - abort %s", oo.deviceID)
315 }
316 if rxMsg[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
317 if len(rxMsg) >= 44 { // then it should normally include the BaseFormat trailer Len
318 // NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
319 // (an extendedFormat message could be destroyed this way!)
320 trailerLenData := rxMsg[42:44]
321 trailerLen := binary.BigEndian.Uint16(trailerLenData)
322 //logger.Debugw(ctx,"omci-received-trailer-len", log.Fields{"Length": trailerLen})
323 if trailerLen != cOmciBaseMessageTrailerLen { // invalid base Format entry -> autocorrect
324 binary.BigEndian.PutUint16(rxMsg[42:44], cOmciBaseMessageTrailerLen)
325 if oo.rxOmciFrameError != cOmciMessageReceiveErrorTrailerLen {
326 //do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
327 logger.Errorw(ctx, "wrong omci-message trailer length: trailer len auto-corrected",
328 log.Fields{"trailer-length": trailerLen, "device-id": oo.deviceID})
329 oo.rxOmciFrameError = cOmciMessageReceiveErrorTrailerLen
330 }
331 }
332 } else if len(rxMsg) >= cOmciBaseMessageTrailerLen { // workaround for Adtran OLT Sim, which currently does not send trailer bytes at all!
333 // NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
334 // (an extendedFormat message could be destroyed this way!)
335 // extend/overwrite with trailer
336 trailer := make([]byte, 8)
337 binary.BigEndian.PutUint16(trailer[2:], cOmciBaseMessageTrailerLen) //set the defined baseline length
338 rxMsg = append(rxMsg[:cOmciBaseMessageTrailerLen], trailer...)
339 if oo.rxOmciFrameError != cOmciMessageReceiveErrorMissTrailer {
340 //do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
341 logger.Errorw(ctx, "omci-message to short to include trailer len: trailer auto-corrected (added)",
342 log.Fields{"message-length": len(rxMsg), "device-id": oo.deviceID})
343 oo.rxOmciFrameError = cOmciMessageReceiveErrorMissTrailer
344 }
345 } else {
346 logger.Errorw(ctx, "received omci-message too small for OmciBaseFormat - abort",
347 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
348 oo.printRxMessage(ctx, rxMsg)
349 return fmt.Errorf("rxOmciMessage too small for BaseFormat %s", oo.deviceID)
350 }
351 } else if rxMsg[cOmciDeviceIdentifierPos] == byte(omci.ExtendedIdent) {
352 if len(rxMsg) > 1980 {
353 logger.Errorw(ctx, "rxOmciMessage has wrong length for OmciExtendedFormat - abort",
354 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
355 oo.printRxMessage(ctx, rxMsg)
356 return fmt.Errorf("rxOmciMessage has wrong length for OmciExtendedFormat %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000357 }
358 } else {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000359 logger.Errorw(ctx, "rxOmciMessage has wrong Device Identifier - abort",
mpagenkoc8bba412021-01-15 15:38:44 +0000360 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000361 oo.printRxMessage(ctx, rxMsg)
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000362 return fmt.Errorf("rxOmciMessage has wrong Device Identifier %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000363 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000364 decodeOptions := gopacket.DecodeOptions{
365 Lazy: true,
366 NoCopy: true,
367 }
368 packet := gopacket.NewPacket(rxMsg, omci.LayerTypeOMCI, decodeOptions)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000369 if packet == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000370 logger.Errorw(ctx, "omci-message could not be decoded", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000371 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200372 return fmt.Errorf("could not decode rxMsg as OMCI %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000373 }
374 omciLayer := packet.Layer(omci.LayerTypeOMCI)
375 if omciLayer == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000376 logger.Errorw(ctx, "omci-message could not decode omci layer", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000377 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200378 return fmt.Errorf("could not decode omci layer %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000379 }
mpagenko836a1fd2021-11-01 16:12:42 +0000380 // insert some check on detected OMCI decoding issues and log them
381 // e.g. should indicate problems when detecting some unknown attribute mask content (independent from message type)
382 // even though allowed from omci-lib due to set relaxed decoding
383 // application may dig into further details if wanted/needed on their own [but info is not transferred from here so far]
384 // (compare mib_sync.go unknownAttrLayer)
385 errLayer := packet.Layer(gopacket.LayerTypeDecodeFailure)
386 if failure, decodeOk := errLayer.(*gopacket.DecodeFailure); decodeOk {
387 errMsg := failure.Error()
388 logger.Warnw(ctx, "Detected decode issue on received OMCI frame", log.Fields{
389 "device-id": oo.deviceID, "issue": errMsg})
390 }
391 //anyway try continue OMCI decoding further on message type layer
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000392 omciMsg, ok := omciLayer.(*omci.OMCI)
393 if !ok {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000394 logger.Errorw(ctx, "omci-message could not assign omci layer", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000395 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200396 return fmt.Errorf("could not assign omci layer %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000397 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000398 logger.Debugw(ctx, "omci-message-decoded:", log.Fields{"omciMsgType": omciMsg.MessageType,
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000399 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16),
400 "DeviceIdent": omciMsg.DeviceIdentifier, "device-id": oo.deviceID})
mpagenko836a1fd2021-11-01 16:12:42 +0000401
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700402 // TestResult is asynchronous indication that carries the same TID as the TestResponse.
403 // We expect to find the TID in the oo.rxSchedulerMap
404 if byte(omciMsg.MessageType)&me.AK == 0 && omciMsg.MessageType != omci.TestResultType {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000405 // Not a response
mpagenko80622a52021-02-09 16:53:23 +0000406 oo.printRxMessage(ctx, rxMsg)
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000407 logger.Debugw(ctx, "RxMsg is no Omci Response Message", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000408 if omciMsg.TransactionID == 0 {
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000409 if rxMsg[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
410 oo.incrementBaseRxNoAkFrames()
411 } else {
412 oo.incrementExtRxNoAkFrames()
413 }
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530414 return oo.receiveOnuMessage(ctx, omciMsg, &packet)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000415 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000416 logger.Errorw(ctx, "Unexpected TransCorrId != 0 not accepted for autonomous messages",
Andrea Campanella6515c582020-10-05 11:25:00 +0200417 log.Fields{"msgType": omciMsg.MessageType, "payload": hex.EncodeToString(omciMsg.Payload),
mpagenko8b07c1b2020-11-26 10:36:31 +0000418 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200419 return fmt.Errorf("autonomous Omci Message with TranSCorrId != 0 not acccepted %s", oo.deviceID)
Himani Chawla4d908332020-08-31 12:30:20 +0530420 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000421 //logger.Debug(ctx,"RxMsg is a Omci Response Message: try to schedule it to the requester")
Himani Chawla4d908332020-08-31 12:30:20 +0530422 oo.mutexRxSchedMap.Lock()
423 rxCallbackEntry, ok := oo.rxSchedulerMap[omciMsg.TransactionID]
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000424 if ok && rxCallbackEntry.CbFunction != nil {
Holger Hildebrandt68854a82022-09-05 07:00:21 +0000425
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000426 if rxCallbackEntry.FramePrint {
mpagenko80622a52021-02-09 16:53:23 +0000427 oo.printRxMessage(ctx, rxMsg)
428 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000429 if rxMsg[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
430 oo.incrementBaseRxAkFrames()
431 } else {
432 oo.incrementExtRxAkFrames()
433 }
Himani Chawla4d908332020-08-31 12:30:20 +0530434 //disadvantage of decoupling: error verification made difficult, but anyway the question is
435 // how to react on erroneous frame reception, maybe can simply be ignored
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530436 go func() {
437 _ = rxCallbackEntry.CbFunction(ctx, omciMsg, &packet, rxCallbackEntry.CbRespChannel)
438 }()
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000439 isSuccessfulResponse, err := oo.isSuccessfulResponseWithMibDataSync(ctx, omciMsg, &packet)
440 if err != nil {
441 // qualified error logging already done in function above
442 if !rxCallbackEntry.FramePrint {
443 oo.printRxMessage(ctx, rxMsg)
444 }
445 return fmt.Errorf("could not decode further layers %s", oo.deviceID)
446 }
447 if isSuccessfulResponse {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000448 oo.pOnuDeviceEntry.IncrementMibDataSync(ctx)
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000449 } else {
450 logger.Debugw(ctx, "mibDataSync counter not to be updated for this message type",
451 log.Fields{"omciMsg.MessageType": omciMsg.MessageType, "device-id": oo.deviceID})
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000452 }
mpagenkoc8bba412021-01-15 15:38:44 +0000453
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700454 // If omciMsg.MessageType is omci.TestResponseType, we still expect the TestResult OMCI message,
455 // so do not clean up the TransactionID in that case.
456 if omciMsg.MessageType != omci.TestResponseType {
457 // having posted the response the request is regarded as 'done'
458 delete(oo.rxSchedulerMap, omciMsg.TransactionID)
459 }
Himani Chawla4d908332020-08-31 12:30:20 +0530460 oo.mutexRxSchedMap.Unlock()
mpagenko80622a52021-02-09 16:53:23 +0000461 return nil
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000462 }
mpagenko80622a52021-02-09 16:53:23 +0000463 oo.mutexRxSchedMap.Unlock()
464 logger.Errorw(ctx, "omci-message-response for not registered transCorrId", log.Fields{"device-id": oo.deviceID})
465 oo.printRxMessage(ctx, rxMsg)
466 return fmt.Errorf("could not find registered response handler tor transCorrId %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000467
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000468 /* py code was:
469 Receive and OMCI message from the proxy channel to the OLT.
470
471 Call this from your ONU Adapter on a new OMCI Rx on the proxy channel
472 :param msg: (str) OMCI binary message (used as input to Scapy packet decoder)
473 """
474 if not self.enabled:
475 return
476
477 try:
478 now = arrow.utcnow()
479 d = None
480
481 # NOTE: Since we may need to do an independent ME map on a per-ONU basis
482 # save the current value of the entity_id_to_class_map, then
483 # replace it with our custom one before decode, and then finally
484 # restore it later. Tried other ways but really made the code messy.
485 saved_me_map = omci_entities.entity_id_to_class_map
486 omci_entities.entity_id_to_class_map = self._me_map
487
488 try:
489 rx_frame = msg if isinstance(msg, OmciFrame) else OmciFrame(msg)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000490 self.logger.debug('recv-omci-msg', omci_msg=hexlify(msg))
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000491 except KeyError as e:
492 # Unknown, Unsupported, or vendor-specific ME. Key is the unknown classID
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000493 self.logger.debug('frame-decode-key-error', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000494 rx_frame = self._decode_unknown_me(msg)
495 self._rx_unknown_me += 1
496
497 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000498 self.logger.exception('frame-decode', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000499 return
500
501 finally:
502 omci_entities.entity_id_to_class_map = saved_me_map # Always restore it.
503
504 rx_tid = rx_frame.fields['transaction_id']
505 msg_type = rx_frame.fields['message_type']
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000506 self.logger.debug('Received message for rx_tid', rx_tid = rx_tid, msg_type = msg_type)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000507 # Filter the Test Result frame and route through receive onu
508 # message method.
509 if rx_tid == 0 or msg_type == EntityOperations.TestResult.value:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000510 self.logger.debug('Receive ONU message', rx_tid=0)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000511 return self._receive_onu_message(rx_frame)
512
513 # Previously unreachable if this is the very first round-trip Rx or we
514 # have been running consecutive errors
515 if self._rx_frames == 0 or self._consecutive_errors != 0:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000516 self.logger.debug('Consecutive errors for rx', err = self._consecutive_errors)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000517 self.reactor.callLater(0, self._publish_connectivity_event, True)
518
519 self._rx_frames += 1
520 self._consecutive_errors = 0
521
522 try:
523 high_priority = self._tid_is_high_priority(rx_tid)
524 index = self._get_priority_index(high_priority)
525
526 # (timestamp, defer, frame, timeout, retry, delayedCall)
527 last_tx_tuple = self._tx_request[index]
528
529 if last_tx_tuple is None or \
530 last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id') != rx_tid:
531 # Possible late Rx on a message that timed-out
532 if last_tx_tuple:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000533 self.logger.debug('Unknown message', rx_tid=rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000534 tx_id=last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id'))
535 self._rx_unknown_tid += 1
536 self._rx_late += 1
537 return
538
539 ts, d, tx_frame, timeout, retry, dc = last_tx_tuple
540 if dc is not None and not dc.cancelled and not dc.called:
541 dc.cancel()
542
543 _secs = self._update_rx_tx_stats(now, ts)
544
545 # Late arrival already serviced by a timeout?
546 if d.called:
547 self._rx_late += 1
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000548 self.logger.debug('Serviced by timeout. Late arrival', rx_late = self._rx_late)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000549 return
550
551 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000552 self.logger.exception('frame-match', msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000553 if d is not None:
554 return d.errback(failure.Failure(e))
555 return
556
557 # Publish Rx event to listeners in a different task
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000558 self.logger.debug('Publish rx event', rx_tid = rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000559 tx_tid = tx_frame.fields['transaction_id'])
560 reactor.callLater(0, self._publish_rx_frame, tx_frame, rx_frame)
561
562 # begin success callback chain (will cancel timeout and queue next Tx message)
563 self._rx_response[index] = rx_frame
564 d.callback(rx_frame)
565
566 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000567 self.logger.exception('rx-msg', e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000568 */
569}
570
Himani Chawla6d2ae152020-09-02 13:11:20 +0530571/*
572func (oo *omciCC) publishRxResponseFrame(ctx context.Context, txFrame []byte, rxFrame []byte) error {
Himani Chawla4d908332020-08-31 12:30:20 +0530573 return errors.New("publishRxResponseFrame unimplemented")
Himani Chawla6d2ae152020-09-02 13:11:20 +0530574 //def _publish_rx_frame(self, tx_frame, rx_frame):
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000575}
Himani Chawla6d2ae152020-09-02 13:11:20 +0530576*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000577
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700578// ReleaseTid releases OMCI transaction identifier from rxSchedulerMap
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000579func (oo *OmciCC) ReleaseTid(ctx context.Context, tid uint16) {
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700580 logger.Debugw(ctx, "releasing tid from rxSchedulerMap", log.Fields{"tid": tid})
581 delete(oo.rxSchedulerMap, tid)
582}
583
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000584// Send - Queue the OMCI Frame for a transmit to the ONU via the proxy_channel
585func (oo *OmciCC) Send(ctx context.Context, txFrame []byte, timeout int, retry int, highPrio bool,
586 receiveCallbackPair CallbackPair) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000587
mpagenkoc26d4c02021-05-06 14:27:57 +0000588 if timeout != 0 {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000589 logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TransCorrId": receiveCallbackPair.CbKey})
mpagenkoc26d4c02021-05-06 14:27:57 +0000590 oo.mutexRxSchedMap.Lock()
591 // it could be checked, if the callback key is already registered - but simply overwrite may be acceptable ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000592 oo.rxSchedulerMap[receiveCallbackPair.CbKey] = receiveCallbackPair.CbEntry
mpagenkoc26d4c02021-05-06 14:27:57 +0000593 oo.mutexRxSchedMap.Unlock()
594 } //else timeout 0 indicates that no response is expected - fire and forget
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000595
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000596 printFrame := receiveCallbackPair.CbEntry.FramePrint //printFrame true means debug print of frame is requested
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000597 //just use a simple list for starting - might need some more effort, especially for multi source write access
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000598 omciTxRequest := OmciTransferStructure{
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530599 chSuccess: make(chan bool),
600 OnuSwWindow: nil,
601 cbPair: receiveCallbackPair,
602 txFrame: txFrame,
603 timeout: timeout,
604 retries: retry,
605 highPrio: highPrio,
606 withFramePrint: printFrame,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000607 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000608 oo.mutexMonReq.Lock()
609 defer oo.mutexMonReq.Unlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000610 if _, exist := oo.monitoredRequests[receiveCallbackPair.CbKey]; !exist {
mpagenko7455fd42021-06-10 16:25:55 +0000611 // do not call processRequestMonitoring in background here to ensure correct sequencing
612 // of requested messages into txQueue (especially for non-response-supervised messages)
613 oo.processRequestMonitoring(ctx, omciTxRequest)
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000614 return nil
615 }
616 logger.Errorw(ctx, "A message with this tid is processed already!",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000617 log.Fields{"tid": receiveCallbackPair.CbKey, "device-id": oo.deviceID})
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000618 return fmt.Errorf("message with tid is processed already %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000619}
620
Holger Hildebrandt34555512021-10-01 16:26:59 +0000621func (oo *OmciCC) sendQueuedRequests(ctx context.Context) {
622 // Avoid accessing the txQueues from parallel send routines to block
623 // parallel omci send requests at least until SendIAP is 'committed'.
624 // To guarantee window size 1 for one ONU it would be necessary to wait
625 // for the corresponding response too (t.b.d.).
626 oo.mutexSendQueuedRequests.Lock()
627 defer oo.mutexSendQueuedRequests.Unlock()
628 if err := oo.sendQueuedHighPrioRequests(ctx); err != nil {
629 logger.Errorw(ctx, "Error during sending high prio requests!",
630 log.Fields{"err": err, "device-id": oo.deviceID})
631 return
632 }
633 if err := oo.sendQueuedLowPrioRequests(ctx); err != nil {
634 logger.Errorw(ctx, "Error during sending low prio requests!",
635 log.Fields{"err": err, "device-id": oo.deviceID})
636 return
637 }
638}
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000639
Holger Hildebrandt34555512021-10-01 16:26:59 +0000640func (oo *OmciCC) sendQueuedHighPrioRequests(ctx context.Context) error {
641 oo.mutexHighPrioTxQueue.Lock()
642 defer oo.mutexHighPrioTxQueue.Unlock()
643 for oo.highPrioTxQueue.Len() > 0 {
balaji.nagarajan3cab2b62025-06-23 15:44:54 +0530644 select {
645 case _, ok := <-oo.pBaseDeviceHandler.GetDeviceDeleteCommChan(ctx):
646 if !ok {
647 return fmt.Errorf("device deletion channel is closed at sendQueuedHighPrioRequests %s", oo.deviceID)
648 }
649 default:
650 queueElement := oo.highPrioTxQueue.Front() // First element
651 if err := oo.sendOMCIRequest(ctx, queueElement.Value.(OmciTransferStructure)); err != nil {
652 // Element will be removed from the queue regardless of the send success, to prevent
653 // an accumulation of send requests for the same message in the event of an error.
654 // In this case, resend attempts for the message are ensured by our retry
655 // mechanism after omci-timeout.
656 oo.highPrioTxQueue.Remove(queueElement) // Dequeue
657 //Remove the call back from the rxSchedulerMap
658 oo.mutexRxSchedMap.Lock()
659 delete(oo.rxSchedulerMap, queueElement.Value.(OmciTransferStructure).cbPair.CbKey)
660 oo.mutexRxSchedMap.Unlock()
661 return err
662 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000663 oo.highPrioTxQueue.Remove(queueElement) // Dequeue
mpagenko80622a52021-02-09 16:53:23 +0000664 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000665 }
666 return nil
667}
668
669func (oo *OmciCC) sendQueuedLowPrioRequests(ctx context.Context) error {
670 oo.mutexLowPrioTxQueue.Lock()
671 for oo.lowPrioTxQueue.Len() > 0 {
balaji.nagarajan3cab2b62025-06-23 15:44:54 +0530672 select {
673 case _, ok := <-oo.pBaseDeviceHandler.GetDeviceDeleteCommChan(ctx):
674 if !ok {
kesavand011d5162021-11-25 19:21:06 +0530675 oo.mutexLowPrioTxQueue.Unlock()
balaji.nagarajan3cab2b62025-06-23 15:44:54 +0530676 return fmt.Errorf("device deletion channel is closed at sendQueuedLowPrioRequests %s", oo.deviceID)
677 }
678 default:
679 queueElement := oo.lowPrioTxQueue.Front() // First element
680 // check if the element is for onu sw section
681 aOmciTxReq := queueElement.Value.(OmciTransferStructure)
682 if aOmciTxReq.OnuSwWindow != nil {
683 if err := oo.sendOnuSwSectionsOfWindow(ctx, aOmciTxReq); err != nil {
684 // Element will be removed from the queue regardless of the send success, to prevent
685 // an accumulation of send requests for the same message in the event of an error.
686 // In this case, resend attempts for the message are ensured by our retry
687 // mechanism after omci-timeout.
688 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
689 oo.mutexLowPrioTxQueue.Unlock()
690 //Remove the call back from the rxSchedulerMap
691 oo.mutexRxSchedMap.Lock()
692 delete(oo.rxSchedulerMap, queueElement.Value.(OmciTransferStructure).cbPair.CbKey)
693 oo.mutexRxSchedMap.Unlock()
694 return err
695 }
696 } else {
697 err := oo.sendOMCIRequest(ctx, queueElement.Value.(OmciTransferStructure))
698 if err != nil {
699 // Element will be removed from the queue regardless of the send success, to prevent
700 // an accumulation of send requests for the same message in the event of an error.
701 // In this case, resend attempts for the message are ensured by our retry
702 // mechanism after omci-timeout.
703 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
704 oo.mutexLowPrioTxQueue.Unlock()
705 oo.mutexRxSchedMap.Lock()
706 delete(oo.rxSchedulerMap, queueElement.Value.(OmciTransferStructure).cbPair.CbKey)
707 oo.mutexRxSchedMap.Unlock()
708 return err
709 }
710 }
711 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
712 // Interrupt the sending of low priority requests to process any high priority requests
713 // that may have arrived in the meantime
714 oo.mutexLowPrioTxQueue.Unlock()
715 if err := oo.sendQueuedHighPrioRequests(ctx); err != nil {
kesavand011d5162021-11-25 19:21:06 +0530716 return err
717 }
balaji.nagarajan3cab2b62025-06-23 15:44:54 +0530718 oo.mutexLowPrioTxQueue.Lock()
amit.ghosh58b704b2021-06-18 03:45:52 +0200719 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000720 }
721
722 oo.mutexLowPrioTxQueue.Unlock()
723 return nil
724}
725
726func (oo *OmciCC) sendOMCIRequest(ctx context.Context, omciTxRequest OmciTransferStructure) error {
727 if omciTxRequest.withFramePrint {
728 logger.Debugw(ctx, "omci-message-to-send:", log.Fields{
729 "TxOmciMessage": hex.EncodeToString(omciTxRequest.txFrame),
730 "device-id": oo.deviceID,
731 "toDeviceType": oo.pBaseDeviceHandler.GetProxyAddressType(),
732 "proxyDeviceID": oo.pBaseDeviceHandler.GetProxyAddressID(),
733 "proxyAddress": oo.pBaseDeviceHandler.GetProxyAddress()})
734 }
khenaidoo42dcdfd2021-10-19 17:34:12 -0400735 omciMsg := &ia.OmciMessage{
Holger Hildebrandt34555512021-10-01 16:26:59 +0000736 ParentDeviceId: oo.pBaseDeviceHandler.GetProxyAddressID(),
737 ChildDeviceId: oo.deviceID,
738 Message: omciTxRequest.txFrame,
739 ProxyAddress: oo.pBaseDeviceHandler.GetProxyAddress(),
740 ConnectStatus: common.ConnectStatus_REACHABLE, // If we are sending OMCI messages means we are connected, else we should not be here
741 }
742 sendErr := oo.pBaseDeviceHandler.SendOMCIRequest(ctx, oo.pBaseDeviceHandler.GetProxyAddress().AdapterEndpoint, omciMsg)
743 if sendErr != nil {
Holger Hildebrandtabfef032022-02-25 12:40:20 +0000744 logger.Errorw(ctx, "send omci request error", log.Fields{"device-id": oo.deviceID, "ChildId": oo.deviceID, "error": sendErr})
Holger Hildebrandt34555512021-10-01 16:26:59 +0000745 return sendErr
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000746 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000747 if omciTxRequest.txFrame[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
748 oo.incrementBaseTxArFrames()
749 } else {
750 oo.incrementExtTxArFrames()
751 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000752 return nil
753}
754
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000755// GetNextTid - TODO: add comment
756func (oo *OmciCC) GetNextTid(highPriority bool) uint16 {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000757 var next uint16
758 if highPriority {
mpagenko900ee4b2020-10-12 11:56:34 +0000759 oo.mutexHpTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000760 next = oo.hpTid
Himani Chawla4d908332020-08-31 12:30:20 +0530761 oo.hpTid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000762 if oo.hpTid < 0x8000 {
763 oo.hpTid = 0x8000
764 }
mpagenko900ee4b2020-10-12 11:56:34 +0000765 oo.mutexHpTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000766 } else {
mpagenko900ee4b2020-10-12 11:56:34 +0000767 oo.mutexTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000768 next = oo.tid
Himani Chawla4d908332020-08-31 12:30:20 +0530769 oo.tid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000770 if oo.tid >= 0x8000 {
771 oo.tid = 1
772 }
mpagenko900ee4b2020-10-12 11:56:34 +0000773 oo.mutexTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000774 }
775 return next
776}
777
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530778// GetOnuSwSecNextTid get the next low prio tid for the onu sw sections
779// onu sw sections uses only low priority tids
780// The mutexTid lock should be taken prior to using this function
kesavand011d5162021-11-25 19:21:06 +0530781func (oo *OmciCC) GetOnuSwSecNextTid() uint16 {
kesavand011d5162021-11-25 19:21:06 +0530782 if oo.tid >= 0x8000 {
783 oo.tid = 1
784 }
bseenivad32c2742024-12-09 11:46:17 +0530785 next := oo.tid
786 oo.tid++
kesavand011d5162021-11-25 19:21:06 +0530787 return next
788}
789
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530790// GetOnuSwSecLastTid gets the last allocated tid
791// The mutexTid lock should be taken prior to using this function
kesavand011d5162021-11-25 19:21:06 +0530792func (oo *OmciCC) GetOnuSwSecLastTid() uint16 {
793 next := oo.tid
794 lastAllocatedTid := next - 1
795 return lastAllocatedTid
796}
797
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530798// LockMutexTID locks mutexTid
kesavand011d5162021-11-25 19:21:06 +0530799func (oo *OmciCC) LockMutexTID() {
800 oo.mutexTid.Lock()
801}
802
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530803// UnLockMutexTID unlocks mutexTid
kesavand011d5162021-11-25 19:21:06 +0530804func (oo *OmciCC) UnLockMutexTID() {
805 oo.mutexTid.Unlock()
806}
807
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000808// ###################################################################################
809// # utility methods provided to work on OMCI messages
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000810
811// Serialize - TODO: add comment
812func Serialize(ctx context.Context, msgType omci.MessageType, request gopacket.SerializableLayer, tid uint16) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000813 omciLayer := &omci.OMCI{
814 TransactionID: tid,
815 MessageType: msgType,
816 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000817 return SerializeOmciLayer(ctx, omciLayer, request)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000818}
819
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000820// SerializeOmciLayer - TODO: add comment
821func SerializeOmciLayer(ctx context.Context, aOmciLayer *omci.OMCI, aRequest gopacket.SerializableLayer) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000822 var options gopacket.SerializeOptions
823 options.FixLengths = true
824
825 buffer := gopacket.NewSerializeBuffer()
Himani Chawla4d908332020-08-31 12:30:20 +0530826 err := gopacket.SerializeLayers(buffer, options, aOmciLayer, aRequest)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000827 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000828 logger.Errorw(ctx, "Could not create goPacket Omci serial buffer", log.Fields{"Err": err})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000829 return nil, err
830 }
831 return buffer.Bytes(), nil
832}
833
Himani Chawla4d908332020-08-31 12:30:20 +0530834/*
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000835func hexEncode(omciPkt []byte) ([]byte, error) {
836 dst := make([]byte, hex.EncodedLen(len(omciPkt)))
837 hex.Encode(dst, omciPkt)
838 return dst, nil
839}
Himani Chawla4d908332020-08-31 12:30:20 +0530840*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000841
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530842// supply a response handler for omci response messages to be transferred to the requested FSM
mgoudad611f4c2025-10-30 14:49:27 +0530843func (oo *OmciCC) receiveOmciResponse(ctx context.Context, omciMsg *omci.OMCI, packet *gopacket.Packet, respChan chan Message) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000844
dbainbri4d3a0dc2020-12-02 00:33:42 +0000845 logger.Debugw(ctx, "omci-message-response - transfer on omciRespChannel", log.Fields{"omciMsgType": omciMsg.MessageType,
divyadesai4d299552020-08-18 07:13:49 +0000846 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000847
848 if oo.pOnuDeviceEntry == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000849 logger.Errorw(ctx, "Abort receiving OMCI response, DeviceEntryPointer is nil", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000850 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200851 return fmt.Errorf("deviceEntryPointer is nil %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000852 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000853 oo.mutexMonReq.RLock()
854 if _, exist := oo.monitoredRequests[omciMsg.TransactionID]; exist {
mpagenko8cd1bf72021-06-22 10:11:19 +0000855 //implement non-blocking channel send to avoid blocking on mutexMonReq later
856 select {
857 case oo.monitoredRequests[omciMsg.TransactionID].chSuccess <- true:
858 default:
859 logger.Debugw(ctx, "response not send on omciRespChannel (no receiver)", log.Fields{
860 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
861 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000862 } else {
863 logger.Infow(ctx, "reqMon: map entry does not exist!",
864 log.Fields{"tid": omciMsg.TransactionID, "device-id": oo.deviceID})
865 }
866 oo.mutexMonReq.RUnlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000867
868 // no further test on SeqNo is done here, assignment from rxScheduler is trusted
869 // MibSync responses are simply transferred via deviceEntry to MibSync, no specific analysis here
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000870 omciRespMsg := Message{
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000871 Type: OMCI,
872 Data: OmciMessage{
873 OmciMsg: omciMsg,
874 OmciPacket: packet,
875 },
876 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000877 //logger.Debugw(ctx,"Message to be sent into channel:", log.Fields{"mibSyncMsg": mibSyncMsg})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000878 respChan <- omciRespMsg
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000879
880 return nil
881}
882
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000883// SendMibReset sends MibResetRequest
884func (oo *OmciCC) SendMibReset(ctx context.Context, timeout int, highPrio bool) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000885
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530886 logger.Infow(ctx, "send MibReset-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000887 request := &omci.MibResetRequest{
888 MeBasePacket: omci.MeBasePacket{
889 EntityClass: me.OnuDataClassID,
890 },
891 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000892 tid := oo.GetNextTid(highPrio)
893 pkt, err := Serialize(ctx, omci.MibResetRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000894 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000895 logger.Errorw(ctx, "Cannot serialize MibResetRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000896 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000897 return err
898 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000899 omciRxCallbackPair := CallbackPair{
900 CbKey: tid,
901 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000902 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000903 return oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000904}
905
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000906// SendReboot sends RebootRequest
907func (oo *OmciCC) SendReboot(ctx context.Context, timeout int, highPrio bool, responseChannel chan Message) error {
908 logger.Debugw(ctx, "send reboot-msg to:", log.Fields{"device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300909 request := &omci.RebootRequest{
910 MeBasePacket: omci.MeBasePacket{
911 EntityClass: me.OnuGClassID,
912 },
913 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000914 tid := oo.GetNextTid(highPrio)
915 pkt, err := Serialize(ctx, omci.RebootRequestType, request, tid)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300916 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000917 logger.Errorw(ctx, "Cannot serialize RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000918 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300919 return err
920 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000921 omciRxCallbackPair := CallbackPair{
922 CbKey: tid,
923 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetOmciRebootMsgRevChan(), oo.receiveOmciResponse, true},
ozgecanetsiae11479f2020-07-06 09:44:47 +0300924 }
925
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000926 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300927 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000928 logger.Errorw(ctx, "Cannot send RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000929 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300930 return err
931 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000932 err = oo.pOnuDeviceEntry.WaitForRebootResponse(ctx, responseChannel)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300933 if err != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000934 logger.Errorw(ctx, "aborting ONU reboot!", log.Fields{
Andrea Campanella6515c582020-10-05 11:25:00 +0200935 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300936 return err
937 }
938 return nil
939}
940
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000941// SendMibUpload sends MibUploadRequest
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000942func (oo *OmciCC) SendMibUpload(ctx context.Context, timeout int, highPrio bool, isExtOmciSupported bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000943 logger.Debugw(ctx, "send MibUpload-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000944
945 tid := oo.GetNextTid(highPrio)
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000946
947 omciLayer := &omci.OMCI{
948 TransactionID: tid,
949 MessageType: omci.MibUploadRequestType,
950 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000951 if isExtOmciSupported {
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000952 omciLayer.DeviceIdentifier = omci.ExtendedIdent
953 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000954 request := &omci.MibUploadRequest{
955 MeBasePacket: omci.MeBasePacket{
956 EntityClass: me.OnuDataClassID,
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000957 Extended: isExtOmciSupported,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000958 },
959 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000960 var options gopacket.SerializeOptions
961 options.FixLengths = true
962
963 buffer := gopacket.NewSerializeBuffer()
964 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000965 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000966 logger.Errorw(ctx, "Cannot serialize MibUploadRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000967 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000968 return err
969 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000970 oo.UploadSequNo = 0
971 oo.UploadNoOfCmds = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000972
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000973 omciRxCallbackPair := CallbackPair{
974 CbKey: tid,
975 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000976 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000977 return oo.Send(ctx, buffer.Bytes(), timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000978}
979
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000980// SendMibUploadNext sends MibUploadNextRequest
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000981func (oo *OmciCC) SendMibUploadNext(ctx context.Context, timeout int, highPrio bool, isExtOmciSupported bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000982 logger.Debugw(ctx, "send MibUploadNext-msg to:", log.Fields{"device-id": oo.deviceID, "UploadSequNo": oo.UploadSequNo})
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000983
984 tid := oo.GetNextTid(highPrio)
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000985
986 omciLayer := &omci.OMCI{
987 TransactionID: tid,
988 MessageType: omci.MibUploadNextRequestType,
989 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000990 if isExtOmciSupported {
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000991 omciLayer.DeviceIdentifier = omci.ExtendedIdent
992 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000993 request := &omci.MibUploadNextRequest{
994 MeBasePacket: omci.MeBasePacket{
995 EntityClass: me.OnuDataClassID,
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000996 Extended: isExtOmciSupported,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000997 },
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000998 CommandSequenceNumber: oo.UploadSequNo,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000999 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +00001000 var options gopacket.SerializeOptions
1001 options.FixLengths = true
1002
1003 buffer := gopacket.NewSerializeBuffer()
1004 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001005 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001006 logger.Errorw(ctx, "Cannot serialize MibUploadNextRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001007 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001008 return err
1009 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001010 oo.UploadSequNo++
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001011
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001012 omciRxCallbackPair := CallbackPair{
1013 CbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001014 //frame printing for MibUpload frames disabled now per default to avoid log file abort situations (size/speed?)
1015 // if wanted, rx frame printing should be specifically done within the MibUpload FSM or controlled via extra parameter
1016 // compare also software upgrade download section handling
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001017 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001018 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +00001019 return oo.Send(ctx, buffer.Bytes(), timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001020}
1021
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001022// SendGetAllAlarm gets all alarm ME instances
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001023func (oo *OmciCC) SendGetAllAlarm(ctx context.Context, alarmRetreivalMode uint8, timeout int, highPrio bool, isExtendedOmci bool) error {
Himani Chawlad3dac422021-03-13 02:31:31 +05301024 logger.Debugw(ctx, "send GetAllAlarms-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001025
1026 tid := oo.GetNextTid(highPrio)
1027 omciLayer := &omci.OMCI{
1028 TransactionID: tid,
1029 MessageType: omci.GetAllAlarmsRequestType,
1030 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1031 }
1032 if isExtendedOmci {
1033 omciLayer.DeviceIdentifier = omci.ExtendedIdent
1034 }
Himani Chawlad3dac422021-03-13 02:31:31 +05301035 request := &omci.GetAllAlarmsRequest{
1036 MeBasePacket: omci.MeBasePacket{
1037 EntityClass: me.OnuDataClassID,
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001038 Extended: isExtendedOmci,
Himani Chawlad3dac422021-03-13 02:31:31 +05301039 },
1040 AlarmRetrievalMode: byte(alarmRetreivalMode),
1041 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001042 var options gopacket.SerializeOptions
1043 options.FixLengths = true
1044 buffer := gopacket.NewSerializeBuffer()
1045 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Himani Chawlad3dac422021-03-13 02:31:31 +05301046 if err != nil {
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001047 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsRequest", log.Fields{"Err": err,
1048 "device-id": oo.deviceID})
Himani Chawlad3dac422021-03-13 02:31:31 +05301049 return err
1050 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001051 outgoingPacket := buffer.Bytes()
1052
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001053 oo.pOnuAlarmManager.ResetAlarmUploadCounters()
Himani Chawlad3dac422021-03-13 02:31:31 +05301054
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001055 omciRxCallbackPair := CallbackPair{
1056 CbKey: tid,
1057 CbEntry: CallbackPairEntry{oo.pOnuAlarmManager.GetAlarmMgrEventChannel(), oo.receiveOmciResponse, true},
Himani Chawlad3dac422021-03-13 02:31:31 +05301058 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001059 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
1060 if err != nil {
1061 logger.Errorw(ctx, "Cannot send GetAllAlarmsRequest", log.Fields{"Err": err,
1062 "device-id": oo.deviceID})
1063 return err
1064 }
1065 logger.Debug(ctx, "send GetAllAlarmsRequest done")
1066 return nil
Himani Chawlad3dac422021-03-13 02:31:31 +05301067}
1068
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001069// SendGetAllAlarmNext gets next alarm ME instance
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001070func (oo *OmciCC) SendGetAllAlarmNext(ctx context.Context, timeout int, highPrio bool, isExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001071 alarmUploadSeqNo := oo.pOnuAlarmManager.GetAlarmUploadSeqNo()
1072 logger.Debugw(ctx, "send SendGetAllAlarmNext-msg to:", log.Fields{"device-id": oo.deviceID,
Himani Chawlad3dac422021-03-13 02:31:31 +05301073 "alarmUploadSeqNo": alarmUploadSeqNo})
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001074
1075 tid := oo.GetNextTid(highPrio)
1076 omciLayer := &omci.OMCI{
1077 TransactionID: tid,
1078 MessageType: omci.GetAllAlarmsNextRequestType,
1079 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1080 }
1081 if isExtendedOmci {
1082 omciLayer.DeviceIdentifier = omci.ExtendedIdent
1083 }
Himani Chawlad3dac422021-03-13 02:31:31 +05301084 request := &omci.GetAllAlarmsNextRequest{
1085 MeBasePacket: omci.MeBasePacket{
1086 EntityClass: me.OnuDataClassID,
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001087 Extended: isExtendedOmci,
Himani Chawlad3dac422021-03-13 02:31:31 +05301088 },
1089 CommandSequenceNumber: alarmUploadSeqNo,
1090 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001091 var options gopacket.SerializeOptions
1092 options.FixLengths = true
1093 buffer := gopacket.NewSerializeBuffer()
1094 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Himani Chawlad3dac422021-03-13 02:31:31 +05301095 if err != nil {
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001096 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsNextRequest", log.Fields{"Err": err,
1097 "device-id": oo.deviceID})
Himani Chawlad3dac422021-03-13 02:31:31 +05301098 return err
1099 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001100 outgoingPacket := buffer.Bytes()
1101
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001102 oo.pOnuAlarmManager.IncrementAlarmUploadSeqNo()
Himani Chawlad3dac422021-03-13 02:31:31 +05301103
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001104 omciRxCallbackPair := CallbackPair{
1105 CbKey: tid,
1106 CbEntry: CallbackPairEntry{oo.pOnuAlarmManager.GetAlarmMgrEventChannel(), oo.receiveOmciResponse, true},
Himani Chawlad3dac422021-03-13 02:31:31 +05301107 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001108 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
1109 if err != nil {
1110 logger.Errorw(ctx, "Cannot send GetAllAlarmsNextRequest", log.Fields{"Err": err,
1111 "device-id": oo.deviceID})
1112 return err
1113 }
1114 logger.Debug(ctx, "send GetAllAlarmsNextRequest done")
1115 return nil
Himani Chawlad3dac422021-03-13 02:31:31 +05301116}
1117
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001118// SendCreateGalEthernetProfile creates GalEthernetProfile ME instance
1119func (oo *OmciCC) SendCreateGalEthernetProfile(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1120 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001121 logger.Debugw(ctx, "send GalEnetProfile-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001122 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001123
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001124 meParams := me.ParamData{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001125 EntityID: GalEthernetEID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001126 Attributes: me.AttributeValueMap{me.GalEthernetProfile_MaximumGemPayloadSize: maxGemPayloadSize},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001127 }
1128 meInstance, omciErr := me.NewGalEthernetProfile(meParams)
1129 if omciErr.GetError() == nil {
1130 //all setByCreate parameters already set, no default option required ...
mpagenko836a1fd2021-11-01 16:12:42 +00001131 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001132 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001133 logger.Errorw(ctx, "Cannot encode GalEnetProfileInstance for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001134 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001135 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001136 }
1137
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001138 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001139 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001140 logger.Errorw(ctx, "Cannot serialize GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001141 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001142 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001143 }
1144
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001145 omciRxCallbackPair := CallbackPair{
1146 CbKey: tid,
1147 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001148 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001149 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001150 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001151 logger.Errorw(ctx, "Cannot send GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001152 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001153 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001154 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001155 logger.Debug(ctx, "send GalEnetProfile-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001156 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001157 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001158 logger.Errorw(ctx, "Cannot generate GalEnetProfileInstance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001159 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001160 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001161}
1162
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001163// SendSetOnu2g sets Onu2G ME instance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001164// might be needed to extend for parameter arguments, here just for setting the ConnectivityMode!!
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001165func (oo *OmciCC) SendSetOnu2g(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1166 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001167 logger.Debugw(ctx, "send ONU2-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001168 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001169
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001170 // ONU-G ME-ID is defined to be 0, but we could verify, if the ONU really supports the desired
1171 // connectivity mode 5 (in ConnCap)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001172 // By now we just use fix values to fire - this is anyway what the python adapter does
1173 // read ONU-2G from DB ???? //TODO!!!
1174 meParams := me.ParamData{
1175 EntityID: 0,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001176 Attributes: me.AttributeValueMap{me.Onu2G_CurrentConnectivityMode: connectivityModeValue},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001177 }
1178 meInstance, omciErr := me.NewOnu2G(meParams)
1179 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001180 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001181 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001182 logger.Errorw(ctx, "Cannot encode ONU2-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001183 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001184 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001185 }
1186
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001187 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001188 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001189 logger.Errorw(ctx, "Cannot serialize ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001190 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001191 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001192 }
1193
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001194 omciRxCallbackPair := CallbackPair{
1195 CbKey: tid,
1196 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001197 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001198 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001199 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001200 logger.Errorw(ctx, "Cannot send ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001201 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001202 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001203 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001204 logger.Debug(ctx, "send ONU2-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001205 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001206 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001207 logger.Errorw(ctx, "Cannot generate ONU2-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001208 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001209 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001210}
1211
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001212// SendCreateMBServiceProfile creates MacBridgeServiceProfile ME instance
1213func (oo *OmciCC) SendCreateMBServiceProfile(ctx context.Context,
1214 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1215 tid := oo.GetNextTid(highPrio)
1216 instID := MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001217 logger.Debugw(ctx, "send MBSP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001218 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001219
1220 meParams := me.ParamData{
1221 EntityID: instID,
1222 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001223 me.MacBridgeServiceProfile_Priority: 0x8000,
1224 me.MacBridgeServiceProfile_MaxAge: 20 * 256, //20s
1225 me.MacBridgeServiceProfile_HelloTime: 2 * 256, //2s
1226 me.MacBridgeServiceProfile_ForwardDelay: 15 * 256, //15s
1227 me.MacBridgeServiceProfile_DynamicFilteringAgeingTime: 0,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001228 },
1229 }
1230
1231 meInstance, omciErr := me.NewMacBridgeServiceProfile(meParams)
1232 if omciErr.GetError() == nil {
1233 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001234 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1235 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001236 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001237 logger.Errorw(ctx, "Cannot encode MBSP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001238 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001239 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001240 }
1241
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001242 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001243 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001244 logger.Errorw(ctx, "Cannot serialize MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001245 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001246 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001247 }
1248
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001249 omciRxCallbackPair := CallbackPair{
1250 CbKey: tid,
1251 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001252 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001253 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001254 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001255 logger.Errorw(ctx, "Cannot send MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001256 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001257 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001258 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001259 logger.Debug(ctx, "send MBSP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001260 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001261 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001262 logger.Errorw(ctx, "Cannot generate MBSP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001263 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001264 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001265}
1266
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001267// SendCreateMBPConfigDataUniSide creates MacBridgePortConfigurationData ME instance
1268func (oo *OmciCC) SendCreateMBPConfigDataUniSide(ctx context.Context,
1269 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1270 tid := oo.GetNextTid(highPrio)
1271 instID, idErr := GenerateUNISideMBPCDEID(uint16(aPUniPort.MacBpNo))
Mahir Gunyel6781f962021-05-16 23:30:08 -07001272 if idErr != nil {
1273 logger.Errorw(ctx, "Cannot generate MBPCD entity id", log.Fields{
1274 "Err": idErr, "device-id": oo.deviceID})
1275 return nil, idErr
1276 }
1277 logger.Debugw(ctx, "send MBPCD-Create-msg for uni side:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001278 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16), "macBpNo": aPUniPort.MacBpNo})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001279
1280 meParams := me.ParamData{
1281 EntityID: instID,
1282 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001283 me.MacBridgePortConfigurationData_BridgeIdPointer: MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo),
1284 me.MacBridgePortConfigurationData_PortNum: aPUniPort.MacBpNo,
1285 me.MacBridgePortConfigurationData_TpType: uint8(aPUniPort.PortType),
1286 me.MacBridgePortConfigurationData_TpPointer: aPUniPort.EntityID,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001287 },
1288 }
1289 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
1290 if omciErr.GetError() == nil {
1291 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001292 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1293 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001294 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001295 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001296 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001297 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001298 }
1299
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001300 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001301 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001302 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001303 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001304 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001305 }
1306
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001307 omciRxCallbackPair := CallbackPair{
1308 CbKey: tid,
1309 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001310 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001311 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001312 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001313 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001314 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001315 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001316 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001317 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001318 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001319 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001320 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001321 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001322 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001323}
1324
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001325// SendCreateEVTOConfigData creates ExtendedVlanTaggingOperationConfigurationData ME instance
1326func (oo *OmciCC) SendCreateEVTOConfigData(ctx context.Context,
1327 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1328 tid := oo.GetNextTid(highPrio)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001329 //same entityId is used as for MBSP (see there), but just arbitrary ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001330 instID := MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001331 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001332 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001333
1334 // compare python adapter code WA VOL-1311: this is not done here!
1335 // (setting TPID values for the create would probably anyway be ignored by the omci lib)
1336 // but perhaps we have to be aware of possible problems at get(Next) Request handling for EVTOOCD tables later ...
1337 assType := uint8(2) // default AssociationType is PPTPEthUni
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001338 if aPUniPort.PortType == UniVEIP {
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001339 assType = uint8(10) // for VEIP
1340 }
1341 meParams := me.ParamData{
1342 EntityID: instID,
1343 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001344 me.ExtendedVlanTaggingOperationConfigurationData_AssociationType: assType,
1345 me.ExtendedVlanTaggingOperationConfigurationData_AssociatedMePointer: aPUniPort.EntityID,
mpagenko836a1fd2021-11-01 16:12:42 +00001346 //EnhancedMode not yet supported, used with default options
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001347 },
1348 }
1349 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(meParams)
1350 if omciErr.GetError() == nil {
1351 //all setByCreate parameters already set, no default option required ...
mpagenko836a1fd2021-11-01 16:12:42 +00001352 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1353 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001354 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001355 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001356 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001357 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001358 }
1359
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001360 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001361 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001362 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001363 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001364 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001365 }
1366
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001367 omciRxCallbackPair := CallbackPair{
1368 CbKey: tid,
1369 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001370 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001371 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001372 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001373 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001374 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001375 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001376 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001377 logger.Debug(ctx, "send EVTOCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001378 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001379 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001380 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001381 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001382 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001383}
1384
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001385// SendSetOnuGLS sets OnuG ME instance
1386func (oo *OmciCC) SendSetOnuGLS(ctx context.Context, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001387 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001388 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001389 logger.Debugw(ctx, "send ONU-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001390 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001391
1392 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1393 meParams := me.ParamData{
1394 EntityID: 0,
1395 Attributes: requestedAttributes,
1396 }
1397 meInstance, omciErr := me.NewOnuG(meParams)
1398 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001399 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001400 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001401 logger.Errorw(ctx, "Cannot encode ONU-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001402 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001403 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001404 }
1405
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001406 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001407 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001408 logger.Errorw(ctx, "Cannot serialize ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001409 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001410 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001411 }
1412
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001413 omciRxCallbackPair := CallbackPair{
1414 CbKey: tid,
1415 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001416 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001417 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001418 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001419 logger.Errorw(ctx, "Cannot send ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001420 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001421 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001422 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001423 logger.Debug(ctx, "send ONU-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001424 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001425 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001426 logger.Errorw(ctx, "Cannot generate ONU-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001427 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001428 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001429}
1430
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001431// SendSetPptpEthUniLS sets PhysicalPathTerminationPointEthernetUni ME instance
1432func (oo *OmciCC) SendSetPptpEthUniLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001433 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001434 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001435 logger.Debugw(ctx, "send PPTPEthUni-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001436 "SequNo": strconv.FormatInt(int64(tid), 16)})
1437
1438 // PPTPEthUni ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1439 meParams := me.ParamData{
1440 EntityID: aInstNo,
1441 Attributes: requestedAttributes,
1442 }
1443 meInstance, omciErr := me.NewPhysicalPathTerminationPointEthernetUni(meParams)
1444 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001445 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001446 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001447 logger.Errorw(ctx, "Cannot encode PPTPEthUni instance for set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001448 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001449 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001450 }
1451
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001452 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001453 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001454 logger.Errorw(ctx, "Cannot serialize PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001455 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001456 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001457 }
1458
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001459 omciRxCallbackPair := CallbackPair{
1460 CbKey: tid,
1461 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001462 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001463 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001464 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001465 logger.Errorw(ctx, "Cannot send PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001466 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001467 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001468 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001469 logger.Debug(ctx, "send PPTPEthUni-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001470 return meInstance, nil
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001471 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001472 logger.Errorw(ctx, "Cannot generate PPTPEthUni", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001473 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001474 return nil, omciErr.GetError()
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001475}
1476
1477/* UniG obsolete by now, left here in case it should be needed once again
1478 UniG AdminState anyway should be ignored by ONU acc. to G988
Himani Chawla6d2ae152020-09-02 13:11:20 +05301479func (oo *omciCC) sendSetUniGLS(ctx context.Context, aInstNo uint16, timeout int,
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001480 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) *me.ManagedEntity {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001481 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001482 logger.Debugw(ctx,"send UNI-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001483 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001484
1485 // UNI-G ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1486 meParams := me.ParamData{
1487 EntityID: aInstNo,
1488 Attributes: requestedAttributes,
1489 }
1490 meInstance, omciErr := me.NewUniG(meParams)
1491 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001492 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001493 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001494 logger.Errorw(ctx,"Cannot encode UNI-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001495 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001496 return nil
1497 }
1498
1499 pkt, err := serializeOmciLayer(omciLayer, msgLayer)
1500 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001501 logger.Errorw(ctx,"Cannot serialize UNI-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001502 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001503 return nil
1504 }
1505
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001506 omciRxCallbackPair := CallbackPair{
1507 CbKey: tid,
1508 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001509 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001510 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001511 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001512 logger.Errorw(ctx,"Cannot send UNIG-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001513 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001514 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001515 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001516 logger.Debug(ctx,"send UNI-G-Set-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001517 return meInstance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001518 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001519 logger.Errorw(ctx,"Cannot generate UNI-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001520 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001521 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001522}
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001523*/
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001524
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001525// SendSetVeipLS sets VirtualEthernetInterfacePoint ME instance
1526func (oo *OmciCC) SendSetVeipLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001527 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001528 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001529 logger.Debugw(ctx, "send VEIP-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001530 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001531
1532 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1533 meParams := me.ParamData{
1534 EntityID: aInstNo,
1535 Attributes: requestedAttributes,
1536 }
1537 meInstance, omciErr := me.NewVirtualEthernetInterfacePoint(meParams)
1538 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001539 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001540 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001541 logger.Errorw(ctx, "Cannot encode VEIP instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001542 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001543 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001544 }
1545
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001546 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001547 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001548 logger.Errorw(ctx, "Cannot serialize VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001549 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001550 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001551 }
1552
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001553 omciRxCallbackPair := CallbackPair{
1554 CbKey: tid,
1555 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001556 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001557 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001558 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001559 logger.Errorw(ctx, "Cannot send VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001560 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001561 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001562 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001563 logger.Debug(ctx, "send VEIP-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001564 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001565 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001566 logger.Errorw(ctx, "Cannot generate VEIP", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001567 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001568 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001569}
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001570
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001571// SendGetMe gets ME instance
1572func (oo *OmciCC) SendGetMe(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributes me.AttributeValueMap,
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001573 timeout int, highPrio bool, rxChan chan Message, isExtendedOmci bool) (*me.ManagedEntity, error) {
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001574
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001575 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001576 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001577 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001578
1579 meParams := me.ParamData{
1580 EntityID: entityID,
1581 Attributes: requestedAttributes,
1582 }
mgoudad611f4c2025-10-30 14:49:27 +05301583 var messageSet = omci.BaselineIdent
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001584 if isExtendedOmci {
1585 messageSet = omci.ExtendedIdent
1586 }
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001587 meInstance, omciErr := me.LoadManagedEntityDefinition(classID, meParams)
1588 if omciErr.GetError() == nil {
Himani Chawla4d908332020-08-31 12:30:20 +05301589 meClassIDName := meInstance.GetName()
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001590 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.GetRequestType, oframe.TransactionID(tid), oframe.FrameFormat(messageSet))
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001591 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001592 logger.Errorf(ctx, "Cannot encode instance for get-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001593 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001594 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001595 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001596 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001597 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001598 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001599 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001600 omciRxCallbackPair := CallbackPair{
1601 CbKey: tid,
1602 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001603 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001604 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001605 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001606 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001607 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001608 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001609 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": meClassIDName, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001610 return meInstance, nil
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001611 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001612 logger.Errorw(ctx, "Cannot generate meDefinition", log.Fields{"classID": classID, "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001613 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001614}
1615
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001616// SendGetMeWithAttributeMask gets ME instance with attribute mask
1617func (oo *OmciCC) SendGetMeWithAttributeMask(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributesMask uint16,
Himani Chawla43f95ff2021-06-03 00:24:12 +05301618 timeout int, highPrio bool, rxChan chan Message) error {
1619
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001620 tid := oo.GetNextTid(highPrio)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301621 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
1622 "SequNo": strconv.FormatInt(int64(tid), 16)})
1623
1624 request := &omci.GetRequest{
1625 MeBasePacket: omci.MeBasePacket{
1626 EntityInstance: entityID,
1627 EntityClass: classID,
1628 },
1629 AttributeMask: requestedAttributesMask,
1630 }
1631
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001632 pkt, err := Serialize(ctx, omci.GetRequestType, request, tid)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301633 if err != nil {
1634 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1635 return err
1636 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001637 omciRxCallbackPair := CallbackPair{
1638 CbKey: tid,
1639 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Himani Chawla43f95ff2021-06-03 00:24:12 +05301640 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001641 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301642 if err != nil {
1643 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1644 return err
1645 }
1646 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": classID, "device-id": oo.deviceID})
1647 return nil
1648}
1649
pnalmas6d6b7d72025-10-23 16:34:22 +05301650// SendGetCurrentDataME gets current performance monitoring data from ME instance
1651func (oo *OmciCC) SendGetCurrentDataME(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributes me.AttributeValueMap,
1652 timeout int, highPrio bool, rxChan chan Message, isExtendedOmci bool) (*me.ManagedEntity, error) {
1653
1654 tid := oo.GetNextTid(highPrio)
1655 logger.Debugw(ctx, "send get-current-data-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
1656 "SequNo": strconv.FormatInt(int64(tid), 16)})
1657
1658 meParams := me.ParamData{
1659 EntityID: entityID,
1660 Attributes: requestedAttributes,
1661 }
1662 var messageSet = omci.BaselineIdent
1663 if isExtendedOmci {
1664 messageSet = omci.ExtendedIdent
1665 }
1666 meInstance, omciErr := me.LoadManagedEntityDefinition(classID, meParams)
1667 if omciErr.GetError() == nil {
1668 meClassIDName := meInstance.GetName()
1669 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.GetCurrentDataRequestType, oframe.TransactionID(tid), oframe.FrameFormat(messageSet))
1670 if err != nil {
1671 logger.Errorf(ctx, "Cannot encode instance for get-current-data-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
1672 return nil, err
1673 }
1674 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
1675 if err != nil {
1676 logger.Errorw(ctx, "Cannot serialize get-current-data-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
1677 return nil, err
1678 }
1679 omciRxCallbackPair := CallbackPair{
1680 CbKey: tid,
1681 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
1682 }
1683 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
1684 if err != nil {
1685 logger.Errorw(ctx, "Cannot send get-current-data-request-msg", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
1686 return nil, err
1687 }
1688 logger.Debugw(ctx, "send get-current-data-request-msg done", log.Fields{"meClassIDName": meClassIDName, "device-id": oo.deviceID})
1689 return meInstance, nil
1690 }
1691 logger.Errorw(ctx, "Cannot generate meDefinition", log.Fields{"classID": classID, "Err": omciErr.GetError(), "device-id": oo.deviceID})
1692 return nil, omciErr.GetError()
1693}
1694
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001695// SendCreateDot1PMapper creates Ieee8021PMapperServiceProfile ME instance
1696func (oo *OmciCC) SendCreateDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001697 aInstID uint16, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001698 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001699 logger.Debugw(ctx, "send .1pMapper-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001700 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(aInstID), 16)})
1701
1702 meParams := me.ParamData{
mpagenko8b5fdd22020-12-17 17:58:32 +00001703 EntityID: aInstID,
1704 Attributes: me.AttributeValueMap{
1705 //workaround for unsuitable omci-lib default values, cmp VOL-3729
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001706 me.Ieee8021PMapperServiceProfile_TpPointer: 0xFFFF,
1707 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority0: 0xFFFF,
1708 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority1: 0xFFFF,
1709 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority2: 0xFFFF,
1710 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority3: 0xFFFF,
1711 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority4: 0xFFFF,
1712 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority5: 0xFFFF,
1713 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority6: 0xFFFF,
1714 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority7: 0xFFFF,
mpagenko8b5fdd22020-12-17 17:58:32 +00001715 },
mpagenko3dbcdd22020-07-22 07:38:45 +00001716 }
1717 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
1718 if omciErr.GetError() == nil {
1719 //we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001720 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1721 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001722 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001723 logger.Errorw(ctx, "Cannot encode .1pMapper for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001724 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001725 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001726 }
1727
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001728 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001729 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001730 logger.Errorw(ctx, "Cannot serialize .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001731 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001732 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001733 }
1734
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001735 omciRxCallbackPair := CallbackPair{
1736 CbKey: tid,
1737 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001738 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001739 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001740 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001741 logger.Errorw(ctx, "Cannot send .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001742 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001743 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001744 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001745 logger.Debug(ctx, "send .1pMapper-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001746 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001747 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001748 logger.Errorw(ctx, "Cannot generate .1pMapper", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001749 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001750 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001751}
1752
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001753// SendCreateMBPConfigDataVar creates MacBridgePortConfigurationData ME instance
1754func (oo *OmciCC) SendCreateMBPConfigDataVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001755 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001756 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001757 logger.Debugw(ctx, "send MBPCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001758 "SequNo": strconv.FormatInt(int64(tid), 16),
1759 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1760
1761 meInstance, omciErr := me.NewMacBridgePortConfigurationData(params[0])
1762 if omciErr.GetError() == nil {
1763 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001764 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1765 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001766 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001767 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001768 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001769 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001770 }
1771
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001772 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001773 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001774 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001775 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001776 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001777 }
1778
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001779 omciRxCallbackPair := CallbackPair{
1780 CbKey: tid,
1781 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001782 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001783 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001784 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001785 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001786 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001787 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001788 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001789 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001790 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001791 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001792 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001793 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001794 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001795}
1796
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001797// SendCreateGemNCTPVar creates GemPortNetworkCtp ME instance
1798func (oo *OmciCC) SendCreateGemNCTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001799 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001800 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001801 logger.Debugw(ctx, "send GemNCTP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001802 "SequNo": strconv.FormatInt(int64(tid), 16),
1803 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1804
1805 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1806 if omciErr.GetError() == nil {
1807 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001808 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1809 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001810 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001811 logger.Errorw(ctx, "Cannot encode GemNCTP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001812 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001813 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001814 }
1815
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001816 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001817 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001818 logger.Errorw(ctx, "Cannot serialize GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001819 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001820 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001821 }
1822
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001823 omciRxCallbackPair := CallbackPair{
1824 CbKey: tid,
1825 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001826 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001827 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001828 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001829 logger.Errorw(ctx, "Cannot send GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001830 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001831 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001832 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001833 logger.Debug(ctx, "send GemNCTP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001834 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001835 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001836 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001837 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001838 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001839}
1840
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001841// SendSetGemNCTPVar sets GemPortNetworkCtp ME instance
1842func (oo *OmciCC) SendSetGemNCTPVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
1843 tid := oo.GetNextTid(highPrio)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001844 logger.Debugw(ctx, "send GemNCTP-Set-msg:", log.Fields{"device-id": oo.deviceID,
1845 "SequNo": strconv.FormatInt(int64(tid), 16),
1846 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1847
1848 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1849 if omciErr.GetError() == nil {
1850 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001851 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType,
1852 oframe.TransactionID(tid), oframe.AddDefaults(true))
ozgecanetsia82b91a62021-05-21 18:54:49 +03001853 if err != nil {
1854 logger.Errorw(ctx, "Cannot encode GemNCTP for set", log.Fields{
1855 "Err": err, "device-id": oo.deviceID})
1856 return nil, err
1857 }
1858
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001859 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001860 if err != nil {
1861 logger.Errorw(ctx, "Cannot serialize GemNCTP set", log.Fields{
1862 "Err": err, "device-id": oo.deviceID})
1863 return nil, err
1864 }
1865
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001866 omciRxCallbackPair := CallbackPair{
1867 CbKey: tid,
1868 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia82b91a62021-05-21 18:54:49 +03001869 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001870 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001871 if err != nil {
1872 logger.Errorw(ctx, "Cannot send GemNCTP set", log.Fields{
1873 "Err": err, "device-id": oo.deviceID})
1874 return nil, err
1875 }
1876 logger.Debug(ctx, "send GemNCTP-Set-msg done", log.Fields{"device-id": oo.deviceID})
1877 return meInstance, nil
1878 }
1879 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
1880 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1881 return nil, omciErr.GetError()
1882}
1883
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001884// SendCreateGemIWTPVar creates GemInterworkingTerminationPoint ME instance
1885func (oo *OmciCC) SendCreateGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001886 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001887 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001888 logger.Debugw(ctx, "send GemIwTp-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001889 "SequNo": strconv.FormatInt(int64(tid), 16),
1890 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1891
1892 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(params[0])
1893 if omciErr.GetError() == nil {
1894 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
mpagenko836a1fd2021-11-01 16:12:42 +00001895 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1896 oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001897 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001898 logger.Errorw(ctx, "Cannot encode GemIwTp for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001899 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001900 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001901 }
1902
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001903 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001904 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001905 logger.Errorw(ctx, "Cannot serialize GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001906 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001907 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001908 }
1909
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001910 omciRxCallbackPair := CallbackPair{
1911 CbKey: tid,
1912 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001913 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001914 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001915 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001916 logger.Errorw(ctx, "Cannot send GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001917 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001918 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001919 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001920 logger.Debug(ctx, "send GemIwTp-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001921 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001922 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001923 logger.Errorw(ctx, "Cannot generate GemIwTp Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001924 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001925 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001926}
1927
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001928// SendSetTcontVar sets TCont ME instance
1929func (oo *OmciCC) SendSetTcontVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001930 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001931 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001932 logger.Debugw(ctx, "send TCont-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001933 "SequNo": strconv.FormatInt(int64(tid), 16),
1934 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1935
1936 meInstance, omciErr := me.NewTCont(params[0])
1937 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001938 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001939 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001940 logger.Errorw(ctx, "Cannot encode TCont for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001941 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001942 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001943 }
1944
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001945 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001946 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001947 logger.Errorw(ctx, "Cannot serialize TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001948 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001949 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001950 }
1951
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001952 omciRxCallbackPair := CallbackPair{
1953 CbKey: tid,
1954 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001955 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001956 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001957 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001958 logger.Errorw(ctx, "Cannot send TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001959 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001960 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001961 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001962 logger.Debug(ctx, "send TCont-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001963 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001964 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001965 logger.Errorw(ctx, "Cannot generate TCont Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001966 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001967 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001968}
1969
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001970// SendSetPrioQueueVar sets PriorityQueue ME instance
1971func (oo *OmciCC) SendSetPrioQueueVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001972 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001973 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001974 logger.Debugw(ctx, "send PrioQueue-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001975 "SequNo": strconv.FormatInt(int64(tid), 16),
1976 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1977
1978 meInstance, omciErr := me.NewPriorityQueue(params[0])
1979 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001980 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001981 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001982 logger.Errorw(ctx, "Cannot encode PrioQueue for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001983 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001984 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001985 }
1986
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001987 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001988 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001989 logger.Errorw(ctx, "Cannot serialize PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001990 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001991 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001992 }
1993
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001994 omciRxCallbackPair := CallbackPair{
1995 CbKey: tid,
1996 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001997 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001998 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001999 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002000 logger.Errorw(ctx, "Cannot send PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00002001 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002002 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00002003 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002004 logger.Debug(ctx, "send PrioQueue-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002005 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00002006 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002007 logger.Errorw(ctx, "Cannot generate PrioQueue Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00002008 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002009 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00002010}
2011
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002012// SendSetDot1PMapperVar sets Ieee8021PMapperServiceProfile ME instance
2013func (oo *OmciCC) SendSetDot1PMapperVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002014 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002015 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002016 logger.Debugw(ctx, "send 1PMapper-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00002017 "SequNo": strconv.FormatInt(int64(tid), 16),
2018 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2019
2020 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(params[0])
2021 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002022 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00002023 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002024 logger.Errorw(ctx, "Cannot encode 1PMapper for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00002025 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002026 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00002027 }
2028
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002029 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00002030 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002031 logger.Errorw(ctx, "Cannot serialize 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00002032 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002033 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00002034 }
2035
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002036 omciRxCallbackPair := CallbackPair{
2037 CbKey: tid,
2038 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00002039 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002040 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00002041 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002042 logger.Errorw(ctx, "Cannot send 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00002043 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002044 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00002045 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002046 logger.Debug(ctx, "send 1PMapper-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002047 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00002048 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002049 logger.Errorw(ctx, "Cannot generate 1PMapper Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00002050 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002051 return nil, omciErr.GetError()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00002052}
mpagenkodff5dda2020-08-28 11:52:01 +00002053
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002054// SendCreateVtfdVar creates VlanTaggingFilterData ME instance
2055func (oo *OmciCC) SendCreateVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002056 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002057 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002058 logger.Debugw(ctx, "send VTFD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002059 "SequNo": strconv.FormatInt(int64(tid), 16),
2060 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2061
2062 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
2063 if omciErr.GetError() == nil {
2064 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
mpagenko836a1fd2021-11-01 16:12:42 +00002065 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
2066 oframe.TransactionID(tid))
mpagenkodff5dda2020-08-28 11:52:01 +00002067 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002068 logger.Errorw(ctx, "Cannot encode VTFD for create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002069 "Err": err, "device-id": oo.deviceID})
2070 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2071 // return (dual format) error code that can be used at caller for immediate error treatment
2072 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002073 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002074 }
2075
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002076 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00002077 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002078 logger.Errorw(ctx, "Cannot serialize VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002079 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002080 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002081 }
2082
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002083 omciRxCallbackPair := CallbackPair{
2084 CbKey: tid,
2085 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00002086 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002087 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00002088 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002089 logger.Errorw(ctx, "Cannot send VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002090 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002091 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002092 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002093 logger.Debug(ctx, "send VTFD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002094 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00002095 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002096 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002097 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002098 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00002099}
2100
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002101// nolint: unused
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002102func (oo *OmciCC) sendSetVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002103 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002104 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002105 logger.Debugw(ctx, "send VTFD-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002106 "SequNo": strconv.FormatInt(int64(tid), 16),
2107 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2108
2109 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
2110 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002111 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType,
2112 oframe.TransactionID(tid))
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002113 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002114 logger.Errorw(ctx, "Cannot encode VTFD for set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002115 "Err": err, "device-id": oo.deviceID})
2116 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2117 // return (dual format) error code that can be used at caller for immediate error treatment
2118 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002119 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002120 }
2121
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002122 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002123 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002124 logger.Errorw(ctx, "Cannot serialize VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002125 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002126 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002127 }
2128
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002129 omciRxCallbackPair := CallbackPair{
2130 CbKey: tid,
2131 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002132 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002133 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002134 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002135 logger.Errorw(ctx, "Cannot send VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002136 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002137 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002138 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002139 logger.Debug(ctx, "send VTFD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002140 return meInstance, nil
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002141 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002142 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002143 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002144 return nil, omciErr.GetError()
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002145}
2146
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002147// SendCreateEvtocdVar creates ExtendedVlanTaggingOperationConfigurationData ME instance
2148func (oo *OmciCC) SendCreateEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002149 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002150 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002151 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002152 "SequNo": strconv.FormatInt(int64(tid), 16),
2153 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2154
2155 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2156 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002157 //EnhancedMode not yet supported, used with default options
2158 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
2159 oframe.TransactionID(tid), oframe.AddDefaults(true))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002160 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002161 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002162 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002163 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002164 }
2165
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002166 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002167 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002168 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002169 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002170 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002171 }
2172
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002173 omciRxCallbackPair := CallbackPair{
2174 CbKey: tid,
2175 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002176 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002177 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002178 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002179 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002180 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002181 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002182 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002183 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002184 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002185 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002186 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002187 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002188 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002189}
2190
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002191// SendSetEvtocdVar sets ExtendedVlanTaggingOperationConfigurationData ME instance
2192func (oo *OmciCC) SendSetEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002193 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002194 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002195 logger.Debugw(ctx, "send EVTOCD-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002196 "SequNo": strconv.FormatInt(int64(tid), 16),
2197 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2198
2199 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2200 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002201 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenkodff5dda2020-08-28 11:52:01 +00002202 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002203 logger.Errorw(ctx, "Cannot encode EVTOCD for set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002204 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002205 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002206 }
2207
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002208 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00002209 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002210 logger.Errorw(ctx, "Cannot serialize EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002211 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002212 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002213 }
2214
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002215 omciRxCallbackPair := CallbackPair{
2216 CbKey: tid,
2217 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00002218 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002219 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00002220 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002221 logger.Errorw(ctx, "Cannot send EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002222 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002223 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002224 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002225 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002226 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00002227 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002228 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002229 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002230 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00002231}
mpagenko01e726e2020-10-23 09:45:29 +00002232
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002233// SendDeleteEvtocd deletes ExtendedVlanTaggingOperationConfigurationData ME instance
2234func (oo *OmciCC) SendDeleteEvtocd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002235 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002236 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002237 logger.Debugw(ctx, "send EVTOCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002238 "SequNo": strconv.FormatInt(int64(tid), 16),
2239 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2240
2241 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2242 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002243 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002244 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002245 logger.Errorw(ctx, "Cannot encode EVTOCD for delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002246 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002247 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002248 }
2249
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002250 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002251 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002252 logger.Errorw(ctx, "Cannot serialize EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002253 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002254 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002255 }
2256
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002257 omciRxCallbackPair := CallbackPair{
2258 CbKey: tid,
2259 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002260 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002261 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002262 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002263 logger.Errorw(ctx, "Cannot send EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002264 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002265 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002266 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002267 logger.Debug(ctx, "send EVTOCD-delete msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002268 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002269 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002270 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002271 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002272 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002273}
2274
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002275// SendDeleteVtfd deletes VlanTaggingFilterData ME instance
2276func (oo *OmciCC) SendDeleteVtfd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002277 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002278 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002279 logger.Debugw(ctx, "send VTFD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko01e726e2020-10-23 09:45:29 +00002280 "SequNo": strconv.FormatInt(int64(tid), 16),
2281 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2282
2283 meParams := me.ParamData{EntityID: aInstID}
2284 meInstance, omciErr := me.NewVlanTaggingFilterData(meParams)
2285 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002286 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2287 oframe.TransactionID(tid))
mpagenko01e726e2020-10-23 09:45:29 +00002288 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002289 logger.Errorw(ctx, "Cannot encode VTFD for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002290 "Err": err, "device-id": oo.deviceID})
2291 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2292 // return (dual format) error code that can be used at caller for immediate error treatment
2293 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002294 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002295 }
2296
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002297 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko01e726e2020-10-23 09:45:29 +00002298 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002299 logger.Errorw(ctx, "Cannot serialize VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002300 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002301 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002302 }
2303
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002304 omciRxCallbackPair := CallbackPair{
2305 CbKey: tid,
2306 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko01e726e2020-10-23 09:45:29 +00002307 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002308 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko01e726e2020-10-23 09:45:29 +00002309 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002310 logger.Errorw(ctx, "Cannot send VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002311 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002312 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002313 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002314 logger.Debug(ctx, "send VTFD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002315 return meInstance, nil
mpagenko01e726e2020-10-23 09:45:29 +00002316 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002317 logger.Errorw(ctx, "Cannot generate VTFD Instance for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002318 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002319 return nil, omciErr.GetError()
mpagenko01e726e2020-10-23 09:45:29 +00002320}
ozgecanetsia422dbf32020-10-28 14:07:19 +03002321
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002322// SendCreateTDVar creates TrafficDescriptor ME instance
2323func (oo *OmciCC) SendCreateTDVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2324 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002325 logger.Debugw(ctx, "send TD-Create-msg:", log.Fields{"device-id": oo.deviceID,
2326 "SequNo": strconv.FormatInt(int64(tid), 16),
2327 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2328 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2329 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002330 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002331 if err != nil {
2332 logger.Errorw(ctx, "Cannot encode TD for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002333 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002334 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002335 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002336 if err != nil {
2337 logger.Errorw(ctx, "Cannot serialize TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002338 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002339 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002340 omciRxCallbackPair := CallbackPair{
2341 CbKey: tid,
2342 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002343 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002344 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002345 if err != nil {
2346 logger.Errorw(ctx, "Cannot send TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002347 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002348 }
2349 logger.Debug(ctx, "send TD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002350 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002351 }
2352 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002353 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002354}
2355
2356// nolint: unused
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002357func (oo *OmciCC) sendSetTDVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002358 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002359 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002360 logger.Debugw(ctx, "send TD-Set-msg:", log.Fields{"device-id": oo.deviceID,
2361 "SequNo": strconv.FormatInt(int64(tid), 16),
2362 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2363
2364 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2365 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002366 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002367 if err != nil {
2368 logger.Errorw(ctx, "Cannot encode TD for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002369 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002370 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002371 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002372 if err != nil {
2373 logger.Errorw(ctx, "Cannot serialize TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002374 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002375 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002376 omciRxCallbackPair := CallbackPair{
2377 CbKey: tid,
2378 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002379 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002380 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002381 if err != nil {
2382 logger.Errorw(ctx, "Cannot send TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002383 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002384 }
2385 logger.Debug(ctx, "send TD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002386 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002387 }
2388 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002389 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002390
2391}
2392
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002393// SendDeleteTD - TODO: add comment
2394func (oo *OmciCC) SendDeleteTD(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002395 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002396 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002397 logger.Debugw(ctx, "send TD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2398 "SequNo": strconv.FormatInt(int64(tid), 16),
2399 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2400
2401 meParams := me.ParamData{EntityID: aInstID}
2402 meInstance, omciErr := me.NewTrafficDescriptor(meParams)
2403 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002404 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002405 if err != nil {
2406 logger.Errorw(ctx, "Cannot encode TD for delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002407 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002408 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002409 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002410 if err != nil {
2411 logger.Errorw(ctx, "Cannot serialize TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002412 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002413 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002414 omciRxCallbackPair := CallbackPair{
2415 CbKey: tid,
2416 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002417 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002418 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002419 if err != nil {
2420 logger.Errorw(ctx, "Cannot send TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002421 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002422 }
2423 logger.Debug(ctx, "send TD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002424 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002425 }
2426 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002427 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002428
2429}
2430
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002431// SendDeleteGemIWTP deletes GemInterworkingTerminationPoint ME instance
2432func (oo *OmciCC) SendDeleteGemIWTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002433 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002434 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002435 logger.Debugw(ctx, "send GemIwTp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002436 "SequNo": strconv.FormatInt(int64(tid), 16),
2437 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2438
2439 meParams := me.ParamData{EntityID: aInstID}
2440 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(meParams)
2441 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002442 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2443 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002444 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002445 logger.Errorw(ctx, "Cannot encode GemIwTp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002446 "Err": err, "device-id": oo.deviceID})
2447 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2448 // return (dual format) error code that can be used at caller for immediate error treatment
2449 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002450 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002451 }
2452
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002453 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002454 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002455 logger.Errorw(ctx, "Cannot serialize GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002456 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002457 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002458 }
2459
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002460 omciRxCallbackPair := CallbackPair{
2461 CbKey: tid,
2462 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002463 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002464 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002465 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002466 logger.Errorw(ctx, "Cannot send GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002467 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002468 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002469 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002470 logger.Debug(ctx, "send GemIwTp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002471 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002472 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002473 logger.Errorw(ctx, "Cannot generate GemIwTp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002474 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002475 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002476}
2477
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002478// SendDeleteGemNCTP deletes GemPortNetworkCtp ME instance
2479func (oo *OmciCC) SendDeleteGemNCTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002480 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002481 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002482 logger.Debugw(ctx, "send GemNCtp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002483 "SequNo": strconv.FormatInt(int64(tid), 16),
2484 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2485
2486 meParams := me.ParamData{EntityID: aInstID}
2487 meInstance, omciErr := me.NewGemPortNetworkCtp(meParams)
2488 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002489 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2490 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002491 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002492 logger.Errorw(ctx, "Cannot encode GemNCtp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002493 "Err": err, "device-id": oo.deviceID})
2494 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2495 // return (dual format) error code that can be used at caller for immediate error treatment
2496 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002497 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002498 }
2499
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002500 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002501 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002502 logger.Errorw(ctx, "Cannot serialize GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002503 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002504 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002505 }
2506
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002507 omciRxCallbackPair := CallbackPair{
2508 CbKey: tid,
2509 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002510 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002511 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002512 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002513 logger.Errorw(ctx, "Cannot send GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002514 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002515 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002516 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002517 logger.Debug(ctx, "send GemNCtp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002518 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002519 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002520 logger.Errorw(ctx, "Cannot generate GemNCtp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002521 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002522 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002523}
2524
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002525// SendDeleteDot1PMapper deletes Ieee8021PMapperServiceProfile ME instance
2526func (oo *OmciCC) SendDeleteDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002527 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002528 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002529 logger.Debugw(ctx, "send .1pMapper-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002530 "SequNo": strconv.FormatInt(int64(tid), 16),
2531 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2532
2533 meParams := me.ParamData{EntityID: aInstID}
2534 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
2535 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002536 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2537 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002538 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002539 logger.Errorw(ctx, "Cannot encode .1pMapper for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002540 "Err": err, "device-id": oo.deviceID})
2541 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2542 // return (dual format) error code that can be used at caller for immediate error treatment
2543 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002544 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002545 }
2546
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002547 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002548 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002549 logger.Errorw(ctx, "Cannot serialize .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002550 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002551 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002552 }
2553
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002554 omciRxCallbackPair := CallbackPair{
2555 CbKey: tid,
2556 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002557 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002558 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002559 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002560 logger.Errorw(ctx, "Cannot send .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002561 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002562 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002563 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002564 logger.Debug(ctx, "send .1pMapper-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002565 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002566 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002567 logger.Errorw(ctx, "Cannot generate .1pMapper Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002568 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002569 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002570}
2571
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002572// SendDeleteMBPConfigData deletes MacBridgePortConfigurationData ME instance
2573func (oo *OmciCC) SendDeleteMBPConfigData(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002574 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002575 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002576 logger.Debugw(ctx, "send MBPCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002577 "SequNo": strconv.FormatInt(int64(tid), 16),
2578 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2579
2580 meParams := me.ParamData{EntityID: aInstID}
2581 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
2582 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002583 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2584 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002585 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002586 logger.Errorw(ctx, "Cannot encode MBPCD for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002587 "Err": err, "device-id": oo.deviceID})
2588 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2589 // return (dual format) error code that can be used at caller for immediate error treatment
2590 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002591 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002592 }
2593
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002594 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002595 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002596 logger.Errorw(ctx, "Cannot serialize MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002597 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002598 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002599 }
2600
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002601 omciRxCallbackPair := CallbackPair{
2602 CbKey: tid,
2603 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002604 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002605 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002606 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002607 logger.Errorw(ctx, "Cannot send MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002608 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002609 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002610 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002611 logger.Debug(ctx, "send MBPCD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002612 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002613 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002614 logger.Errorw(ctx, "Cannot generate MBPCD Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002615 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002616 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002617}
2618
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002619// SendCreateMulticastGemIWTPVar creates MulticastGemInterworkingTerminationPoint ME instance
2620func (oo *OmciCC) SendCreateMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002621 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002622 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002623 logger.Debugw(ctx, "send MulticastGemIWTP-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002624 "SequNo": strconv.FormatInt(int64(tid), 16),
2625 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2626
2627 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2628 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002629 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2630 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002631 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002632 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002633 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002634 }
2635
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002636 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002637 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002638 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002639 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002640 }
2641
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002642 omciRxCallbackPair := CallbackPair{CbKey: tid,
2643 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002644 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002645 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002646 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002647 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002648 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002649 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002650 logger.Debug(ctx, "send MulticastGEMIWTP-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002651 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002652 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002653 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002654 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002655 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002656}
2657
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002658// SendSetMulticastGemIWTPVar sets MulticastGemInterworkingTerminationPoint ME instance
2659func (oo *OmciCC) SendSetMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002660 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002661 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002662 logger.Debugw(ctx, "send MulticastGemIWTP-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002663 "SequNo": strconv.FormatInt(int64(tid), 16),
2664 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2665
2666 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2667 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002668 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2669 oframe.AddDefaults(true))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002670 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002671 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002672 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002673 }
2674
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002675 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002676 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002677 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002678 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002679 }
2680
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002681 omciRxCallbackPair := CallbackPair{CbKey: tid,
2682 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002683 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002684 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002685 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002686 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002687 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002688 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002689 logger.Debug(ctx, "send MulticastGEMIWTP-set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002690 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002691 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002692 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002693 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002694 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002695}
2696
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002697// SendCreateMulticastOperationProfileVar creates MulticastOperationsProfile ME instance
2698func (oo *OmciCC) SendCreateMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002699 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002700 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002701 logger.Debugw(ctx, "send MulticastOperationProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002702 "SequNo": strconv.FormatInt(int64(tid), 16),
2703 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2704
2705 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2706 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002707 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2708 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002709 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002710 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002711 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002712 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002713 }
2714
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002715 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002716 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002717 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002718 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002719 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002720 }
2721
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002722 omciRxCallbackPair := CallbackPair{CbKey: tid,
2723 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002724 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002725 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002726 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002727 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002728 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002729 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002730 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002731 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002732 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002733 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002734 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002735 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002736 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002737}
2738
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002739// SendSetMulticastOperationProfileVar sets MulticastOperationsProfile ME instance
2740func (oo *OmciCC) SendSetMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002741 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002742 tid := oo.GetNextTid(highPrio)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002743 logger.Debugw(ctx, "send MulticastOperationProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002744 "SequNo": strconv.FormatInt(int64(tid), 16),
2745 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2746
2747 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2748 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002749 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2750 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002751 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002752 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002753 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002754 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002755 }
2756
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002757 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002758 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002759 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002760 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002761 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002762 }
2763
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002764 omciRxCallbackPair := CallbackPair{CbKey: tid,
2765 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002766 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002767 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002768 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002769 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002770 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002771 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002772 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002773 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002774 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002775 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002776 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002777 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002778 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002779}
2780
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002781// SendCreateMulticastSubConfigInfoVar creates MulticastSubscriberConfigInfo ME instance
2782func (oo *OmciCC) SendCreateMulticastSubConfigInfoVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002783 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002784 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002785 logger.Debugw(ctx, "send MulticastSubConfigInfo-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002786 "SequNo": strconv.FormatInt(int64(tid), 16),
2787 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2788
2789 meInstance, omciErr := me.NewMulticastSubscriberConfigInfo(params[0])
2790 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002791 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2792 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002793 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002794 logger.Errorw(ctx, "Cannot encode MulticastSubConfigInfo for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002795 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002796 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002797 }
2798
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002799 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002800 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002801 logger.Errorw(ctx, "Cannot serialize MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002802 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002803 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002804 }
2805
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002806 omciRxCallbackPair := CallbackPair{CbKey: tid,
2807 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002808 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002809 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002810 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002811 logger.Errorw(ctx, "Cannot send MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002812 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002813 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002814 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002815 logger.Debug(ctx, "send MulticastSubConfigInfo-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002816 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002817 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002818 logger.Errorw(ctx, "Cannot generate MulticastSubConfigInfo Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002819 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002820 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002821}
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00002822
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002823// SendCreateVoipVoiceCTP nolint: unused
2824func (oo *OmciCC) SendCreateVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2825 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2826 tid := oo.GetNextTid(highPrio)
2827 logger.Debugw(ctx, "send VoipVoiceCTP-create-msg:", log.Fields{"device-id": oo.deviceID,
2828 "SequNo": strconv.FormatInt(int64(tid), 16),
2829 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2830
2831 meInstance, omciErr := me.NewVoipVoiceCtp(params[0])
2832 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002833 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2834 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002835 if err != nil {
2836 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for create", log.Fields{"Err": err,
2837 "device-id": oo.deviceID})
2838 return nil, err
2839 }
2840
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002841 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002842 if err != nil {
2843 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP create", log.Fields{"Err": err,
2844 "device-id": oo.deviceID})
2845 return nil, err
2846 }
2847
2848 omciRxCallbackPair := CallbackPair{CbKey: tid,
2849 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2850 }
2851 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2852 if err != nil {
2853 logger.Errorw(ctx, "Cannot send VoipVoiceCTP create", log.Fields{"Err": err,
2854 "device-id": oo.deviceID})
2855 return nil, err
2856 }
2857 logger.Debug(ctx, "send VoipVoiceCTP-create-msg done")
2858 return meInstance, nil
2859 }
2860 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance", log.Fields{"Err": omciErr.GetError(),
2861 "device-id": oo.deviceID})
2862 return nil, omciErr.GetError()
2863}
2864
2865// SendSetVoipVoiceCTP nolint: unused
2866func (oo *OmciCC) SendSetVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2867 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2868 tid := oo.GetNextTid(highPrio)
2869 logger.Debugw(ctx, "send VoipVoiceCTP-set-msg:", log.Fields{"device-id": oo.deviceID,
2870 "SequNo": strconv.FormatInt(int64(tid), 16),
2871 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2872
2873 meInstance, omciErr := me.NewVoipVoiceCtp(params[0])
2874 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002875 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2876 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002877 if err != nil {
2878 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for set", log.Fields{"Err": err,
2879 "device-id": oo.deviceID})
2880 return nil, err
2881 }
2882
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002883 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002884 if err != nil {
2885 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP set", log.Fields{"Err": err,
2886 "device-id": oo.deviceID})
2887 return nil, err
2888 }
2889
2890 omciRxCallbackPair := CallbackPair{CbKey: tid,
2891 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2892 }
2893 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2894 if err != nil {
2895 logger.Errorw(ctx, "Cannot send VoipVoiceCTP set", log.Fields{"Err": err,
2896 "device-id": oo.deviceID})
2897 return nil, err
2898 }
2899 logger.Debug(ctx, "send VoipVoiceCTP-set-msg done")
2900 return meInstance, nil
2901 }
2902 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance", log.Fields{"Err": omciErr.GetError(),
2903 "device-id": oo.deviceID})
2904 return nil, omciErr.GetError()
2905}
2906
2907// SendDeleteVoipVoiceCTP nolint: unused
2908func (oo *OmciCC) SendDeleteVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2909 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
2910 tid := oo.GetNextTid(highPrio)
2911 logger.Debugw(ctx, "send VoipVoiceCTP-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2912 "SequNo": strconv.FormatInt(int64(tid), 16),
2913 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2914
2915 meParams := me.ParamData{EntityID: aInstID}
2916 meInstance, omciErr := me.NewVoipVoiceCtp(meParams)
2917 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002918 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2919 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002920 if err != nil {
2921 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for delete", log.Fields{
2922 "Err": err, "device-id": oo.deviceID})
2923 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2924 // return (dual format) error code that can be used at caller for immediate error treatment
2925 // (relevant to all used sendXX() methods and their error conditions)
2926 return nil, err
2927 }
2928
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002929 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002930 if err != nil {
2931 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP delete", log.Fields{
2932 "Err": err, "device-id": oo.deviceID})
2933 return nil, err
2934 }
2935
2936 omciRxCallbackPair := CallbackPair{
2937 CbKey: tid,
2938 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2939 }
2940 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2941 if err != nil {
2942 logger.Errorw(ctx, "Cannot send VoipVoiceCTP delete", log.Fields{
2943 "Err": err, "device-id": oo.deviceID})
2944 return nil, err
2945 }
2946 logger.Debug(ctx, "send VoipVoiceCTP-Delete-msg done")
2947 return meInstance, nil
2948 }
2949 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance for delete", log.Fields{
2950 "Err": omciErr.GetError(), "device-id": oo.deviceID})
2951 return nil, omciErr.GetError()
2952}
2953
2954// SendCreateVoipMediaProfile nolint: unused
2955func (oo *OmciCC) SendCreateVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2956 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2957 tid := oo.GetNextTid(highPrio)
2958 logger.Debugw(ctx, "send VoipMediaProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
2959 "SequNo": strconv.FormatInt(int64(tid), 16),
2960 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2961
2962 meInstance, omciErr := me.NewVoipMediaProfile(params[0])
2963 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002964 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2965 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002966 if err != nil {
2967 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for create", log.Fields{"Err": err,
2968 "device-id": oo.deviceID})
2969 return nil, err
2970 }
2971
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002972 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002973 if err != nil {
2974 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile create", log.Fields{"Err": err,
2975 "device-id": oo.deviceID})
2976 return nil, err
2977 }
2978
2979 omciRxCallbackPair := CallbackPair{CbKey: tid,
2980 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2981 }
2982 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2983 if err != nil {
2984 logger.Errorw(ctx, "Cannot send VoipMediaProfile create", log.Fields{"Err": err,
2985 "device-id": oo.deviceID})
2986 return nil, err
2987 }
2988 logger.Debug(ctx, "send VoipMediaProfile-create-msg done")
2989 return meInstance, nil
2990 }
2991 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance", log.Fields{"Err": omciErr.GetError(),
2992 "device-id": oo.deviceID})
2993 return nil, omciErr.GetError()
2994}
2995
2996// SendSetVoipMediaProfile nolint: unused
2997func (oo *OmciCC) SendSetVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2998 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2999 tid := oo.GetNextTid(highPrio)
3000 logger.Debugw(ctx, "send VoipMediaProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
3001 "SequNo": strconv.FormatInt(int64(tid), 16),
3002 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3003
3004 meInstance, omciErr := me.NewVoipMediaProfile(params[0])
3005 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003006 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3007 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003008 if err != nil {
3009 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for set", log.Fields{"Err": err,
3010 "device-id": oo.deviceID})
3011 return nil, err
3012 }
3013
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003014 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003015 if err != nil {
3016 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile set", log.Fields{"Err": err,
3017 "device-id": oo.deviceID})
3018 return nil, err
3019 }
3020
3021 omciRxCallbackPair := CallbackPair{CbKey: tid,
3022 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3023 }
3024 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3025 if err != nil {
3026 logger.Errorw(ctx, "Cannot send VoipMediaProfile set", log.Fields{"Err": err,
3027 "device-id": oo.deviceID})
3028 return nil, err
3029 }
3030 logger.Debug(ctx, "send VoipMediaProfile-set-msg done")
3031 return meInstance, nil
3032 }
3033 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance", log.Fields{"Err": omciErr.GetError(),
3034 "device-id": oo.deviceID})
3035 return nil, omciErr.GetError()
3036}
3037
3038// SendDeleteVoipMediaProfile nolint: unused
3039func (oo *OmciCC) SendDeleteVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
3040 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3041 tid := oo.GetNextTid(highPrio)
3042 logger.Debugw(ctx, "send VoipMediaProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3043 "SequNo": strconv.FormatInt(int64(tid), 16),
3044 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3045
3046 meParams := me.ParamData{EntityID: aInstID}
3047 meInstance, omciErr := me.NewVoipMediaProfile(meParams)
3048 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003049 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3050 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003051 if err != nil {
3052 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for delete", log.Fields{
3053 "Err": err, "device-id": oo.deviceID})
3054 return nil, err
3055 }
3056
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003057 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003058 if err != nil {
3059 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile delete", log.Fields{
3060 "Err": err, "device-id": oo.deviceID})
3061 return nil, err
3062 }
3063
3064 omciRxCallbackPair := CallbackPair{
3065 CbKey: tid,
3066 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3067 }
3068 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3069 if err != nil {
3070 logger.Errorw(ctx, "Cannot send VoipMediaProfile delete", log.Fields{
3071 "Err": err, "device-id": oo.deviceID})
3072 return nil, err
3073 }
3074 logger.Debug(ctx, "send VoipMediaProfile-Delete-msg done")
3075 return meInstance, nil
3076 }
3077 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance for delete", log.Fields{
3078 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3079 return nil, omciErr.GetError()
3080}
3081
3082// SendCreateVoiceServiceProfile nolint: unused
3083func (oo *OmciCC) SendCreateVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3084 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3085 tid := oo.GetNextTid(highPrio)
3086 logger.Debugw(ctx, "send VoiceServiceProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
3087 "SequNo": strconv.FormatInt(int64(tid), 16),
3088 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3089
3090 meInstance, omciErr := me.NewVoiceServiceProfile(params[0])
3091 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003092 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3093 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003094 if err != nil {
3095 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for create", log.Fields{"Err": err,
3096 "device-id": oo.deviceID})
3097 return nil, err
3098 }
3099
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003100 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003101 if err != nil {
3102 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile create", log.Fields{"Err": err,
3103 "device-id": oo.deviceID})
3104 return nil, err
3105 }
3106
3107 omciRxCallbackPair := CallbackPair{CbKey: tid,
3108 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3109 }
3110 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3111 if err != nil {
3112 logger.Errorw(ctx, "Cannot send VoiceServiceProfile create", log.Fields{"Err": err,
3113 "device-id": oo.deviceID})
3114 return nil, err
3115 }
3116 logger.Debug(ctx, "send VoiceServiceProfile-create-msg done")
3117 return meInstance, nil
3118 }
3119 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3120 "device-id": oo.deviceID})
3121 return nil, omciErr.GetError()
3122}
3123
3124// SendSetVoiceServiceProfile nolint: unused
3125func (oo *OmciCC) SendSetVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3126 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3127 tid := oo.GetNextTid(highPrio)
3128 logger.Debugw(ctx, "send VoiceServiceProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
3129 "SequNo": strconv.FormatInt(int64(tid), 16),
3130 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3131
3132 meInstance, omciErr := me.NewVoiceServiceProfile(params[0])
3133 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003134 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3135 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003136 if err != nil {
3137 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for set", log.Fields{"Err": err,
3138 "device-id": oo.deviceID})
3139 return nil, err
3140 }
3141
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003142 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003143 if err != nil {
3144 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile set", log.Fields{"Err": err,
3145 "device-id": oo.deviceID})
3146 return nil, err
3147 }
3148
3149 omciRxCallbackPair := CallbackPair{CbKey: tid,
3150 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3151 }
3152 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3153 if err != nil {
3154 logger.Errorw(ctx, "Cannot send VoiceServiceProfile set", log.Fields{"Err": err,
3155 "device-id": oo.deviceID})
3156 return nil, err
3157 }
3158 logger.Debug(ctx, "send VoiceServiceProfile-set-msg done")
3159 return meInstance, nil
3160 }
3161 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3162 "device-id": oo.deviceID})
3163 return nil, omciErr.GetError()
3164}
3165
3166// SendDeleteVoiceServiceProfile nolint: unused
3167func (oo *OmciCC) SendDeleteVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3168 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3169 tid := oo.GetNextTid(highPrio)
3170 logger.Debugw(ctx, "send VoiceServiceProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3171 "SequNo": strconv.FormatInt(int64(tid), 16),
3172 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3173
3174 meParams := me.ParamData{EntityID: aInstID}
3175 meInstance, omciErr := me.NewVoiceServiceProfile(meParams)
3176 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003177 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3178 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003179 if err != nil {
3180 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for delete", log.Fields{
3181 "Err": err, "device-id": oo.deviceID})
3182 return nil, err
3183 }
3184
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003185 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003186 if err != nil {
3187 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile delete", log.Fields{
3188 "Err": err, "device-id": oo.deviceID})
3189 return nil, err
3190 }
3191
3192 omciRxCallbackPair := CallbackPair{
3193 CbKey: tid,
3194 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3195 }
3196 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3197 if err != nil {
3198 logger.Errorw(ctx, "Cannot send VoiceServiceProfile delete", log.Fields{
3199 "Err": err, "device-id": oo.deviceID})
3200 return nil, err
3201 }
3202 logger.Debug(ctx, "send VoiceServiceProfile-Delete-msg done")
3203 return meInstance, nil
3204 }
3205 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance for delete", log.Fields{
3206 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3207 return nil, omciErr.GetError()
3208}
3209
3210// SendCreateSIPUserData nolint: unused
3211func (oo *OmciCC) SendCreateSIPUserData(ctx context.Context, timeout int, highPrio bool,
3212 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3213 tid := oo.GetNextTid(highPrio)
3214 logger.Debugw(ctx, "send SIPUserData-create-msg:", log.Fields{"device-id": oo.deviceID,
3215 "SequNo": strconv.FormatInt(int64(tid), 16),
3216 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3217
3218 meInstance, omciErr := me.NewSipUserData(params[0])
3219 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003220 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3221 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003222 if err != nil {
3223 logger.Errorw(ctx, "Cannot encode SIPUserData for create", log.Fields{"Err": err,
3224 "device-id": oo.deviceID})
3225 return nil, err
3226 }
3227
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003228 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003229 if err != nil {
3230 logger.Errorw(ctx, "Cannot serialize SIPUserData create", log.Fields{"Err": err,
3231 "device-id": oo.deviceID})
3232 return nil, err
3233 }
3234
3235 omciRxCallbackPair := CallbackPair{CbKey: tid,
3236 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3237 }
3238 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3239 if err != nil {
3240 logger.Errorw(ctx, "Cannot send SIPUserData create", log.Fields{"Err": err,
3241 "device-id": oo.deviceID})
3242 return nil, err
3243 }
3244 logger.Debug(ctx, "send SIPUserData-create-msg done")
3245 return meInstance, nil
3246 }
3247 logger.Errorw(ctx, "Cannot generate SIPUserData Instance", log.Fields{"Err": omciErr.GetError(),
3248 "device-id": oo.deviceID})
3249 return nil, omciErr.GetError()
3250}
3251
3252// SendSetSIPUserData nolint: unused
3253func (oo *OmciCC) SendSetSIPUserData(ctx context.Context, timeout int, highPrio bool,
3254 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3255 tid := oo.GetNextTid(highPrio)
3256 logger.Debugw(ctx, "send SIPUserData-set-msg:", log.Fields{"device-id": oo.deviceID,
3257 "SequNo": strconv.FormatInt(int64(tid), 16),
3258 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3259
3260 meInstance, omciErr := me.NewSipUserData(params[0])
3261 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003262 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3263 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003264 if err != nil {
3265 logger.Errorw(ctx, "Cannot encode SIPUserData for set", log.Fields{"Err": err,
3266 "device-id": oo.deviceID})
3267 return nil, err
3268 }
3269
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003270 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003271 if err != nil {
3272 logger.Errorw(ctx, "Cannot serialize SIPUserData set", log.Fields{"Err": err,
3273 "device-id": oo.deviceID})
3274 return nil, err
3275 }
3276
3277 omciRxCallbackPair := CallbackPair{CbKey: tid,
3278 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3279 }
3280 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3281 if err != nil {
3282 logger.Errorw(ctx, "Cannot send SIPUserData set", log.Fields{"Err": err,
3283 "device-id": oo.deviceID})
3284 return nil, err
3285 }
3286 logger.Debug(ctx, "send SIPUserData-set-msg done")
3287 return meInstance, nil
3288 }
3289 logger.Errorw(ctx, "Cannot generate SIPUserData Instance", log.Fields{"Err": omciErr.GetError(),
3290 "device-id": oo.deviceID})
3291 return nil, omciErr.GetError()
3292}
3293
3294// SendDeleteSIPUserData nolint: unused
3295func (oo *OmciCC) SendDeleteSIPUserData(ctx context.Context, timeout int, highPrio bool,
3296 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3297 tid := oo.GetNextTid(highPrio)
3298 logger.Debugw(ctx, "send SIPUserData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3299 "SequNo": strconv.FormatInt(int64(tid), 16),
3300 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3301
3302 meParams := me.ParamData{EntityID: aInstID}
3303 meInstance, omciErr := me.NewSipUserData(meParams)
3304 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003305 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3306 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003307 if err != nil {
3308 logger.Errorw(ctx, "Cannot encode SIPUserData for delete", log.Fields{
3309 "Err": err, "device-id": oo.deviceID})
3310 return nil, err
3311 }
3312
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003313 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003314 if err != nil {
3315 logger.Errorw(ctx, "Cannot serialize SIPUserData delete", log.Fields{
3316 "Err": err, "device-id": oo.deviceID})
3317 return nil, err
3318 }
3319
3320 omciRxCallbackPair := CallbackPair{
3321 CbKey: tid,
3322 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3323 }
3324 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3325 if err != nil {
3326 logger.Errorw(ctx, "Cannot send SIPUserData delete", log.Fields{
3327 "Err": err, "device-id": oo.deviceID})
3328 return nil, err
3329 }
3330 logger.Debug(ctx, "send SIPUserData-Delete-msg done")
3331 return meInstance, nil
3332 }
3333 logger.Errorw(ctx, "Cannot generate SIPUserData Instance for delete", log.Fields{
3334 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3335 return nil, omciErr.GetError()
3336}
3337
3338// SendCreateVoipApplicationServiceProfile nolint: unused
3339func (oo *OmciCC) SendCreateVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3340 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3341 tid := oo.GetNextTid(highPrio)
3342 logger.Debugw(ctx, "send VoipApplicationServiceProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
3343 "SequNo": strconv.FormatInt(int64(tid), 16),
3344 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3345
3346 meInstance, omciErr := me.NewVoipApplicationServiceProfile(params[0])
3347 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003348 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3349 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003350 if err != nil {
3351 logger.Errorw(ctx, "Cannot encode VoipApplicationServiceProfile for create", log.Fields{"Err": err,
3352 "device-id": oo.deviceID})
3353 return nil, err
3354 }
3355
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003356 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003357 if err != nil {
3358 logger.Errorw(ctx, "Cannot serialize VoipApplicationServiceProfile create", log.Fields{"Err": err,
3359 "device-id": oo.deviceID})
3360 return nil, err
3361 }
3362
3363 omciRxCallbackPair := CallbackPair{CbKey: tid,
3364 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3365 }
3366 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3367 if err != nil {
3368 logger.Errorw(ctx, "Cannot send VoipApplicationServiceProfile create", log.Fields{"Err": err,
3369 "device-id": oo.deviceID})
3370 return nil, err
3371 }
3372 logger.Debug(ctx, "send VoipApplicationServiceProfile-create-msg done")
3373 return meInstance, nil
3374 }
3375 logger.Errorw(ctx, "Cannot generate VoipApplicationServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3376 "device-id": oo.deviceID})
3377 return nil, omciErr.GetError()
3378}
3379
3380// SendSetVoipApplicationServiceProfile nolint: unused
3381func (oo *OmciCC) SendSetVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3382 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3383 tid := oo.GetNextTid(highPrio)
3384 logger.Debugw(ctx, "send VoipApplicationServiceProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
3385 "SequNo": strconv.FormatInt(int64(tid), 16),
3386 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3387
3388 meInstance, omciErr := me.NewVoipApplicationServiceProfile(params[0])
3389 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003390 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3391 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003392 if err != nil {
3393 logger.Errorw(ctx, "Cannot encode VoipApplicationServiceProfile for set", log.Fields{"Err": err,
3394 "device-id": oo.deviceID})
3395 return nil, err
3396 }
3397
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003398 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003399 if err != nil {
3400 logger.Errorw(ctx, "Cannot serialize VoipApplicationServiceProfile set", log.Fields{"Err": err,
3401 "device-id": oo.deviceID})
3402 return nil, err
3403 }
3404
3405 omciRxCallbackPair := CallbackPair{CbKey: tid,
3406 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3407 }
3408 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3409 if err != nil {
3410 logger.Errorw(ctx, "Cannot send VoipApplicationServiceProfile set", log.Fields{"Err": err,
3411 "device-id": oo.deviceID})
3412 return nil, err
3413 }
3414 logger.Debug(ctx, "send VoipApplicationServiceProfile-set-msg done")
3415 return meInstance, nil
3416 }
3417 logger.Errorw(ctx, "Cannot generate VoipApplicationServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3418 "device-id": oo.deviceID})
3419 return nil, omciErr.GetError()
3420}
3421
3422// SendDeleteVoipApplicationServiceProfile nolint: unused
3423func (oo *OmciCC) SendDeleteVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3424 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3425 tid := oo.GetNextTid(highPrio)
3426 logger.Debugw(ctx, "send SIPVoipApplicationServiceProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3427 "SequNo": strconv.FormatInt(int64(tid), 16),
3428 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3429
3430 meParams := me.ParamData{EntityID: aInstID}
3431 meInstance, omciErr := me.NewVoipApplicationServiceProfile(meParams)
3432 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003433 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3434 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003435 if err != nil {
3436 logger.Errorw(ctx, "Cannot encode SIPVoipApplicationServiceProfile for delete", log.Fields{
3437 "Err": err, "device-id": oo.deviceID})
3438 return nil, err
3439 }
3440
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003441 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003442 if err != nil {
3443 logger.Errorw(ctx, "Cannot serialize SIPVoipApplicationServiceProfile delete", log.Fields{
3444 "Err": err, "device-id": oo.deviceID})
3445 return nil, err
3446 }
3447
3448 omciRxCallbackPair := CallbackPair{
3449 CbKey: tid,
3450 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3451 }
3452 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3453 if err != nil {
3454 logger.Errorw(ctx, "Cannot send SIPVoipApplicationServiceProfile delete", log.Fields{
3455 "Err": err, "device-id": oo.deviceID})
3456 return nil, err
3457 }
3458 logger.Debug(ctx, "send SIPVoipApplicationServiceProfile-Delete-msg done")
3459 return meInstance, nil
3460 }
3461 logger.Errorw(ctx, "Cannot generate SIPVoipApplicationServiceProfile Instance for delete", log.Fields{
3462 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3463 return nil, omciErr.GetError()
3464}
3465
3466// SendCreateSIPAgentConfigData nolint: unused
3467func (oo *OmciCC) SendCreateSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3468 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3469 tid := oo.GetNextTid(highPrio)
3470 logger.Debugw(ctx, "send SIPAgentConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3471 "SequNo": strconv.FormatInt(int64(tid), 16),
3472 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3473
3474 meInstance, omciErr := me.NewSipAgentConfigData(params[0])
3475 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003476 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3477 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003478 if err != nil {
3479 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for create", log.Fields{"Err": err,
3480 "device-id": oo.deviceID})
3481 return nil, err
3482 }
3483
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003484 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003485 if err != nil {
3486 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData create", log.Fields{"Err": err,
3487 "device-id": oo.deviceID})
3488 return nil, err
3489 }
3490
3491 omciRxCallbackPair := CallbackPair{CbKey: tid,
3492 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3493 }
3494 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3495 if err != nil {
3496 logger.Errorw(ctx, "Cannot send SIPAgentConfigData create", log.Fields{"Err": err,
3497 "device-id": oo.deviceID})
3498 return nil, err
3499 }
3500 logger.Debug(ctx, "send SIPAgentConfigData-create-msg done")
3501 return meInstance, nil
3502 }
3503 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3504 "device-id": oo.deviceID})
3505 return nil, omciErr.GetError()
3506}
3507
3508// SendSetSIPAgentConfigData nolint: unused
3509func (oo *OmciCC) SendSetSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3510 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3511 tid := oo.GetNextTid(highPrio)
3512 logger.Debugw(ctx, "send SIPAgentConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3513 "SequNo": strconv.FormatInt(int64(tid), 16),
3514 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3515
3516 meInstance, omciErr := me.NewSipAgentConfigData(params[0])
3517 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003518 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3519 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003520 if err != nil {
3521 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for set", log.Fields{"Err": err,
3522 "device-id": oo.deviceID})
3523 return nil, err
3524 }
3525
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003526 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003527 if err != nil {
3528 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData set", log.Fields{"Err": err,
3529 "device-id": oo.deviceID})
3530 return nil, err
3531 }
3532
3533 omciRxCallbackPair := CallbackPair{CbKey: tid,
3534 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3535 }
3536 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3537 if err != nil {
3538 logger.Errorw(ctx, "Cannot send SIPAgentConfigData set", log.Fields{"Err": err,
3539 "device-id": oo.deviceID})
3540 return nil, err
3541 }
3542 logger.Debug(ctx, "send SIPAgentConfigData-set-msg done")
3543 return meInstance, nil
3544 }
3545 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3546 "device-id": oo.deviceID})
3547 return nil, omciErr.GetError()
3548}
3549
3550// SendDeleteSIPAgentConfigData nolint: unused
3551func (oo *OmciCC) SendDeleteSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3552 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3553 tid := oo.GetNextTid(highPrio)
3554 logger.Debugw(ctx, "send SIPAgentConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3555 "SequNo": strconv.FormatInt(int64(tid), 16),
3556 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3557
3558 meParams := me.ParamData{EntityID: aInstID}
3559 meInstance, omciErr := me.NewSipAgentConfigData(meParams)
3560 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003561 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3562 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003563 if err != nil {
3564 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for delete", log.Fields{
3565 "Err": err, "device-id": oo.deviceID})
3566 return nil, err
3567 }
3568
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003569 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003570 if err != nil {
3571 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData delete", log.Fields{
3572 "Err": err, "device-id": oo.deviceID})
3573 return nil, err
3574 }
3575
3576 omciRxCallbackPair := CallbackPair{
3577 CbKey: tid,
3578 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3579 }
3580 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3581 if err != nil {
3582 logger.Errorw(ctx, "Cannot send SIPAgentConfigData delete", log.Fields{
3583 "Err": err, "device-id": oo.deviceID})
3584 return nil, err
3585 }
3586 logger.Debug(ctx, "send SIPAgentConfigData-Delete-msg done")
3587 return meInstance, nil
3588 }
3589 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance for delete", log.Fields{
3590 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3591 return nil, omciErr.GetError()
3592}
3593
3594// SendCreateTCPUDPConfigData nolint: unused
3595func (oo *OmciCC) SendCreateTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3596 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3597 tid := oo.GetNextTid(highPrio)
3598 logger.Debugw(ctx, "send TCPUDPConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3599 "SequNo": strconv.FormatInt(int64(tid), 16),
3600 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3601
3602 meInstance, omciErr := me.NewTcpUdpConfigData(params[0])
3603 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003604 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3605 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003606 if err != nil {
3607 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for create", log.Fields{"Err": err,
3608 "device-id": oo.deviceID})
3609 return nil, err
3610 }
3611
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003612 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003613 if err != nil {
3614 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData create", log.Fields{"Err": err,
3615 "device-id": oo.deviceID})
3616 return nil, err
3617 }
3618
3619 omciRxCallbackPair := CallbackPair{CbKey: tid,
3620 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3621 }
3622 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3623 if err != nil {
3624 logger.Errorw(ctx, "Cannot send TCPUDPConfigData create", log.Fields{"Err": err,
3625 "device-id": oo.deviceID})
3626 return nil, err
3627 }
3628 logger.Debug(ctx, "send TCPUDPConfigData-create-msg done")
3629 return meInstance, nil
3630 }
3631 logger.Errorw(ctx, "Cannot generate TCPUDPConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3632 "device-id": oo.deviceID})
3633 return nil, omciErr.GetError()
3634}
3635
3636// SendSetTCPUDPConfigData nolint: unused
3637func (oo *OmciCC) SendSetTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3638 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3639 tid := oo.GetNextTid(highPrio)
3640 logger.Debugw(ctx, "send TCPUDPConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3641 "SequNo": strconv.FormatInt(int64(tid), 16),
3642 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3643
3644 meInstance, omciErr := me.NewTcpUdpConfigData(params[0])
3645 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003646 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3647 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003648 if err != nil {
3649 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for set", log.Fields{"Err": err,
3650 "device-id": oo.deviceID})
3651 return nil, err
3652 }
3653
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003654 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003655 if err != nil {
3656 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData set", log.Fields{"Err": err,
3657 "device-id": oo.deviceID})
3658 return nil, err
3659 }
3660
3661 omciRxCallbackPair := CallbackPair{CbKey: tid,
3662 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3663 }
3664 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3665 if err != nil {
3666 logger.Errorw(ctx, "Cannot send TCPUDPConfigData set", log.Fields{"Err": err,
3667 "device-id": oo.deviceID})
3668 return nil, err
3669 }
3670 logger.Debug(ctx, "send TCPUDPConfigData-set-msg done")
3671 return meInstance, nil
3672 }
3673 logger.Errorw(ctx, "Cannot generate TCPUDPConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3674 "device-id": oo.deviceID})
3675 return nil, omciErr.GetError()
3676}
3677
3678// SendDeleteTCPUDPConfigData nolint: unused
3679func (oo *OmciCC) SendDeleteTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3680 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3681 tid := oo.GetNextTid(highPrio)
3682 logger.Debugw(ctx, "send TCPUDPConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3683 "SequNo": strconv.FormatInt(int64(tid), 16),
3684 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3685
3686 meParams := me.ParamData{EntityID: aInstID}
3687 meInstance, omciErr := me.NewTcpUdpConfigData(meParams)
3688 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003689 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3690 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003691 if err != nil {
3692 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for delete", log.Fields{
3693 "Err": err, "device-id": oo.deviceID})
3694 return nil, err
3695 }
3696
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003697 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003698 if err != nil {
3699 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData delete", log.Fields{
3700 "Err": err, "device-id": oo.deviceID})
3701 return nil, err
3702 }
3703
3704 omciRxCallbackPair := CallbackPair{
3705 CbKey: tid,
3706 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3707 }
3708 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3709 if err != nil {
3710 logger.Errorw(ctx, "Cannot send TCPUDPConfigData delete", log.Fields{
3711 "Err": err, "device-id": oo.deviceID})
3712 return nil, err
3713 }
3714 logger.Debug(ctx, "send TCPUDPConfigData-Delete-msg done")
3715 return meInstance, nil
3716 }
3717 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance for delete", log.Fields{
3718 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3719 return nil, omciErr.GetError()
3720}
3721
3722// SendCreateIPHostConfigData nolint: unused
3723func (oo *OmciCC) SendCreateIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3724 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3725 tid := oo.GetNextTid(highPrio)
3726 logger.Debugw(ctx, "send IPHostConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3727 "SequNo": strconv.FormatInt(int64(tid), 16),
3728 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3729
3730 meInstance, omciErr := me.NewIpHostConfigData(params[0])
3731 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003732 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3733 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003734 if err != nil {
3735 logger.Errorw(ctx, "Cannot encode IPHostConfigData for create", log.Fields{"Err": err,
3736 "device-id": oo.deviceID})
3737 return nil, err
3738 }
3739
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003740 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003741 if err != nil {
3742 logger.Errorw(ctx, "Cannot serialize IPHostConfigData create", log.Fields{"Err": err,
3743 "device-id": oo.deviceID})
3744 return nil, err
3745 }
3746
3747 omciRxCallbackPair := CallbackPair{CbKey: tid,
3748 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3749 }
3750 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3751 if err != nil {
3752 logger.Errorw(ctx, "Cannot send IPHostConfigData create", log.Fields{"Err": err,
3753 "device-id": oo.deviceID})
3754 return nil, err
3755 }
3756 logger.Debug(ctx, "send IPHostConfigData-create-msg done")
3757 return meInstance, nil
3758 }
3759 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3760 "device-id": oo.deviceID})
3761 return nil, omciErr.GetError()
3762}
3763
3764// SendSetIPHostConfigData nolint: unused
3765func (oo *OmciCC) SendSetIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3766 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3767 tid := oo.GetNextTid(highPrio)
3768 logger.Debugw(ctx, "send IPHostConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3769 "SequNo": strconv.FormatInt(int64(tid), 16),
3770 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3771
3772 meInstance, omciErr := me.NewIpHostConfigData(params[0])
3773 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003774 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3775 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003776 if err != nil {
3777 logger.Errorw(ctx, "Cannot encode IPHostConfigData for set", log.Fields{"Err": err,
3778 "device-id": oo.deviceID})
3779 return nil, err
3780 }
3781
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003782 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003783 if err != nil {
3784 logger.Errorw(ctx, "Cannot serialize IPHostConfigData set", log.Fields{"Err": err,
3785 "device-id": oo.deviceID})
3786 return nil, err
3787 }
3788
3789 omciRxCallbackPair := CallbackPair{CbKey: tid,
3790 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3791 }
3792 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3793 if err != nil {
3794 logger.Errorw(ctx, "Cannot send IPHostConfigData set", log.Fields{"Err": err,
3795 "device-id": oo.deviceID})
3796 return nil, err
3797 }
3798 logger.Debug(ctx, "send IPHostConfigData-set-msg done")
3799 return meInstance, nil
3800 }
3801 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3802 "device-id": oo.deviceID})
3803 return nil, omciErr.GetError()
3804}
3805
3806// SendDeleteIPHostConfigData nolint: unused
3807func (oo *OmciCC) SendDeleteIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3808 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3809 tid := oo.GetNextTid(highPrio)
3810 logger.Debugw(ctx, "send IPHostConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3811 "SequNo": strconv.FormatInt(int64(tid), 16),
3812 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3813
3814 meParams := me.ParamData{EntityID: aInstID}
3815 meInstance, omciErr := me.NewIpHostConfigData(meParams)
3816 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003817 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3818 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003819 if err != nil {
3820 logger.Errorw(ctx, "Cannot encode IPHostConfigData for delete", log.Fields{
3821 "Err": err, "device-id": oo.deviceID})
3822 return nil, err
3823 }
3824
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003825 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003826 if err != nil {
3827 logger.Errorw(ctx, "Cannot serialize IPHostConfigData delete", log.Fields{
3828 "Err": err, "device-id": oo.deviceID})
3829 return nil, err
3830 }
3831
3832 omciRxCallbackPair := CallbackPair{
3833 CbKey: tid,
3834 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3835 }
3836 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3837 if err != nil {
3838 logger.Errorw(ctx, "Cannot send IPHostConfigData delete", log.Fields{
3839 "Err": err, "device-id": oo.deviceID})
3840 return nil, err
3841 }
3842 logger.Debug(ctx, "send IPHostConfigData-Delete-msg done")
3843 return meInstance, nil
3844 }
3845 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance for delete", log.Fields{
3846 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3847 return nil, omciErr.GetError()
3848}
3849
3850// SendCreateRTPProfileData nolint: unused
3851func (oo *OmciCC) SendCreateRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3852 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3853 tid := oo.GetNextTid(highPrio)
3854 logger.Debugw(ctx, "send RTPProfileData-create-msg:", log.Fields{"device-id": oo.deviceID,
3855 "SequNo": strconv.FormatInt(int64(tid), 16),
3856 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3857
3858 meInstance, omciErr := me.NewRtpProfileData(params[0])
3859 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003860 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3861 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003862 if err != nil {
3863 logger.Errorw(ctx, "Cannot encode RTPProfileData for create", log.Fields{"Err": err,
3864 "device-id": oo.deviceID})
3865 return nil, err
3866 }
3867
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003868 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003869 if err != nil {
3870 logger.Errorw(ctx, "Cannot serialize RTPProfileData create", log.Fields{"Err": err,
3871 "device-id": oo.deviceID})
3872 return nil, err
3873 }
3874
3875 omciRxCallbackPair := CallbackPair{CbKey: tid,
3876 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3877 }
3878 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3879 if err != nil {
3880 logger.Errorw(ctx, "Cannot send RTPProfileData create", log.Fields{"Err": err,
3881 "device-id": oo.deviceID})
3882 return nil, err
3883 }
3884 logger.Debug(ctx, "send RTPProfileData-create-msg done")
3885 return meInstance, nil
3886 }
3887 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance", log.Fields{"Err": omciErr.GetError(),
3888 "device-id": oo.deviceID})
3889 return nil, omciErr.GetError()
3890}
3891
3892// SendSetRTPProfileData nolint: unused
3893func (oo *OmciCC) SendSetRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3894 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3895 tid := oo.GetNextTid(highPrio)
3896 logger.Debugw(ctx, "send RTPProfileData-set-msg:", log.Fields{"device-id": oo.deviceID,
3897 "SequNo": strconv.FormatInt(int64(tid), 16),
3898 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3899
3900 meInstance, omciErr := me.NewRtpProfileData(params[0])
3901 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003902 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3903 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003904 if err != nil {
3905 logger.Errorw(ctx, "Cannot encode RTPProfileData for set", log.Fields{"Err": err,
3906 "device-id": oo.deviceID})
3907 return nil, err
3908 }
3909
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003910 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003911 if err != nil {
3912 logger.Errorw(ctx, "Cannot serialize RTPProfileData set", log.Fields{"Err": err,
3913 "device-id": oo.deviceID})
3914 return nil, err
3915 }
3916
3917 omciRxCallbackPair := CallbackPair{CbKey: tid,
3918 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3919 }
3920 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3921 if err != nil {
3922 logger.Errorw(ctx, "Cannot send RTPProfileData set", log.Fields{"Err": err,
3923 "device-id": oo.deviceID})
3924 return nil, err
3925 }
3926 logger.Debug(ctx, "send RTPProfileData-set-msg done")
3927 return meInstance, nil
3928 }
3929 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance", log.Fields{"Err": omciErr.GetError(),
3930 "device-id": oo.deviceID})
3931 return nil, omciErr.GetError()
3932}
3933
3934// SendDeleteRTPProfileData nolint: unused
3935func (oo *OmciCC) SendDeleteRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3936 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3937 tid := oo.GetNextTid(highPrio)
3938 logger.Debugw(ctx, "send RTPProfileData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3939 "SequNo": strconv.FormatInt(int64(tid), 16),
3940 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3941
3942 meParams := me.ParamData{EntityID: aInstID}
3943 meInstance, omciErr := me.NewRtpProfileData(meParams)
3944 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003945 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3946 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003947 if err != nil {
3948 logger.Errorw(ctx, "Cannot encode RTPProfileData for delete", log.Fields{
3949 "Err": err, "device-id": oo.deviceID})
3950 return nil, err
3951 }
3952
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003953 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003954 if err != nil {
3955 logger.Errorw(ctx, "Cannot serialize RTPProfileData delete", log.Fields{
3956 "Err": err, "device-id": oo.deviceID})
3957 return nil, err
3958 }
3959
3960 omciRxCallbackPair := CallbackPair{
3961 CbKey: tid,
3962 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3963 }
3964 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3965 if err != nil {
3966 logger.Errorw(ctx, "Cannot send RTPProfileData delete", log.Fields{
3967 "Err": err, "device-id": oo.deviceID})
3968 return nil, err
3969 }
3970 logger.Debug(ctx, "send RTPProfileData-Delete-msg done")
3971 return meInstance, nil
3972 }
3973 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance for delete", log.Fields{
3974 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3975 return nil, omciErr.GetError()
3976}
3977
3978// SendCreateNetworkDialPlanTable nolint: unused
3979func (oo *OmciCC) SendCreateNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
3980 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3981 tid := oo.GetNextTid(highPrio)
3982 logger.Debugw(ctx, "send NetworkDialPlanTable-create-msg:", log.Fields{"device-id": oo.deviceID,
3983 "SequNo": strconv.FormatInt(int64(tid), 16),
3984 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3985
3986 meInstance, omciErr := me.NewNetworkDialPlanTable(params[0])
3987 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003988 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3989 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003990 if err != nil {
3991 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for create", log.Fields{"Err": err,
3992 "device-id": oo.deviceID})
3993 return nil, err
3994 }
3995
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003996 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003997 if err != nil {
3998 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable create", log.Fields{"Err": err,
3999 "device-id": oo.deviceID})
4000 return nil, err
4001 }
4002
4003 omciRxCallbackPair := CallbackPair{CbKey: tid,
4004 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4005 }
4006 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
4007 if err != nil {
4008 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable create", log.Fields{"Err": err,
4009 "device-id": oo.deviceID})
4010 return nil, err
4011 }
4012 logger.Debug(ctx, "send NetworkDialPlanTable-create-msg done")
4013 return meInstance, nil
4014 }
4015 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance", log.Fields{"Err": omciErr.GetError(),
4016 "device-id": oo.deviceID})
4017 return nil, omciErr.GetError()
4018}
4019
4020// SendSetNetworkDialPlanTable nolint: unused
4021func (oo *OmciCC) SendSetNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
4022 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
4023 tid := oo.GetNextTid(highPrio)
4024 logger.Debugw(ctx, "send NetworkDialPlanTable-set-msg:", log.Fields{"device-id": oo.deviceID,
4025 "SequNo": strconv.FormatInt(int64(tid), 16),
4026 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
4027
4028 meInstance, omciErr := me.NewNetworkDialPlanTable(params[0])
4029 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00004030 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
4031 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004032 if err != nil {
4033 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for set", log.Fields{"Err": err,
4034 "device-id": oo.deviceID})
4035 return nil, err
4036 }
4037
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004038 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004039 if err != nil {
4040 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable set", log.Fields{"Err": err,
4041 "device-id": oo.deviceID})
4042 return nil, err
4043 }
4044
4045 omciRxCallbackPair := CallbackPair{CbKey: tid,
4046 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4047 }
4048 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
4049 if err != nil {
4050 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable set", log.Fields{"Err": err,
4051 "device-id": oo.deviceID})
4052 return nil, err
4053 }
4054 logger.Debug(ctx, "send NetworkDialPlanTable-set-msg done")
4055 return meInstance, nil
4056 }
4057 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance", log.Fields{"Err": omciErr.GetError(),
4058 "device-id": oo.deviceID})
4059 return nil, omciErr.GetError()
4060}
4061
4062// SendDeleteNetworkDialPlanTable nolint: unused
4063func (oo *OmciCC) SendDeleteNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
4064 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
4065 tid := oo.GetNextTid(highPrio)
4066 logger.Debugw(ctx, "send NetworkDialPlanTable-Delete-msg:", log.Fields{"device-id": oo.deviceID,
4067 "SequNo": strconv.FormatInt(int64(tid), 16),
4068 "InstId": strconv.FormatInt(int64(aInstID), 16)})
4069
4070 meParams := me.ParamData{EntityID: aInstID}
4071 meInstance, omciErr := me.NewNetworkDialPlanTable(meParams)
4072 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00004073 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
4074 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004075 if err != nil {
4076 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for delete", log.Fields{
4077 "Err": err, "device-id": oo.deviceID})
4078 return nil, err
4079 }
4080
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004081 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004082 if err != nil {
4083 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable delete", log.Fields{
4084 "Err": err, "device-id": oo.deviceID})
4085 return nil, err
4086 }
4087
4088 omciRxCallbackPair := CallbackPair{
4089 CbKey: tid,
4090 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4091 }
4092 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
4093 if err != nil {
4094 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable delete", log.Fields{
4095 "Err": err, "device-id": oo.deviceID})
4096 return nil, err
4097 }
4098 logger.Debug(ctx, "send NetworkDialPlanTable-Delete-msg done")
4099 return meInstance, nil
4100 }
4101 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance for delete", log.Fields{
4102 "Err": omciErr.GetError(), "device-id": oo.deviceID})
4103 return nil, omciErr.GetError()
4104}
4105
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004106// SendSyncTime sends SynchronizeTimeRequest
4107func (oo *OmciCC) SendSyncTime(ctx context.Context, timeout int, highPrio bool, rxChan chan Message) error {
4108 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004109 logger.Debugw(ctx, "send synchronize time request:", log.Fields{"device-id": oo.deviceID,
4110 "SequNo": strconv.FormatInt(int64(tid), 16)})
4111
4112 omciLayer := &omci.OMCI{
4113 TransactionID: tid,
4114 MessageType: omci.SynchronizeTimeRequestType,
4115 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4116 // Length: 0x28, // Optional, defaults to 40 octets
4117 }
4118 utcTime := time.Now().UTC()
4119 request := &omci.SynchronizeTimeRequest{
4120 MeBasePacket: omci.MeBasePacket{
4121 EntityClass: me.OnuGClassID,
4122 // Default Instance ID is 0
4123 },
4124 Year: uint16(utcTime.Year()),
4125 Month: uint8(utcTime.Month()),
4126 Day: uint8(utcTime.Day()),
4127 Hour: uint8(utcTime.Hour()),
4128 Minute: uint8(utcTime.Minute()),
4129 Second: uint8(utcTime.Second()),
4130 }
4131
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004132 pkt, err := SerializeOmciLayer(ctx, omciLayer, request)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004133 if err != nil {
4134 logger.Errorw(ctx, "Cannot serialize synchronize time request", log.Fields{"Err": err,
4135 "device-id": oo.deviceID})
4136 return err
4137 }
4138
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004139 omciRxCallbackPair := CallbackPair{CbKey: tid,
4140 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004141 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004142 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004143 if err != nil {
4144 logger.Errorw(ctx, "Cannot send synchronize time request", log.Fields{"Err": err,
4145 "device-id": oo.deviceID})
4146 return err
4147 }
4148 logger.Debug(ctx, "send synchronize time request done")
4149 return nil
4150}
4151
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004152// SendCreateOrDeleteEthernetPerformanceMonitoringHistoryME creates or deletes EthernetFramePerformanceMonitoringHistoryData ME instance
4153func (oo *OmciCC) SendCreateOrDeleteEthernetPerformanceMonitoringHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004154 upstream bool, create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004155 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004156 logger.Debugw(ctx, "send ethernet-performance-monitoring-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4157 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
4158 meParam := me.ParamData{EntityID: entityID}
4159 var meInstance *me.ManagedEntity
4160 var omciErr me.OmciErrors
4161 if upstream {
4162 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataUpstream(meParam)
4163 } else {
4164 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataDownstream(meParam)
4165 }
4166 if omciErr.GetError() == nil {
4167 var omciLayer *omci.OMCI
4168 var msgLayer gopacket.SerializableLayer
4169 var err error
4170 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004171 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4172 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004173 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004174 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4175 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004176 }
4177 if err != nil {
4178 logger.Errorw(ctx, "Cannot encode ethernet frame performance monitoring history data ME",
4179 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004180 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004181 }
4182
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004183 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004184 if err != nil {
4185 logger.Errorw(ctx, "Cannot serialize ethernet frame performance monitoring history data ME",
4186 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004187 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004188 }
4189
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004190 omciRxCallbackPair := CallbackPair{CbKey: tid,
4191 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004192 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004193 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004194 if err != nil {
4195 logger.Errorw(ctx, "Cannot send ethernet frame performance monitoring history data ME",
4196 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004197 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004198 }
4199 logger.Debugw(ctx, "send ethernet frame performance monitoring history data ME done",
4200 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004201 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08004202 }
4203 logger.Errorw(ctx, "Cannot generate ethernet frame performance monitoring history data ME Instance",
4204 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 +03004205 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08004206}
4207
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004208// SendCreateOrDeleteEthernetUniHistoryME creates or deletes EthernetPerformanceMonitoringHistoryData ME instance
4209func (oo *OmciCC) SendCreateOrDeleteEthernetUniHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004210 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004211 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004212 logger.Debugw(ctx, "send ethernet-uni-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4213 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4214 meParam := me.ParamData{EntityID: entityID}
4215 var meInstance *me.ManagedEntity
4216 var omciErr me.OmciErrors
4217 meInstance, omciErr = me.NewEthernetPerformanceMonitoringHistoryData(meParam)
4218
4219 if omciErr.GetError() == nil {
4220 var omciLayer *omci.OMCI
4221 var msgLayer gopacket.SerializableLayer
4222 var err error
4223 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004224 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4225 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004226 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004227 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4228 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004229 }
4230 if err != nil {
4231 logger.Errorw(ctx, "Cannot encode ethernet uni history data ME",
4232 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004233 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004234 }
4235
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004236 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004237 if err != nil {
4238 logger.Errorw(ctx, "Cannot serialize ethernet uni history data ME",
4239 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004240 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004241 }
4242
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004243 omciRxCallbackPair := CallbackPair{CbKey: tid,
4244 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004245 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004246 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004247 if err != nil {
4248 logger.Errorw(ctx, "Cannot send ethernet uni history data ME",
4249 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004250 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004251 }
4252 logger.Debugw(ctx, "send ethernet uni history data ME done",
4253 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004254 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08004255 }
4256 logger.Errorw(ctx, "Cannot generate ethernet uni history data ME Instance",
4257 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004258 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08004259}
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004260
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004261// SendCreateOrDeleteFecHistoryME creates or deletes FecPerformanceMonitoringHistoryData ME instance
4262func (oo *OmciCC) SendCreateOrDeleteFecHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004263 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004264 tid := oo.GetNextTid(highPrio)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004265 logger.Debugw(ctx, "send fec-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4266 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4267 meParam := me.ParamData{EntityID: entityID}
4268 var meInstance *me.ManagedEntity
4269 var omciErr me.OmciErrors
4270 meInstance, omciErr = me.NewFecPerformanceMonitoringHistoryData(meParam)
4271
4272 if omciErr.GetError() == nil {
4273 var omciLayer *omci.OMCI
4274 var msgLayer gopacket.SerializableLayer
4275 var err error
4276 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004277 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4278 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004279 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004280 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4281 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004282 }
4283 if err != nil {
4284 logger.Errorw(ctx, "Cannot encode fec history data ME",
4285 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004286 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004287 }
4288
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004289 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004290 if err != nil {
4291 logger.Errorw(ctx, "Cannot serialize fec history data ME",
4292 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004293 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004294 }
4295
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004296 omciRxCallbackPair := CallbackPair{CbKey: tid,
4297 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004298 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004299 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004300 if err != nil {
4301 logger.Errorw(ctx, "Cannot send fec history data ME",
4302 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004303 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004304 }
4305 logger.Debugw(ctx, "send fec history data ME done",
4306 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004307 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004308 }
4309 logger.Errorw(ctx, "Cannot generate fec history data ME Instance",
4310 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004311 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004312}
4313
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004314// SendCreateOrDeleteGemPortHistoryME deletes GemPortNetworkCtpPerformanceMonitoringHistoryData ME instance
4315func (oo *OmciCC) SendCreateOrDeleteGemPortHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004316 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004317 tid := oo.GetNextTid(highPrio)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004318 logger.Debugw(ctx, "send gemport-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4319 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4320 meParam := me.ParamData{EntityID: entityID}
4321 var meInstance *me.ManagedEntity
4322 var omciErr me.OmciErrors
4323 meInstance, omciErr = me.NewGemPortNetworkCtpPerformanceMonitoringHistoryData(meParam)
4324
4325 if omciErr.GetError() == nil {
4326 var omciLayer *omci.OMCI
4327 var msgLayer gopacket.SerializableLayer
4328 var err error
4329 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004330 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4331 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004332 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004333 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4334 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004335 }
4336 if err != nil {
4337 logger.Errorw(ctx, "Cannot encode gemport history data ME",
4338 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004339 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004340 }
4341
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004342 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004343 if err != nil {
4344 logger.Errorw(ctx, "Cannot serialize gemport history data ME",
4345 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004346 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004347 }
4348
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004349 omciRxCallbackPair := CallbackPair{CbKey: tid,
4350 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004351 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004352 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004353 if err != nil {
4354 logger.Errorw(ctx, "Cannot send gemport history data ME",
4355 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004356 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004357 }
4358 logger.Debugw(ctx, "send gemport history data ME done",
4359 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004360 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004361 }
4362 logger.Errorw(ctx, "Cannot generate gemport history data ME Instance",
4363 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004364 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004365}
4366
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004367// SendStartSoftwareDownload sends StartSoftwareDownloadRequest
4368func (oo *OmciCC) SendStartSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004369 rxChan chan Message, aImageMeID uint16, aDownloadWindowSize uint8, aFileLen uint32, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004370 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004371 logger.Debugw(ctx, "send StartSwDlRequest:", log.Fields{"device-id": oo.deviceID,
4372 "SequNo": strconv.FormatInt(int64(tid), 16),
4373 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4374
4375 omciLayer := &omci.OMCI{
4376 TransactionID: tid,
4377 MessageType: omci.StartSoftwareDownloadRequestType,
4378 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4379 // Length: 0x28, // Optional, defaults to 40 octets
4380 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004381 if aIsExtendedOmci {
4382 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4383 }
mpagenko80622a52021-02-09 16:53:23 +00004384 request := &omci.StartSoftwareDownloadRequest{
4385 MeBasePacket: omci.MeBasePacket{
4386 EntityClass: me.SoftwareImageClassID,
4387 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004388 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004389 },
4390 WindowSize: aDownloadWindowSize,
4391 ImageSize: aFileLen,
4392 NumberOfCircuitPacks: 1, //parallel download to multiple circuit packs not supported
4393 CircuitPacks: []uint16{0}, //circuit pack indication don't care for NumberOfCircuitPacks=1, but needed by omci-lib
4394 }
4395
4396 var options gopacket.SerializeOptions
4397 options.FixLengths = true
4398 buffer := gopacket.NewSerializeBuffer()
4399 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4400 if err != nil {
4401 logger.Errorw(ctx, "Cannot serialize StartSwDlRequest", log.Fields{"Err": err,
4402 "device-id": oo.deviceID})
4403 return err
4404 }
4405 outgoingPacket := buffer.Bytes()
4406
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004407 omciRxCallbackPair := CallbackPair{CbKey: tid,
4408 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko80622a52021-02-09 16:53:23 +00004409 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004410 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004411 if err != nil {
4412 logger.Errorw(ctx, "Cannot send StartSwDlRequest", log.Fields{"Err": err,
4413 "device-id": oo.deviceID})
4414 return err
4415 }
4416 logger.Debug(ctx, "send StartSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004417 return nil
4418}
4419
kesavand011d5162021-11-25 19:21:06 +05304420// PrepareOnuSectionsOfWindow prepares a list of sections for each window
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304421// Before invoking this function the oo.mutexTid needs to be be locked so that
4422// GetOnuSwSecNextTid can be invoked without further locking
kesavand011d5162021-11-25 19:21:06 +05304423func (oo *OmciCC) PrepareOnuSectionsOfWindow(ctx context.Context,
4424 aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004425 omciMsgsPerWindow *ia.OmciMessages, aIsExtendedOmci bool) (OmciTransferStructure, error) {
kesavand011d5162021-11-25 19:21:06 +05304426 //onuswsections uses only low prioirity tids
4427 tid := oo.GetOnuSwSecNextTid()
4428 logger.Infow(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
4429 "SequNo": strconv.FormatInt(int64(tid), 16),
4430 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest, "sectionNo": aDownloadSectionNo, "sectionData": aSection})
4431
4432 var omciTxReq OmciTransferStructure
4433 msgType := omci.DownloadSectionRequestType
4434
4435 if aAckRequest > 0 {
4436 msgType = omci.DownloadSectionRequestWithResponseType
4437
4438 }
4439 omciLayer := &omci.OMCI{
4440 TransactionID: tid,
4441 MessageType: msgType,
4442 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4443 // Length: 0x28, // Optional, defaults to 40 octets
4444 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004445 if aIsExtendedOmci {
4446 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4447 }
kesavand011d5162021-11-25 19:21:06 +05304448 localSectionData := make([]byte, len(aSection))
4449
4450 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
4451 request := &omci.DownloadSectionRequest{
4452 MeBasePacket: omci.MeBasePacket{
4453 EntityClass: me.SoftwareImageClassID,
4454 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004455 Extended: aIsExtendedOmci,
kesavand011d5162021-11-25 19:21:06 +05304456 },
4457 SectionNumber: aDownloadSectionNo,
4458 SectionData: localSectionData,
4459 }
4460
4461 var options gopacket.SerializeOptions
4462 options.FixLengths = true
4463 buffer := gopacket.NewSerializeBuffer()
4464 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4465 if err != nil {
4466 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
4467 "device-id": oo.deviceID})
4468 return omciTxReq, err
4469 }
4470 outgoingPacket := buffer.Bytes()
4471
4472 omciMsgsPerWindow.Messages = append(omciMsgsPerWindow.Messages, outgoingPacket)
4473
4474 if aAckRequest > 0 {
4475 // only the last section should have a timeout as an ack is required only for the last section of the window
4476 omciTxReq = OmciTransferStructure{
4477 withFramePrint: true,
4478 OnuSwWindow: omciMsgsPerWindow,
4479 }
4480 return omciTxReq, nil
4481 }
4482
4483 return omciTxReq, nil
4484}
4485
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304486// SendOnuSwSectionsWindowWithRxSupervision sends onu swd sections
kesavand011d5162021-11-25 19:21:06 +05304487func (oo *OmciCC) SendOnuSwSectionsWindowWithRxSupervision(ctx context.Context,
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304488 aOmciTxRequest OmciTransferStructure, aTimeout int, rxChan chan Message) error {
kesavand011d5162021-11-25 19:21:06 +05304489 if aOmciTxRequest.OnuSwWindow == nil {
4490 logger.Errorw(ctx, "SendOnuSwSectionsWindowWithRxSupervision: omciTxRequest.OnuSwWindow is nil",
4491 log.Fields{"device-id": oo.deviceID})
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304492 return fmt.Errorf("sendOnuSwSectionsWindowWithRxSupervision: omciTxRequest.OnuSwWindow is nil device-id: %v",
4493 oo.deviceID)
kesavand011d5162021-11-25 19:21:06 +05304494 }
4495
4496 tid := oo.GetOnuSwSecLastTid()
4497 logger.Debugw(ctx, "SendOnuSwSectionsWindowWithRxSupervision tid for the last segment is ", log.Fields{"TID": tid})
4498 omciRxCallbackPair := CallbackPair{CbKey: tid,
4499 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4500 }
4501
4502 aOmciTxRequest.cbPair = omciRxCallbackPair
4503 logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TansCorrId": aOmciTxRequest.cbPair.CbKey})
4504 oo.mutexRxSchedMap.Lock()
4505 // it could be checked, if the callback key is already registered - but simply overwrite may be acceptable ...
4506 oo.rxSchedulerMap[aOmciTxRequest.cbPair.CbKey] = aOmciTxRequest.cbPair.CbEntry
4507 oo.mutexRxSchedMap.Unlock()
4508
4509 chSuccess := make(chan bool)
4510 aOmciTxRequest.chSuccess = chSuccess
4511 aOmciTxRequest.timeout = aTimeout
4512 aOmciTxRequest.retries = CDefaultRetries
4513
4514 //tid := aOmciTxRequest.cbPair.CbKey
4515 oo.mutexMonReq.Lock()
4516 oo.monitoredRequests[tid] = aOmciTxRequest
4517 oo.mutexMonReq.Unlock()
4518
4519 retries := aOmciTxRequest.retries
4520 retryCounter := 0
4521 if aTimeout == 0 {
4522 logger.Errorw(ctx, "no timeout present for last section of window", log.Fields{"device-id": oo.deviceID})
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304523 return fmt.Errorf("no timeout present for last section of window device-id: %v", oo.deviceID)
kesavand011d5162021-11-25 19:21:06 +05304524 }
4525loop:
4526 for retryCounter <= retries {
4527 // the onu sw sections are enqueued only to the low priority queue
4528 oo.mutexLowPrioTxQueue.Lock()
4529 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4530 oo.mutexLowPrioTxQueue.Unlock()
4531
pnalmasc6e916a2025-06-30 11:59:16 +05304532 //Register the call back again as we clean up the Map entry when we failed to send the message
4533 oo.mutexRxSchedMap.Lock()
4534 oo.rxSchedulerMap[aOmciTxRequest.cbPair.CbKey] = aOmciTxRequest.cbPair.CbEntry
4535 oo.mutexRxSchedMap.Unlock()
4536
kesavand011d5162021-11-25 19:21:06 +05304537 go oo.sendQueuedRequests(ctx)
4538
4539 select {
4540 case success := <-chSuccess:
4541 if success {
4542 logger.Debugw(ctx, "reqMon: response received in time",
4543 log.Fields{"tid": tid, "device-id": oo.deviceID})
4544 } else {
4545 logger.Debugw(ctx, "reqMon: wait for response aborted",
4546 log.Fields{"tid": tid, "device-id": oo.deviceID})
4547 }
4548 break loop
4549 case <-time.After(time.Duration(aTimeout) * time.Second):
4550 if retryCounter == retries {
Holger Hildebrandt2b107642022-12-09 07:56:23 +00004551 if oo.pBaseDeviceHandler.IsOltAvailable() {
4552 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - send ONU device event!",
4553 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4554 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationFailureSwUpgrade, OnuOmciCommunicationFailureSwUpgradeDesc)
4555 } else {
4556 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - skip ONU device event: OLT unavailable!",
4557 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4558 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004559 oo.incrementTxTimesouts()
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304560 oo.mutexMonReq.Lock()
4561 delete(oo.monitoredRequests, tid)
4562 oo.mutexMonReq.Unlock()
4563 return fmt.Errorf("reqMon: timeout waiting for response - no of max retries reached device-id: %v", oo.deviceID)
kesavand011d5162021-11-25 19:21:06 +05304564 }
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304565 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
4566 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4567 oo.incrementTxRetries()
4568 case _, ok := <-oo.pBaseDeviceHandler.GetDeviceDeleteCommChan(ctx):
4569 if !ok {
4570 logger.Warnw(ctx, "device deletion channel is closed", log.Fields{"device-id": oo.deviceID})
4571 oo.mutexMonReq.Lock()
4572 delete(oo.monitoredRequests, tid)
4573 oo.mutexMonReq.Unlock()
4574 return fmt.Errorf("device deletion channel is closed device-id: %v", oo.deviceID)
4575 }
4576 oo.mutexMonReq.Lock()
4577 delete(oo.monitoredRequests, tid)
4578 oo.mutexMonReq.Unlock()
4579 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 +05304580 }
4581 retryCounter++
4582 }
4583 oo.mutexMonReq.Lock()
4584 delete(oo.monitoredRequests, tid)
4585 oo.mutexMonReq.Unlock()
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304586 return nil
kesavand011d5162021-11-25 19:21:06 +05304587}
4588
4589func (oo *OmciCC) sendOnuSwSectionsOfWindow(ctx context.Context, omciTxRequest OmciTransferStructure) error {
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004590 var lastSection []byte
4591 if omciTxRequest.OnuSwWindow != nil {
4592 lastSection = omciTxRequest.OnuSwWindow.Messages[len(omciTxRequest.OnuSwWindow.Messages)-1]
4593 } else {
4594 logger.Errorw(ctx, "invalid sw window received", log.Fields{"device-id": oo.deviceID})
4595 return fmt.Errorf("invalid sw window received")
4596 }
4597 if omciTxRequest.withFramePrint {
4598 logger.Debugw(ctx, "sw-section-omci-message-to-send:", log.Fields{
kesavand011d5162021-11-25 19:21:06 +05304599 "TxOmciMessage": hex.EncodeToString(lastSection),
4600 "device-id": oo.deviceID,
4601 "toDeviceType": oo.pBaseDeviceHandler.GetProxyAddressType(),
4602 "proxyDeviceID": oo.pBaseDeviceHandler.GetProxyAddressID(),
4603 "proxyAddress": oo.pBaseDeviceHandler.GetProxyAddress()})
4604 }
4605 sendErr := oo.pBaseDeviceHandler.SendOnuSwSectionsOfWindow(ctx, oo.pBaseDeviceHandler.GetProxyAddress().AdapterEndpoint, omciTxRequest.OnuSwWindow)
4606 if sendErr != nil {
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004607 logger.Errorw(ctx, "send onu sw sections omci request error", log.Fields{"device-id": oo.deviceID, "error": sendErr})
kesavand011d5162021-11-25 19:21:06 +05304608 return sendErr
4609 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004610 numberOfNoArSections := len(omciTxRequest.OnuSwWindow.Messages) - 1 // last section of window is sent with AR expected
4611 if lastSection[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
4612 oo.increaseBaseTxNoArFramesBy(ctx, uint32(numberOfNoArSections))
4613 oo.incrementBaseTxArFrames()
4614 } else {
4615 oo.increaseExtTxNoArFramesBy(ctx, uint32(numberOfNoArSections))
4616 oo.incrementExtTxArFrames()
4617 }
kesavand011d5162021-11-25 19:21:06 +05304618 return nil
4619}
4620
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004621// SendDownloadSection sends DownloadSectionRequestWithResponse
4622func (oo *OmciCC) SendDownloadSection(ctx context.Context, aTimeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004623 rxChan chan Message, aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte, aPrint bool, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004624 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004625 logger.Debugw(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
4626 "SequNo": strconv.FormatInt(int64(tid), 16),
mpagenko15ff4a52021-03-02 10:09:20 +00004627 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest})
mpagenko80622a52021-02-09 16:53:23 +00004628
4629 //TODO!!!: don't know by now on how to generate the possibly needed AR (or enforce it to 0) with current omci-lib
4630 // by now just try to send it as defined by omci-lib
mpagenko15ff4a52021-03-02 10:09:20 +00004631 msgType := omci.DownloadSectionRequestType
mgoudad611f4c2025-10-30 14:49:27 +05304632 var timeout = 0 //default value for no response expected
mpagenko15ff4a52021-03-02 10:09:20 +00004633 if aAckRequest > 0 {
4634 msgType = omci.DownloadSectionRequestWithResponseType
mpagenkoc26d4c02021-05-06 14:27:57 +00004635 timeout = aTimeout
mpagenko15ff4a52021-03-02 10:09:20 +00004636 }
mpagenko80622a52021-02-09 16:53:23 +00004637 omciLayer := &omci.OMCI{
4638 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004639 MessageType: msgType,
mpagenko80622a52021-02-09 16:53:23 +00004640 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4641 // Length: 0x28, // Optional, defaults to 40 octets
4642 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004643 if aIsExtendedOmci {
4644 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4645 }
Himani Chawla43f95ff2021-06-03 00:24:12 +05304646 localSectionData := make([]byte, len(aSection))
4647
mpagenko15ff4a52021-03-02 10:09:20 +00004648 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
mpagenko80622a52021-02-09 16:53:23 +00004649 request := &omci.DownloadSectionRequest{
4650 MeBasePacket: omci.MeBasePacket{
4651 EntityClass: me.SoftwareImageClassID,
4652 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004653 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004654 },
4655 SectionNumber: aDownloadSectionNo,
4656 SectionData: localSectionData,
4657 }
4658
4659 var options gopacket.SerializeOptions
4660 options.FixLengths = true
4661 buffer := gopacket.NewSerializeBuffer()
4662 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4663 if err != nil {
4664 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
4665 "device-id": oo.deviceID})
4666 return err
4667 }
4668 outgoingPacket := buffer.Bytes()
4669
mpagenko15ff4a52021-03-02 10:09:20 +00004670 //for initial debug purpose overrule the requested print state for some frames
4671 printFrame := aPrint
4672 if aAckRequest > 0 || aDownloadSectionNo == 0 {
4673 printFrame = true
4674 }
4675
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004676 omciRxCallbackPair := CallbackPair{CbKey: tid,
mpagenkoc26d4c02021-05-06 14:27:57 +00004677 // the callback is set even though no response might be required here, the tid (key) setting is needed here anyway
4678 // (used to avoid retransmission of frames with the same TID)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004679 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, printFrame /*aPrint*/},
mpagenko80622a52021-02-09 16:53:23 +00004680 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004681 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004682 if err != nil {
4683 logger.Errorw(ctx, "Cannot send DlSectionRequest", log.Fields{"Err": err,
4684 "device-id": oo.deviceID})
4685 return err
4686 }
4687 logger.Debug(ctx, "send DlSectionRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004688 return nil
4689}
4690
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304691// SendEndSoftwareDownload sends EndSoftwareDownloadRequest
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004692func (oo *OmciCC) SendEndSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004693 rxChan chan Message, aImageMeID uint16, aFileLen uint32, aImageCrc uint32, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004694 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004695 logger.Debugw(ctx, "send EndSwDlRequest:", log.Fields{"device-id": oo.deviceID,
4696 "SequNo": strconv.FormatInt(int64(tid), 16),
4697 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4698
mpagenko15ff4a52021-03-02 10:09:20 +00004699 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00004700 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004701 MessageType: omci.EndSoftwareDownloadRequestType,
mpagenko80622a52021-02-09 16:53:23 +00004702 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4703 // Length: 0x28, // Optional, defaults to 40 octets
4704 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004705 if aIsExtendedOmci {
4706 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4707 }
mpagenko15ff4a52021-03-02 10:09:20 +00004708 request := &omci.EndSoftwareDownloadRequest{
mpagenko80622a52021-02-09 16:53:23 +00004709 MeBasePacket: omci.MeBasePacket{
4710 EntityClass: me.SoftwareImageClassID,
4711 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004712 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004713 },
mpagenko15ff4a52021-03-02 10:09:20 +00004714 CRC32: aImageCrc,
4715 ImageSize: aFileLen,
4716 NumberOfInstances: 1, //parallel download to multiple circuit packs not supported
4717 ImageInstances: []uint16{0}, //don't care for NumberOfInstances=1, but probably needed by omci-lib as in startSwDlRequest
mpagenko80622a52021-02-09 16:53:23 +00004718 }
mpagenko15ff4a52021-03-02 10:09:20 +00004719
4720 var options gopacket.SerializeOptions
4721 options.FixLengths = true
4722 buffer := gopacket.NewSerializeBuffer()
4723 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4724 if err != nil {
4725 logger.Errorw(ctx, "Cannot serialize EndSwDlRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00004726 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00004727 return err
mpagenko80622a52021-02-09 16:53:23 +00004728 }
mpagenko15ff4a52021-03-02 10:09:20 +00004729 outgoingPacket := buffer.Bytes()
4730
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004731 omciRxCallbackPair := CallbackPair{CbKey: tid,
4732 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko15ff4a52021-03-02 10:09:20 +00004733 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004734 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00004735 if err != nil {
4736 logger.Errorw(ctx, "Cannot send EndSwDlRequest", log.Fields{"Err": err,
4737 "device-id": oo.deviceID})
4738 return err
4739 }
4740 logger.Debug(ctx, "send EndSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004741 return nil
4742}
4743
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004744// SendActivateSoftware sends ActivateSoftwareRequest
4745func (oo *OmciCC) SendActivateSoftware(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004746 rxChan chan Message, aImageMeID uint16, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004747 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004748 logger.Debugw(ctx, "send ActivateSwRequest:", log.Fields{"device-id": oo.deviceID,
4749 "SequNo": strconv.FormatInt(int64(tid), 16),
4750 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4751
4752 omciLayer := &omci.OMCI{
4753 TransactionID: tid,
4754 MessageType: omci.ActivateSoftwareRequestType,
4755 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4756 // Length: 0x28, // Optional, defaults to 40 octets
4757 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004758 if aIsExtendedOmci {
4759 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4760 }
mpagenko80622a52021-02-09 16:53:23 +00004761 request := &omci.ActivateSoftwareRequest{
4762 MeBasePacket: omci.MeBasePacket{
4763 EntityClass: me.SoftwareImageClassID,
4764 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004765 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004766 },
4767 ActivateFlags: 0, //unconditionally reset as the only relevant option here (regardless of VOIP)
4768 }
4769
4770 var options gopacket.SerializeOptions
4771 options.FixLengths = true
4772 buffer := gopacket.NewSerializeBuffer()
4773 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4774 if err != nil {
4775 logger.Errorw(ctx, "Cannot serialize ActivateSwRequest", log.Fields{"Err": err,
4776 "device-id": oo.deviceID})
4777 return err
4778 }
4779 outgoingPacket := buffer.Bytes()
4780
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004781 omciRxCallbackPair := CallbackPair{CbKey: tid,
4782 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko80622a52021-02-09 16:53:23 +00004783 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004784 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004785 if err != nil {
4786 logger.Errorw(ctx, "Cannot send ActivateSwRequest", log.Fields{"Err": err,
4787 "device-id": oo.deviceID})
4788 return err
4789 }
4790 logger.Debug(ctx, "send ActivateSwRequest done")
mpagenko15ff4a52021-03-02 10:09:20 +00004791 return nil
4792}
mpagenko80622a52021-02-09 16:53:23 +00004793
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004794// SendCommitSoftware sends CommitSoftwareRequest
4795func (oo *OmciCC) SendCommitSoftware(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004796 rxChan chan Message, aImageMeID uint16, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004797 tid := oo.GetNextTid(highPrio)
mpagenko15ff4a52021-03-02 10:09:20 +00004798 logger.Debugw(ctx, "send CommitSwRequest:", log.Fields{"device-id": oo.deviceID,
4799 "SequNo": strconv.FormatInt(int64(tid), 16),
4800 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4801
4802 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00004803 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004804 MessageType: omci.CommitSoftwareRequestType,
mpagenko80622a52021-02-09 16:53:23 +00004805 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4806 // Length: 0x28, // Optional, defaults to 40 octets
4807 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004808 if aIsExtendedOmci {
4809 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4810 }
mpagenko15ff4a52021-03-02 10:09:20 +00004811 request := &omci.CommitSoftwareRequest{
mpagenko80622a52021-02-09 16:53:23 +00004812 MeBasePacket: omci.MeBasePacket{
4813 EntityClass: me.SoftwareImageClassID,
4814 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004815 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004816 },
mpagenko80622a52021-02-09 16:53:23 +00004817 }
mpagenko15ff4a52021-03-02 10:09:20 +00004818
4819 var options gopacket.SerializeOptions
4820 options.FixLengths = true
4821 buffer := gopacket.NewSerializeBuffer()
4822 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4823 if err != nil {
4824 logger.Errorw(ctx, "Cannot serialize CommitSwRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00004825 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00004826 return err
mpagenko80622a52021-02-09 16:53:23 +00004827 }
mpagenko15ff4a52021-03-02 10:09:20 +00004828 outgoingPacket := buffer.Bytes()
4829
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004830 omciRxCallbackPair := CallbackPair{CbKey: tid,
4831 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko15ff4a52021-03-02 10:09:20 +00004832 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004833 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00004834 if err != nil {
4835 logger.Errorw(ctx, "Cannot send CommitSwRequest", log.Fields{"Err": err,
4836 "device-id": oo.deviceID})
4837 return err
4838 }
4839 logger.Debug(ctx, "send CommitSwRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004840 return nil
4841}
4842
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304843// SendSelfTestReq sends TestRequest
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004844func (oo *OmciCC) SendSelfTestReq(ctx context.Context, classID me.ClassID, instdID uint16, timeout int, highPrio bool, rxChan chan Message) error {
4845 tid := oo.GetNextTid(highPrio)
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004846 logger.Debugw(ctx, "send self test request:", log.Fields{"device-id": oo.deviceID,
4847 "SequNo": strconv.FormatInt(int64(tid), 16),
4848 "InstId": strconv.FormatInt(int64(instdID), 16)})
4849 omciLayer := &omci.OMCI{
4850 TransactionID: tid,
4851 MessageType: omci.TestRequestType,
4852 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4853 // Length: 0x28, // Optional, defaults to 40 octets
4854 }
4855
4856 var request *omci.OpticalLineSupervisionTestRequest
4857 switch classID {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004858 case me.AniGClassID:
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004859 request = &omci.OpticalLineSupervisionTestRequest{
4860 MeBasePacket: omci.MeBasePacket{
4861 EntityClass: classID,
4862 EntityInstance: instdID,
4863 },
4864 SelectTest: uint8(7), // self test
4865 GeneralPurposeBuffer: uint16(0),
4866 VendorSpecificParameters: uint16(0),
4867 }
4868 default:
4869 logger.Errorw(ctx, "unsupported class id for self test request", log.Fields{"device-id": oo.deviceID, "classID": classID})
4870 return fmt.Errorf("unsupported-class-id-for-self-test-request-%v", classID)
4871 }
4872 // Test serialization back to former string
4873 var options gopacket.SerializeOptions
4874 options.FixLengths = true
4875
4876 buffer := gopacket.NewSerializeBuffer()
4877 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4878 if err != nil {
4879 logger.Errorw(ctx, "Cannot serialize self test request", log.Fields{"Err": err,
4880 "device-id": oo.deviceID})
4881 return err
4882 }
4883 outgoingPacket := buffer.Bytes()
4884
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004885 omciRxCallbackPair := CallbackPair{CbKey: tid,
4886 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004887 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004888 err = oo.Send(ctx, outgoingPacket, timeout, 0, highPrio, omciRxCallbackPair)
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004889 if err != nil {
4890 logger.Errorw(ctx, "Cannot send self test request", log.Fields{"Err": err,
4891 "device-id": oo.deviceID})
4892 return err
4893 }
4894 logger.Debug(ctx, "send self test request done")
4895 return nil
4896}
4897
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304898// nolint: gocyclo
mgoudad611f4c2025-10-30 14:49:27 +05304899func (oo *OmciCC) isSuccessfulResponseWithMibDataSync(ctx context.Context, omciMsg *omci.OMCI, packet *gopacket.Packet) (bool, error) {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004900
4901 nextLayer, err := omci.MsgTypeToNextLayer(omciMsg.MessageType, false)
4902 if err != nil {
4903 logger.Errorw(ctx, "omci-message: could not map msgType to nextLayer", log.Fields{"device-id": oo.deviceID})
4904 return false, fmt.Errorf("could not map msgType to nextLayer - %s", oo.deviceID)
4905 }
4906 msgLayer := (*packet).Layer(nextLayer)
4907 if msgLayer != nil {
4908 // Note: Due to relaxed decoding, you may now still have a decoding error attached to the layers
4909 if failure := (*packet).ErrorLayer(); failure != nil {
mgoudad611f4c2025-10-30 14:49:27 +05304910 switch nextLayer {
4911 case omci.LayerTypeMibUploadNextResponse:
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004912 // In the case of MibUploadNextResponse, we let the packet pass so that later processing
4913 // can examine for UnkonwnMEs and UnknownAttributes
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304914 logger.Debug(ctx, "omci-message: MibUploadNextResponse packet with ErrorLayer - let it pass",
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004915 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4916 return false, nil
mgoudad611f4c2025-10-30 14:49:27 +05304917 case omci.LayerTypeGetResponse:
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004918 if resp := msgLayer.(*omci.GetResponse); resp != nil {
4919 if resp.NextLayerType() == omci.LayerTypeUnknownAttributes {
4920 unknownAttrLayer := (*packet).Layer(omci.LayerTypeUnknownAttributes)
4921 if unknownAttrLayer != nil {
4922 logger.Errorw(ctx, "omci-message: GetResponse packet contains unknownAttrLayer - skip it!",
4923 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "unknownAttrLayer": unknownAttrLayer})
4924 return false, fmt.Errorf("packet contains unknownAttrLayer - %s", oo.deviceID)
4925 }
4926 }
4927 }
4928 }
4929 // Try to decode any further error information
4930 if decodeFailure, ok := failure.(*gopacket.DecodeFailure); ok && decodeFailure != nil {
4931 logger.Errorw(ctx, "omci-message: packet contains ErrorLayer with further info - skip it!",
4932 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "decodeFailure": decodeFailure.String()})
4933 return false, fmt.Errorf("packet contains ErrorLayer with further info - %s", oo.deviceID)
4934 }
4935 logger.Errorw(ctx, "omci-message: packet contains ErrorLayer - skip it!",
4936 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4937 return false, fmt.Errorf("packet contains ErrorLayer - %s", oo.deviceID)
4938 }
4939 } else if failure := (*packet).ErrorLayer(); failure != nil {
4940 // message layer could not be decoded, but at least check if additional failure information is available
4941 if decodeFailure, ok := failure.(*gopacket.DecodeFailure); ok && decodeFailure != nil {
Holger Hildebrandt93d183f2022-04-22 15:50:26 +00004942 errMsg := decodeFailure.String()
4943 if nextLayer == omci.LayerTypeMibUploadNextResponse {
4944 if strings.Contains(strings.ToLower(errMsg), "table decode") {
4945 // In the case of MibUploadNextResponse with non-standard table attributes, we let the packet pass
4946 // so that later processing can deal with it
4947 logger.Infow(ctx, "omci-message: MibUploadNextResponse packet with table attributes - let it pass",
4948 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4949 return false, nil
4950 }
4951 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004952 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet, further info available - skip it!",
Holger Hildebrandt93d183f2022-04-22 15:50:26 +00004953 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "decodeFailure": errMsg})
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004954 return false, fmt.Errorf("could not decode msgLayer of packet, further info available - %s", oo.deviceID)
4955 }
4956 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet, ErrorLayer available",
4957 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4958 return false, fmt.Errorf("could not decode msgLayer of packet, ErrorLayer available - %s", oo.deviceID)
4959 } else {
4960 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet", log.Fields{"device-id": oo.deviceID})
4961 return false, fmt.Errorf("could not decode msgLayer of packet - %s", oo.deviceID)
4962 }
4963
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004964 for _, v := range responsesWithMibDataSync {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004965 if v == omciMsg.MessageType {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004966 switch nextLayer {
4967 case omci.LayerTypeCreateResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004968 if resp := msgLayer.(*omci.CreateResponse); resp != nil {
4969 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004970 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004971 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004972 }
4973 case omci.LayerTypeDeleteResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004974 if resp := msgLayer.(*omci.DeleteResponse); resp != nil {
4975 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004976 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004977 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004978 }
4979 case omci.LayerTypeSetResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004980 if resp := msgLayer.(*omci.SetResponse); resp != nil {
4981 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004982 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004983 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004984 }
4985 case omci.LayerTypeStartSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004986 if resp := msgLayer.(*omci.StartSoftwareDownloadResponse); resp != nil {
4987 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004988 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004989 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004990 }
4991 case omci.LayerTypeEndSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004992 if resp := msgLayer.(*omci.EndSoftwareDownloadResponse); resp != nil {
4993 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004994 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004995 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004996 }
4997 case omci.LayerTypeActivateSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004998 if resp := msgLayer.(*omci.ActivateSoftwareResponse); resp != nil {
4999 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00005000 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00005001 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00005002 }
5003 case omci.LayerTypeCommitSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00005004 if resp := msgLayer.(*omci.CommitSoftwareResponse); resp != nil {
5005 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00005006 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00005007 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00005008 }
5009 }
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00005010 }
5011 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00005012 return false, nil
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00005013}
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005014
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005015func (oo *OmciCC) processRequestMonitoring(ctx context.Context, aOmciTxRequest OmciTransferStructure) {
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005016 timeout := aOmciTxRequest.timeout
mpagenkoc26d4c02021-05-06 14:27:57 +00005017 if timeout == 0 {
5018 //timeout 0 indicates that no response is expected - fire and forget
Holger Hildebrandt34555512021-10-01 16:26:59 +00005019 // enqueue
5020 if aOmciTxRequest.highPrio {
5021 oo.mutexHighPrioTxQueue.Lock()
5022 oo.highPrioTxQueue.PushBack(aOmciTxRequest)
5023 oo.mutexHighPrioTxQueue.Unlock()
5024 } else {
5025 oo.mutexLowPrioTxQueue.Lock()
5026 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
5027 oo.mutexLowPrioTxQueue.Unlock()
5028 }
5029 go oo.sendQueuedRequests(ctx)
mpagenkoc26d4c02021-05-06 14:27:57 +00005030 } else {
mpagenko7455fd42021-06-10 16:25:55 +00005031 //the supervised sending with waiting on the response (based on TID) is called in background
5032 // to avoid blocking of the sender for the complete OMCI handshake procedure
5033 // to stay consistent with the processing tested so far, sending of next messages of the same control procedure
5034 // is ensured by the according control instances (FSM's etc.) (by waiting for the respective responses there)
5035 go oo.sendWithRxSupervision(ctx, aOmciTxRequest, timeout)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005036 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005037}
5038
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005039func (oo *OmciCC) sendWithRxSupervision(ctx context.Context, aOmciTxRequest OmciTransferStructure, aTimeout int) {
mpagenko7455fd42021-06-10 16:25:55 +00005040 chSuccess := make(chan bool)
5041 aOmciTxRequest.chSuccess = chSuccess
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005042 tid := aOmciTxRequest.cbPair.CbKey
mpagenko7455fd42021-06-10 16:25:55 +00005043 oo.mutexMonReq.Lock()
5044 oo.monitoredRequests[tid] = aOmciTxRequest
5045 oo.mutexMonReq.Unlock()
5046
5047 retries := aOmciTxRequest.retries
5048 retryCounter := 0
5049loop:
5050 for retryCounter <= retries {
Holger Hildebrandt34555512021-10-01 16:26:59 +00005051 // enqueue
5052 if aOmciTxRequest.highPrio {
5053 oo.mutexHighPrioTxQueue.Lock()
5054 oo.highPrioTxQueue.PushBack(aOmciTxRequest)
5055 oo.mutexHighPrioTxQueue.Unlock()
5056 } else {
5057 oo.mutexLowPrioTxQueue.Lock()
5058 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
5059 oo.mutexLowPrioTxQueue.Unlock()
5060 }
pnalmasc6e916a2025-06-30 11:59:16 +05305061
5062 //Register the call back again as we clean up the Map entry when we failed to send the message .
5063 oo.mutexRxSchedMap.Lock()
5064 oo.rxSchedulerMap[aOmciTxRequest.cbPair.CbKey] = aOmciTxRequest.cbPair.CbEntry
5065 oo.mutexRxSchedMap.Unlock()
5066
Holger Hildebrandt34555512021-10-01 16:26:59 +00005067 go oo.sendQueuedRequests(ctx)
mpagenko7455fd42021-06-10 16:25:55 +00005068
5069 select {
5070 case success := <-chSuccess:
5071 if success {
5072 logger.Debugw(ctx, "reqMon: response received in time",
5073 log.Fields{"tid": tid, "device-id": oo.deviceID})
5074 } else {
5075 logger.Debugw(ctx, "reqMon: wait for response aborted",
5076 log.Fields{"tid": tid, "device-id": oo.deviceID})
5077 }
5078 break loop
5079 case <-time.After(time.Duration(aTimeout) * time.Second):
5080 if retryCounter == retries {
Holger Hildebrandt2b107642022-12-09 07:56:23 +00005081 if oo.pBaseDeviceHandler.IsOltAvailable() {
5082 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - send ONU device event!",
5083 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
5084 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationFailureConfig, OnuOmciCommunicationFailureConfigDesc)
5085 } else {
5086 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - skip ONU device event: OLT unavailable!",
5087 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
5088 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005089 oo.incrementTxTimesouts()
mpagenko7455fd42021-06-10 16:25:55 +00005090 break loop
5091 } else {
5092 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
5093 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005094 oo.incrementTxRetries()
mpagenko7455fd42021-06-10 16:25:55 +00005095 }
balaji.nagarajan3cab2b62025-06-23 15:44:54 +05305096 case _, ok := <-oo.pBaseDeviceHandler.GetDeviceDeleteCommChan(ctx):
5097 if !ok {
5098 logger.Warnw(ctx, "device deletion channel is closed at sendWithRxSupervision", log.Fields{"device-id": oo.deviceID})
5099 break loop
5100 }
mpagenko7455fd42021-06-10 16:25:55 +00005101 }
5102 retryCounter++
5103 }
5104 oo.mutexMonReq.Lock()
5105 delete(oo.monitoredRequests, tid)
5106 oo.mutexMonReq.Unlock()
5107}
5108
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05305109// CancelRequestMonitoring terminates monitoring of outstanding omci requests
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005110func (oo *OmciCC) CancelRequestMonitoring(ctx context.Context) {
Holger Hildebrandt12609a12022-03-25 13:23:25 +00005111 logger.Debugw(ctx, "CancelRequestMonitoring entered", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005112 oo.mutexMonReq.RLock()
5113 for k := range oo.monitoredRequests {
mpagenko8cd1bf72021-06-22 10:11:19 +00005114 //implement non-blocking channel send to avoid blocking on mutexMonReq later
5115 select {
5116 case oo.monitoredRequests[k].chSuccess <- false:
Holger Hildebrandt12609a12022-03-25 13:23:25 +00005117 logger.Debugw(ctx, "send cancellation on omciRespChannel",
5118 log.Fields{"index": k, "device-id": oo.deviceID})
mpagenko8cd1bf72021-06-22 10:11:19 +00005119 default:
Holger Hildebrandt12609a12022-03-25 13:23:25 +00005120 logger.Debugw(ctx, "cancellation could not be send on omciRespChannel (no receiver)",
5121 log.Fields{"index": k, "device-id": oo.deviceID})
mpagenko8cd1bf72021-06-22 10:11:19 +00005122 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005123 }
5124 oo.mutexMonReq.RUnlock()
5125}
5126
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05305127// GetMaxOmciTimeoutWithRetries provides a timeout value greater than the maximum
5128// time consumed for retry processing of a particular OMCI-request
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005129func (oo *OmciCC) GetMaxOmciTimeoutWithRetries() time.Duration {
5130 return time.Duration((CDefaultRetries+1)*oo.pBaseDeviceHandler.GetOmciTimeout() + 1)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005131}
Himani Chawla43f95ff2021-06-03 00:24:12 +05305132
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005133// SendCreateOrDeleteEthernetFrameExtendedPMME deletes EthernetFrameExtendedPm ME instance
5134func (oo *OmciCC) SendCreateOrDeleteEthernetFrameExtendedPMME(ctx context.Context, timeout int, highPrio bool,
Himani Chawla43f95ff2021-06-03 00:24:12 +05305135 upstream bool, create bool, rxChan chan Message, entityID uint16, classID me.ClassID, controlBlock []uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005136 tid := oo.GetNextTid(highPrio)
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05305137 logger.Info(ctx, "send-ethernet-frame-extended-pm-me-msg:", log.Fields{"device-id": oo.deviceID,
Himani Chawla43f95ff2021-06-03 00:24:12 +05305138 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
5139
5140 meParam := me.ParamData{EntityID: entityID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00005141 Attributes: me.AttributeValueMap{me.EthernetFrameExtendedPm_ControlBlock: controlBlock},
Himani Chawla43f95ff2021-06-03 00:24:12 +05305142 }
5143 var meInstance *me.ManagedEntity
5144 var omciErr me.OmciErrors
5145 if classID == me.EthernetFrameExtendedPmClassID {
5146 meInstance, omciErr = me.NewEthernetFrameExtendedPm(meParam)
5147 } else {
5148 meInstance, omciErr = me.NewEthernetFrameExtendedPm64Bit(meParam)
5149 }
5150
5151 if omciErr.GetError() == nil {
5152 var omciLayer *omci.OMCI
5153 var msgLayer gopacket.SerializableLayer
5154 var err error
5155 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00005156 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
5157 oframe.AddDefaults(true))
Himani Chawla43f95ff2021-06-03 00:24:12 +05305158 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00005159 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
5160 oframe.AddDefaults(true))
Himani Chawla43f95ff2021-06-03 00:24:12 +05305161 }
5162 if err != nil {
5163 logger.Errorw(ctx, "cannot-encode-ethernet-frame-extended-pm-me",
5164 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5165 return nil, err
5166 }
5167
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00005168 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Himani Chawla43f95ff2021-06-03 00:24:12 +05305169 if err != nil {
5170 logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me",
5171 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5172 return nil, err
5173 }
5174
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005175 omciRxCallbackPair := CallbackPair{CbKey: tid,
5176 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Himani Chawla43f95ff2021-06-03 00:24:12 +05305177 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005178 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawla43f95ff2021-06-03 00:24:12 +05305179 if err != nil {
5180 logger.Errorw(ctx, "Cannot send ethernet-frame-extended-pm-me",
5181 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5182 return nil, err
5183 }
5184 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-done",
5185 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5186 return meInstance, nil
5187 }
5188 logger.Errorw(ctx, "cannot-generate-ethernet-frame-extended-pm-me-instance",
5189 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5190 return nil, omciErr.GetError()
5191}
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005192
5193// RLockMutexMonReq lock read access to monitoredRequests
5194func (oo *OmciCC) RLockMutexMonReq() {
5195 oo.mutexMonReq.RLock()
5196}
5197
5198// RUnlockMutexMonReq unlock read access to monitoredRequests
5199func (oo *OmciCC) RUnlockMutexMonReq() {
5200 oo.mutexMonReq.RUnlock()
5201}
5202
5203// GetMonitoredRequest get OmciTransferStructure for an omciTransID
5204func (oo *OmciCC) GetMonitoredRequest(omciTransID uint16) (value OmciTransferStructure, exist bool) {
5205 value, exist = oo.monitoredRequests[omciTransID]
5206 return value, exist
5207}
5208
5209// SetChMonitoredRequest sets chSuccess to indicate whether response was received or not
5210func (oo *OmciCC) SetChMonitoredRequest(omciTransID uint16, chVal bool) {
5211 oo.monitoredRequests[omciTransID].chSuccess <- chVal
5212}
Himani Chawlaee10b542021-09-20 16:46:40 +05305213
5214// SendSetEthernetFrameExtendedPMME sends the set request for ethernet frame extended type me
5215func (oo *OmciCC) SendSetEthernetFrameExtendedPMME(ctx context.Context, timeout int, highPrio bool,
5216 rxChan chan Message, entityID uint16, classID me.ClassID, controlBlock []uint16) (*me.ManagedEntity, error) {
5217 tid := oo.GetNextTid(highPrio)
5218 logger.Debugw(ctx, "send-set-ethernet-frame-extended-pm-me-control-block:", log.Fields{"device-id": oo.deviceID,
5219 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16)})
5220
5221 meParams := me.ParamData{EntityID: entityID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00005222 Attributes: me.AttributeValueMap{me.EthernetFrameExtendedPm_ControlBlock: controlBlock},
Himani Chawlaee10b542021-09-20 16:46:40 +05305223 }
5224 var meInstance *me.ManagedEntity
5225 var omciErr me.OmciErrors
5226 if classID == me.EthernetFrameExtendedPmClassID {
5227 meInstance, omciErr = me.NewEthernetFrameExtendedPm(meParams)
5228 } else {
5229 meInstance, omciErr = me.NewEthernetFrameExtendedPm64Bit(meParams)
5230 }
5231
5232 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00005233 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Himani Chawlaee10b542021-09-20 16:46:40 +05305234 if err != nil {
5235 logger.Errorw(ctx, "cannot-encode-ethernet-frame-extended-pm-me",
5236 log.Fields{"err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5237 return nil, err
5238 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00005239 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Himani Chawlaee10b542021-09-20 16:46:40 +05305240 if err != nil {
5241 logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me-set-msg",
5242 log.Fields{"err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5243 return nil, err
5244 }
5245 omciRxCallbackPair := CallbackPair{
5246 CbKey: tid,
5247 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
5248 }
5249 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
5250 if err != nil {
5251 logger.Errorw(ctx, "Cannot send ethernet-frame-extended-pm-me",
5252 log.Fields{"Err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5253 return nil, err
5254 }
5255 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-set-msg-done",
5256 log.Fields{"device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5257 return meInstance, nil
5258 }
5259 logger.Errorw(ctx, "cannot-generate-ethernet-frame-extended-pm-me-instance",
5260 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5261 return nil, omciErr.GetError()
5262}
Holger Hildebrandte7cc6092022-02-01 11:37:03 +00005263
5264// PrepareForGarbageCollection - remove references to prepare for garbage collection
5265func (oo *OmciCC) PrepareForGarbageCollection(ctx context.Context, aDeviceID string) {
5266 logger.Debugw(ctx, "prepare for garbage collection", log.Fields{"device-id": aDeviceID})
5267 oo.pBaseDeviceHandler = nil
5268 oo.pOnuDeviceEntry = nil
5269 oo.pOnuAlarmManager = nil
5270}
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005271
5272// GetOmciCounters - TODO: add comment
5273func (oo *OmciCC) GetOmciCounters() *extension.SingleGetValueResponse {
5274 oo.mutexCounters.RLock()
5275 defer oo.mutexCounters.RUnlock()
5276 resp := extension.SingleGetValueResponse{
5277 Response: &extension.GetValueResponse{
5278 Status: extension.GetValueResponse_OK,
5279 Response: &extension.GetValueResponse_OnuOmciStats{
5280 OnuOmciStats: &extension.GetOnuOmciTxRxStatsResponse{},
5281 },
5282 },
5283 }
5284 resp.Response.GetOnuOmciStats().BaseTxArFrames = oo.countersBase.txArFrames
5285 resp.Response.GetOnuOmciStats().BaseTxNoArFrames = oo.countersBase.txNoArFrames
5286 resp.Response.GetOnuOmciStats().BaseRxAkFrames = oo.countersBase.rxAkFrames
5287 resp.Response.GetOnuOmciStats().BaseRxNoAkFrames = oo.countersBase.rxNoAkFrames
5288 resp.Response.GetOnuOmciStats().ExtTxArFrames = oo.countersExt.txArFrames
5289 resp.Response.GetOnuOmciStats().ExtTxNoArFrames = oo.countersExt.txNoArFrames
5290 resp.Response.GetOnuOmciStats().ExtRxAkFrames = oo.countersExt.rxAkFrames
5291 resp.Response.GetOnuOmciStats().ExtRxNoAkFrames = oo.countersExt.rxNoAkFrames
5292 resp.Response.GetOnuOmciStats().TxOmciCounterRetries = oo.txRetries
5293 resp.Response.GetOnuOmciStats().TxOmciCounterTimeouts = oo.txTimeouts
5294 return &resp
5295}
5296
5297// For more speed, separate functions for each counter
5298
5299func (oo *OmciCC) incrementBaseTxArFrames() {
5300 oo.mutexCounters.Lock()
5301 defer oo.mutexCounters.Unlock()
5302 oo.countersBase.txArFrames++
5303}
5304
5305func (oo *OmciCC) incrementExtTxArFrames() {
5306 oo.mutexCounters.Lock()
5307 defer oo.mutexCounters.Unlock()
5308 oo.countersExt.txArFrames++
5309}
5310
5311func (oo *OmciCC) incrementBaseRxAkFrames() {
5312 oo.mutexCounters.Lock()
5313 defer oo.mutexCounters.Unlock()
5314 oo.countersBase.rxAkFrames++
5315}
5316
5317func (oo *OmciCC) incrementExtRxAkFrames() {
5318 oo.mutexCounters.Lock()
5319 defer oo.mutexCounters.Unlock()
5320 oo.countersExt.rxAkFrames++
5321}
5322
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +05305323//nolint:unparam
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005324func (oo *OmciCC) increaseBaseTxNoArFramesBy(ctx context.Context, value uint32) {
5325 oo.mutexCounters.Lock()
5326 defer oo.mutexCounters.Unlock()
5327 oo.countersBase.txNoArFrames += value
5328}
5329
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +05305330//nolint:unparam
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005331func (oo *OmciCC) increaseExtTxNoArFramesBy(ctx context.Context, value uint32) {
5332 oo.mutexCounters.Lock()
5333 defer oo.mutexCounters.Unlock()
5334 oo.countersExt.txNoArFrames += value
5335}
5336
5337func (oo *OmciCC) incrementBaseRxNoAkFrames() {
5338 oo.mutexCounters.Lock()
5339 defer oo.mutexCounters.Unlock()
5340 oo.countersBase.rxNoAkFrames++
5341}
5342
5343func (oo *OmciCC) incrementExtRxNoAkFrames() {
5344 oo.mutexCounters.Lock()
5345 defer oo.mutexCounters.Unlock()
5346 oo.countersExt.rxNoAkFrames++
5347}
5348
5349func (oo *OmciCC) incrementTxRetries() {
5350 oo.mutexCounters.Lock()
5351 defer oo.mutexCounters.Unlock()
5352 oo.txRetries++
5353}
5354
5355func (oo *OmciCC) incrementTxTimesouts() {
5356 oo.mutexCounters.Lock()
5357 defer oo.mutexCounters.Unlock()
5358 oo.txTimeouts++
5359}
Holger Hildebrandt7e138462023-03-29 12:12:14 +00005360
5361// NotifyAboutOnuConfigFailure - trigger ONU DeviceEvent to notify about ONU config failure
5362func (oo *OmciCC) NotifyAboutOnuConfigFailure(ctx context.Context, errID string, meClassID me.ClassID, meEntityID uint16,
5363 meName string, meResult me.Results) {
5364 var description string
5365 if !oo.confFailMeAlreadyHandled(meClassID) {
5366 switch errID {
5367 case OnuConfigFailureResponseErr:
5368 description = OnuConfigFailureResponseErrDesc + meResult.String() +
5369 ", OMCI ME: " + meName + " / instance: " + fmt.Sprintf("%d", meEntityID) + " (only first instance reported)"
5370 case OnuConfigFailureTimeout:
5371 description = OnuConfigFailureTimeoutDesc + meName + " / instance: " + fmt.Sprintf("%d", meEntityID) +
5372 " (only first instance reported)"
5373 default:
5374 logger.Warnw(ctx, "method called with undefined errID", log.Fields{"errID": errID, "device-id": oo.deviceID})
5375 return
5376 }
5377 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, errID, description)
5378 oo.appendConfFailMe(meClassID)
5379 }
5380}
5381
5382func (oo *OmciCC) confFailMeAlreadyHandled(meClassID me.ClassID) bool {
5383 oo.mutexConfFailMEs.RLock()
5384 defer oo.mutexConfFailMEs.RUnlock()
5385 for _, v := range oo.confFailMEs {
5386 if v == meClassID {
5387 return true
5388 }
5389 }
5390 return false
5391}
5392
5393func (oo *OmciCC) appendConfFailMe(meClassID me.ClassID) {
5394 oo.mutexConfFailMEs.Lock()
5395 defer oo.mutexConfFailMEs.Unlock()
5396 oo.confFailMEs = append(oo.confFailMEs, meClassID)
5397}
5398
5399// ResetConfFailMEs - reset list of stored config failure MEs
5400func (oo *OmciCC) ResetConfFailMEs() {
5401 oo.mutexConfFailMEs.Lock()
5402 defer oo.mutexConfFailMEs.Unlock()
5403 oo.confFailMEs = nil
5404}