blob: 01c6fbfb15f5a0c1567ed9bbe865d6c5bf1595fa [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 ....
33 gp "github.com/google/gopacket"
34
mpagenko836a1fd2021-11-01 16:12:42 +000035 "github.com/opencord/omci-lib-go/v2"
36 me "github.com/opencord/omci-lib-go/v2/generated"
37 oframe "github.com/opencord/omci-lib-go/v2/meframe"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000038
khenaidoo7d3c5582021-08-11 18:09:44 -040039 vgrpc "github.com/opencord/voltha-lib-go/v7/pkg/grpc"
40
khenaidoo7d3c5582021-08-11 18:09:44 -040041 "github.com/opencord/voltha-lib-go/v7/pkg/log"
khenaidoo42dcdfd2021-10-19 17:34:12 -040042 "github.com/opencord/voltha-protos/v5/go/common"
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +000043 "github.com/opencord/voltha-protos/v5/go/extension"
khenaidoo42dcdfd2021-10-19 17:34:12 -040044 ia "github.com/opencord/voltha-protos/v5/go/inter_adapter"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000045)
46
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000047// ### OMCI related definitions - retrieved from Python adapter code/trace ####
Himani Chawla6d2ae152020-09-02 13:11:20 +053048
Holger Hildebrandt9b64e0b2022-04-21 08:02:00 +000049const maxGemPayloadSize = uint16(2048)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000050const connectivityModeValue = uint8(5)
Himani Chawla4d908332020-08-31 12:30:20 +053051
52//const defaultTPID = uint16(0x8100)
53//const broadComDefaultVID = uint16(4091)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000054
55// UnusedTcontAllocID - TODO: add comment
56const UnusedTcontAllocID = uint16(0xFFFF) //common unused AllocId for G.984 and G.987 systems
mpagenko8b07c1b2020-11-26 10:36:31 +000057
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +000058const cOmciDeviceIdentifierPos = 3
mpagenkoc8bba412021-01-15 15:38:44 +000059const cOmciBaseMessageTrailerLen = 40
60
61// tOmciReceiveError - enum type for detected problems/errors in the received OMCI message (format)
62type tOmciReceiveError uint8
63
64const (
65 // cOmciMessageReceiveNoError - default start state
66 cOmciMessageReceiveNoError tOmciReceiveError = iota
67 // Error indication wrong trailer length within the message
68 cOmciMessageReceiveErrorTrailerLen
69 // Error indication missing trailer within the message
70 cOmciMessageReceiveErrorMissTrailer
71)
72
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000073// CDefaultRetries - TODO: add comment
74const CDefaultRetries = 2
Holger Hildebrandt366ef192021-05-05 11:07:44 +000075
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000076// ### OMCI related definitions - end
77
nikesh.krishnan1ffb8132023-05-23 03:44:13 +053078// CallbackPairEntry to be used for OMCI send/receive correlation
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000079type CallbackPairEntry struct {
80 CbRespChannel chan Message
81 CbFunction func(context.Context, *omci.OMCI, *gp.Packet, chan Message) error
82 FramePrint bool //true for printing
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000083}
84
nikesh.krishnan1ffb8132023-05-23 03:44:13 +053085// CallbackPair to be used for ReceiveCallback init
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000086type CallbackPair struct {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000087 CbEntry CallbackPairEntry
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +053088 CbKey uint16
Holger Hildebrandtfa074992020-03-27 15:42:06 +000089}
90
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000091// OmciTransferStructure - TODO: add comment
92type OmciTransferStructure struct {
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +053093 chSuccess chan bool
94 OnuSwWindow *ia.OmciMessages
95 cbPair CallbackPair
mpagenko80622a52021-02-09 16:53:23 +000096 txFrame []byte
97 timeout int
Holger Hildebrandt366ef192021-05-05 11:07:44 +000098 retries int
mpagenko80622a52021-02-09 16:53:23 +000099 highPrio bool
100 withFramePrint bool
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000101}
102
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000103type txRxCounters struct {
104 txArFrames uint32
105 txNoArFrames uint32
106 rxAkFrames uint32
107 rxNoAkFrames uint32
108}
109
Joey Armstrong89c812c2024-01-12 19:00:20 -0500110// OmciCC structure holds information needed for OMCI communication (to/from OLT Adapter)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000111type OmciCC struct {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000112 pBaseDeviceHandler IdeviceHandler
113 pOnuDeviceEntry IonuDeviceEntry
114 pOnuAlarmManager IonuAlarmManager
khenaidoo7d3c5582021-08-11 18:09:44 -0400115 coreClient *vgrpc.Client
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530116 lowPrioTxQueue *list.List
117 highPrioTxQueue *list.List
118 rxSchedulerMap map[uint16]CallbackPairEntry
119 monitoredRequests map[uint16]OmciTransferStructure
120 deviceID string
Holger Hildebrandt7e138462023-03-29 12:12:14 +0000121 confFailMEs []me.ClassID
122 mutexConfFailMEs sync.RWMutex
mpagenkoc8bba412021-01-15 15:38:44 +0000123
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000124 mutexCounters sync.RWMutex
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530125 mutexMonReq sync.RWMutex
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000126 countersBase txRxCounters
127 countersExt txRxCounters
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000128
129 // OMCI params
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530130 mutexTid sync.Mutex
131 mutexHpTid sync.Mutex
132
133 mutexSendQueuedRequests sync.Mutex
134 mutexLowPrioTxQueue sync.Mutex
135 mutexHighPrioTxQueue sync.Mutex
136 mutexRxSchedMap sync.Mutex
137 txRetries uint32
138 txTimeouts uint32
139
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000140 tid uint16
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000141 hpTid uint16
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000142 UploadSequNo uint16
143 UploadNoOfCmds uint16
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000144
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530145 enabled bool
146 supportExtMsg bool
147 rxOmciFrameError tOmciReceiveError
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000148}
149
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000150var responsesWithMibDataSync = []omci.MessageType{
151 omci.CreateResponseType,
152 omci.DeleteResponseType,
153 omci.SetResponseType,
154 omci.StartSoftwareDownloadResponseType,
155 omci.EndSoftwareDownloadResponseType,
156 omci.ActivateSoftwareResponseType,
157 omci.CommitSoftwareResponseType,
158}
159
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530160// NewOmciCC constructor returns a new instance of a OmciCC
161// mib_db (as well as not inluded alarm_db not really used in this code? VERIFY!!)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000162func NewOmciCC(ctx context.Context, deviceID string, deviceHandler IdeviceHandler,
163 onuDeviceEntry IonuDeviceEntry, onuAlarmManager IonuAlarmManager,
164 coreClient *vgrpc.Client) *OmciCC {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000165 logger.Debugw(ctx, "init-omciCC", log.Fields{"device-id": deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000166 var omciCC OmciCC
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000167 omciCC.enabled = false
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000168 omciCC.pBaseDeviceHandler = deviceHandler
169 omciCC.pOnuAlarmManager = onuAlarmManager
Himani Chawla4d908332020-08-31 12:30:20 +0530170 omciCC.pOnuDeviceEntry = onuDeviceEntry
171 omciCC.deviceID = deviceID
khenaidoo7d3c5582021-08-11 18:09:44 -0400172 omciCC.coreClient = coreClient
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000173 omciCC.supportExtMsg = false
mpagenkoc8bba412021-01-15 15:38:44 +0000174 omciCC.rxOmciFrameError = cOmciMessageReceiveNoError
Holger Hildebrandt7e138462023-03-29 12:12:14 +0000175 omciCC.confFailMEs = nil
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000176 omciCC.countersBase = txRxCounters{0, 0, 0, 0}
177 omciCC.countersExt = txRxCounters{0, 0, 0, 0}
178 omciCC.txRetries = 0
179 omciCC.txTimeouts = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000180 omciCC.tid = 0x1
181 omciCC.hpTid = 0x8000
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000182 omciCC.UploadSequNo = 0
183 omciCC.UploadNoOfCmds = 0
Holger Hildebrandt34555512021-10-01 16:26:59 +0000184 omciCC.lowPrioTxQueue = list.New()
185 omciCC.highPrioTxQueue = list.New()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000186 omciCC.rxSchedulerMap = make(map[uint16]CallbackPairEntry)
187 omciCC.monitoredRequests = make(map[uint16]OmciTransferStructure)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000188 return &omciCC
189}
190
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530191// Stop stops/resets the omciCC
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000192func (oo *OmciCC) Stop(ctx context.Context) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000193 logger.Debugw(ctx, "omciCC-stopping", log.Fields{"device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000194 //reseting all internal data, which might also be helpful for discarding any lingering tx/rx requests
mpagenko8cd1bf72021-06-22 10:11:19 +0000195 oo.CancelRequestMonitoring(ctx)
Holger Hildebrandt34555512021-10-01 16:26:59 +0000196 // clear the tx queues
197 oo.mutexHighPrioTxQueue.Lock()
198 oo.highPrioTxQueue.Init()
199 oo.mutexHighPrioTxQueue.Unlock()
200 oo.mutexLowPrioTxQueue.Lock()
201 oo.lowPrioTxQueue.Init()
202 oo.mutexLowPrioTxQueue.Unlock()
203 //clear the scheduler map
mpagenko900ee4b2020-10-12 11:56:34 +0000204 oo.mutexRxSchedMap.Lock()
205 for k := range oo.rxSchedulerMap {
Holger Hildebrandt34555512021-10-01 16:26:59 +0000206 delete(oo.rxSchedulerMap, k)
mpagenko900ee4b2020-10-12 11:56:34 +0000207 }
208 oo.mutexRxSchedMap.Unlock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000209 //reset the high prio transactionId
mpagenko900ee4b2020-10-12 11:56:34 +0000210 oo.mutexHpTid.Lock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000211 oo.hpTid = 0x8000
mpagenko900ee4b2020-10-12 11:56:34 +0000212 oo.mutexHpTid.Unlock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000213 //reset the low prio transactionId
mpagenko900ee4b2020-10-12 11:56:34 +0000214 oo.mutexTid.Lock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000215 oo.tid = 1
mpagenko900ee4b2020-10-12 11:56:34 +0000216 oo.mutexTid.Unlock()
217 //reset control values
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000218 oo.UploadSequNo = 0
219 oo.UploadNoOfCmds = 0
mpagenkoc8bba412021-01-15 15:38:44 +0000220 oo.rxOmciFrameError = cOmciMessageReceiveNoError
Holger Hildebrandt7e138462023-03-29 12:12:14 +0000221 oo.ResetConfFailMEs()
mpagenko900ee4b2020-10-12 11:56:34 +0000222
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000223 //reset the stats counter
224 oo.mutexCounters.Lock()
225 oo.countersBase = txRxCounters{0, 0, 0, 0}
226 oo.countersExt = txRxCounters{0, 0, 0, 0}
227 oo.txRetries = 0
228 oo.txTimeouts = 0
229 oo.mutexCounters.Unlock()
mpagenko900ee4b2020-10-12 11:56:34 +0000230 return nil
231}
232
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000233// Rx handler for omci messages
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000234func (oo *OmciCC) receiveOnuMessage(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000235 logger.Debugw(ctx, "rx-onu-autonomous-message", log.Fields{"omciMsgType": omciMsg.MessageType,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000236 "payload": hex.EncodeToString(omciMsg.Payload)})
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530237 switch omciMsg.MessageType {
238 case omci.AlarmNotificationType:
239 data := OmciMessage{
240 OmciMsg: omciMsg,
241 OmciPacket: packet,
242 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000243 go oo.pOnuAlarmManager.HandleOmciAlarmNotificationMessage(ctx, data)
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530244 return nil
245 default:
246 return fmt.Errorf("receiveOnuMessageType %s unimplemented", omciMsg.MessageType.String())
247 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000248 /*
249 msgType = rxFrame.fields["message_type"] //assumed OmciOperationsValue
250 rxOnuFrames++
251
252 switch msgType {
253 case AlarmNotification:
254 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000255 logger.Info("Unhandled: received-onu-alarm-message")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000256 // python code was:
257 //if msg_type == EntityOperations.AlarmNotification.value:
258 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.Alarm_Notification)
259 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
260 //
261 return errors.New("RxAlarmNotification unimplemented")
262 }
263 case AttributeValueChange:
264 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000265 logger.Info("Unhandled: received-attribute-value-change")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000266 // python code was:
267 //elif msg_type == EntityOperations.AttributeValueChange.value:
268 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.AVC_Notification)
269 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
270 //
271 return errors.New("RxAttributeValueChange unimplemented")
272 }
273 case TestResult:
274 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000275 logger.Info("Unhandled: received-test-result")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000276 // python code was:
277 //elif msg_type == EntityOperations.TestResult.value:
278 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.Test_Result)
279 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
280 //
281 return errors.New("RxTestResult unimplemented")
282 }
283 default:
284 {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000285 logger.Errorw(ctx,"rx-onu-unsupported-autonomous-message", log.Fields{"msgType": msgType})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000286 rxOnuDiscards++
287 return errors.New("RxOnuMsgType unimplemented")
288 }
289 }
290 */
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000291}
292
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000293func (oo *OmciCC) printRxMessage(ctx context.Context, rxMsg []byte) {
mpagenko80622a52021-02-09 16:53:23 +0000294 //assuming omci message content is hex coded!
295 // with restricted output of 16bytes would be ...rxMsg[:16]
296 logger.Debugw(ctx, "omci-message-received:", log.Fields{
297 "RxOmciMessage": hex.EncodeToString(rxMsg),
298 "device-id": oo.deviceID})
299}
300
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000301// ReceiveMessage - Rx handler for onu messages
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530302//
303// e.g. would call ReceiveOnuMessage() in case of TID=0 or Action=test ...
304//
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000305// nolint: gocyclo
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000306func (oo *OmciCC) ReceiveMessage(ctx context.Context, rxMsg []byte) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000307 //logger.Debugw(ctx,"cc-receive-omci-message", log.Fields{"RxOmciMessage-x2s": hex.EncodeToString(rxMsg)})
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000308
309 if len(rxMsg) < 10 {
310 logger.Errorw(ctx, "rxOmciMessage has wrong length in general - abort",
311 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
312 if len(rxMsg) > 0 {
313 oo.printRxMessage(ctx, rxMsg)
mpagenkoc8bba412021-01-15 15:38:44 +0000314 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000315 return fmt.Errorf("rxOmciMessage has wrong length in general - abort %s", oo.deviceID)
316 }
317 if rxMsg[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
318 if len(rxMsg) >= 44 { // then it should normally include the BaseFormat trailer Len
319 // NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
320 // (an extendedFormat message could be destroyed this way!)
321 trailerLenData := rxMsg[42:44]
322 trailerLen := binary.BigEndian.Uint16(trailerLenData)
323 //logger.Debugw(ctx,"omci-received-trailer-len", log.Fields{"Length": trailerLen})
324 if trailerLen != cOmciBaseMessageTrailerLen { // invalid base Format entry -> autocorrect
325 binary.BigEndian.PutUint16(rxMsg[42:44], cOmciBaseMessageTrailerLen)
326 if oo.rxOmciFrameError != cOmciMessageReceiveErrorTrailerLen {
327 //do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
328 logger.Errorw(ctx, "wrong omci-message trailer length: trailer len auto-corrected",
329 log.Fields{"trailer-length": trailerLen, "device-id": oo.deviceID})
330 oo.rxOmciFrameError = cOmciMessageReceiveErrorTrailerLen
331 }
332 }
333 } else if len(rxMsg) >= cOmciBaseMessageTrailerLen { // workaround for Adtran OLT Sim, which currently does not send trailer bytes at all!
334 // NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
335 // (an extendedFormat message could be destroyed this way!)
336 // extend/overwrite with trailer
337 trailer := make([]byte, 8)
338 binary.BigEndian.PutUint16(trailer[2:], cOmciBaseMessageTrailerLen) //set the defined baseline length
339 rxMsg = append(rxMsg[:cOmciBaseMessageTrailerLen], trailer...)
340 if oo.rxOmciFrameError != cOmciMessageReceiveErrorMissTrailer {
341 //do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
342 logger.Errorw(ctx, "omci-message to short to include trailer len: trailer auto-corrected (added)",
343 log.Fields{"message-length": len(rxMsg), "device-id": oo.deviceID})
344 oo.rxOmciFrameError = cOmciMessageReceiveErrorMissTrailer
345 }
346 } else {
347 logger.Errorw(ctx, "received omci-message too small for OmciBaseFormat - abort",
348 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
349 oo.printRxMessage(ctx, rxMsg)
350 return fmt.Errorf("rxOmciMessage too small for BaseFormat %s", oo.deviceID)
351 }
352 } else if rxMsg[cOmciDeviceIdentifierPos] == byte(omci.ExtendedIdent) {
353 if len(rxMsg) > 1980 {
354 logger.Errorw(ctx, "rxOmciMessage has wrong length for OmciExtendedFormat - abort",
355 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
356 oo.printRxMessage(ctx, rxMsg)
357 return fmt.Errorf("rxOmciMessage has wrong length for OmciExtendedFormat %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000358 }
359 } else {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000360 logger.Errorw(ctx, "rxOmciMessage has wrong Device Identifier - abort",
mpagenkoc8bba412021-01-15 15:38:44 +0000361 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000362 oo.printRxMessage(ctx, rxMsg)
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000363 return fmt.Errorf("rxOmciMessage has wrong Device Identifier %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000364 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000365 decodeOptions := gopacket.DecodeOptions{
366 Lazy: true,
367 NoCopy: true,
368 }
369 packet := gopacket.NewPacket(rxMsg, omci.LayerTypeOMCI, decodeOptions)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000370 if packet == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000371 logger.Errorw(ctx, "omci-message could not be decoded", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000372 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200373 return fmt.Errorf("could not decode rxMsg as OMCI %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000374 }
375 omciLayer := packet.Layer(omci.LayerTypeOMCI)
376 if omciLayer == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000377 logger.Errorw(ctx, "omci-message could not decode omci layer", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000378 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200379 return fmt.Errorf("could not decode omci layer %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000380 }
mpagenko836a1fd2021-11-01 16:12:42 +0000381 // insert some check on detected OMCI decoding issues and log them
382 // e.g. should indicate problems when detecting some unknown attribute mask content (independent from message type)
383 // even though allowed from omci-lib due to set relaxed decoding
384 // application may dig into further details if wanted/needed on their own [but info is not transferred from here so far]
385 // (compare mib_sync.go unknownAttrLayer)
386 errLayer := packet.Layer(gopacket.LayerTypeDecodeFailure)
387 if failure, decodeOk := errLayer.(*gopacket.DecodeFailure); decodeOk {
388 errMsg := failure.Error()
389 logger.Warnw(ctx, "Detected decode issue on received OMCI frame", log.Fields{
390 "device-id": oo.deviceID, "issue": errMsg})
391 }
392 //anyway try continue OMCI decoding further on message type layer
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000393 omciMsg, ok := omciLayer.(*omci.OMCI)
394 if !ok {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000395 logger.Errorw(ctx, "omci-message could not assign omci layer", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000396 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200397 return fmt.Errorf("could not assign omci layer %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000398 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000399 logger.Debugw(ctx, "omci-message-decoded:", log.Fields{"omciMsgType": omciMsg.MessageType,
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000400 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16),
401 "DeviceIdent": omciMsg.DeviceIdentifier, "device-id": oo.deviceID})
mpagenko836a1fd2021-11-01 16:12:42 +0000402
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700403 // TestResult is asynchronous indication that carries the same TID as the TestResponse.
404 // We expect to find the TID in the oo.rxSchedulerMap
405 if byte(omciMsg.MessageType)&me.AK == 0 && omciMsg.MessageType != omci.TestResultType {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000406 // Not a response
mpagenko80622a52021-02-09 16:53:23 +0000407 oo.printRxMessage(ctx, rxMsg)
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000408 logger.Debugw(ctx, "RxMsg is no Omci Response Message", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000409 if omciMsg.TransactionID == 0 {
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000410 if rxMsg[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
411 oo.incrementBaseRxNoAkFrames()
412 } else {
413 oo.incrementExtRxNoAkFrames()
414 }
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530415 return oo.receiveOnuMessage(ctx, omciMsg, &packet)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000416 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000417 logger.Errorw(ctx, "Unexpected TransCorrId != 0 not accepted for autonomous messages",
Andrea Campanella6515c582020-10-05 11:25:00 +0200418 log.Fields{"msgType": omciMsg.MessageType, "payload": hex.EncodeToString(omciMsg.Payload),
mpagenko8b07c1b2020-11-26 10:36:31 +0000419 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200420 return fmt.Errorf("autonomous Omci Message with TranSCorrId != 0 not acccepted %s", oo.deviceID)
Himani Chawla4d908332020-08-31 12:30:20 +0530421 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000422 //logger.Debug(ctx,"RxMsg is a Omci Response Message: try to schedule it to the requester")
Himani Chawla4d908332020-08-31 12:30:20 +0530423 oo.mutexRxSchedMap.Lock()
424 rxCallbackEntry, ok := oo.rxSchedulerMap[omciMsg.TransactionID]
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000425 if ok && rxCallbackEntry.CbFunction != nil {
Holger Hildebrandt68854a82022-09-05 07:00:21 +0000426
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000427 if rxCallbackEntry.FramePrint {
mpagenko80622a52021-02-09 16:53:23 +0000428 oo.printRxMessage(ctx, rxMsg)
429 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000430 if rxMsg[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
431 oo.incrementBaseRxAkFrames()
432 } else {
433 oo.incrementExtRxAkFrames()
434 }
Himani Chawla4d908332020-08-31 12:30:20 +0530435 //disadvantage of decoupling: error verification made difficult, but anyway the question is
436 // how to react on erroneous frame reception, maybe can simply be ignored
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530437 go func() {
438 _ = rxCallbackEntry.CbFunction(ctx, omciMsg, &packet, rxCallbackEntry.CbRespChannel)
439 }()
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000440 isSuccessfulResponse, err := oo.isSuccessfulResponseWithMibDataSync(ctx, omciMsg, &packet)
441 if err != nil {
442 // qualified error logging already done in function above
443 if !rxCallbackEntry.FramePrint {
444 oo.printRxMessage(ctx, rxMsg)
445 }
446 return fmt.Errorf("could not decode further layers %s", oo.deviceID)
447 }
448 if isSuccessfulResponse {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000449 oo.pOnuDeviceEntry.IncrementMibDataSync(ctx)
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000450 } else {
451 logger.Debugw(ctx, "mibDataSync counter not to be updated for this message type",
452 log.Fields{"omciMsg.MessageType": omciMsg.MessageType, "device-id": oo.deviceID})
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000453 }
mpagenkoc8bba412021-01-15 15:38:44 +0000454
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700455 // If omciMsg.MessageType is omci.TestResponseType, we still expect the TestResult OMCI message,
456 // so do not clean up the TransactionID in that case.
457 if omciMsg.MessageType != omci.TestResponseType {
458 // having posted the response the request is regarded as 'done'
459 delete(oo.rxSchedulerMap, omciMsg.TransactionID)
460 }
Himani Chawla4d908332020-08-31 12:30:20 +0530461 oo.mutexRxSchedMap.Unlock()
mpagenko80622a52021-02-09 16:53:23 +0000462 return nil
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000463 }
mpagenko80622a52021-02-09 16:53:23 +0000464 oo.mutexRxSchedMap.Unlock()
465 logger.Errorw(ctx, "omci-message-response for not registered transCorrId", log.Fields{"device-id": oo.deviceID})
466 oo.printRxMessage(ctx, rxMsg)
467 return fmt.Errorf("could not find registered response handler tor transCorrId %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000468
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000469 /* py code was:
470 Receive and OMCI message from the proxy channel to the OLT.
471
472 Call this from your ONU Adapter on a new OMCI Rx on the proxy channel
473 :param msg: (str) OMCI binary message (used as input to Scapy packet decoder)
474 """
475 if not self.enabled:
476 return
477
478 try:
479 now = arrow.utcnow()
480 d = None
481
482 # NOTE: Since we may need to do an independent ME map on a per-ONU basis
483 # save the current value of the entity_id_to_class_map, then
484 # replace it with our custom one before decode, and then finally
485 # restore it later. Tried other ways but really made the code messy.
486 saved_me_map = omci_entities.entity_id_to_class_map
487 omci_entities.entity_id_to_class_map = self._me_map
488
489 try:
490 rx_frame = msg if isinstance(msg, OmciFrame) else OmciFrame(msg)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000491 self.logger.debug('recv-omci-msg', omci_msg=hexlify(msg))
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000492 except KeyError as e:
493 # Unknown, Unsupported, or vendor-specific ME. Key is the unknown classID
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000494 self.logger.debug('frame-decode-key-error', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000495 rx_frame = self._decode_unknown_me(msg)
496 self._rx_unknown_me += 1
497
498 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000499 self.logger.exception('frame-decode', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000500 return
501
502 finally:
503 omci_entities.entity_id_to_class_map = saved_me_map # Always restore it.
504
505 rx_tid = rx_frame.fields['transaction_id']
506 msg_type = rx_frame.fields['message_type']
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000507 self.logger.debug('Received message for rx_tid', rx_tid = rx_tid, msg_type = msg_type)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000508 # Filter the Test Result frame and route through receive onu
509 # message method.
510 if rx_tid == 0 or msg_type == EntityOperations.TestResult.value:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000511 self.logger.debug('Receive ONU message', rx_tid=0)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000512 return self._receive_onu_message(rx_frame)
513
514 # Previously unreachable if this is the very first round-trip Rx or we
515 # have been running consecutive errors
516 if self._rx_frames == 0 or self._consecutive_errors != 0:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000517 self.logger.debug('Consecutive errors for rx', err = self._consecutive_errors)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000518 self.reactor.callLater(0, self._publish_connectivity_event, True)
519
520 self._rx_frames += 1
521 self._consecutive_errors = 0
522
523 try:
524 high_priority = self._tid_is_high_priority(rx_tid)
525 index = self._get_priority_index(high_priority)
526
527 # (timestamp, defer, frame, timeout, retry, delayedCall)
528 last_tx_tuple = self._tx_request[index]
529
530 if last_tx_tuple is None or \
531 last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id') != rx_tid:
532 # Possible late Rx on a message that timed-out
533 if last_tx_tuple:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000534 self.logger.debug('Unknown message', rx_tid=rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000535 tx_id=last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id'))
536 self._rx_unknown_tid += 1
537 self._rx_late += 1
538 return
539
540 ts, d, tx_frame, timeout, retry, dc = last_tx_tuple
541 if dc is not None and not dc.cancelled and not dc.called:
542 dc.cancel()
543
544 _secs = self._update_rx_tx_stats(now, ts)
545
546 # Late arrival already serviced by a timeout?
547 if d.called:
548 self._rx_late += 1
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000549 self.logger.debug('Serviced by timeout. Late arrival', rx_late = self._rx_late)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000550 return
551
552 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000553 self.logger.exception('frame-match', msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000554 if d is not None:
555 return d.errback(failure.Failure(e))
556 return
557
558 # Publish Rx event to listeners in a different task
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000559 self.logger.debug('Publish rx event', rx_tid = rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000560 tx_tid = tx_frame.fields['transaction_id'])
561 reactor.callLater(0, self._publish_rx_frame, tx_frame, rx_frame)
562
563 # begin success callback chain (will cancel timeout and queue next Tx message)
564 self._rx_response[index] = rx_frame
565 d.callback(rx_frame)
566
567 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000568 self.logger.exception('rx-msg', e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000569 */
570}
571
Himani Chawla6d2ae152020-09-02 13:11:20 +0530572/*
573func (oo *omciCC) publishRxResponseFrame(ctx context.Context, txFrame []byte, rxFrame []byte) error {
Himani Chawla4d908332020-08-31 12:30:20 +0530574 return errors.New("publishRxResponseFrame unimplemented")
Himani Chawla6d2ae152020-09-02 13:11:20 +0530575 //def _publish_rx_frame(self, tx_frame, rx_frame):
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000576}
Himani Chawla6d2ae152020-09-02 13:11:20 +0530577*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000578
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700579// ReleaseTid releases OMCI transaction identifier from rxSchedulerMap
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000580func (oo *OmciCC) ReleaseTid(ctx context.Context, tid uint16) {
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700581 logger.Debugw(ctx, "releasing tid from rxSchedulerMap", log.Fields{"tid": tid})
582 delete(oo.rxSchedulerMap, tid)
583}
584
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000585// Send - Queue the OMCI Frame for a transmit to the ONU via the proxy_channel
586func (oo *OmciCC) Send(ctx context.Context, txFrame []byte, timeout int, retry int, highPrio bool,
587 receiveCallbackPair CallbackPair) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000588
mpagenkoc26d4c02021-05-06 14:27:57 +0000589 if timeout != 0 {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000590 logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TransCorrId": receiveCallbackPair.CbKey})
mpagenkoc26d4c02021-05-06 14:27:57 +0000591 oo.mutexRxSchedMap.Lock()
592 // it could be checked, if the callback key is already registered - but simply overwrite may be acceptable ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000593 oo.rxSchedulerMap[receiveCallbackPair.CbKey] = receiveCallbackPair.CbEntry
mpagenkoc26d4c02021-05-06 14:27:57 +0000594 oo.mutexRxSchedMap.Unlock()
595 } //else timeout 0 indicates that no response is expected - fire and forget
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000596
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000597 printFrame := receiveCallbackPair.CbEntry.FramePrint //printFrame true means debug print of frame is requested
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000598 //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 +0000599 omciTxRequest := OmciTransferStructure{
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +0530600 chSuccess: make(chan bool),
601 OnuSwWindow: nil,
602 cbPair: receiveCallbackPair,
603 txFrame: txFrame,
604 timeout: timeout,
605 retries: retry,
606 highPrio: highPrio,
607 withFramePrint: printFrame,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000608 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000609 oo.mutexMonReq.Lock()
610 defer oo.mutexMonReq.Unlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000611 if _, exist := oo.monitoredRequests[receiveCallbackPair.CbKey]; !exist {
mpagenko7455fd42021-06-10 16:25:55 +0000612 // do not call processRequestMonitoring in background here to ensure correct sequencing
613 // of requested messages into txQueue (especially for non-response-supervised messages)
614 oo.processRequestMonitoring(ctx, omciTxRequest)
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000615 return nil
616 }
617 logger.Errorw(ctx, "A message with this tid is processed already!",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000618 log.Fields{"tid": receiveCallbackPair.CbKey, "device-id": oo.deviceID})
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000619 return fmt.Errorf("message with tid is processed already %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000620}
621
Holger Hildebrandt34555512021-10-01 16:26:59 +0000622func (oo *OmciCC) sendQueuedRequests(ctx context.Context) {
623 // Avoid accessing the txQueues from parallel send routines to block
624 // parallel omci send requests at least until SendIAP is 'committed'.
625 // To guarantee window size 1 for one ONU it would be necessary to wait
626 // for the corresponding response too (t.b.d.).
627 oo.mutexSendQueuedRequests.Lock()
628 defer oo.mutexSendQueuedRequests.Unlock()
629 if err := oo.sendQueuedHighPrioRequests(ctx); err != nil {
630 logger.Errorw(ctx, "Error during sending high prio requests!",
631 log.Fields{"err": err, "device-id": oo.deviceID})
632 return
633 }
634 if err := oo.sendQueuedLowPrioRequests(ctx); err != nil {
635 logger.Errorw(ctx, "Error during sending low prio requests!",
636 log.Fields{"err": err, "device-id": oo.deviceID})
637 return
638 }
639}
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000640
Holger Hildebrandt34555512021-10-01 16:26:59 +0000641func (oo *OmciCC) sendQueuedHighPrioRequests(ctx context.Context) error {
642 oo.mutexHighPrioTxQueue.Lock()
643 defer oo.mutexHighPrioTxQueue.Unlock()
644 for oo.highPrioTxQueue.Len() > 0 {
balaji.nagarajan3cab2b62025-06-23 15:44:54 +0530645 select {
646 case _, ok := <-oo.pBaseDeviceHandler.GetDeviceDeleteCommChan(ctx):
647 if !ok {
648 return fmt.Errorf("device deletion channel is closed at sendQueuedHighPrioRequests %s", oo.deviceID)
649 }
650 default:
651 queueElement := oo.highPrioTxQueue.Front() // First element
652 if err := oo.sendOMCIRequest(ctx, queueElement.Value.(OmciTransferStructure)); err != nil {
653 // Element will be removed from the queue regardless of the send success, to prevent
654 // an accumulation of send requests for the same message in the event of an error.
655 // In this case, resend attempts for the message are ensured by our retry
656 // mechanism after omci-timeout.
657 oo.highPrioTxQueue.Remove(queueElement) // Dequeue
658 //Remove the call back from the rxSchedulerMap
659 oo.mutexRxSchedMap.Lock()
660 delete(oo.rxSchedulerMap, queueElement.Value.(OmciTransferStructure).cbPair.CbKey)
661 oo.mutexRxSchedMap.Unlock()
662 return err
663 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000664 oo.highPrioTxQueue.Remove(queueElement) // Dequeue
mpagenko80622a52021-02-09 16:53:23 +0000665 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000666 }
667 return nil
668}
669
670func (oo *OmciCC) sendQueuedLowPrioRequests(ctx context.Context) error {
671 oo.mutexLowPrioTxQueue.Lock()
672 for oo.lowPrioTxQueue.Len() > 0 {
balaji.nagarajan3cab2b62025-06-23 15:44:54 +0530673 select {
674 case _, ok := <-oo.pBaseDeviceHandler.GetDeviceDeleteCommChan(ctx):
675 if !ok {
kesavand011d5162021-11-25 19:21:06 +0530676 oo.mutexLowPrioTxQueue.Unlock()
balaji.nagarajan3cab2b62025-06-23 15:44:54 +0530677 return fmt.Errorf("device deletion channel is closed at sendQueuedLowPrioRequests %s", oo.deviceID)
678 }
679 default:
680 queueElement := oo.lowPrioTxQueue.Front() // First element
681 // check if the element is for onu sw section
682 aOmciTxReq := queueElement.Value.(OmciTransferStructure)
683 if aOmciTxReq.OnuSwWindow != nil {
684 if err := oo.sendOnuSwSectionsOfWindow(ctx, aOmciTxReq); err != nil {
685 // Element will be removed from the queue regardless of the send success, to prevent
686 // an accumulation of send requests for the same message in the event of an error.
687 // In this case, resend attempts for the message are ensured by our retry
688 // mechanism after omci-timeout.
689 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
690 oo.mutexLowPrioTxQueue.Unlock()
691 //Remove the call back from the rxSchedulerMap
692 oo.mutexRxSchedMap.Lock()
693 delete(oo.rxSchedulerMap, queueElement.Value.(OmciTransferStructure).cbPair.CbKey)
694 oo.mutexRxSchedMap.Unlock()
695 return err
696 }
697 } else {
698 err := oo.sendOMCIRequest(ctx, queueElement.Value.(OmciTransferStructure))
699 if err != nil {
700 // Element will be removed from the queue regardless of the send success, to prevent
701 // an accumulation of send requests for the same message in the event of an error.
702 // In this case, resend attempts for the message are ensured by our retry
703 // mechanism after omci-timeout.
704 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
705 oo.mutexLowPrioTxQueue.Unlock()
706 oo.mutexRxSchedMap.Lock()
707 delete(oo.rxSchedulerMap, queueElement.Value.(OmciTransferStructure).cbPair.CbKey)
708 oo.mutexRxSchedMap.Unlock()
709 return err
710 }
711 }
712 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
713 // Interrupt the sending of low priority requests to process any high priority requests
714 // that may have arrived in the meantime
715 oo.mutexLowPrioTxQueue.Unlock()
716 if err := oo.sendQueuedHighPrioRequests(ctx); err != nil {
kesavand011d5162021-11-25 19:21:06 +0530717 return err
718 }
balaji.nagarajan3cab2b62025-06-23 15:44:54 +0530719 oo.mutexLowPrioTxQueue.Lock()
amit.ghosh58b704b2021-06-18 03:45:52 +0200720 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000721 }
722
723 oo.mutexLowPrioTxQueue.Unlock()
724 return nil
725}
726
727func (oo *OmciCC) sendOMCIRequest(ctx context.Context, omciTxRequest OmciTransferStructure) error {
728 if omciTxRequest.withFramePrint {
729 logger.Debugw(ctx, "omci-message-to-send:", log.Fields{
730 "TxOmciMessage": hex.EncodeToString(omciTxRequest.txFrame),
731 "device-id": oo.deviceID,
732 "toDeviceType": oo.pBaseDeviceHandler.GetProxyAddressType(),
733 "proxyDeviceID": oo.pBaseDeviceHandler.GetProxyAddressID(),
734 "proxyAddress": oo.pBaseDeviceHandler.GetProxyAddress()})
735 }
khenaidoo42dcdfd2021-10-19 17:34:12 -0400736 omciMsg := &ia.OmciMessage{
Holger Hildebrandt34555512021-10-01 16:26:59 +0000737 ParentDeviceId: oo.pBaseDeviceHandler.GetProxyAddressID(),
738 ChildDeviceId: oo.deviceID,
739 Message: omciTxRequest.txFrame,
740 ProxyAddress: oo.pBaseDeviceHandler.GetProxyAddress(),
741 ConnectStatus: common.ConnectStatus_REACHABLE, // If we are sending OMCI messages means we are connected, else we should not be here
742 }
743 sendErr := oo.pBaseDeviceHandler.SendOMCIRequest(ctx, oo.pBaseDeviceHandler.GetProxyAddress().AdapterEndpoint, omciMsg)
744 if sendErr != nil {
Holger Hildebrandtabfef032022-02-25 12:40:20 +0000745 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 +0000746 return sendErr
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000747 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000748 if omciTxRequest.txFrame[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
749 oo.incrementBaseTxArFrames()
750 } else {
751 oo.incrementExtTxArFrames()
752 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000753 return nil
754}
755
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000756// GetNextTid - TODO: add comment
757func (oo *OmciCC) GetNextTid(highPriority bool) uint16 {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000758 var next uint16
759 if highPriority {
mpagenko900ee4b2020-10-12 11:56:34 +0000760 oo.mutexHpTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000761 next = oo.hpTid
Himani Chawla4d908332020-08-31 12:30:20 +0530762 oo.hpTid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000763 if oo.hpTid < 0x8000 {
764 oo.hpTid = 0x8000
765 }
mpagenko900ee4b2020-10-12 11:56:34 +0000766 oo.mutexHpTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000767 } else {
mpagenko900ee4b2020-10-12 11:56:34 +0000768 oo.mutexTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000769 next = oo.tid
Himani Chawla4d908332020-08-31 12:30:20 +0530770 oo.tid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000771 if oo.tid >= 0x8000 {
772 oo.tid = 1
773 }
mpagenko900ee4b2020-10-12 11:56:34 +0000774 oo.mutexTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000775 }
776 return next
777}
778
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530779// GetOnuSwSecNextTid get the next low prio tid for the onu sw sections
780// onu sw sections uses only low priority tids
781// The mutexTid lock should be taken prior to using this function
kesavand011d5162021-11-25 19:21:06 +0530782func (oo *OmciCC) GetOnuSwSecNextTid() uint16 {
kesavand011d5162021-11-25 19:21:06 +0530783 if oo.tid >= 0x8000 {
784 oo.tid = 1
785 }
bseenivad32c2742024-12-09 11:46:17 +0530786 next := oo.tid
787 oo.tid++
kesavand011d5162021-11-25 19:21:06 +0530788 return next
789}
790
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530791// GetOnuSwSecLastTid gets the last allocated tid
792// The mutexTid lock should be taken prior to using this function
kesavand011d5162021-11-25 19:21:06 +0530793func (oo *OmciCC) GetOnuSwSecLastTid() uint16 {
794 next := oo.tid
795 lastAllocatedTid := next - 1
796 return lastAllocatedTid
797}
798
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530799// LockMutexTID locks mutexTid
kesavand011d5162021-11-25 19:21:06 +0530800func (oo *OmciCC) LockMutexTID() {
801 oo.mutexTid.Lock()
802}
803
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530804// UnLockMutexTID unlocks mutexTid
kesavand011d5162021-11-25 19:21:06 +0530805func (oo *OmciCC) UnLockMutexTID() {
806 oo.mutexTid.Unlock()
807}
808
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000809// ###################################################################################
810// # utility methods provided to work on OMCI messages
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000811
812// Serialize - TODO: add comment
813func Serialize(ctx context.Context, msgType omci.MessageType, request gopacket.SerializableLayer, tid uint16) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000814 omciLayer := &omci.OMCI{
815 TransactionID: tid,
816 MessageType: msgType,
817 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000818 return SerializeOmciLayer(ctx, omciLayer, request)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000819}
820
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000821// SerializeOmciLayer - TODO: add comment
822func SerializeOmciLayer(ctx context.Context, aOmciLayer *omci.OMCI, aRequest gopacket.SerializableLayer) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000823 var options gopacket.SerializeOptions
824 options.FixLengths = true
825
826 buffer := gopacket.NewSerializeBuffer()
Himani Chawla4d908332020-08-31 12:30:20 +0530827 err := gopacket.SerializeLayers(buffer, options, aOmciLayer, aRequest)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000828 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000829 logger.Errorw(ctx, "Could not create goPacket Omci serial buffer", log.Fields{"Err": err})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000830 return nil, err
831 }
832 return buffer.Bytes(), nil
833}
834
Himani Chawla4d908332020-08-31 12:30:20 +0530835/*
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000836func hexEncode(omciPkt []byte) ([]byte, error) {
837 dst := make([]byte, hex.EncodedLen(len(omciPkt)))
838 hex.Encode(dst, omciPkt)
839 return dst, nil
840}
Himani Chawla4d908332020-08-31 12:30:20 +0530841*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000842
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530843// supply a response handler for omci response messages to be transferred to the requested FSM
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000844func (oo *OmciCC) receiveOmciResponse(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet, respChan chan Message) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000845
dbainbri4d3a0dc2020-12-02 00:33:42 +0000846 logger.Debugw(ctx, "omci-message-response - transfer on omciRespChannel", log.Fields{"omciMsgType": omciMsg.MessageType,
divyadesai4d299552020-08-18 07:13:49 +0000847 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000848
849 if oo.pOnuDeviceEntry == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000850 logger.Errorw(ctx, "Abort receiving OMCI response, DeviceEntryPointer is nil", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000851 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200852 return fmt.Errorf("deviceEntryPointer is nil %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000853 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000854 oo.mutexMonReq.RLock()
855 if _, exist := oo.monitoredRequests[omciMsg.TransactionID]; exist {
mpagenko8cd1bf72021-06-22 10:11:19 +0000856 //implement non-blocking channel send to avoid blocking on mutexMonReq later
857 select {
858 case oo.monitoredRequests[omciMsg.TransactionID].chSuccess <- true:
859 default:
860 logger.Debugw(ctx, "response not send on omciRespChannel (no receiver)", log.Fields{
861 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
862 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000863 } else {
864 logger.Infow(ctx, "reqMon: map entry does not exist!",
865 log.Fields{"tid": omciMsg.TransactionID, "device-id": oo.deviceID})
866 }
867 oo.mutexMonReq.RUnlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000868
869 // no further test on SeqNo is done here, assignment from rxScheduler is trusted
870 // MibSync responses are simply transferred via deviceEntry to MibSync, no specific analysis here
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000871 omciRespMsg := Message{
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000872 Type: OMCI,
873 Data: OmciMessage{
874 OmciMsg: omciMsg,
875 OmciPacket: packet,
876 },
877 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000878 //logger.Debugw(ctx,"Message to be sent into channel:", log.Fields{"mibSyncMsg": mibSyncMsg})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000879 respChan <- omciRespMsg
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000880
881 return nil
882}
883
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000884// SendMibReset sends MibResetRequest
885func (oo *OmciCC) SendMibReset(ctx context.Context, timeout int, highPrio bool) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000886
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530887 logger.Infow(ctx, "send MibReset-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000888 request := &omci.MibResetRequest{
889 MeBasePacket: omci.MeBasePacket{
890 EntityClass: me.OnuDataClassID,
891 },
892 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000893 tid := oo.GetNextTid(highPrio)
894 pkt, err := Serialize(ctx, omci.MibResetRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000895 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000896 logger.Errorw(ctx, "Cannot serialize MibResetRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000897 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000898 return err
899 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000900 omciRxCallbackPair := CallbackPair{
901 CbKey: tid,
902 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000903 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000904 return oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000905}
906
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000907// SendReboot sends RebootRequest
908func (oo *OmciCC) SendReboot(ctx context.Context, timeout int, highPrio bool, responseChannel chan Message) error {
909 logger.Debugw(ctx, "send reboot-msg to:", log.Fields{"device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300910 request := &omci.RebootRequest{
911 MeBasePacket: omci.MeBasePacket{
912 EntityClass: me.OnuGClassID,
913 },
914 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000915 tid := oo.GetNextTid(highPrio)
916 pkt, err := Serialize(ctx, omci.RebootRequestType, request, tid)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300917 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000918 logger.Errorw(ctx, "Cannot serialize RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000919 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300920 return err
921 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000922 omciRxCallbackPair := CallbackPair{
923 CbKey: tid,
924 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetOmciRebootMsgRevChan(), oo.receiveOmciResponse, true},
ozgecanetsiae11479f2020-07-06 09:44:47 +0300925 }
926
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000927 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300928 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000929 logger.Errorw(ctx, "Cannot send RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000930 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300931 return err
932 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000933 err = oo.pOnuDeviceEntry.WaitForRebootResponse(ctx, responseChannel)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300934 if err != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000935 logger.Errorw(ctx, "aborting ONU reboot!", log.Fields{
Andrea Campanella6515c582020-10-05 11:25:00 +0200936 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300937 return err
938 }
939 return nil
940}
941
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000942// SendMibUpload sends MibUploadRequest
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000943func (oo *OmciCC) SendMibUpload(ctx context.Context, timeout int, highPrio bool, isExtOmciSupported bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000944 logger.Debugw(ctx, "send MibUpload-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000945
946 tid := oo.GetNextTid(highPrio)
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000947
948 omciLayer := &omci.OMCI{
949 TransactionID: tid,
950 MessageType: omci.MibUploadRequestType,
951 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000952 if isExtOmciSupported {
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000953 omciLayer.DeviceIdentifier = omci.ExtendedIdent
954 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000955 request := &omci.MibUploadRequest{
956 MeBasePacket: omci.MeBasePacket{
957 EntityClass: me.OnuDataClassID,
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000958 Extended: isExtOmciSupported,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000959 },
960 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000961 var options gopacket.SerializeOptions
962 options.FixLengths = true
963
964 buffer := gopacket.NewSerializeBuffer()
965 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000966 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000967 logger.Errorw(ctx, "Cannot serialize MibUploadRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000968 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000969 return err
970 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000971 oo.UploadSequNo = 0
972 oo.UploadNoOfCmds = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000973
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000974 omciRxCallbackPair := CallbackPair{
975 CbKey: tid,
976 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000977 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000978 return oo.Send(ctx, buffer.Bytes(), timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000979}
980
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000981// SendMibUploadNext sends MibUploadNextRequest
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000982func (oo *OmciCC) SendMibUploadNext(ctx context.Context, timeout int, highPrio bool, isExtOmciSupported bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000983 logger.Debugw(ctx, "send MibUploadNext-msg to:", log.Fields{"device-id": oo.deviceID, "UploadSequNo": oo.UploadSequNo})
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000984
985 tid := oo.GetNextTid(highPrio)
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000986
987 omciLayer := &omci.OMCI{
988 TransactionID: tid,
989 MessageType: omci.MibUploadNextRequestType,
990 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000991 if isExtOmciSupported {
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000992 omciLayer.DeviceIdentifier = omci.ExtendedIdent
993 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000994 request := &omci.MibUploadNextRequest{
995 MeBasePacket: omci.MeBasePacket{
996 EntityClass: me.OnuDataClassID,
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000997 Extended: isExtOmciSupported,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000998 },
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000999 CommandSequenceNumber: oo.UploadSequNo,
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001000 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +00001001 var options gopacket.SerializeOptions
1002 options.FixLengths = true
1003
1004 buffer := gopacket.NewSerializeBuffer()
1005 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001006 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001007 logger.Errorw(ctx, "Cannot serialize MibUploadNextRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001008 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001009 return err
1010 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001011 oo.UploadSequNo++
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001012
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001013 omciRxCallbackPair := CallbackPair{
1014 CbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001015 //frame printing for MibUpload frames disabled now per default to avoid log file abort situations (size/speed?)
1016 // if wanted, rx frame printing should be specifically done within the MibUpload FSM or controlled via extra parameter
1017 // compare also software upgrade download section handling
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001018 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001019 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +00001020 return oo.Send(ctx, buffer.Bytes(), timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001021}
1022
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001023// SendGetAllAlarm gets all alarm ME instances
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001024func (oo *OmciCC) SendGetAllAlarm(ctx context.Context, alarmRetreivalMode uint8, timeout int, highPrio bool, isExtendedOmci bool) error {
Himani Chawlad3dac422021-03-13 02:31:31 +05301025 logger.Debugw(ctx, "send GetAllAlarms-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001026
1027 tid := oo.GetNextTid(highPrio)
1028 omciLayer := &omci.OMCI{
1029 TransactionID: tid,
1030 MessageType: omci.GetAllAlarmsRequestType,
1031 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1032 }
1033 if isExtendedOmci {
1034 omciLayer.DeviceIdentifier = omci.ExtendedIdent
1035 }
Himani Chawlad3dac422021-03-13 02:31:31 +05301036 request := &omci.GetAllAlarmsRequest{
1037 MeBasePacket: omci.MeBasePacket{
1038 EntityClass: me.OnuDataClassID,
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001039 Extended: isExtendedOmci,
Himani Chawlad3dac422021-03-13 02:31:31 +05301040 },
1041 AlarmRetrievalMode: byte(alarmRetreivalMode),
1042 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001043 var options gopacket.SerializeOptions
1044 options.FixLengths = true
1045 buffer := gopacket.NewSerializeBuffer()
1046 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Himani Chawlad3dac422021-03-13 02:31:31 +05301047 if err != nil {
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001048 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsRequest", log.Fields{"Err": err,
1049 "device-id": oo.deviceID})
Himani Chawlad3dac422021-03-13 02:31:31 +05301050 return err
1051 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001052 outgoingPacket := buffer.Bytes()
1053
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001054 oo.pOnuAlarmManager.ResetAlarmUploadCounters()
Himani Chawlad3dac422021-03-13 02:31:31 +05301055
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001056 omciRxCallbackPair := CallbackPair{
1057 CbKey: tid,
1058 CbEntry: CallbackPairEntry{oo.pOnuAlarmManager.GetAlarmMgrEventChannel(), oo.receiveOmciResponse, true},
Himani Chawlad3dac422021-03-13 02:31:31 +05301059 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001060 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
1061 if err != nil {
1062 logger.Errorw(ctx, "Cannot send GetAllAlarmsRequest", log.Fields{"Err": err,
1063 "device-id": oo.deviceID})
1064 return err
1065 }
1066 logger.Debug(ctx, "send GetAllAlarmsRequest done")
1067 return nil
Himani Chawlad3dac422021-03-13 02:31:31 +05301068}
1069
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001070// SendGetAllAlarmNext gets next alarm ME instance
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001071func (oo *OmciCC) SendGetAllAlarmNext(ctx context.Context, timeout int, highPrio bool, isExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001072 alarmUploadSeqNo := oo.pOnuAlarmManager.GetAlarmUploadSeqNo()
1073 logger.Debugw(ctx, "send SendGetAllAlarmNext-msg to:", log.Fields{"device-id": oo.deviceID,
Himani Chawlad3dac422021-03-13 02:31:31 +05301074 "alarmUploadSeqNo": alarmUploadSeqNo})
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001075
1076 tid := oo.GetNextTid(highPrio)
1077 omciLayer := &omci.OMCI{
1078 TransactionID: tid,
1079 MessageType: omci.GetAllAlarmsNextRequestType,
1080 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1081 }
1082 if isExtendedOmci {
1083 omciLayer.DeviceIdentifier = omci.ExtendedIdent
1084 }
Himani Chawlad3dac422021-03-13 02:31:31 +05301085 request := &omci.GetAllAlarmsNextRequest{
1086 MeBasePacket: omci.MeBasePacket{
1087 EntityClass: me.OnuDataClassID,
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001088 Extended: isExtendedOmci,
Himani Chawlad3dac422021-03-13 02:31:31 +05301089 },
1090 CommandSequenceNumber: alarmUploadSeqNo,
1091 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001092 var options gopacket.SerializeOptions
1093 options.FixLengths = true
1094 buffer := gopacket.NewSerializeBuffer()
1095 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Himani Chawlad3dac422021-03-13 02:31:31 +05301096 if err != nil {
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001097 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsNextRequest", log.Fields{"Err": err,
1098 "device-id": oo.deviceID})
Himani Chawlad3dac422021-03-13 02:31:31 +05301099 return err
1100 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001101 outgoingPacket := buffer.Bytes()
1102
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001103 oo.pOnuAlarmManager.IncrementAlarmUploadSeqNo()
Himani Chawlad3dac422021-03-13 02:31:31 +05301104
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001105 omciRxCallbackPair := CallbackPair{
1106 CbKey: tid,
1107 CbEntry: CallbackPairEntry{oo.pOnuAlarmManager.GetAlarmMgrEventChannel(), oo.receiveOmciResponse, true},
Himani Chawlad3dac422021-03-13 02:31:31 +05301108 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001109 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
1110 if err != nil {
1111 logger.Errorw(ctx, "Cannot send GetAllAlarmsNextRequest", log.Fields{"Err": err,
1112 "device-id": oo.deviceID})
1113 return err
1114 }
1115 logger.Debug(ctx, "send GetAllAlarmsNextRequest done")
1116 return nil
Himani Chawlad3dac422021-03-13 02:31:31 +05301117}
1118
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001119// SendCreateGalEthernetProfile creates GalEthernetProfile ME instance
1120func (oo *OmciCC) SendCreateGalEthernetProfile(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1121 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001122 logger.Debugw(ctx, "send GalEnetProfile-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001123 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001124
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001125 meParams := me.ParamData{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001126 EntityID: GalEthernetEID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001127 Attributes: me.AttributeValueMap{me.GalEthernetProfile_MaximumGemPayloadSize: maxGemPayloadSize},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001128 }
1129 meInstance, omciErr := me.NewGalEthernetProfile(meParams)
1130 if omciErr.GetError() == nil {
1131 //all setByCreate parameters already set, no default option required ...
mpagenko836a1fd2021-11-01 16:12:42 +00001132 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001133 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001134 logger.Errorw(ctx, "Cannot encode GalEnetProfileInstance for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001135 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001136 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001137 }
1138
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001139 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001140 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001141 logger.Errorw(ctx, "Cannot serialize GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001142 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001143 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001144 }
1145
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001146 omciRxCallbackPair := CallbackPair{
1147 CbKey: tid,
1148 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001149 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001150 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001151 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001152 logger.Errorw(ctx, "Cannot send GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001153 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001154 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001155 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001156 logger.Debug(ctx, "send GalEnetProfile-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001157 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001158 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001159 logger.Errorw(ctx, "Cannot generate GalEnetProfileInstance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001160 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001161 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001162}
1163
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001164// SendSetOnu2g sets Onu2G ME instance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001165// might be needed to extend for parameter arguments, here just for setting the ConnectivityMode!!
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001166func (oo *OmciCC) SendSetOnu2g(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1167 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001168 logger.Debugw(ctx, "send ONU2-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001169 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001170
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001171 // ONU-G ME-ID is defined to be 0, but we could verify, if the ONU really supports the desired
1172 // connectivity mode 5 (in ConnCap)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001173 // By now we just use fix values to fire - this is anyway what the python adapter does
1174 // read ONU-2G from DB ???? //TODO!!!
1175 meParams := me.ParamData{
1176 EntityID: 0,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001177 Attributes: me.AttributeValueMap{me.Onu2G_CurrentConnectivityMode: connectivityModeValue},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001178 }
1179 meInstance, omciErr := me.NewOnu2G(meParams)
1180 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001181 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001182 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001183 logger.Errorw(ctx, "Cannot encode ONU2-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001184 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001185 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001186 }
1187
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001188 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001189 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001190 logger.Errorw(ctx, "Cannot serialize ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001191 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001192 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001193 }
1194
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001195 omciRxCallbackPair := CallbackPair{
1196 CbKey: tid,
1197 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001198 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001199 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001200 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001201 logger.Errorw(ctx, "Cannot send ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001202 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001203 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001204 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001205 logger.Debug(ctx, "send ONU2-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001206 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001207 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001208 logger.Errorw(ctx, "Cannot generate ONU2-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001209 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001210 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001211}
1212
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001213// SendCreateMBServiceProfile creates MacBridgeServiceProfile ME instance
1214func (oo *OmciCC) SendCreateMBServiceProfile(ctx context.Context,
1215 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1216 tid := oo.GetNextTid(highPrio)
1217 instID := MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001218 logger.Debugw(ctx, "send MBSP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001219 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001220
1221 meParams := me.ParamData{
1222 EntityID: instID,
1223 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001224 me.MacBridgeServiceProfile_Priority: 0x8000,
1225 me.MacBridgeServiceProfile_MaxAge: 20 * 256, //20s
1226 me.MacBridgeServiceProfile_HelloTime: 2 * 256, //2s
1227 me.MacBridgeServiceProfile_ForwardDelay: 15 * 256, //15s
1228 me.MacBridgeServiceProfile_DynamicFilteringAgeingTime: 0,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001229 },
1230 }
1231
1232 meInstance, omciErr := me.NewMacBridgeServiceProfile(meParams)
1233 if omciErr.GetError() == nil {
1234 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001235 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1236 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001237 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001238 logger.Errorw(ctx, "Cannot encode MBSP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001239 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001240 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001241 }
1242
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001243 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001244 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001245 logger.Errorw(ctx, "Cannot serialize MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001246 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001247 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001248 }
1249
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001250 omciRxCallbackPair := CallbackPair{
1251 CbKey: tid,
1252 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001253 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001254 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001255 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001256 logger.Errorw(ctx, "Cannot send MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001257 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001258 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001259 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001260 logger.Debug(ctx, "send MBSP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001261 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001262 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001263 logger.Errorw(ctx, "Cannot generate MBSP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001264 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001265 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001266}
1267
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001268// SendCreateMBPConfigDataUniSide creates MacBridgePortConfigurationData ME instance
1269func (oo *OmciCC) SendCreateMBPConfigDataUniSide(ctx context.Context,
1270 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1271 tid := oo.GetNextTid(highPrio)
1272 instID, idErr := GenerateUNISideMBPCDEID(uint16(aPUniPort.MacBpNo))
Mahir Gunyel6781f962021-05-16 23:30:08 -07001273 if idErr != nil {
1274 logger.Errorw(ctx, "Cannot generate MBPCD entity id", log.Fields{
1275 "Err": idErr, "device-id": oo.deviceID})
1276 return nil, idErr
1277 }
1278 logger.Debugw(ctx, "send MBPCD-Create-msg for uni side:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001279 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16), "macBpNo": aPUniPort.MacBpNo})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001280
1281 meParams := me.ParamData{
1282 EntityID: instID,
1283 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001284 me.MacBridgePortConfigurationData_BridgeIdPointer: MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo),
1285 me.MacBridgePortConfigurationData_PortNum: aPUniPort.MacBpNo,
1286 me.MacBridgePortConfigurationData_TpType: uint8(aPUniPort.PortType),
1287 me.MacBridgePortConfigurationData_TpPointer: aPUniPort.EntityID,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001288 },
1289 }
1290 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
1291 if omciErr.GetError() == nil {
1292 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001293 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1294 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001295 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001296 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001297 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001298 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001299 }
1300
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001301 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001302 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001303 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001304 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001305 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001306 }
1307
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001308 omciRxCallbackPair := CallbackPair{
1309 CbKey: tid,
1310 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001311 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001312 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001313 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001314 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001315 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001316 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001317 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001318 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001319 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001320 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001321 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001322 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001323 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001324}
1325
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001326// SendCreateEVTOConfigData creates ExtendedVlanTaggingOperationConfigurationData ME instance
1327func (oo *OmciCC) SendCreateEVTOConfigData(ctx context.Context,
1328 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1329 tid := oo.GetNextTid(highPrio)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001330 //same entityId is used as for MBSP (see there), but just arbitrary ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001331 instID := MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001332 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001333 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001334
1335 // compare python adapter code WA VOL-1311: this is not done here!
1336 // (setting TPID values for the create would probably anyway be ignored by the omci lib)
1337 // but perhaps we have to be aware of possible problems at get(Next) Request handling for EVTOOCD tables later ...
1338 assType := uint8(2) // default AssociationType is PPTPEthUni
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001339 if aPUniPort.PortType == UniVEIP {
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001340 assType = uint8(10) // for VEIP
1341 }
1342 meParams := me.ParamData{
1343 EntityID: instID,
1344 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001345 me.ExtendedVlanTaggingOperationConfigurationData_AssociationType: assType,
1346 me.ExtendedVlanTaggingOperationConfigurationData_AssociatedMePointer: aPUniPort.EntityID,
mpagenko836a1fd2021-11-01 16:12:42 +00001347 //EnhancedMode not yet supported, used with default options
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001348 },
1349 }
1350 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(meParams)
1351 if omciErr.GetError() == nil {
1352 //all setByCreate parameters already set, no default option required ...
mpagenko836a1fd2021-11-01 16:12:42 +00001353 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1354 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001355 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001356 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001357 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001358 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001359 }
1360
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001361 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001362 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001363 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001364 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001365 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001366 }
1367
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001368 omciRxCallbackPair := CallbackPair{
1369 CbKey: tid,
1370 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001371 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001372 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001373 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001374 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001375 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001376 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001377 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001378 logger.Debug(ctx, "send EVTOCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001379 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001380 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001381 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001382 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001383 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001384}
1385
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001386// SendSetOnuGLS sets OnuG ME instance
1387func (oo *OmciCC) SendSetOnuGLS(ctx context.Context, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001388 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001389 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001390 logger.Debugw(ctx, "send ONU-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001391 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001392
1393 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1394 meParams := me.ParamData{
1395 EntityID: 0,
1396 Attributes: requestedAttributes,
1397 }
1398 meInstance, omciErr := me.NewOnuG(meParams)
1399 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001400 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001401 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001402 logger.Errorw(ctx, "Cannot encode ONU-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001403 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001404 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001405 }
1406
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001407 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001408 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001409 logger.Errorw(ctx, "Cannot serialize ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001410 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001411 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001412 }
1413
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001414 omciRxCallbackPair := CallbackPair{
1415 CbKey: tid,
1416 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001417 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001418 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001419 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001420 logger.Errorw(ctx, "Cannot send ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001421 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001422 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001423 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001424 logger.Debug(ctx, "send ONU-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001425 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001426 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001427 logger.Errorw(ctx, "Cannot generate ONU-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001428 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001429 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001430}
1431
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001432// SendSetPptpEthUniLS sets PhysicalPathTerminationPointEthernetUni ME instance
1433func (oo *OmciCC) SendSetPptpEthUniLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001434 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001435 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001436 logger.Debugw(ctx, "send PPTPEthUni-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001437 "SequNo": strconv.FormatInt(int64(tid), 16)})
1438
1439 // PPTPEthUni ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1440 meParams := me.ParamData{
1441 EntityID: aInstNo,
1442 Attributes: requestedAttributes,
1443 }
1444 meInstance, omciErr := me.NewPhysicalPathTerminationPointEthernetUni(meParams)
1445 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001446 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001447 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001448 logger.Errorw(ctx, "Cannot encode PPTPEthUni instance for set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001449 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001450 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001451 }
1452
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001453 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001454 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001455 logger.Errorw(ctx, "Cannot serialize PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001456 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001457 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001458 }
1459
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001460 omciRxCallbackPair := CallbackPair{
1461 CbKey: tid,
1462 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001463 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001464 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001465 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001466 logger.Errorw(ctx, "Cannot send PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001467 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001468 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001469 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001470 logger.Debug(ctx, "send PPTPEthUni-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001471 return meInstance, nil
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001472 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001473 logger.Errorw(ctx, "Cannot generate PPTPEthUni", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001474 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001475 return nil, omciErr.GetError()
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001476}
1477
1478/* UniG obsolete by now, left here in case it should be needed once again
1479 UniG AdminState anyway should be ignored by ONU acc. to G988
Himani Chawla6d2ae152020-09-02 13:11:20 +05301480func (oo *omciCC) sendSetUniGLS(ctx context.Context, aInstNo uint16, timeout int,
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001481 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) *me.ManagedEntity {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001482 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001483 logger.Debugw(ctx,"send UNI-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001484 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001485
1486 // UNI-G ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1487 meParams := me.ParamData{
1488 EntityID: aInstNo,
1489 Attributes: requestedAttributes,
1490 }
1491 meInstance, omciErr := me.NewUniG(meParams)
1492 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001493 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001494 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001495 logger.Errorw(ctx,"Cannot encode UNI-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001496 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001497 return nil
1498 }
1499
1500 pkt, err := serializeOmciLayer(omciLayer, msgLayer)
1501 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001502 logger.Errorw(ctx,"Cannot serialize UNI-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001503 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001504 return nil
1505 }
1506
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001507 omciRxCallbackPair := CallbackPair{
1508 CbKey: tid,
1509 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001510 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001511 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001512 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001513 logger.Errorw(ctx,"Cannot send UNIG-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001514 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001515 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001516 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001517 logger.Debug(ctx,"send UNI-G-Set-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001518 return meInstance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001519 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001520 logger.Errorw(ctx,"Cannot generate UNI-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001521 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001522 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001523}
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001524*/
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001525
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001526// SendSetVeipLS sets VirtualEthernetInterfacePoint ME instance
1527func (oo *OmciCC) SendSetVeipLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001528 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001529 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001530 logger.Debugw(ctx, "send VEIP-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001531 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001532
1533 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1534 meParams := me.ParamData{
1535 EntityID: aInstNo,
1536 Attributes: requestedAttributes,
1537 }
1538 meInstance, omciErr := me.NewVirtualEthernetInterfacePoint(meParams)
1539 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001540 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001541 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001542 logger.Errorw(ctx, "Cannot encode VEIP instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001543 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001544 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001545 }
1546
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001547 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001548 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001549 logger.Errorw(ctx, "Cannot serialize VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001550 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001551 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001552 }
1553
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001554 omciRxCallbackPair := CallbackPair{
1555 CbKey: tid,
1556 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001557 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001558 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001559 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001560 logger.Errorw(ctx, "Cannot send VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001561 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001562 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001563 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001564 logger.Debug(ctx, "send VEIP-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001565 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001566 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001567 logger.Errorw(ctx, "Cannot generate VEIP", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001568 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001569 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001570}
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001571
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001572// SendGetMe gets ME instance
1573func (oo *OmciCC) SendGetMe(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributes me.AttributeValueMap,
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001574 timeout int, highPrio bool, rxChan chan Message, isExtendedOmci bool) (*me.ManagedEntity, error) {
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001575
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001576 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001577 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001578 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001579
1580 meParams := me.ParamData{
1581 EntityID: entityID,
1582 Attributes: requestedAttributes,
1583 }
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001584 var messageSet omci.DeviceIdent = omci.BaselineIdent
1585 if isExtendedOmci {
1586 messageSet = omci.ExtendedIdent
1587 }
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001588 meInstance, omciErr := me.LoadManagedEntityDefinition(classID, meParams)
1589 if omciErr.GetError() == nil {
Himani Chawla4d908332020-08-31 12:30:20 +05301590 meClassIDName := meInstance.GetName()
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001591 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.GetRequestType, oframe.TransactionID(tid), oframe.FrameFormat(messageSet))
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001592 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001593 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 +03001594 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001595 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001596 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001597 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001598 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001599 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001600 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001601 omciRxCallbackPair := CallbackPair{
1602 CbKey: tid,
1603 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001604 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001605 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001606 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001607 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001608 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001609 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001610 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": meClassIDName, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001611 return meInstance, nil
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001612 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001613 logger.Errorw(ctx, "Cannot generate meDefinition", log.Fields{"classID": classID, "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001614 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001615}
1616
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001617// SendGetMeWithAttributeMask gets ME instance with attribute mask
1618func (oo *OmciCC) SendGetMeWithAttributeMask(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributesMask uint16,
Himani Chawla43f95ff2021-06-03 00:24:12 +05301619 timeout int, highPrio bool, rxChan chan Message) error {
1620
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001621 tid := oo.GetNextTid(highPrio)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301622 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
1623 "SequNo": strconv.FormatInt(int64(tid), 16)})
1624
1625 request := &omci.GetRequest{
1626 MeBasePacket: omci.MeBasePacket{
1627 EntityInstance: entityID,
1628 EntityClass: classID,
1629 },
1630 AttributeMask: requestedAttributesMask,
1631 }
1632
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001633 pkt, err := Serialize(ctx, omci.GetRequestType, request, tid)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301634 if err != nil {
1635 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1636 return err
1637 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001638 omciRxCallbackPair := CallbackPair{
1639 CbKey: tid,
1640 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Himani Chawla43f95ff2021-06-03 00:24:12 +05301641 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001642 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301643 if err != nil {
1644 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1645 return err
1646 }
1647 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": classID, "device-id": oo.deviceID})
1648 return nil
1649}
1650
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001651// SendCreateDot1PMapper creates Ieee8021PMapperServiceProfile ME instance
1652func (oo *OmciCC) SendCreateDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001653 aInstID uint16, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001654 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001655 logger.Debugw(ctx, "send .1pMapper-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001656 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(aInstID), 16)})
1657
1658 meParams := me.ParamData{
mpagenko8b5fdd22020-12-17 17:58:32 +00001659 EntityID: aInstID,
1660 Attributes: me.AttributeValueMap{
1661 //workaround for unsuitable omci-lib default values, cmp VOL-3729
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001662 me.Ieee8021PMapperServiceProfile_TpPointer: 0xFFFF,
1663 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority0: 0xFFFF,
1664 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority1: 0xFFFF,
1665 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority2: 0xFFFF,
1666 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority3: 0xFFFF,
1667 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority4: 0xFFFF,
1668 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority5: 0xFFFF,
1669 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority6: 0xFFFF,
1670 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority7: 0xFFFF,
mpagenko8b5fdd22020-12-17 17:58:32 +00001671 },
mpagenko3dbcdd22020-07-22 07:38:45 +00001672 }
1673 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
1674 if omciErr.GetError() == nil {
1675 //we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001676 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1677 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001678 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001679 logger.Errorw(ctx, "Cannot encode .1pMapper for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001680 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001681 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001682 }
1683
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001684 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001685 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001686 logger.Errorw(ctx, "Cannot serialize .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001687 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001688 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001689 }
1690
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001691 omciRxCallbackPair := CallbackPair{
1692 CbKey: tid,
1693 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001694 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001695 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001696 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001697 logger.Errorw(ctx, "Cannot send .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001698 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001699 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001700 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001701 logger.Debug(ctx, "send .1pMapper-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001702 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001703 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001704 logger.Errorw(ctx, "Cannot generate .1pMapper", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001705 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001706 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001707}
1708
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001709// SendCreateMBPConfigDataVar creates MacBridgePortConfigurationData ME instance
1710func (oo *OmciCC) SendCreateMBPConfigDataVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001711 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001712 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001713 logger.Debugw(ctx, "send MBPCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001714 "SequNo": strconv.FormatInt(int64(tid), 16),
1715 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1716
1717 meInstance, omciErr := me.NewMacBridgePortConfigurationData(params[0])
1718 if omciErr.GetError() == nil {
1719 //obviously 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 MBPCD 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 MBPCD 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 MBPCD 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 MBPCD-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 MBPCD Instance", 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// SendCreateGemNCTPVar creates GemPortNetworkCtp ME instance
1754func (oo *OmciCC) SendCreateGemNCTPVar(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 GemNCTP-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.NewGemPortNetworkCtp(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 GemNCTP 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 GemNCTP 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 GemNCTP 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 GemNCTP-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 GemNCTP 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// SendSetGemNCTPVar sets GemPortNetworkCtp ME instance
1798func (oo *OmciCC) SendSetGemNCTPVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
1799 tid := oo.GetNextTid(highPrio)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001800 logger.Debugw(ctx, "send GemNCTP-Set-msg:", log.Fields{"device-id": oo.deviceID,
1801 "SequNo": strconv.FormatInt(int64(tid), 16),
1802 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1803
1804 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1805 if omciErr.GetError() == nil {
1806 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001807 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType,
1808 oframe.TransactionID(tid), oframe.AddDefaults(true))
ozgecanetsia82b91a62021-05-21 18:54:49 +03001809 if err != nil {
1810 logger.Errorw(ctx, "Cannot encode GemNCTP for set", log.Fields{
1811 "Err": err, "device-id": oo.deviceID})
1812 return nil, err
1813 }
1814
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001815 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001816 if err != nil {
1817 logger.Errorw(ctx, "Cannot serialize GemNCTP set", log.Fields{
1818 "Err": err, "device-id": oo.deviceID})
1819 return nil, err
1820 }
1821
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001822 omciRxCallbackPair := CallbackPair{
1823 CbKey: tid,
1824 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia82b91a62021-05-21 18:54:49 +03001825 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001826 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001827 if err != nil {
1828 logger.Errorw(ctx, "Cannot send GemNCTP set", log.Fields{
1829 "Err": err, "device-id": oo.deviceID})
1830 return nil, err
1831 }
1832 logger.Debug(ctx, "send GemNCTP-Set-msg done", log.Fields{"device-id": oo.deviceID})
1833 return meInstance, nil
1834 }
1835 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
1836 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1837 return nil, omciErr.GetError()
1838}
1839
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001840// SendCreateGemIWTPVar creates GemInterworkingTerminationPoint ME instance
1841func (oo *OmciCC) SendCreateGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001842 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001843 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001844 logger.Debugw(ctx, "send GemIwTp-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001845 "SequNo": strconv.FormatInt(int64(tid), 16),
1846 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1847
1848 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(params[0])
1849 if omciErr.GetError() == nil {
1850 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
mpagenko836a1fd2021-11-01 16:12:42 +00001851 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1852 oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001853 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001854 logger.Errorw(ctx, "Cannot encode GemIwTp for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001855 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001856 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001857 }
1858
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001859 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001860 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001861 logger.Errorw(ctx, "Cannot serialize GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001862 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001863 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001864 }
1865
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001866 omciRxCallbackPair := CallbackPair{
1867 CbKey: tid,
1868 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001869 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001870 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001871 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001872 logger.Errorw(ctx, "Cannot send GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001873 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001874 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001875 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001876 logger.Debug(ctx, "send GemIwTp-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001877 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001878 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001879 logger.Errorw(ctx, "Cannot generate GemIwTp Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001880 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001881 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001882}
1883
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001884// SendSetTcontVar sets TCont ME instance
1885func (oo *OmciCC) SendSetTcontVar(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 TCont-Set-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.NewTCont(params[0])
1893 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001894 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001895 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001896 logger.Errorw(ctx, "Cannot encode TCont for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001897 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001898 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001899 }
1900
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001901 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001902 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001903 logger.Errorw(ctx, "Cannot serialize TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001904 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001905 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001906 }
1907
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001908 omciRxCallbackPair := CallbackPair{
1909 CbKey: tid,
1910 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001911 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001912 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001913 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001914 logger.Errorw(ctx, "Cannot send TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001915 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001916 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001917 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001918 logger.Debug(ctx, "send TCont-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001919 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001920 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001921 logger.Errorw(ctx, "Cannot generate TCont Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001922 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001923 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001924}
1925
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001926// SendSetPrioQueueVar sets PriorityQueue ME instance
1927func (oo *OmciCC) SendSetPrioQueueVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001928 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001929 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001930 logger.Debugw(ctx, "send PrioQueue-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001931 "SequNo": strconv.FormatInt(int64(tid), 16),
1932 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1933
1934 meInstance, omciErr := me.NewPriorityQueue(params[0])
1935 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001936 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001937 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001938 logger.Errorw(ctx, "Cannot encode PrioQueue for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001939 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001940 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001941 }
1942
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001943 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001944 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001945 logger.Errorw(ctx, "Cannot serialize PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001946 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001947 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001948 }
1949
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001950 omciRxCallbackPair := CallbackPair{
1951 CbKey: tid,
1952 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001953 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001954 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001955 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001956 logger.Errorw(ctx, "Cannot send PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001957 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001958 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001959 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001960 logger.Debug(ctx, "send PrioQueue-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001961 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001962 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001963 logger.Errorw(ctx, "Cannot generate PrioQueue Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001964 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001965 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001966}
1967
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001968// SendSetDot1PMapperVar sets Ieee8021PMapperServiceProfile ME instance
1969func (oo *OmciCC) SendSetDot1PMapperVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001970 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001971 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001972 logger.Debugw(ctx, "send 1PMapper-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001973 "SequNo": strconv.FormatInt(int64(tid), 16),
1974 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1975
1976 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(params[0])
1977 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001978 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001979 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001980 logger.Errorw(ctx, "Cannot encode 1PMapper for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001981 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001982 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001983 }
1984
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001985 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001986 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001987 logger.Errorw(ctx, "Cannot serialize 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001988 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001989 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001990 }
1991
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001992 omciRxCallbackPair := CallbackPair{
1993 CbKey: tid,
1994 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001995 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001996 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001997 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001998 logger.Errorw(ctx, "Cannot send 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001999 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002000 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00002001 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002002 logger.Debug(ctx, "send 1PMapper-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002003 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00002004 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002005 logger.Errorw(ctx, "Cannot generate 1PMapper Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00002006 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002007 return nil, omciErr.GetError()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00002008}
mpagenkodff5dda2020-08-28 11:52:01 +00002009
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002010// SendCreateVtfdVar creates VlanTaggingFilterData ME instance
2011func (oo *OmciCC) SendCreateVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002012 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002013 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002014 logger.Debugw(ctx, "send VTFD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002015 "SequNo": strconv.FormatInt(int64(tid), 16),
2016 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2017
2018 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
2019 if omciErr.GetError() == nil {
2020 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
mpagenko836a1fd2021-11-01 16:12:42 +00002021 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
2022 oframe.TransactionID(tid))
mpagenkodff5dda2020-08-28 11:52:01 +00002023 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002024 logger.Errorw(ctx, "Cannot encode VTFD for create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002025 "Err": err, "device-id": oo.deviceID})
2026 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2027 // return (dual format) error code that can be used at caller for immediate error treatment
2028 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002029 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002030 }
2031
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002032 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00002033 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002034 logger.Errorw(ctx, "Cannot serialize VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002035 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002036 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002037 }
2038
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002039 omciRxCallbackPair := CallbackPair{
2040 CbKey: tid,
2041 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00002042 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002043 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00002044 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002045 logger.Errorw(ctx, "Cannot send VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002046 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002047 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002048 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002049 logger.Debug(ctx, "send VTFD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002050 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00002051 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002052 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002053 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002054 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00002055}
2056
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002057// nolint: unused
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002058func (oo *OmciCC) sendSetVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002059 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002060 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002061 logger.Debugw(ctx, "send VTFD-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002062 "SequNo": strconv.FormatInt(int64(tid), 16),
2063 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2064
2065 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
2066 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002067 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType,
2068 oframe.TransactionID(tid))
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002069 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002070 logger.Errorw(ctx, "Cannot encode VTFD for set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002071 "Err": err, "device-id": oo.deviceID})
2072 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2073 // return (dual format) error code that can be used at caller for immediate error treatment
2074 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002075 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002076 }
2077
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002078 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002079 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002080 logger.Errorw(ctx, "Cannot serialize VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002081 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002082 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002083 }
2084
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002085 omciRxCallbackPair := CallbackPair{
2086 CbKey: tid,
2087 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002088 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002089 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002090 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002091 logger.Errorw(ctx, "Cannot send VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002092 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002093 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002094 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002095 logger.Debug(ctx, "send VTFD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002096 return meInstance, nil
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002097 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002098 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002099 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002100 return nil, omciErr.GetError()
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002101}
2102
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002103// SendCreateEvtocdVar creates ExtendedVlanTaggingOperationConfigurationData ME instance
2104func (oo *OmciCC) SendCreateEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002105 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002106 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002107 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002108 "SequNo": strconv.FormatInt(int64(tid), 16),
2109 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2110
2111 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2112 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002113 //EnhancedMode not yet supported, used with default options
2114 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
2115 oframe.TransactionID(tid), oframe.AddDefaults(true))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002116 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002117 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002118 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002119 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002120 }
2121
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002122 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002123 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002124 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002125 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002126 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002127 }
2128
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002129 omciRxCallbackPair := CallbackPair{
2130 CbKey: tid,
2131 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002132 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002133 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002134 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002135 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002136 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002137 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002138 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002139 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002140 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002141 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002142 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002143 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002144 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002145}
2146
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002147// SendSetEvtocdVar sets ExtendedVlanTaggingOperationConfigurationData ME instance
2148func (oo *OmciCC) SendSetEvtocdVar(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-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002152 "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 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenkodff5dda2020-08-28 11:52:01 +00002158 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002159 logger.Errorw(ctx, "Cannot encode EVTOCD for set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002160 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002161 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002162 }
2163
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002164 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00002165 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002166 logger.Errorw(ctx, "Cannot serialize EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002167 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002168 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002169 }
2170
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002171 omciRxCallbackPair := CallbackPair{
2172 CbKey: tid,
2173 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00002174 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002175 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00002176 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002177 logger.Errorw(ctx, "Cannot send EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002178 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002179 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002180 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002181 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002182 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00002183 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002184 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002185 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002186 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00002187}
mpagenko01e726e2020-10-23 09:45:29 +00002188
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002189// SendDeleteEvtocd deletes ExtendedVlanTaggingOperationConfigurationData ME instance
2190func (oo *OmciCC) SendDeleteEvtocd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002191 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002192 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002193 logger.Debugw(ctx, "send EVTOCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002194 "SequNo": strconv.FormatInt(int64(tid), 16),
2195 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2196
2197 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2198 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002199 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002200 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002201 logger.Errorw(ctx, "Cannot encode EVTOCD for delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002202 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002203 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002204 }
2205
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002206 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002207 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002208 logger.Errorw(ctx, "Cannot serialize EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002209 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002210 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002211 }
2212
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002213 omciRxCallbackPair := CallbackPair{
2214 CbKey: tid,
2215 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002216 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002217 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002218 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002219 logger.Errorw(ctx, "Cannot send EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002220 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002221 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002222 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002223 logger.Debug(ctx, "send EVTOCD-delete msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002224 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002225 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002226 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002227 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002228 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002229}
2230
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002231// SendDeleteVtfd deletes VlanTaggingFilterData ME instance
2232func (oo *OmciCC) SendDeleteVtfd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002233 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002234 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002235 logger.Debugw(ctx, "send VTFD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko01e726e2020-10-23 09:45:29 +00002236 "SequNo": strconv.FormatInt(int64(tid), 16),
2237 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2238
2239 meParams := me.ParamData{EntityID: aInstID}
2240 meInstance, omciErr := me.NewVlanTaggingFilterData(meParams)
2241 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002242 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2243 oframe.TransactionID(tid))
mpagenko01e726e2020-10-23 09:45:29 +00002244 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002245 logger.Errorw(ctx, "Cannot encode VTFD for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002246 "Err": err, "device-id": oo.deviceID})
2247 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2248 // return (dual format) error code that can be used at caller for immediate error treatment
2249 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002250 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002251 }
2252
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002253 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko01e726e2020-10-23 09:45:29 +00002254 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002255 logger.Errorw(ctx, "Cannot serialize VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002256 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002257 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002258 }
2259
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002260 omciRxCallbackPair := CallbackPair{
2261 CbKey: tid,
2262 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko01e726e2020-10-23 09:45:29 +00002263 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002264 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko01e726e2020-10-23 09:45:29 +00002265 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002266 logger.Errorw(ctx, "Cannot send VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002267 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002268 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002269 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002270 logger.Debug(ctx, "send VTFD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002271 return meInstance, nil
mpagenko01e726e2020-10-23 09:45:29 +00002272 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002273 logger.Errorw(ctx, "Cannot generate VTFD Instance for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002274 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002275 return nil, omciErr.GetError()
mpagenko01e726e2020-10-23 09:45:29 +00002276}
ozgecanetsia422dbf32020-10-28 14:07:19 +03002277
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002278// SendCreateTDVar creates TrafficDescriptor ME instance
2279func (oo *OmciCC) SendCreateTDVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2280 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002281 logger.Debugw(ctx, "send TD-Create-msg:", log.Fields{"device-id": oo.deviceID,
2282 "SequNo": strconv.FormatInt(int64(tid), 16),
2283 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2284 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2285 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002286 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002287 if err != nil {
2288 logger.Errorw(ctx, "Cannot encode TD for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002289 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002290 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002291 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002292 if err != nil {
2293 logger.Errorw(ctx, "Cannot serialize TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002294 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002295 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002296 omciRxCallbackPair := CallbackPair{
2297 CbKey: tid,
2298 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002299 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002300 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002301 if err != nil {
2302 logger.Errorw(ctx, "Cannot send TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002303 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002304 }
2305 logger.Debug(ctx, "send TD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002306 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002307 }
2308 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002309 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002310}
2311
2312// nolint: unused
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002313func (oo *OmciCC) sendSetTDVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002314 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002315 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002316 logger.Debugw(ctx, "send TD-Set-msg:", log.Fields{"device-id": oo.deviceID,
2317 "SequNo": strconv.FormatInt(int64(tid), 16),
2318 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2319
2320 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2321 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002322 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002323 if err != nil {
2324 logger.Errorw(ctx, "Cannot encode TD for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002325 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002326 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002327 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002328 if err != nil {
2329 logger.Errorw(ctx, "Cannot serialize TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002330 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002331 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002332 omciRxCallbackPair := CallbackPair{
2333 CbKey: tid,
2334 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002335 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002336 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002337 if err != nil {
2338 logger.Errorw(ctx, "Cannot send TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002339 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002340 }
2341 logger.Debug(ctx, "send TD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002342 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002343 }
2344 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002345 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002346
2347}
2348
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002349// SendDeleteTD - TODO: add comment
2350func (oo *OmciCC) SendDeleteTD(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002351 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002352 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002353 logger.Debugw(ctx, "send TD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2354 "SequNo": strconv.FormatInt(int64(tid), 16),
2355 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2356
2357 meParams := me.ParamData{EntityID: aInstID}
2358 meInstance, omciErr := me.NewTrafficDescriptor(meParams)
2359 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002360 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002361 if err != nil {
2362 logger.Errorw(ctx, "Cannot encode TD for delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002363 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002364 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002365 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002366 if err != nil {
2367 logger.Errorw(ctx, "Cannot serialize TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002368 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002369 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002370 omciRxCallbackPair := CallbackPair{
2371 CbKey: tid,
2372 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002373 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002374 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002375 if err != nil {
2376 logger.Errorw(ctx, "Cannot send TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002377 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002378 }
2379 logger.Debug(ctx, "send TD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002380 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002381 }
2382 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002383 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002384
2385}
2386
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002387// SendDeleteGemIWTP deletes GemInterworkingTerminationPoint ME instance
2388func (oo *OmciCC) SendDeleteGemIWTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002389 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002390 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002391 logger.Debugw(ctx, "send GemIwTp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002392 "SequNo": strconv.FormatInt(int64(tid), 16),
2393 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2394
2395 meParams := me.ParamData{EntityID: aInstID}
2396 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(meParams)
2397 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002398 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2399 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002400 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002401 logger.Errorw(ctx, "Cannot encode GemIwTp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002402 "Err": err, "device-id": oo.deviceID})
2403 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2404 // return (dual format) error code that can be used at caller for immediate error treatment
2405 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002406 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002407 }
2408
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002409 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002410 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002411 logger.Errorw(ctx, "Cannot serialize GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002412 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002413 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002414 }
2415
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002416 omciRxCallbackPair := CallbackPair{
2417 CbKey: tid,
2418 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002419 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002420 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002421 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002422 logger.Errorw(ctx, "Cannot send GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002423 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002424 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002425 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002426 logger.Debug(ctx, "send GemIwTp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002427 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002428 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002429 logger.Errorw(ctx, "Cannot generate GemIwTp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002430 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002431 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002432}
2433
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002434// SendDeleteGemNCTP deletes GemPortNetworkCtp ME instance
2435func (oo *OmciCC) SendDeleteGemNCTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002436 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002437 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002438 logger.Debugw(ctx, "send GemNCtp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002439 "SequNo": strconv.FormatInt(int64(tid), 16),
2440 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2441
2442 meParams := me.ParamData{EntityID: aInstID}
2443 meInstance, omciErr := me.NewGemPortNetworkCtp(meParams)
2444 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002445 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2446 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002447 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002448 logger.Errorw(ctx, "Cannot encode GemNCtp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002449 "Err": err, "device-id": oo.deviceID})
2450 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2451 // return (dual format) error code that can be used at caller for immediate error treatment
2452 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002453 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002454 }
2455
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002456 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002457 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002458 logger.Errorw(ctx, "Cannot serialize GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002459 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002460 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002461 }
2462
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002463 omciRxCallbackPair := CallbackPair{
2464 CbKey: tid,
2465 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002466 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002467 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002468 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002469 logger.Errorw(ctx, "Cannot send GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002470 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002471 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002472 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002473 logger.Debug(ctx, "send GemNCtp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002474 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002475 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002476 logger.Errorw(ctx, "Cannot generate GemNCtp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002477 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002478 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002479}
2480
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002481// SendDeleteDot1PMapper deletes Ieee8021PMapperServiceProfile ME instance
2482func (oo *OmciCC) SendDeleteDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002483 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002484 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002485 logger.Debugw(ctx, "send .1pMapper-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002486 "SequNo": strconv.FormatInt(int64(tid), 16),
2487 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2488
2489 meParams := me.ParamData{EntityID: aInstID}
2490 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
2491 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002492 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2493 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002494 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002495 logger.Errorw(ctx, "Cannot encode .1pMapper for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002496 "Err": err, "device-id": oo.deviceID})
2497 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2498 // return (dual format) error code that can be used at caller for immediate error treatment
2499 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002500 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002501 }
2502
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002503 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002504 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002505 logger.Errorw(ctx, "Cannot serialize .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002506 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002507 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002508 }
2509
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002510 omciRxCallbackPair := CallbackPair{
2511 CbKey: tid,
2512 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002513 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002514 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002515 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002516 logger.Errorw(ctx, "Cannot send .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002517 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002518 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002519 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002520 logger.Debug(ctx, "send .1pMapper-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002521 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002522 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002523 logger.Errorw(ctx, "Cannot generate .1pMapper Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002524 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002525 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002526}
2527
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002528// SendDeleteMBPConfigData deletes MacBridgePortConfigurationData ME instance
2529func (oo *OmciCC) SendDeleteMBPConfigData(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002530 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002531 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002532 logger.Debugw(ctx, "send MBPCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002533 "SequNo": strconv.FormatInt(int64(tid), 16),
2534 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2535
2536 meParams := me.ParamData{EntityID: aInstID}
2537 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
2538 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002539 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2540 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002541 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002542 logger.Errorw(ctx, "Cannot encode MBPCD for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002543 "Err": err, "device-id": oo.deviceID})
2544 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2545 // return (dual format) error code that can be used at caller for immediate error treatment
2546 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002547 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002548 }
2549
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002550 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002551 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002552 logger.Errorw(ctx, "Cannot serialize MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002553 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002554 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002555 }
2556
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002557 omciRxCallbackPair := CallbackPair{
2558 CbKey: tid,
2559 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002560 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002561 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002562 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002563 logger.Errorw(ctx, "Cannot send MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002564 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002565 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002566 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002567 logger.Debug(ctx, "send MBPCD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002568 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002569 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002570 logger.Errorw(ctx, "Cannot generate MBPCD Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002571 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002572 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002573}
2574
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002575// SendCreateMulticastGemIWTPVar creates MulticastGemInterworkingTerminationPoint ME instance
2576func (oo *OmciCC) SendCreateMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002577 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002578 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002579 logger.Debugw(ctx, "send MulticastGemIWTP-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002580 "SequNo": strconv.FormatInt(int64(tid), 16),
2581 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2582
2583 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2584 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002585 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2586 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002587 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002588 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002589 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002590 }
2591
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002592 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002593 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002594 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002595 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002596 }
2597
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002598 omciRxCallbackPair := CallbackPair{CbKey: tid,
2599 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002600 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002601 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002602 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002603 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002604 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002605 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002606 logger.Debug(ctx, "send MulticastGEMIWTP-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002607 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002608 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002609 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002610 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002611 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002612}
2613
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002614// SendSetMulticastGemIWTPVar sets MulticastGemInterworkingTerminationPoint ME instance
2615func (oo *OmciCC) SendSetMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002616 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002617 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002618 logger.Debugw(ctx, "send MulticastGemIWTP-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002619 "SequNo": strconv.FormatInt(int64(tid), 16),
2620 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2621
2622 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2623 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002624 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2625 oframe.AddDefaults(true))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002626 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002627 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002628 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002629 }
2630
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002631 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002632 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002633 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002634 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002635 }
2636
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002637 omciRxCallbackPair := CallbackPair{CbKey: tid,
2638 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002639 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002640 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002641 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002642 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002643 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002644 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002645 logger.Debug(ctx, "send MulticastGEMIWTP-set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002646 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002647 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002648 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002649 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002650 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002651}
2652
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002653// SendCreateMulticastOperationProfileVar creates MulticastOperationsProfile ME instance
2654func (oo *OmciCC) SendCreateMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002655 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002656 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002657 logger.Debugw(ctx, "send MulticastOperationProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002658 "SequNo": strconv.FormatInt(int64(tid), 16),
2659 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2660
2661 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2662 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002663 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2664 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002665 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002666 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002667 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002668 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002669 }
2670
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002671 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002672 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002673 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002674 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002675 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002676 }
2677
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002678 omciRxCallbackPair := CallbackPair{CbKey: tid,
2679 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002680 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002681 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002682 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002683 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002684 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002685 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002686 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002687 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002688 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002689 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002690 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002691 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002692 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002693}
2694
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002695// SendSetMulticastOperationProfileVar sets MulticastOperationsProfile ME instance
2696func (oo *OmciCC) SendSetMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002697 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002698 tid := oo.GetNextTid(highPrio)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002699 logger.Debugw(ctx, "send MulticastOperationProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002700 "SequNo": strconv.FormatInt(int64(tid), 16),
2701 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2702
2703 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2704 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002705 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2706 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002707 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002708 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002709 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002710 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002711 }
2712
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002713 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002714 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002715 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002716 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002717 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002718 }
2719
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002720 omciRxCallbackPair := CallbackPair{CbKey: tid,
2721 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002722 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002723 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002724 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002725 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002726 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002727 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002728 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002729 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002730 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002731 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002732 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002733 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002734 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002735}
2736
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002737// SendCreateMulticastSubConfigInfoVar creates MulticastSubscriberConfigInfo ME instance
2738func (oo *OmciCC) SendCreateMulticastSubConfigInfoVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002739 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002740 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002741 logger.Debugw(ctx, "send MulticastSubConfigInfo-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002742 "SequNo": strconv.FormatInt(int64(tid), 16),
2743 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2744
2745 meInstance, omciErr := me.NewMulticastSubscriberConfigInfo(params[0])
2746 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002747 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2748 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002749 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002750 logger.Errorw(ctx, "Cannot encode MulticastSubConfigInfo for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002751 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002752 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002753 }
2754
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002755 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002756 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002757 logger.Errorw(ctx, "Cannot serialize MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002758 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002759 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002760 }
2761
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002762 omciRxCallbackPair := CallbackPair{CbKey: tid,
2763 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002764 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002765 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002766 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002767 logger.Errorw(ctx, "Cannot send MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002768 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002769 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002770 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002771 logger.Debug(ctx, "send MulticastSubConfigInfo-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002772 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002773 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002774 logger.Errorw(ctx, "Cannot generate MulticastSubConfigInfo Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002775 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002776 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002777}
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00002778
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002779// SendCreateVoipVoiceCTP nolint: unused
2780func (oo *OmciCC) SendCreateVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2781 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2782 tid := oo.GetNextTid(highPrio)
2783 logger.Debugw(ctx, "send VoipVoiceCTP-create-msg:", log.Fields{"device-id": oo.deviceID,
2784 "SequNo": strconv.FormatInt(int64(tid), 16),
2785 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2786
2787 meInstance, omciErr := me.NewVoipVoiceCtp(params[0])
2788 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002789 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2790 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002791 if err != nil {
2792 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for create", log.Fields{"Err": err,
2793 "device-id": oo.deviceID})
2794 return nil, err
2795 }
2796
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002797 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002798 if err != nil {
2799 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP create", log.Fields{"Err": err,
2800 "device-id": oo.deviceID})
2801 return nil, err
2802 }
2803
2804 omciRxCallbackPair := CallbackPair{CbKey: tid,
2805 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2806 }
2807 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2808 if err != nil {
2809 logger.Errorw(ctx, "Cannot send VoipVoiceCTP create", log.Fields{"Err": err,
2810 "device-id": oo.deviceID})
2811 return nil, err
2812 }
2813 logger.Debug(ctx, "send VoipVoiceCTP-create-msg done")
2814 return meInstance, nil
2815 }
2816 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance", log.Fields{"Err": omciErr.GetError(),
2817 "device-id": oo.deviceID})
2818 return nil, omciErr.GetError()
2819}
2820
2821// SendSetVoipVoiceCTP nolint: unused
2822func (oo *OmciCC) SendSetVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2823 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2824 tid := oo.GetNextTid(highPrio)
2825 logger.Debugw(ctx, "send VoipVoiceCTP-set-msg:", log.Fields{"device-id": oo.deviceID,
2826 "SequNo": strconv.FormatInt(int64(tid), 16),
2827 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2828
2829 meInstance, omciErr := me.NewVoipVoiceCtp(params[0])
2830 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002831 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2832 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002833 if err != nil {
2834 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for set", log.Fields{"Err": err,
2835 "device-id": oo.deviceID})
2836 return nil, err
2837 }
2838
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002839 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002840 if err != nil {
2841 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP set", log.Fields{"Err": err,
2842 "device-id": oo.deviceID})
2843 return nil, err
2844 }
2845
2846 omciRxCallbackPair := CallbackPair{CbKey: tid,
2847 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2848 }
2849 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2850 if err != nil {
2851 logger.Errorw(ctx, "Cannot send VoipVoiceCTP set", log.Fields{"Err": err,
2852 "device-id": oo.deviceID})
2853 return nil, err
2854 }
2855 logger.Debug(ctx, "send VoipVoiceCTP-set-msg done")
2856 return meInstance, nil
2857 }
2858 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance", log.Fields{"Err": omciErr.GetError(),
2859 "device-id": oo.deviceID})
2860 return nil, omciErr.GetError()
2861}
2862
2863// SendDeleteVoipVoiceCTP nolint: unused
2864func (oo *OmciCC) SendDeleteVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2865 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
2866 tid := oo.GetNextTid(highPrio)
2867 logger.Debugw(ctx, "send VoipVoiceCTP-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2868 "SequNo": strconv.FormatInt(int64(tid), 16),
2869 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2870
2871 meParams := me.ParamData{EntityID: aInstID}
2872 meInstance, omciErr := me.NewVoipVoiceCtp(meParams)
2873 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002874 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2875 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002876 if err != nil {
2877 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for delete", log.Fields{
2878 "Err": err, "device-id": oo.deviceID})
2879 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2880 // return (dual format) error code that can be used at caller for immediate error treatment
2881 // (relevant to all used sendXX() methods and their error conditions)
2882 return nil, err
2883 }
2884
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002885 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002886 if err != nil {
2887 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP delete", log.Fields{
2888 "Err": err, "device-id": oo.deviceID})
2889 return nil, err
2890 }
2891
2892 omciRxCallbackPair := CallbackPair{
2893 CbKey: tid,
2894 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2895 }
2896 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2897 if err != nil {
2898 logger.Errorw(ctx, "Cannot send VoipVoiceCTP delete", log.Fields{
2899 "Err": err, "device-id": oo.deviceID})
2900 return nil, err
2901 }
2902 logger.Debug(ctx, "send VoipVoiceCTP-Delete-msg done")
2903 return meInstance, nil
2904 }
2905 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance for delete", log.Fields{
2906 "Err": omciErr.GetError(), "device-id": oo.deviceID})
2907 return nil, omciErr.GetError()
2908}
2909
2910// SendCreateVoipMediaProfile nolint: unused
2911func (oo *OmciCC) SendCreateVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2912 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2913 tid := oo.GetNextTid(highPrio)
2914 logger.Debugw(ctx, "send VoipMediaProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
2915 "SequNo": strconv.FormatInt(int64(tid), 16),
2916 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2917
2918 meInstance, omciErr := me.NewVoipMediaProfile(params[0])
2919 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002920 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2921 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002922 if err != nil {
2923 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for create", log.Fields{"Err": err,
2924 "device-id": oo.deviceID})
2925 return nil, err
2926 }
2927
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002928 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002929 if err != nil {
2930 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile create", log.Fields{"Err": err,
2931 "device-id": oo.deviceID})
2932 return nil, err
2933 }
2934
2935 omciRxCallbackPair := CallbackPair{CbKey: tid,
2936 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2937 }
2938 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2939 if err != nil {
2940 logger.Errorw(ctx, "Cannot send VoipMediaProfile create", log.Fields{"Err": err,
2941 "device-id": oo.deviceID})
2942 return nil, err
2943 }
2944 logger.Debug(ctx, "send VoipMediaProfile-create-msg done")
2945 return meInstance, nil
2946 }
2947 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance", log.Fields{"Err": omciErr.GetError(),
2948 "device-id": oo.deviceID})
2949 return nil, omciErr.GetError()
2950}
2951
2952// SendSetVoipMediaProfile nolint: unused
2953func (oo *OmciCC) SendSetVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2954 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2955 tid := oo.GetNextTid(highPrio)
2956 logger.Debugw(ctx, "send VoipMediaProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
2957 "SequNo": strconv.FormatInt(int64(tid), 16),
2958 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2959
2960 meInstance, omciErr := me.NewVoipMediaProfile(params[0])
2961 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002962 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2963 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002964 if err != nil {
2965 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for set", log.Fields{"Err": err,
2966 "device-id": oo.deviceID})
2967 return nil, err
2968 }
2969
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002970 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002971 if err != nil {
2972 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile set", log.Fields{"Err": err,
2973 "device-id": oo.deviceID})
2974 return nil, err
2975 }
2976
2977 omciRxCallbackPair := CallbackPair{CbKey: tid,
2978 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2979 }
2980 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2981 if err != nil {
2982 logger.Errorw(ctx, "Cannot send VoipMediaProfile set", log.Fields{"Err": err,
2983 "device-id": oo.deviceID})
2984 return nil, err
2985 }
2986 logger.Debug(ctx, "send VoipMediaProfile-set-msg done")
2987 return meInstance, nil
2988 }
2989 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance", log.Fields{"Err": omciErr.GetError(),
2990 "device-id": oo.deviceID})
2991 return nil, omciErr.GetError()
2992}
2993
2994// SendDeleteVoipMediaProfile nolint: unused
2995func (oo *OmciCC) SendDeleteVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2996 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
2997 tid := oo.GetNextTid(highPrio)
2998 logger.Debugw(ctx, "send VoipMediaProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2999 "SequNo": strconv.FormatInt(int64(tid), 16),
3000 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3001
3002 meParams := me.ParamData{EntityID: aInstID}
3003 meInstance, omciErr := me.NewVoipMediaProfile(meParams)
3004 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003005 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3006 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003007 if err != nil {
3008 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for delete", log.Fields{
3009 "Err": err, "device-id": oo.deviceID})
3010 return nil, err
3011 }
3012
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003013 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003014 if err != nil {
3015 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile delete", log.Fields{
3016 "Err": err, "device-id": oo.deviceID})
3017 return nil, err
3018 }
3019
3020 omciRxCallbackPair := CallbackPair{
3021 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 delete", log.Fields{
3027 "Err": err, "device-id": oo.deviceID})
3028 return nil, err
3029 }
3030 logger.Debug(ctx, "send VoipMediaProfile-Delete-msg done")
3031 return meInstance, nil
3032 }
3033 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance for delete", log.Fields{
3034 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3035 return nil, omciErr.GetError()
3036}
3037
3038// SendCreateVoiceServiceProfile nolint: unused
3039func (oo *OmciCC) SendCreateVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3040 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3041 tid := oo.GetNextTid(highPrio)
3042 logger.Debugw(ctx, "send VoiceServiceProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
3043 "SequNo": strconv.FormatInt(int64(tid), 16),
3044 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3045
3046 meInstance, omciErr := me.NewVoiceServiceProfile(params[0])
3047 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003048 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3049 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003050 if err != nil {
3051 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for create", log.Fields{"Err": err,
3052 "device-id": oo.deviceID})
3053 return nil, err
3054 }
3055
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003056 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003057 if err != nil {
3058 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile create", log.Fields{"Err": err,
3059 "device-id": oo.deviceID})
3060 return nil, err
3061 }
3062
3063 omciRxCallbackPair := CallbackPair{CbKey: tid,
3064 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3065 }
3066 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3067 if err != nil {
3068 logger.Errorw(ctx, "Cannot send VoiceServiceProfile create", log.Fields{"Err": err,
3069 "device-id": oo.deviceID})
3070 return nil, err
3071 }
3072 logger.Debug(ctx, "send VoiceServiceProfile-create-msg done")
3073 return meInstance, nil
3074 }
3075 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3076 "device-id": oo.deviceID})
3077 return nil, omciErr.GetError()
3078}
3079
3080// SendSetVoiceServiceProfile nolint: unused
3081func (oo *OmciCC) SendSetVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3082 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3083 tid := oo.GetNextTid(highPrio)
3084 logger.Debugw(ctx, "send VoiceServiceProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
3085 "SequNo": strconv.FormatInt(int64(tid), 16),
3086 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3087
3088 meInstance, omciErr := me.NewVoiceServiceProfile(params[0])
3089 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003090 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3091 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003092 if err != nil {
3093 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for set", log.Fields{"Err": err,
3094 "device-id": oo.deviceID})
3095 return nil, err
3096 }
3097
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003098 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003099 if err != nil {
3100 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile set", log.Fields{"Err": err,
3101 "device-id": oo.deviceID})
3102 return nil, err
3103 }
3104
3105 omciRxCallbackPair := CallbackPair{CbKey: tid,
3106 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3107 }
3108 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3109 if err != nil {
3110 logger.Errorw(ctx, "Cannot send VoiceServiceProfile set", log.Fields{"Err": err,
3111 "device-id": oo.deviceID})
3112 return nil, err
3113 }
3114 logger.Debug(ctx, "send VoiceServiceProfile-set-msg done")
3115 return meInstance, nil
3116 }
3117 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3118 "device-id": oo.deviceID})
3119 return nil, omciErr.GetError()
3120}
3121
3122// SendDeleteVoiceServiceProfile nolint: unused
3123func (oo *OmciCC) SendDeleteVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3124 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3125 tid := oo.GetNextTid(highPrio)
3126 logger.Debugw(ctx, "send VoiceServiceProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3127 "SequNo": strconv.FormatInt(int64(tid), 16),
3128 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3129
3130 meParams := me.ParamData{EntityID: aInstID}
3131 meInstance, omciErr := me.NewVoiceServiceProfile(meParams)
3132 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003133 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3134 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003135 if err != nil {
3136 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for delete", log.Fields{
3137 "Err": err, "device-id": oo.deviceID})
3138 return nil, err
3139 }
3140
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003141 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003142 if err != nil {
3143 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile delete", log.Fields{
3144 "Err": err, "device-id": oo.deviceID})
3145 return nil, err
3146 }
3147
3148 omciRxCallbackPair := CallbackPair{
3149 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 delete", log.Fields{
3155 "Err": err, "device-id": oo.deviceID})
3156 return nil, err
3157 }
3158 logger.Debug(ctx, "send VoiceServiceProfile-Delete-msg done")
3159 return meInstance, nil
3160 }
3161 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance for delete", log.Fields{
3162 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3163 return nil, omciErr.GetError()
3164}
3165
3166// SendCreateSIPUserData nolint: unused
3167func (oo *OmciCC) SendCreateSIPUserData(ctx context.Context, timeout int, highPrio bool,
3168 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3169 tid := oo.GetNextTid(highPrio)
3170 logger.Debugw(ctx, "send SIPUserData-create-msg:", log.Fields{"device-id": oo.deviceID,
3171 "SequNo": strconv.FormatInt(int64(tid), 16),
3172 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3173
3174 meInstance, omciErr := me.NewSipUserData(params[0])
3175 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003176 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3177 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003178 if err != nil {
3179 logger.Errorw(ctx, "Cannot encode SIPUserData for create", log.Fields{"Err": err,
3180 "device-id": oo.deviceID})
3181 return nil, err
3182 }
3183
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003184 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003185 if err != nil {
3186 logger.Errorw(ctx, "Cannot serialize SIPUserData create", log.Fields{"Err": err,
3187 "device-id": oo.deviceID})
3188 return nil, err
3189 }
3190
3191 omciRxCallbackPair := CallbackPair{CbKey: tid,
3192 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3193 }
3194 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3195 if err != nil {
3196 logger.Errorw(ctx, "Cannot send SIPUserData create", log.Fields{"Err": err,
3197 "device-id": oo.deviceID})
3198 return nil, err
3199 }
3200 logger.Debug(ctx, "send SIPUserData-create-msg done")
3201 return meInstance, nil
3202 }
3203 logger.Errorw(ctx, "Cannot generate SIPUserData Instance", log.Fields{"Err": omciErr.GetError(),
3204 "device-id": oo.deviceID})
3205 return nil, omciErr.GetError()
3206}
3207
3208// SendSetSIPUserData nolint: unused
3209func (oo *OmciCC) SendSetSIPUserData(ctx context.Context, timeout int, highPrio bool,
3210 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3211 tid := oo.GetNextTid(highPrio)
3212 logger.Debugw(ctx, "send SIPUserData-set-msg:", log.Fields{"device-id": oo.deviceID,
3213 "SequNo": strconv.FormatInt(int64(tid), 16),
3214 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3215
3216 meInstance, omciErr := me.NewSipUserData(params[0])
3217 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003218 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3219 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003220 if err != nil {
3221 logger.Errorw(ctx, "Cannot encode SIPUserData for set", log.Fields{"Err": err,
3222 "device-id": oo.deviceID})
3223 return nil, err
3224 }
3225
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003226 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003227 if err != nil {
3228 logger.Errorw(ctx, "Cannot serialize SIPUserData set", log.Fields{"Err": err,
3229 "device-id": oo.deviceID})
3230 return nil, err
3231 }
3232
3233 omciRxCallbackPair := CallbackPair{CbKey: tid,
3234 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3235 }
3236 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3237 if err != nil {
3238 logger.Errorw(ctx, "Cannot send SIPUserData set", log.Fields{"Err": err,
3239 "device-id": oo.deviceID})
3240 return nil, err
3241 }
3242 logger.Debug(ctx, "send SIPUserData-set-msg done")
3243 return meInstance, nil
3244 }
3245 logger.Errorw(ctx, "Cannot generate SIPUserData Instance", log.Fields{"Err": omciErr.GetError(),
3246 "device-id": oo.deviceID})
3247 return nil, omciErr.GetError()
3248}
3249
3250// SendDeleteSIPUserData nolint: unused
3251func (oo *OmciCC) SendDeleteSIPUserData(ctx context.Context, timeout int, highPrio bool,
3252 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3253 tid := oo.GetNextTid(highPrio)
3254 logger.Debugw(ctx, "send SIPUserData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3255 "SequNo": strconv.FormatInt(int64(tid), 16),
3256 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3257
3258 meParams := me.ParamData{EntityID: aInstID}
3259 meInstance, omciErr := me.NewSipUserData(meParams)
3260 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003261 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3262 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003263 if err != nil {
3264 logger.Errorw(ctx, "Cannot encode SIPUserData for delete", log.Fields{
3265 "Err": err, "device-id": oo.deviceID})
3266 return nil, err
3267 }
3268
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003269 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003270 if err != nil {
3271 logger.Errorw(ctx, "Cannot serialize SIPUserData delete", log.Fields{
3272 "Err": err, "device-id": oo.deviceID})
3273 return nil, err
3274 }
3275
3276 omciRxCallbackPair := CallbackPair{
3277 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 delete", log.Fields{
3283 "Err": err, "device-id": oo.deviceID})
3284 return nil, err
3285 }
3286 logger.Debug(ctx, "send SIPUserData-Delete-msg done")
3287 return meInstance, nil
3288 }
3289 logger.Errorw(ctx, "Cannot generate SIPUserData Instance for delete", log.Fields{
3290 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3291 return nil, omciErr.GetError()
3292}
3293
3294// SendCreateVoipApplicationServiceProfile nolint: unused
3295func (oo *OmciCC) SendCreateVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3296 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3297 tid := oo.GetNextTid(highPrio)
3298 logger.Debugw(ctx, "send VoipApplicationServiceProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
3299 "SequNo": strconv.FormatInt(int64(tid), 16),
3300 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3301
3302 meInstance, omciErr := me.NewVoipApplicationServiceProfile(params[0])
3303 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003304 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3305 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003306 if err != nil {
3307 logger.Errorw(ctx, "Cannot encode VoipApplicationServiceProfile for create", log.Fields{"Err": err,
3308 "device-id": oo.deviceID})
3309 return nil, err
3310 }
3311
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003312 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003313 if err != nil {
3314 logger.Errorw(ctx, "Cannot serialize VoipApplicationServiceProfile create", log.Fields{"Err": err,
3315 "device-id": oo.deviceID})
3316 return nil, err
3317 }
3318
3319 omciRxCallbackPair := CallbackPair{CbKey: tid,
3320 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3321 }
3322 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3323 if err != nil {
3324 logger.Errorw(ctx, "Cannot send VoipApplicationServiceProfile create", log.Fields{"Err": err,
3325 "device-id": oo.deviceID})
3326 return nil, err
3327 }
3328 logger.Debug(ctx, "send VoipApplicationServiceProfile-create-msg done")
3329 return meInstance, nil
3330 }
3331 logger.Errorw(ctx, "Cannot generate VoipApplicationServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3332 "device-id": oo.deviceID})
3333 return nil, omciErr.GetError()
3334}
3335
3336// SendSetVoipApplicationServiceProfile nolint: unused
3337func (oo *OmciCC) SendSetVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3338 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3339 tid := oo.GetNextTid(highPrio)
3340 logger.Debugw(ctx, "send VoipApplicationServiceProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
3341 "SequNo": strconv.FormatInt(int64(tid), 16),
3342 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3343
3344 meInstance, omciErr := me.NewVoipApplicationServiceProfile(params[0])
3345 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003346 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3347 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003348 if err != nil {
3349 logger.Errorw(ctx, "Cannot encode VoipApplicationServiceProfile for set", log.Fields{"Err": err,
3350 "device-id": oo.deviceID})
3351 return nil, err
3352 }
3353
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003354 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003355 if err != nil {
3356 logger.Errorw(ctx, "Cannot serialize VoipApplicationServiceProfile set", log.Fields{"Err": err,
3357 "device-id": oo.deviceID})
3358 return nil, err
3359 }
3360
3361 omciRxCallbackPair := CallbackPair{CbKey: tid,
3362 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3363 }
3364 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3365 if err != nil {
3366 logger.Errorw(ctx, "Cannot send VoipApplicationServiceProfile set", log.Fields{"Err": err,
3367 "device-id": oo.deviceID})
3368 return nil, err
3369 }
3370 logger.Debug(ctx, "send VoipApplicationServiceProfile-set-msg done")
3371 return meInstance, nil
3372 }
3373 logger.Errorw(ctx, "Cannot generate VoipApplicationServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3374 "device-id": oo.deviceID})
3375 return nil, omciErr.GetError()
3376}
3377
3378// SendDeleteVoipApplicationServiceProfile nolint: unused
3379func (oo *OmciCC) SendDeleteVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3380 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3381 tid := oo.GetNextTid(highPrio)
3382 logger.Debugw(ctx, "send SIPVoipApplicationServiceProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3383 "SequNo": strconv.FormatInt(int64(tid), 16),
3384 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3385
3386 meParams := me.ParamData{EntityID: aInstID}
3387 meInstance, omciErr := me.NewVoipApplicationServiceProfile(meParams)
3388 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003389 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3390 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003391 if err != nil {
3392 logger.Errorw(ctx, "Cannot encode SIPVoipApplicationServiceProfile for delete", log.Fields{
3393 "Err": err, "device-id": oo.deviceID})
3394 return nil, err
3395 }
3396
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003397 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003398 if err != nil {
3399 logger.Errorw(ctx, "Cannot serialize SIPVoipApplicationServiceProfile delete", log.Fields{
3400 "Err": err, "device-id": oo.deviceID})
3401 return nil, err
3402 }
3403
3404 omciRxCallbackPair := CallbackPair{
3405 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 SIPVoipApplicationServiceProfile delete", log.Fields{
3411 "Err": err, "device-id": oo.deviceID})
3412 return nil, err
3413 }
3414 logger.Debug(ctx, "send SIPVoipApplicationServiceProfile-Delete-msg done")
3415 return meInstance, nil
3416 }
3417 logger.Errorw(ctx, "Cannot generate SIPVoipApplicationServiceProfile Instance for delete", log.Fields{
3418 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3419 return nil, omciErr.GetError()
3420}
3421
3422// SendCreateSIPAgentConfigData nolint: unused
3423func (oo *OmciCC) SendCreateSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3424 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3425 tid := oo.GetNextTid(highPrio)
3426 logger.Debugw(ctx, "send SIPAgentConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3427 "SequNo": strconv.FormatInt(int64(tid), 16),
3428 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3429
3430 meInstance, omciErr := me.NewSipAgentConfigData(params[0])
3431 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003432 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3433 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003434 if err != nil {
3435 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for create", log.Fields{"Err": err,
3436 "device-id": oo.deviceID})
3437 return nil, err
3438 }
3439
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003440 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003441 if err != nil {
3442 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData create", log.Fields{"Err": err,
3443 "device-id": oo.deviceID})
3444 return nil, err
3445 }
3446
3447 omciRxCallbackPair := CallbackPair{CbKey: tid,
3448 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3449 }
3450 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3451 if err != nil {
3452 logger.Errorw(ctx, "Cannot send SIPAgentConfigData create", log.Fields{"Err": err,
3453 "device-id": oo.deviceID})
3454 return nil, err
3455 }
3456 logger.Debug(ctx, "send SIPAgentConfigData-create-msg done")
3457 return meInstance, nil
3458 }
3459 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3460 "device-id": oo.deviceID})
3461 return nil, omciErr.GetError()
3462}
3463
3464// SendSetSIPAgentConfigData nolint: unused
3465func (oo *OmciCC) SendSetSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3466 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3467 tid := oo.GetNextTid(highPrio)
3468 logger.Debugw(ctx, "send SIPAgentConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3469 "SequNo": strconv.FormatInt(int64(tid), 16),
3470 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3471
3472 meInstance, omciErr := me.NewSipAgentConfigData(params[0])
3473 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003474 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3475 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003476 if err != nil {
3477 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for set", log.Fields{"Err": err,
3478 "device-id": oo.deviceID})
3479 return nil, err
3480 }
3481
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003482 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003483 if err != nil {
3484 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData set", log.Fields{"Err": err,
3485 "device-id": oo.deviceID})
3486 return nil, err
3487 }
3488
3489 omciRxCallbackPair := CallbackPair{CbKey: tid,
3490 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3491 }
3492 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3493 if err != nil {
3494 logger.Errorw(ctx, "Cannot send SIPAgentConfigData set", log.Fields{"Err": err,
3495 "device-id": oo.deviceID})
3496 return nil, err
3497 }
3498 logger.Debug(ctx, "send SIPAgentConfigData-set-msg done")
3499 return meInstance, nil
3500 }
3501 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3502 "device-id": oo.deviceID})
3503 return nil, omciErr.GetError()
3504}
3505
3506// SendDeleteSIPAgentConfigData nolint: unused
3507func (oo *OmciCC) SendDeleteSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3508 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3509 tid := oo.GetNextTid(highPrio)
3510 logger.Debugw(ctx, "send SIPAgentConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3511 "SequNo": strconv.FormatInt(int64(tid), 16),
3512 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3513
3514 meParams := me.ParamData{EntityID: aInstID}
3515 meInstance, omciErr := me.NewSipAgentConfigData(meParams)
3516 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003517 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3518 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003519 if err != nil {
3520 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for delete", log.Fields{
3521 "Err": err, "device-id": oo.deviceID})
3522 return nil, err
3523 }
3524
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003525 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003526 if err != nil {
3527 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData delete", log.Fields{
3528 "Err": err, "device-id": oo.deviceID})
3529 return nil, err
3530 }
3531
3532 omciRxCallbackPair := CallbackPair{
3533 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 delete", log.Fields{
3539 "Err": err, "device-id": oo.deviceID})
3540 return nil, err
3541 }
3542 logger.Debug(ctx, "send SIPAgentConfigData-Delete-msg done")
3543 return meInstance, nil
3544 }
3545 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance for delete", log.Fields{
3546 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3547 return nil, omciErr.GetError()
3548}
3549
3550// SendCreateTCPUDPConfigData nolint: unused
3551func (oo *OmciCC) SendCreateTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3552 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3553 tid := oo.GetNextTid(highPrio)
3554 logger.Debugw(ctx, "send TCPUDPConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3555 "SequNo": strconv.FormatInt(int64(tid), 16),
3556 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3557
3558 meInstance, omciErr := me.NewTcpUdpConfigData(params[0])
3559 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003560 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3561 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003562 if err != nil {
3563 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for create", log.Fields{"Err": err,
3564 "device-id": oo.deviceID})
3565 return nil, err
3566 }
3567
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003568 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003569 if err != nil {
3570 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData create", log.Fields{"Err": err,
3571 "device-id": oo.deviceID})
3572 return nil, err
3573 }
3574
3575 omciRxCallbackPair := CallbackPair{CbKey: tid,
3576 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3577 }
3578 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3579 if err != nil {
3580 logger.Errorw(ctx, "Cannot send TCPUDPConfigData create", log.Fields{"Err": err,
3581 "device-id": oo.deviceID})
3582 return nil, err
3583 }
3584 logger.Debug(ctx, "send TCPUDPConfigData-create-msg done")
3585 return meInstance, nil
3586 }
3587 logger.Errorw(ctx, "Cannot generate TCPUDPConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3588 "device-id": oo.deviceID})
3589 return nil, omciErr.GetError()
3590}
3591
3592// SendSetTCPUDPConfigData nolint: unused
3593func (oo *OmciCC) SendSetTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3594 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3595 tid := oo.GetNextTid(highPrio)
3596 logger.Debugw(ctx, "send TCPUDPConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3597 "SequNo": strconv.FormatInt(int64(tid), 16),
3598 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3599
3600 meInstance, omciErr := me.NewTcpUdpConfigData(params[0])
3601 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003602 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3603 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003604 if err != nil {
3605 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for set", log.Fields{"Err": err,
3606 "device-id": oo.deviceID})
3607 return nil, err
3608 }
3609
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003610 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003611 if err != nil {
3612 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData set", log.Fields{"Err": err,
3613 "device-id": oo.deviceID})
3614 return nil, err
3615 }
3616
3617 omciRxCallbackPair := CallbackPair{CbKey: tid,
3618 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3619 }
3620 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3621 if err != nil {
3622 logger.Errorw(ctx, "Cannot send TCPUDPConfigData set", log.Fields{"Err": err,
3623 "device-id": oo.deviceID})
3624 return nil, err
3625 }
3626 logger.Debug(ctx, "send TCPUDPConfigData-set-msg done")
3627 return meInstance, nil
3628 }
3629 logger.Errorw(ctx, "Cannot generate TCPUDPConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3630 "device-id": oo.deviceID})
3631 return nil, omciErr.GetError()
3632}
3633
3634// SendDeleteTCPUDPConfigData nolint: unused
3635func (oo *OmciCC) SendDeleteTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3636 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3637 tid := oo.GetNextTid(highPrio)
3638 logger.Debugw(ctx, "send TCPUDPConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3639 "SequNo": strconv.FormatInt(int64(tid), 16),
3640 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3641
3642 meParams := me.ParamData{EntityID: aInstID}
3643 meInstance, omciErr := me.NewTcpUdpConfigData(meParams)
3644 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003645 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3646 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003647 if err != nil {
3648 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for delete", log.Fields{
3649 "Err": err, "device-id": oo.deviceID})
3650 return nil, err
3651 }
3652
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003653 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003654 if err != nil {
3655 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData delete", log.Fields{
3656 "Err": err, "device-id": oo.deviceID})
3657 return nil, err
3658 }
3659
3660 omciRxCallbackPair := CallbackPair{
3661 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 delete", log.Fields{
3667 "Err": err, "device-id": oo.deviceID})
3668 return nil, err
3669 }
3670 logger.Debug(ctx, "send TCPUDPConfigData-Delete-msg done")
3671 return meInstance, nil
3672 }
3673 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance for delete", log.Fields{
3674 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3675 return nil, omciErr.GetError()
3676}
3677
3678// SendCreateIPHostConfigData nolint: unused
3679func (oo *OmciCC) SendCreateIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3680 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3681 tid := oo.GetNextTid(highPrio)
3682 logger.Debugw(ctx, "send IPHostConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3683 "SequNo": strconv.FormatInt(int64(tid), 16),
3684 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3685
3686 meInstance, omciErr := me.NewIpHostConfigData(params[0])
3687 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003688 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3689 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003690 if err != nil {
3691 logger.Errorw(ctx, "Cannot encode IPHostConfigData for create", log.Fields{"Err": err,
3692 "device-id": oo.deviceID})
3693 return nil, err
3694 }
3695
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003696 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003697 if err != nil {
3698 logger.Errorw(ctx, "Cannot serialize IPHostConfigData create", log.Fields{"Err": err,
3699 "device-id": oo.deviceID})
3700 return nil, err
3701 }
3702
3703 omciRxCallbackPair := CallbackPair{CbKey: tid,
3704 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3705 }
3706 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3707 if err != nil {
3708 logger.Errorw(ctx, "Cannot send IPHostConfigData create", log.Fields{"Err": err,
3709 "device-id": oo.deviceID})
3710 return nil, err
3711 }
3712 logger.Debug(ctx, "send IPHostConfigData-create-msg done")
3713 return meInstance, nil
3714 }
3715 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3716 "device-id": oo.deviceID})
3717 return nil, omciErr.GetError()
3718}
3719
3720// SendSetIPHostConfigData nolint: unused
3721func (oo *OmciCC) SendSetIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3722 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3723 tid := oo.GetNextTid(highPrio)
3724 logger.Debugw(ctx, "send IPHostConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3725 "SequNo": strconv.FormatInt(int64(tid), 16),
3726 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3727
3728 meInstance, omciErr := me.NewIpHostConfigData(params[0])
3729 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003730 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3731 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003732 if err != nil {
3733 logger.Errorw(ctx, "Cannot encode IPHostConfigData for set", log.Fields{"Err": err,
3734 "device-id": oo.deviceID})
3735 return nil, err
3736 }
3737
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003738 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003739 if err != nil {
3740 logger.Errorw(ctx, "Cannot serialize IPHostConfigData set", log.Fields{"Err": err,
3741 "device-id": oo.deviceID})
3742 return nil, err
3743 }
3744
3745 omciRxCallbackPair := CallbackPair{CbKey: tid,
3746 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3747 }
3748 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3749 if err != nil {
3750 logger.Errorw(ctx, "Cannot send IPHostConfigData set", log.Fields{"Err": err,
3751 "device-id": oo.deviceID})
3752 return nil, err
3753 }
3754 logger.Debug(ctx, "send IPHostConfigData-set-msg done")
3755 return meInstance, nil
3756 }
3757 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3758 "device-id": oo.deviceID})
3759 return nil, omciErr.GetError()
3760}
3761
3762// SendDeleteIPHostConfigData nolint: unused
3763func (oo *OmciCC) SendDeleteIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3764 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3765 tid := oo.GetNextTid(highPrio)
3766 logger.Debugw(ctx, "send IPHostConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3767 "SequNo": strconv.FormatInt(int64(tid), 16),
3768 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3769
3770 meParams := me.ParamData{EntityID: aInstID}
3771 meInstance, omciErr := me.NewIpHostConfigData(meParams)
3772 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003773 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3774 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003775 if err != nil {
3776 logger.Errorw(ctx, "Cannot encode IPHostConfigData for delete", log.Fields{
3777 "Err": err, "device-id": oo.deviceID})
3778 return nil, err
3779 }
3780
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003781 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003782 if err != nil {
3783 logger.Errorw(ctx, "Cannot serialize IPHostConfigData delete", log.Fields{
3784 "Err": err, "device-id": oo.deviceID})
3785 return nil, err
3786 }
3787
3788 omciRxCallbackPair := CallbackPair{
3789 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 delete", log.Fields{
3795 "Err": err, "device-id": oo.deviceID})
3796 return nil, err
3797 }
3798 logger.Debug(ctx, "send IPHostConfigData-Delete-msg done")
3799 return meInstance, nil
3800 }
3801 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance for delete", log.Fields{
3802 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3803 return nil, omciErr.GetError()
3804}
3805
3806// SendCreateRTPProfileData nolint: unused
3807func (oo *OmciCC) SendCreateRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3808 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3809 tid := oo.GetNextTid(highPrio)
3810 logger.Debugw(ctx, "send RTPProfileData-create-msg:", log.Fields{"device-id": oo.deviceID,
3811 "SequNo": strconv.FormatInt(int64(tid), 16),
3812 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3813
3814 meInstance, omciErr := me.NewRtpProfileData(params[0])
3815 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003816 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3817 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003818 if err != nil {
3819 logger.Errorw(ctx, "Cannot encode RTPProfileData for create", log.Fields{"Err": err,
3820 "device-id": oo.deviceID})
3821 return nil, err
3822 }
3823
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003824 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003825 if err != nil {
3826 logger.Errorw(ctx, "Cannot serialize RTPProfileData create", log.Fields{"Err": err,
3827 "device-id": oo.deviceID})
3828 return nil, err
3829 }
3830
3831 omciRxCallbackPair := CallbackPair{CbKey: tid,
3832 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3833 }
3834 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3835 if err != nil {
3836 logger.Errorw(ctx, "Cannot send RTPProfileData create", log.Fields{"Err": err,
3837 "device-id": oo.deviceID})
3838 return nil, err
3839 }
3840 logger.Debug(ctx, "send RTPProfileData-create-msg done")
3841 return meInstance, nil
3842 }
3843 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance", log.Fields{"Err": omciErr.GetError(),
3844 "device-id": oo.deviceID})
3845 return nil, omciErr.GetError()
3846}
3847
3848// SendSetRTPProfileData nolint: unused
3849func (oo *OmciCC) SendSetRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3850 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3851 tid := oo.GetNextTid(highPrio)
3852 logger.Debugw(ctx, "send RTPProfileData-set-msg:", log.Fields{"device-id": oo.deviceID,
3853 "SequNo": strconv.FormatInt(int64(tid), 16),
3854 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3855
3856 meInstance, omciErr := me.NewRtpProfileData(params[0])
3857 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003858 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3859 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003860 if err != nil {
3861 logger.Errorw(ctx, "Cannot encode RTPProfileData for set", log.Fields{"Err": err,
3862 "device-id": oo.deviceID})
3863 return nil, err
3864 }
3865
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003866 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003867 if err != nil {
3868 logger.Errorw(ctx, "Cannot serialize RTPProfileData set", log.Fields{"Err": err,
3869 "device-id": oo.deviceID})
3870 return nil, err
3871 }
3872
3873 omciRxCallbackPair := CallbackPair{CbKey: tid,
3874 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3875 }
3876 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3877 if err != nil {
3878 logger.Errorw(ctx, "Cannot send RTPProfileData set", log.Fields{"Err": err,
3879 "device-id": oo.deviceID})
3880 return nil, err
3881 }
3882 logger.Debug(ctx, "send RTPProfileData-set-msg done")
3883 return meInstance, nil
3884 }
3885 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance", log.Fields{"Err": omciErr.GetError(),
3886 "device-id": oo.deviceID})
3887 return nil, omciErr.GetError()
3888}
3889
3890// SendDeleteRTPProfileData nolint: unused
3891func (oo *OmciCC) SendDeleteRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3892 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3893 tid := oo.GetNextTid(highPrio)
3894 logger.Debugw(ctx, "send RTPProfileData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3895 "SequNo": strconv.FormatInt(int64(tid), 16),
3896 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3897
3898 meParams := me.ParamData{EntityID: aInstID}
3899 meInstance, omciErr := me.NewRtpProfileData(meParams)
3900 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003901 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3902 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003903 if err != nil {
3904 logger.Errorw(ctx, "Cannot encode RTPProfileData for delete", log.Fields{
3905 "Err": err, "device-id": oo.deviceID})
3906 return nil, err
3907 }
3908
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003909 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003910 if err != nil {
3911 logger.Errorw(ctx, "Cannot serialize RTPProfileData delete", log.Fields{
3912 "Err": err, "device-id": oo.deviceID})
3913 return nil, err
3914 }
3915
3916 omciRxCallbackPair := CallbackPair{
3917 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 delete", log.Fields{
3923 "Err": err, "device-id": oo.deviceID})
3924 return nil, err
3925 }
3926 logger.Debug(ctx, "send RTPProfileData-Delete-msg done")
3927 return meInstance, nil
3928 }
3929 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance for delete", log.Fields{
3930 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3931 return nil, omciErr.GetError()
3932}
3933
3934// SendCreateNetworkDialPlanTable nolint: unused
3935func (oo *OmciCC) SendCreateNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
3936 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3937 tid := oo.GetNextTid(highPrio)
3938 logger.Debugw(ctx, "send NetworkDialPlanTable-create-msg:", log.Fields{"device-id": oo.deviceID,
3939 "SequNo": strconv.FormatInt(int64(tid), 16),
3940 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3941
3942 meInstance, omciErr := me.NewNetworkDialPlanTable(params[0])
3943 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003944 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3945 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003946 if err != nil {
3947 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for create", log.Fields{"Err": err,
3948 "device-id": oo.deviceID})
3949 return nil, err
3950 }
3951
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003952 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003953 if err != nil {
3954 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable create", log.Fields{"Err": err,
3955 "device-id": oo.deviceID})
3956 return nil, err
3957 }
3958
3959 omciRxCallbackPair := CallbackPair{CbKey: tid,
3960 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3961 }
3962 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3963 if err != nil {
3964 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable create", log.Fields{"Err": err,
3965 "device-id": oo.deviceID})
3966 return nil, err
3967 }
3968 logger.Debug(ctx, "send NetworkDialPlanTable-create-msg done")
3969 return meInstance, nil
3970 }
3971 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance", log.Fields{"Err": omciErr.GetError(),
3972 "device-id": oo.deviceID})
3973 return nil, omciErr.GetError()
3974}
3975
3976// SendSetNetworkDialPlanTable nolint: unused
3977func (oo *OmciCC) SendSetNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
3978 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3979 tid := oo.GetNextTid(highPrio)
3980 logger.Debugw(ctx, "send NetworkDialPlanTable-set-msg:", log.Fields{"device-id": oo.deviceID,
3981 "SequNo": strconv.FormatInt(int64(tid), 16),
3982 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3983
3984 meInstance, omciErr := me.NewNetworkDialPlanTable(params[0])
3985 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003986 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3987 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003988 if err != nil {
3989 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for set", log.Fields{"Err": err,
3990 "device-id": oo.deviceID})
3991 return nil, err
3992 }
3993
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003994 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003995 if err != nil {
3996 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable set", log.Fields{"Err": err,
3997 "device-id": oo.deviceID})
3998 return nil, err
3999 }
4000
4001 omciRxCallbackPair := CallbackPair{CbKey: tid,
4002 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4003 }
4004 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
4005 if err != nil {
4006 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable set", log.Fields{"Err": err,
4007 "device-id": oo.deviceID})
4008 return nil, err
4009 }
4010 logger.Debug(ctx, "send NetworkDialPlanTable-set-msg done")
4011 return meInstance, nil
4012 }
4013 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance", log.Fields{"Err": omciErr.GetError(),
4014 "device-id": oo.deviceID})
4015 return nil, omciErr.GetError()
4016}
4017
4018// SendDeleteNetworkDialPlanTable nolint: unused
4019func (oo *OmciCC) SendDeleteNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
4020 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
4021 tid := oo.GetNextTid(highPrio)
4022 logger.Debugw(ctx, "send NetworkDialPlanTable-Delete-msg:", log.Fields{"device-id": oo.deviceID,
4023 "SequNo": strconv.FormatInt(int64(tid), 16),
4024 "InstId": strconv.FormatInt(int64(aInstID), 16)})
4025
4026 meParams := me.ParamData{EntityID: aInstID}
4027 meInstance, omciErr := me.NewNetworkDialPlanTable(meParams)
4028 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00004029 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
4030 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004031 if err != nil {
4032 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for delete", log.Fields{
4033 "Err": err, "device-id": oo.deviceID})
4034 return nil, err
4035 }
4036
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004037 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004038 if err != nil {
4039 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable delete", log.Fields{
4040 "Err": err, "device-id": oo.deviceID})
4041 return nil, err
4042 }
4043
4044 omciRxCallbackPair := CallbackPair{
4045 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 delete", log.Fields{
4051 "Err": err, "device-id": oo.deviceID})
4052 return nil, err
4053 }
4054 logger.Debug(ctx, "send NetworkDialPlanTable-Delete-msg done")
4055 return meInstance, nil
4056 }
4057 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance for delete", log.Fields{
4058 "Err": omciErr.GetError(), "device-id": oo.deviceID})
4059 return nil, omciErr.GetError()
4060}
4061
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004062// SendSyncTime sends SynchronizeTimeRequest
4063func (oo *OmciCC) SendSyncTime(ctx context.Context, timeout int, highPrio bool, rxChan chan Message) error {
4064 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004065 logger.Debugw(ctx, "send synchronize time request:", log.Fields{"device-id": oo.deviceID,
4066 "SequNo": strconv.FormatInt(int64(tid), 16)})
4067
4068 omciLayer := &omci.OMCI{
4069 TransactionID: tid,
4070 MessageType: omci.SynchronizeTimeRequestType,
4071 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4072 // Length: 0x28, // Optional, defaults to 40 octets
4073 }
4074 utcTime := time.Now().UTC()
4075 request := &omci.SynchronizeTimeRequest{
4076 MeBasePacket: omci.MeBasePacket{
4077 EntityClass: me.OnuGClassID,
4078 // Default Instance ID is 0
4079 },
4080 Year: uint16(utcTime.Year()),
4081 Month: uint8(utcTime.Month()),
4082 Day: uint8(utcTime.Day()),
4083 Hour: uint8(utcTime.Hour()),
4084 Minute: uint8(utcTime.Minute()),
4085 Second: uint8(utcTime.Second()),
4086 }
4087
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004088 pkt, err := SerializeOmciLayer(ctx, omciLayer, request)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004089 if err != nil {
4090 logger.Errorw(ctx, "Cannot serialize synchronize time request", log.Fields{"Err": err,
4091 "device-id": oo.deviceID})
4092 return err
4093 }
4094
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004095 omciRxCallbackPair := CallbackPair{CbKey: tid,
4096 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004097 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004098 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004099 if err != nil {
4100 logger.Errorw(ctx, "Cannot send synchronize time request", log.Fields{"Err": err,
4101 "device-id": oo.deviceID})
4102 return err
4103 }
4104 logger.Debug(ctx, "send synchronize time request done")
4105 return nil
4106}
4107
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004108// SendCreateOrDeleteEthernetPerformanceMonitoringHistoryME creates or deletes EthernetFramePerformanceMonitoringHistoryData ME instance
4109func (oo *OmciCC) SendCreateOrDeleteEthernetPerformanceMonitoringHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004110 upstream bool, create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004111 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004112 logger.Debugw(ctx, "send ethernet-performance-monitoring-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4113 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
4114 meParam := me.ParamData{EntityID: entityID}
4115 var meInstance *me.ManagedEntity
4116 var omciErr me.OmciErrors
4117 if upstream {
4118 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataUpstream(meParam)
4119 } else {
4120 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataDownstream(meParam)
4121 }
4122 if omciErr.GetError() == nil {
4123 var omciLayer *omci.OMCI
4124 var msgLayer gopacket.SerializableLayer
4125 var err error
4126 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004127 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4128 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004129 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004130 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4131 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004132 }
4133 if err != nil {
4134 logger.Errorw(ctx, "Cannot encode ethernet frame performance monitoring history data ME",
4135 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004136 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004137 }
4138
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004139 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004140 if err != nil {
4141 logger.Errorw(ctx, "Cannot serialize ethernet frame performance monitoring history data ME",
4142 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004143 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004144 }
4145
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004146 omciRxCallbackPair := CallbackPair{CbKey: tid,
4147 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004148 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004149 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004150 if err != nil {
4151 logger.Errorw(ctx, "Cannot send ethernet frame performance monitoring history data ME",
4152 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004153 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004154 }
4155 logger.Debugw(ctx, "send ethernet frame performance monitoring history data ME done",
4156 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004157 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08004158 }
4159 logger.Errorw(ctx, "Cannot generate ethernet frame performance monitoring history data ME Instance",
4160 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 +03004161 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08004162}
4163
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004164// SendCreateOrDeleteEthernetUniHistoryME creates or deletes EthernetPerformanceMonitoringHistoryData ME instance
4165func (oo *OmciCC) SendCreateOrDeleteEthernetUniHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004166 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004167 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004168 logger.Debugw(ctx, "send ethernet-uni-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4169 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4170 meParam := me.ParamData{EntityID: entityID}
4171 var meInstance *me.ManagedEntity
4172 var omciErr me.OmciErrors
4173 meInstance, omciErr = me.NewEthernetPerformanceMonitoringHistoryData(meParam)
4174
4175 if omciErr.GetError() == nil {
4176 var omciLayer *omci.OMCI
4177 var msgLayer gopacket.SerializableLayer
4178 var err error
4179 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004180 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4181 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004182 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004183 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4184 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004185 }
4186 if err != nil {
4187 logger.Errorw(ctx, "Cannot encode ethernet uni history data ME",
4188 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004189 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004190 }
4191
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004192 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004193 if err != nil {
4194 logger.Errorw(ctx, "Cannot serialize ethernet uni history data ME",
4195 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004196 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004197 }
4198
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004199 omciRxCallbackPair := CallbackPair{CbKey: tid,
4200 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004201 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004202 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004203 if err != nil {
4204 logger.Errorw(ctx, "Cannot send ethernet uni history data ME",
4205 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004206 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004207 }
4208 logger.Debugw(ctx, "send ethernet uni history data ME done",
4209 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004210 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08004211 }
4212 logger.Errorw(ctx, "Cannot generate ethernet uni history data ME Instance",
4213 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004214 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08004215}
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004216
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004217// SendCreateOrDeleteFecHistoryME creates or deletes FecPerformanceMonitoringHistoryData ME instance
4218func (oo *OmciCC) SendCreateOrDeleteFecHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004219 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004220 tid := oo.GetNextTid(highPrio)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004221 logger.Debugw(ctx, "send fec-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4222 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4223 meParam := me.ParamData{EntityID: entityID}
4224 var meInstance *me.ManagedEntity
4225 var omciErr me.OmciErrors
4226 meInstance, omciErr = me.NewFecPerformanceMonitoringHistoryData(meParam)
4227
4228 if omciErr.GetError() == nil {
4229 var omciLayer *omci.OMCI
4230 var msgLayer gopacket.SerializableLayer
4231 var err error
4232 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004233 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4234 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004235 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004236 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4237 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004238 }
4239 if err != nil {
4240 logger.Errorw(ctx, "Cannot encode fec history data ME",
4241 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004242 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004243 }
4244
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004245 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004246 if err != nil {
4247 logger.Errorw(ctx, "Cannot serialize fec history data ME",
4248 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004249 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004250 }
4251
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004252 omciRxCallbackPair := CallbackPair{CbKey: tid,
4253 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004254 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004255 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004256 if err != nil {
4257 logger.Errorw(ctx, "Cannot send fec history data ME",
4258 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004259 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004260 }
4261 logger.Debugw(ctx, "send fec history data ME done",
4262 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004263 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004264 }
4265 logger.Errorw(ctx, "Cannot generate fec history data ME Instance",
4266 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004267 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004268}
4269
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004270// SendCreateOrDeleteGemPortHistoryME deletes GemPortNetworkCtpPerformanceMonitoringHistoryData ME instance
4271func (oo *OmciCC) SendCreateOrDeleteGemPortHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004272 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004273 tid := oo.GetNextTid(highPrio)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004274 logger.Debugw(ctx, "send gemport-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4275 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4276 meParam := me.ParamData{EntityID: entityID}
4277 var meInstance *me.ManagedEntity
4278 var omciErr me.OmciErrors
4279 meInstance, omciErr = me.NewGemPortNetworkCtpPerformanceMonitoringHistoryData(meParam)
4280
4281 if omciErr.GetError() == nil {
4282 var omciLayer *omci.OMCI
4283 var msgLayer gopacket.SerializableLayer
4284 var err error
4285 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004286 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4287 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004288 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004289 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4290 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004291 }
4292 if err != nil {
4293 logger.Errorw(ctx, "Cannot encode gemport history data ME",
4294 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004295 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004296 }
4297
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004298 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004299 if err != nil {
4300 logger.Errorw(ctx, "Cannot serialize gemport history data ME",
4301 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004302 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004303 }
4304
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004305 omciRxCallbackPair := CallbackPair{CbKey: tid,
4306 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004307 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004308 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004309 if err != nil {
4310 logger.Errorw(ctx, "Cannot send gemport history data ME",
4311 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004312 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004313 }
4314 logger.Debugw(ctx, "send gemport history data ME done",
4315 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004316 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004317 }
4318 logger.Errorw(ctx, "Cannot generate gemport history data ME Instance",
4319 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004320 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004321}
4322
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004323// SendStartSoftwareDownload sends StartSoftwareDownloadRequest
4324func (oo *OmciCC) SendStartSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004325 rxChan chan Message, aImageMeID uint16, aDownloadWindowSize uint8, aFileLen uint32, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004326 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004327 logger.Debugw(ctx, "send StartSwDlRequest:", log.Fields{"device-id": oo.deviceID,
4328 "SequNo": strconv.FormatInt(int64(tid), 16),
4329 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4330
4331 omciLayer := &omci.OMCI{
4332 TransactionID: tid,
4333 MessageType: omci.StartSoftwareDownloadRequestType,
4334 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4335 // Length: 0x28, // Optional, defaults to 40 octets
4336 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004337 if aIsExtendedOmci {
4338 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4339 }
mpagenko80622a52021-02-09 16:53:23 +00004340 request := &omci.StartSoftwareDownloadRequest{
4341 MeBasePacket: omci.MeBasePacket{
4342 EntityClass: me.SoftwareImageClassID,
4343 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004344 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004345 },
4346 WindowSize: aDownloadWindowSize,
4347 ImageSize: aFileLen,
4348 NumberOfCircuitPacks: 1, //parallel download to multiple circuit packs not supported
4349 CircuitPacks: []uint16{0}, //circuit pack indication don't care for NumberOfCircuitPacks=1, but needed by omci-lib
4350 }
4351
4352 var options gopacket.SerializeOptions
4353 options.FixLengths = true
4354 buffer := gopacket.NewSerializeBuffer()
4355 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4356 if err != nil {
4357 logger.Errorw(ctx, "Cannot serialize StartSwDlRequest", log.Fields{"Err": err,
4358 "device-id": oo.deviceID})
4359 return err
4360 }
4361 outgoingPacket := buffer.Bytes()
4362
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004363 omciRxCallbackPair := CallbackPair{CbKey: tid,
4364 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko80622a52021-02-09 16:53:23 +00004365 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004366 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004367 if err != nil {
4368 logger.Errorw(ctx, "Cannot send StartSwDlRequest", log.Fields{"Err": err,
4369 "device-id": oo.deviceID})
4370 return err
4371 }
4372 logger.Debug(ctx, "send StartSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004373 return nil
4374}
4375
kesavand011d5162021-11-25 19:21:06 +05304376// PrepareOnuSectionsOfWindow prepares a list of sections for each window
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304377// Before invoking this function the oo.mutexTid needs to be be locked so that
4378// GetOnuSwSecNextTid can be invoked without further locking
kesavand011d5162021-11-25 19:21:06 +05304379func (oo *OmciCC) PrepareOnuSectionsOfWindow(ctx context.Context,
4380 aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004381 omciMsgsPerWindow *ia.OmciMessages, aIsExtendedOmci bool) (OmciTransferStructure, error) {
kesavand011d5162021-11-25 19:21:06 +05304382 //onuswsections uses only low prioirity tids
4383 tid := oo.GetOnuSwSecNextTid()
4384 logger.Infow(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
4385 "SequNo": strconv.FormatInt(int64(tid), 16),
4386 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest, "sectionNo": aDownloadSectionNo, "sectionData": aSection})
4387
4388 var omciTxReq OmciTransferStructure
4389 msgType := omci.DownloadSectionRequestType
4390
4391 if aAckRequest > 0 {
4392 msgType = omci.DownloadSectionRequestWithResponseType
4393
4394 }
4395 omciLayer := &omci.OMCI{
4396 TransactionID: tid,
4397 MessageType: msgType,
4398 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4399 // Length: 0x28, // Optional, defaults to 40 octets
4400 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004401 if aIsExtendedOmci {
4402 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4403 }
kesavand011d5162021-11-25 19:21:06 +05304404 localSectionData := make([]byte, len(aSection))
4405
4406 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
4407 request := &omci.DownloadSectionRequest{
4408 MeBasePacket: omci.MeBasePacket{
4409 EntityClass: me.SoftwareImageClassID,
4410 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004411 Extended: aIsExtendedOmci,
kesavand011d5162021-11-25 19:21:06 +05304412 },
4413 SectionNumber: aDownloadSectionNo,
4414 SectionData: localSectionData,
4415 }
4416
4417 var options gopacket.SerializeOptions
4418 options.FixLengths = true
4419 buffer := gopacket.NewSerializeBuffer()
4420 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4421 if err != nil {
4422 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
4423 "device-id": oo.deviceID})
4424 return omciTxReq, err
4425 }
4426 outgoingPacket := buffer.Bytes()
4427
4428 omciMsgsPerWindow.Messages = append(omciMsgsPerWindow.Messages, outgoingPacket)
4429
4430 if aAckRequest > 0 {
4431 // only the last section should have a timeout as an ack is required only for the last section of the window
4432 omciTxReq = OmciTransferStructure{
4433 withFramePrint: true,
4434 OnuSwWindow: omciMsgsPerWindow,
4435 }
4436 return omciTxReq, nil
4437 }
4438
4439 return omciTxReq, nil
4440}
4441
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304442// SendOnuSwSectionsWindowWithRxSupervision sends onu swd sections
kesavand011d5162021-11-25 19:21:06 +05304443func (oo *OmciCC) SendOnuSwSectionsWindowWithRxSupervision(ctx context.Context,
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304444 aOmciTxRequest OmciTransferStructure, aTimeout int, rxChan chan Message) error {
kesavand011d5162021-11-25 19:21:06 +05304445 if aOmciTxRequest.OnuSwWindow == nil {
4446 logger.Errorw(ctx, "SendOnuSwSectionsWindowWithRxSupervision: omciTxRequest.OnuSwWindow is nil",
4447 log.Fields{"device-id": oo.deviceID})
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304448 return fmt.Errorf("sendOnuSwSectionsWindowWithRxSupervision: omciTxRequest.OnuSwWindow is nil device-id: %v",
4449 oo.deviceID)
kesavand011d5162021-11-25 19:21:06 +05304450 }
4451
4452 tid := oo.GetOnuSwSecLastTid()
4453 logger.Debugw(ctx, "SendOnuSwSectionsWindowWithRxSupervision tid for the last segment is ", log.Fields{"TID": tid})
4454 omciRxCallbackPair := CallbackPair{CbKey: tid,
4455 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4456 }
4457
4458 aOmciTxRequest.cbPair = omciRxCallbackPair
4459 logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TansCorrId": aOmciTxRequest.cbPair.CbKey})
4460 oo.mutexRxSchedMap.Lock()
4461 // it could be checked, if the callback key is already registered - but simply overwrite may be acceptable ...
4462 oo.rxSchedulerMap[aOmciTxRequest.cbPair.CbKey] = aOmciTxRequest.cbPair.CbEntry
4463 oo.mutexRxSchedMap.Unlock()
4464
4465 chSuccess := make(chan bool)
4466 aOmciTxRequest.chSuccess = chSuccess
4467 aOmciTxRequest.timeout = aTimeout
4468 aOmciTxRequest.retries = CDefaultRetries
4469
4470 //tid := aOmciTxRequest.cbPair.CbKey
4471 oo.mutexMonReq.Lock()
4472 oo.monitoredRequests[tid] = aOmciTxRequest
4473 oo.mutexMonReq.Unlock()
4474
4475 retries := aOmciTxRequest.retries
4476 retryCounter := 0
4477 if aTimeout == 0 {
4478 logger.Errorw(ctx, "no timeout present for last section of window", log.Fields{"device-id": oo.deviceID})
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304479 return fmt.Errorf("no timeout present for last section of window device-id: %v", oo.deviceID)
kesavand011d5162021-11-25 19:21:06 +05304480 }
4481loop:
4482 for retryCounter <= retries {
4483 // the onu sw sections are enqueued only to the low priority queue
4484 oo.mutexLowPrioTxQueue.Lock()
4485 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4486 oo.mutexLowPrioTxQueue.Unlock()
4487
pnalmasc6e916a2025-06-30 11:59:16 +05304488 //Register the call back again as we clean up the Map entry when we failed to send the message
4489 oo.mutexRxSchedMap.Lock()
4490 oo.rxSchedulerMap[aOmciTxRequest.cbPair.CbKey] = aOmciTxRequest.cbPair.CbEntry
4491 oo.mutexRxSchedMap.Unlock()
4492
kesavand011d5162021-11-25 19:21:06 +05304493 go oo.sendQueuedRequests(ctx)
4494
4495 select {
4496 case success := <-chSuccess:
4497 if success {
4498 logger.Debugw(ctx, "reqMon: response received in time",
4499 log.Fields{"tid": tid, "device-id": oo.deviceID})
4500 } else {
4501 logger.Debugw(ctx, "reqMon: wait for response aborted",
4502 log.Fields{"tid": tid, "device-id": oo.deviceID})
4503 }
4504 break loop
4505 case <-time.After(time.Duration(aTimeout) * time.Second):
4506 if retryCounter == retries {
Holger Hildebrandt2b107642022-12-09 07:56:23 +00004507 if oo.pBaseDeviceHandler.IsOltAvailable() {
4508 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - send ONU device event!",
4509 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4510 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationFailureSwUpgrade, OnuOmciCommunicationFailureSwUpgradeDesc)
4511 } else {
4512 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - skip ONU device event: OLT unavailable!",
4513 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4514 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004515 oo.incrementTxTimesouts()
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304516 oo.mutexMonReq.Lock()
4517 delete(oo.monitoredRequests, tid)
4518 oo.mutexMonReq.Unlock()
4519 return fmt.Errorf("reqMon: timeout waiting for response - no of max retries reached device-id: %v", oo.deviceID)
kesavand011d5162021-11-25 19:21:06 +05304520 }
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304521 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
4522 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4523 oo.incrementTxRetries()
4524 case _, ok := <-oo.pBaseDeviceHandler.GetDeviceDeleteCommChan(ctx):
4525 if !ok {
4526 logger.Warnw(ctx, "device deletion channel is closed", log.Fields{"device-id": oo.deviceID})
4527 oo.mutexMonReq.Lock()
4528 delete(oo.monitoredRequests, tid)
4529 oo.mutexMonReq.Unlock()
4530 return fmt.Errorf("device deletion channel is closed device-id: %v", oo.deviceID)
4531 }
4532 oo.mutexMonReq.Lock()
4533 delete(oo.monitoredRequests, tid)
4534 oo.mutexMonReq.Unlock()
4535 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 +05304536 }
4537 retryCounter++
4538 }
4539 oo.mutexMonReq.Lock()
4540 delete(oo.monitoredRequests, tid)
4541 oo.mutexMonReq.Unlock()
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304542 return nil
kesavand011d5162021-11-25 19:21:06 +05304543}
4544
4545func (oo *OmciCC) sendOnuSwSectionsOfWindow(ctx context.Context, omciTxRequest OmciTransferStructure) error {
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004546 var lastSection []byte
4547 if omciTxRequest.OnuSwWindow != nil {
4548 lastSection = omciTxRequest.OnuSwWindow.Messages[len(omciTxRequest.OnuSwWindow.Messages)-1]
4549 } else {
4550 logger.Errorw(ctx, "invalid sw window received", log.Fields{"device-id": oo.deviceID})
4551 return fmt.Errorf("invalid sw window received")
4552 }
4553 if omciTxRequest.withFramePrint {
4554 logger.Debugw(ctx, "sw-section-omci-message-to-send:", log.Fields{
kesavand011d5162021-11-25 19:21:06 +05304555 "TxOmciMessage": hex.EncodeToString(lastSection),
4556 "device-id": oo.deviceID,
4557 "toDeviceType": oo.pBaseDeviceHandler.GetProxyAddressType(),
4558 "proxyDeviceID": oo.pBaseDeviceHandler.GetProxyAddressID(),
4559 "proxyAddress": oo.pBaseDeviceHandler.GetProxyAddress()})
4560 }
4561 sendErr := oo.pBaseDeviceHandler.SendOnuSwSectionsOfWindow(ctx, oo.pBaseDeviceHandler.GetProxyAddress().AdapterEndpoint, omciTxRequest.OnuSwWindow)
4562 if sendErr != nil {
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004563 logger.Errorw(ctx, "send onu sw sections omci request error", log.Fields{"device-id": oo.deviceID, "error": sendErr})
kesavand011d5162021-11-25 19:21:06 +05304564 return sendErr
4565 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004566 numberOfNoArSections := len(omciTxRequest.OnuSwWindow.Messages) - 1 // last section of window is sent with AR expected
4567 if lastSection[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
4568 oo.increaseBaseTxNoArFramesBy(ctx, uint32(numberOfNoArSections))
4569 oo.incrementBaseTxArFrames()
4570 } else {
4571 oo.increaseExtTxNoArFramesBy(ctx, uint32(numberOfNoArSections))
4572 oo.incrementExtTxArFrames()
4573 }
kesavand011d5162021-11-25 19:21:06 +05304574 return nil
4575}
4576
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004577// SendDownloadSection sends DownloadSectionRequestWithResponse
4578func (oo *OmciCC) SendDownloadSection(ctx context.Context, aTimeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004579 rxChan chan Message, aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte, aPrint bool, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004580 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004581 logger.Debugw(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
4582 "SequNo": strconv.FormatInt(int64(tid), 16),
mpagenko15ff4a52021-03-02 10:09:20 +00004583 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest})
mpagenko80622a52021-02-09 16:53:23 +00004584
4585 //TODO!!!: don't know by now on how to generate the possibly needed AR (or enforce it to 0) with current omci-lib
4586 // by now just try to send it as defined by omci-lib
mpagenko15ff4a52021-03-02 10:09:20 +00004587 msgType := omci.DownloadSectionRequestType
mpagenkoc26d4c02021-05-06 14:27:57 +00004588 var timeout int = 0 //default value for no response expected
mpagenko15ff4a52021-03-02 10:09:20 +00004589 if aAckRequest > 0 {
4590 msgType = omci.DownloadSectionRequestWithResponseType
mpagenkoc26d4c02021-05-06 14:27:57 +00004591 timeout = aTimeout
mpagenko15ff4a52021-03-02 10:09:20 +00004592 }
mpagenko80622a52021-02-09 16:53:23 +00004593 omciLayer := &omci.OMCI{
4594 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004595 MessageType: msgType,
mpagenko80622a52021-02-09 16:53:23 +00004596 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4597 // Length: 0x28, // Optional, defaults to 40 octets
4598 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004599 if aIsExtendedOmci {
4600 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4601 }
Himani Chawla43f95ff2021-06-03 00:24:12 +05304602 localSectionData := make([]byte, len(aSection))
4603
mpagenko15ff4a52021-03-02 10:09:20 +00004604 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
mpagenko80622a52021-02-09 16:53:23 +00004605 request := &omci.DownloadSectionRequest{
4606 MeBasePacket: omci.MeBasePacket{
4607 EntityClass: me.SoftwareImageClassID,
4608 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004609 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004610 },
4611 SectionNumber: aDownloadSectionNo,
4612 SectionData: localSectionData,
4613 }
4614
4615 var options gopacket.SerializeOptions
4616 options.FixLengths = true
4617 buffer := gopacket.NewSerializeBuffer()
4618 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4619 if err != nil {
4620 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
4621 "device-id": oo.deviceID})
4622 return err
4623 }
4624 outgoingPacket := buffer.Bytes()
4625
mpagenko15ff4a52021-03-02 10:09:20 +00004626 //for initial debug purpose overrule the requested print state for some frames
4627 printFrame := aPrint
4628 if aAckRequest > 0 || aDownloadSectionNo == 0 {
4629 printFrame = true
4630 }
4631
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004632 omciRxCallbackPair := CallbackPair{CbKey: tid,
mpagenkoc26d4c02021-05-06 14:27:57 +00004633 // the callback is set even though no response might be required here, the tid (key) setting is needed here anyway
4634 // (used to avoid retransmission of frames with the same TID)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004635 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, printFrame /*aPrint*/},
mpagenko80622a52021-02-09 16:53:23 +00004636 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004637 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004638 if err != nil {
4639 logger.Errorw(ctx, "Cannot send DlSectionRequest", log.Fields{"Err": err,
4640 "device-id": oo.deviceID})
4641 return err
4642 }
4643 logger.Debug(ctx, "send DlSectionRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004644 return nil
4645}
4646
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304647// SendEndSoftwareDownload sends EndSoftwareDownloadRequest
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004648func (oo *OmciCC) SendEndSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004649 rxChan chan Message, aImageMeID uint16, aFileLen uint32, aImageCrc uint32, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004650 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004651 logger.Debugw(ctx, "send EndSwDlRequest:", log.Fields{"device-id": oo.deviceID,
4652 "SequNo": strconv.FormatInt(int64(tid), 16),
4653 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4654
mpagenko15ff4a52021-03-02 10:09:20 +00004655 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00004656 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004657 MessageType: omci.EndSoftwareDownloadRequestType,
mpagenko80622a52021-02-09 16:53:23 +00004658 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4659 // Length: 0x28, // Optional, defaults to 40 octets
4660 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004661 if aIsExtendedOmci {
4662 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4663 }
mpagenko15ff4a52021-03-02 10:09:20 +00004664 request := &omci.EndSoftwareDownloadRequest{
mpagenko80622a52021-02-09 16:53:23 +00004665 MeBasePacket: omci.MeBasePacket{
4666 EntityClass: me.SoftwareImageClassID,
4667 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004668 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004669 },
mpagenko15ff4a52021-03-02 10:09:20 +00004670 CRC32: aImageCrc,
4671 ImageSize: aFileLen,
4672 NumberOfInstances: 1, //parallel download to multiple circuit packs not supported
4673 ImageInstances: []uint16{0}, //don't care for NumberOfInstances=1, but probably needed by omci-lib as in startSwDlRequest
mpagenko80622a52021-02-09 16:53:23 +00004674 }
mpagenko15ff4a52021-03-02 10:09:20 +00004675
4676 var options gopacket.SerializeOptions
4677 options.FixLengths = true
4678 buffer := gopacket.NewSerializeBuffer()
4679 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4680 if err != nil {
4681 logger.Errorw(ctx, "Cannot serialize EndSwDlRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00004682 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00004683 return err
mpagenko80622a52021-02-09 16:53:23 +00004684 }
mpagenko15ff4a52021-03-02 10:09:20 +00004685 outgoingPacket := buffer.Bytes()
4686
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004687 omciRxCallbackPair := CallbackPair{CbKey: tid,
4688 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko15ff4a52021-03-02 10:09:20 +00004689 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004690 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00004691 if err != nil {
4692 logger.Errorw(ctx, "Cannot send EndSwDlRequest", log.Fields{"Err": err,
4693 "device-id": oo.deviceID})
4694 return err
4695 }
4696 logger.Debug(ctx, "send EndSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004697 return nil
4698}
4699
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004700// SendActivateSoftware sends ActivateSoftwareRequest
4701func (oo *OmciCC) SendActivateSoftware(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004702 rxChan chan Message, aImageMeID uint16, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004703 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004704 logger.Debugw(ctx, "send ActivateSwRequest:", log.Fields{"device-id": oo.deviceID,
4705 "SequNo": strconv.FormatInt(int64(tid), 16),
4706 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4707
4708 omciLayer := &omci.OMCI{
4709 TransactionID: tid,
4710 MessageType: omci.ActivateSoftwareRequestType,
4711 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4712 // Length: 0x28, // Optional, defaults to 40 octets
4713 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004714 if aIsExtendedOmci {
4715 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4716 }
mpagenko80622a52021-02-09 16:53:23 +00004717 request := &omci.ActivateSoftwareRequest{
4718 MeBasePacket: omci.MeBasePacket{
4719 EntityClass: me.SoftwareImageClassID,
4720 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004721 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004722 },
4723 ActivateFlags: 0, //unconditionally reset as the only relevant option here (regardless of VOIP)
4724 }
4725
4726 var options gopacket.SerializeOptions
4727 options.FixLengths = true
4728 buffer := gopacket.NewSerializeBuffer()
4729 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4730 if err != nil {
4731 logger.Errorw(ctx, "Cannot serialize ActivateSwRequest", log.Fields{"Err": err,
4732 "device-id": oo.deviceID})
4733 return err
4734 }
4735 outgoingPacket := buffer.Bytes()
4736
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004737 omciRxCallbackPair := CallbackPair{CbKey: tid,
4738 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko80622a52021-02-09 16:53:23 +00004739 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004740 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004741 if err != nil {
4742 logger.Errorw(ctx, "Cannot send ActivateSwRequest", log.Fields{"Err": err,
4743 "device-id": oo.deviceID})
4744 return err
4745 }
4746 logger.Debug(ctx, "send ActivateSwRequest done")
mpagenko15ff4a52021-03-02 10:09:20 +00004747 return nil
4748}
mpagenko80622a52021-02-09 16:53:23 +00004749
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004750// SendCommitSoftware sends CommitSoftwareRequest
4751func (oo *OmciCC) SendCommitSoftware(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004752 rxChan chan Message, aImageMeID uint16, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004753 tid := oo.GetNextTid(highPrio)
mpagenko15ff4a52021-03-02 10:09:20 +00004754 logger.Debugw(ctx, "send CommitSwRequest:", log.Fields{"device-id": oo.deviceID,
4755 "SequNo": strconv.FormatInt(int64(tid), 16),
4756 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4757
4758 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00004759 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004760 MessageType: omci.CommitSoftwareRequestType,
mpagenko80622a52021-02-09 16:53:23 +00004761 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4762 // Length: 0x28, // Optional, defaults to 40 octets
4763 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004764 if aIsExtendedOmci {
4765 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4766 }
mpagenko15ff4a52021-03-02 10:09:20 +00004767 request := &omci.CommitSoftwareRequest{
mpagenko80622a52021-02-09 16:53:23 +00004768 MeBasePacket: omci.MeBasePacket{
4769 EntityClass: me.SoftwareImageClassID,
4770 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004771 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004772 },
mpagenko80622a52021-02-09 16:53:23 +00004773 }
mpagenko15ff4a52021-03-02 10:09:20 +00004774
4775 var options gopacket.SerializeOptions
4776 options.FixLengths = true
4777 buffer := gopacket.NewSerializeBuffer()
4778 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4779 if err != nil {
4780 logger.Errorw(ctx, "Cannot serialize CommitSwRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00004781 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00004782 return err
mpagenko80622a52021-02-09 16:53:23 +00004783 }
mpagenko15ff4a52021-03-02 10:09:20 +00004784 outgoingPacket := buffer.Bytes()
4785
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004786 omciRxCallbackPair := CallbackPair{CbKey: tid,
4787 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko15ff4a52021-03-02 10:09:20 +00004788 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004789 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00004790 if err != nil {
4791 logger.Errorw(ctx, "Cannot send CommitSwRequest", log.Fields{"Err": err,
4792 "device-id": oo.deviceID})
4793 return err
4794 }
4795 logger.Debug(ctx, "send CommitSwRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004796 return nil
4797}
4798
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304799// SendSelfTestReq sends TestRequest
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004800func (oo *OmciCC) SendSelfTestReq(ctx context.Context, classID me.ClassID, instdID uint16, timeout int, highPrio bool, rxChan chan Message) error {
4801 tid := oo.GetNextTid(highPrio)
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004802 logger.Debugw(ctx, "send self test request:", log.Fields{"device-id": oo.deviceID,
4803 "SequNo": strconv.FormatInt(int64(tid), 16),
4804 "InstId": strconv.FormatInt(int64(instdID), 16)})
4805 omciLayer := &omci.OMCI{
4806 TransactionID: tid,
4807 MessageType: omci.TestRequestType,
4808 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4809 // Length: 0x28, // Optional, defaults to 40 octets
4810 }
4811
4812 var request *omci.OpticalLineSupervisionTestRequest
4813 switch classID {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004814 case me.AniGClassID:
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004815 request = &omci.OpticalLineSupervisionTestRequest{
4816 MeBasePacket: omci.MeBasePacket{
4817 EntityClass: classID,
4818 EntityInstance: instdID,
4819 },
4820 SelectTest: uint8(7), // self test
4821 GeneralPurposeBuffer: uint16(0),
4822 VendorSpecificParameters: uint16(0),
4823 }
4824 default:
4825 logger.Errorw(ctx, "unsupported class id for self test request", log.Fields{"device-id": oo.deviceID, "classID": classID})
4826 return fmt.Errorf("unsupported-class-id-for-self-test-request-%v", classID)
4827 }
4828 // Test serialization back to former string
4829 var options gopacket.SerializeOptions
4830 options.FixLengths = true
4831
4832 buffer := gopacket.NewSerializeBuffer()
4833 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4834 if err != nil {
4835 logger.Errorw(ctx, "Cannot serialize self test request", log.Fields{"Err": err,
4836 "device-id": oo.deviceID})
4837 return err
4838 }
4839 outgoingPacket := buffer.Bytes()
4840
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004841 omciRxCallbackPair := CallbackPair{CbKey: tid,
4842 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004843 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004844 err = oo.Send(ctx, outgoingPacket, timeout, 0, highPrio, omciRxCallbackPair)
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004845 if err != nil {
4846 logger.Errorw(ctx, "Cannot send self test request", log.Fields{"Err": err,
4847 "device-id": oo.deviceID})
4848 return err
4849 }
4850 logger.Debug(ctx, "send self test request done")
4851 return nil
4852}
4853
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304854// nolint: gocyclo
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004855func (oo *OmciCC) isSuccessfulResponseWithMibDataSync(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet) (bool, error) {
4856
4857 nextLayer, err := omci.MsgTypeToNextLayer(omciMsg.MessageType, false)
4858 if err != nil {
4859 logger.Errorw(ctx, "omci-message: could not map msgType to nextLayer", log.Fields{"device-id": oo.deviceID})
4860 return false, fmt.Errorf("could not map msgType to nextLayer - %s", oo.deviceID)
4861 }
4862 msgLayer := (*packet).Layer(nextLayer)
4863 if msgLayer != nil {
4864 // Note: Due to relaxed decoding, you may now still have a decoding error attached to the layers
4865 if failure := (*packet).ErrorLayer(); failure != nil {
4866 if nextLayer == omci.LayerTypeMibUploadNextResponse {
4867 // In the case of MibUploadNextResponse, we let the packet pass so that later processing
4868 // can examine for UnkonwnMEs and UnknownAttributes
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304869 logger.Debug(ctx, "omci-message: MibUploadNextResponse packet with ErrorLayer - let it pass",
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004870 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4871 return false, nil
4872 } else if nextLayer == omci.LayerTypeGetResponse {
4873 if resp := msgLayer.(*omci.GetResponse); resp != nil {
4874 if resp.NextLayerType() == omci.LayerTypeUnknownAttributes {
4875 unknownAttrLayer := (*packet).Layer(omci.LayerTypeUnknownAttributes)
4876 if unknownAttrLayer != nil {
4877 logger.Errorw(ctx, "omci-message: GetResponse packet contains unknownAttrLayer - skip it!",
4878 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "unknownAttrLayer": unknownAttrLayer})
4879 return false, fmt.Errorf("packet contains unknownAttrLayer - %s", oo.deviceID)
4880 }
4881 }
4882 }
4883 }
4884 // Try to decode any further error information
4885 if decodeFailure, ok := failure.(*gopacket.DecodeFailure); ok && decodeFailure != nil {
4886 logger.Errorw(ctx, "omci-message: packet contains ErrorLayer with further info - skip it!",
4887 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "decodeFailure": decodeFailure.String()})
4888 return false, fmt.Errorf("packet contains ErrorLayer with further info - %s", oo.deviceID)
4889 }
4890 logger.Errorw(ctx, "omci-message: packet contains ErrorLayer - skip it!",
4891 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4892 return false, fmt.Errorf("packet contains ErrorLayer - %s", oo.deviceID)
4893 }
4894 } else if failure := (*packet).ErrorLayer(); failure != nil {
4895 // message layer could not be decoded, but at least check if additional failure information is available
4896 if decodeFailure, ok := failure.(*gopacket.DecodeFailure); ok && decodeFailure != nil {
Holger Hildebrandt93d183f2022-04-22 15:50:26 +00004897 errMsg := decodeFailure.String()
4898 if nextLayer == omci.LayerTypeMibUploadNextResponse {
4899 if strings.Contains(strings.ToLower(errMsg), "table decode") {
4900 // In the case of MibUploadNextResponse with non-standard table attributes, we let the packet pass
4901 // so that later processing can deal with it
4902 logger.Infow(ctx, "omci-message: MibUploadNextResponse packet with table attributes - let it pass",
4903 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4904 return false, nil
4905 }
4906 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004907 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet, further info available - skip it!",
Holger Hildebrandt93d183f2022-04-22 15:50:26 +00004908 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "decodeFailure": errMsg})
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004909 return false, fmt.Errorf("could not decode msgLayer of packet, further info available - %s", oo.deviceID)
4910 }
4911 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet, ErrorLayer available",
4912 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4913 return false, fmt.Errorf("could not decode msgLayer of packet, ErrorLayer available - %s", oo.deviceID)
4914 } else {
4915 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet", log.Fields{"device-id": oo.deviceID})
4916 return false, fmt.Errorf("could not decode msgLayer of packet - %s", oo.deviceID)
4917 }
4918
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004919 for _, v := range responsesWithMibDataSync {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004920 if v == omciMsg.MessageType {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004921 switch nextLayer {
4922 case omci.LayerTypeCreateResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004923 if resp := msgLayer.(*omci.CreateResponse); resp != nil {
4924 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004925 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004926 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004927 }
4928 case omci.LayerTypeDeleteResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004929 if resp := msgLayer.(*omci.DeleteResponse); resp != nil {
4930 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004931 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004932 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004933 }
4934 case omci.LayerTypeSetResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004935 if resp := msgLayer.(*omci.SetResponse); resp != nil {
4936 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004937 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004938 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004939 }
4940 case omci.LayerTypeStartSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004941 if resp := msgLayer.(*omci.StartSoftwareDownloadResponse); resp != nil {
4942 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004943 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004944 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004945 }
4946 case omci.LayerTypeEndSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004947 if resp := msgLayer.(*omci.EndSoftwareDownloadResponse); resp != nil {
4948 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004949 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004950 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004951 }
4952 case omci.LayerTypeActivateSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004953 if resp := msgLayer.(*omci.ActivateSoftwareResponse); resp != nil {
4954 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004955 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004956 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004957 }
4958 case omci.LayerTypeCommitSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004959 if resp := msgLayer.(*omci.CommitSoftwareResponse); resp != nil {
4960 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004961 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004962 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004963 }
4964 }
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004965 }
4966 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004967 return false, nil
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004968}
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004969
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004970func (oo *OmciCC) processRequestMonitoring(ctx context.Context, aOmciTxRequest OmciTransferStructure) {
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004971 timeout := aOmciTxRequest.timeout
mpagenkoc26d4c02021-05-06 14:27:57 +00004972 if timeout == 0 {
4973 //timeout 0 indicates that no response is expected - fire and forget
Holger Hildebrandt34555512021-10-01 16:26:59 +00004974 // enqueue
4975 if aOmciTxRequest.highPrio {
4976 oo.mutexHighPrioTxQueue.Lock()
4977 oo.highPrioTxQueue.PushBack(aOmciTxRequest)
4978 oo.mutexHighPrioTxQueue.Unlock()
4979 } else {
4980 oo.mutexLowPrioTxQueue.Lock()
4981 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4982 oo.mutexLowPrioTxQueue.Unlock()
4983 }
4984 go oo.sendQueuedRequests(ctx)
mpagenkoc26d4c02021-05-06 14:27:57 +00004985 } else {
mpagenko7455fd42021-06-10 16:25:55 +00004986 //the supervised sending with waiting on the response (based on TID) is called in background
4987 // to avoid blocking of the sender for the complete OMCI handshake procedure
4988 // to stay consistent with the processing tested so far, sending of next messages of the same control procedure
4989 // is ensured by the according control instances (FSM's etc.) (by waiting for the respective responses there)
4990 go oo.sendWithRxSupervision(ctx, aOmciTxRequest, timeout)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004991 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004992}
4993
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004994func (oo *OmciCC) sendWithRxSupervision(ctx context.Context, aOmciTxRequest OmciTransferStructure, aTimeout int) {
mpagenko7455fd42021-06-10 16:25:55 +00004995 chSuccess := make(chan bool)
4996 aOmciTxRequest.chSuccess = chSuccess
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004997 tid := aOmciTxRequest.cbPair.CbKey
mpagenko7455fd42021-06-10 16:25:55 +00004998 oo.mutexMonReq.Lock()
4999 oo.monitoredRequests[tid] = aOmciTxRequest
5000 oo.mutexMonReq.Unlock()
5001
5002 retries := aOmciTxRequest.retries
5003 retryCounter := 0
5004loop:
5005 for retryCounter <= retries {
Holger Hildebrandt34555512021-10-01 16:26:59 +00005006 // enqueue
5007 if aOmciTxRequest.highPrio {
5008 oo.mutexHighPrioTxQueue.Lock()
5009 oo.highPrioTxQueue.PushBack(aOmciTxRequest)
5010 oo.mutexHighPrioTxQueue.Unlock()
5011 } else {
5012 oo.mutexLowPrioTxQueue.Lock()
5013 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
5014 oo.mutexLowPrioTxQueue.Unlock()
5015 }
pnalmasc6e916a2025-06-30 11:59:16 +05305016
5017 //Register the call back again as we clean up the Map entry when we failed to send the message .
5018 oo.mutexRxSchedMap.Lock()
5019 oo.rxSchedulerMap[aOmciTxRequest.cbPair.CbKey] = aOmciTxRequest.cbPair.CbEntry
5020 oo.mutexRxSchedMap.Unlock()
5021
Holger Hildebrandt34555512021-10-01 16:26:59 +00005022 go oo.sendQueuedRequests(ctx)
mpagenko7455fd42021-06-10 16:25:55 +00005023
5024 select {
5025 case success := <-chSuccess:
5026 if success {
5027 logger.Debugw(ctx, "reqMon: response received in time",
5028 log.Fields{"tid": tid, "device-id": oo.deviceID})
5029 } else {
5030 logger.Debugw(ctx, "reqMon: wait for response aborted",
5031 log.Fields{"tid": tid, "device-id": oo.deviceID})
5032 }
5033 break loop
5034 case <-time.After(time.Duration(aTimeout) * time.Second):
5035 if retryCounter == retries {
Holger Hildebrandt2b107642022-12-09 07:56:23 +00005036 if oo.pBaseDeviceHandler.IsOltAvailable() {
5037 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - send ONU device event!",
5038 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
5039 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationFailureConfig, OnuOmciCommunicationFailureConfigDesc)
5040 } else {
5041 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - skip ONU device event: OLT unavailable!",
5042 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
5043 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005044 oo.incrementTxTimesouts()
mpagenko7455fd42021-06-10 16:25:55 +00005045 break loop
5046 } else {
5047 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
5048 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005049 oo.incrementTxRetries()
mpagenko7455fd42021-06-10 16:25:55 +00005050 }
balaji.nagarajan3cab2b62025-06-23 15:44:54 +05305051 case _, ok := <-oo.pBaseDeviceHandler.GetDeviceDeleteCommChan(ctx):
5052 if !ok {
5053 logger.Warnw(ctx, "device deletion channel is closed at sendWithRxSupervision", log.Fields{"device-id": oo.deviceID})
5054 break loop
5055 }
mpagenko7455fd42021-06-10 16:25:55 +00005056 }
5057 retryCounter++
5058 }
5059 oo.mutexMonReq.Lock()
5060 delete(oo.monitoredRequests, tid)
5061 oo.mutexMonReq.Unlock()
5062}
5063
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05305064// CancelRequestMonitoring terminates monitoring of outstanding omci requests
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005065func (oo *OmciCC) CancelRequestMonitoring(ctx context.Context) {
Holger Hildebrandt12609a12022-03-25 13:23:25 +00005066 logger.Debugw(ctx, "CancelRequestMonitoring entered", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005067 oo.mutexMonReq.RLock()
5068 for k := range oo.monitoredRequests {
mpagenko8cd1bf72021-06-22 10:11:19 +00005069 //implement non-blocking channel send to avoid blocking on mutexMonReq later
5070 select {
5071 case oo.monitoredRequests[k].chSuccess <- false:
Holger Hildebrandt12609a12022-03-25 13:23:25 +00005072 logger.Debugw(ctx, "send cancellation on omciRespChannel",
5073 log.Fields{"index": k, "device-id": oo.deviceID})
mpagenko8cd1bf72021-06-22 10:11:19 +00005074 default:
Holger Hildebrandt12609a12022-03-25 13:23:25 +00005075 logger.Debugw(ctx, "cancellation could not be send on omciRespChannel (no receiver)",
5076 log.Fields{"index": k, "device-id": oo.deviceID})
mpagenko8cd1bf72021-06-22 10:11:19 +00005077 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005078 }
5079 oo.mutexMonReq.RUnlock()
5080}
5081
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05305082// GetMaxOmciTimeoutWithRetries provides a timeout value greater than the maximum
5083// time consumed for retry processing of a particular OMCI-request
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005084func (oo *OmciCC) GetMaxOmciTimeoutWithRetries() time.Duration {
5085 return time.Duration((CDefaultRetries+1)*oo.pBaseDeviceHandler.GetOmciTimeout() + 1)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005086}
Himani Chawla43f95ff2021-06-03 00:24:12 +05305087
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005088// SendCreateOrDeleteEthernetFrameExtendedPMME deletes EthernetFrameExtendedPm ME instance
5089func (oo *OmciCC) SendCreateOrDeleteEthernetFrameExtendedPMME(ctx context.Context, timeout int, highPrio bool,
Himani Chawla43f95ff2021-06-03 00:24:12 +05305090 upstream bool, create bool, rxChan chan Message, entityID uint16, classID me.ClassID, controlBlock []uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005091 tid := oo.GetNextTid(highPrio)
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05305092 logger.Info(ctx, "send-ethernet-frame-extended-pm-me-msg:", log.Fields{"device-id": oo.deviceID,
Himani Chawla43f95ff2021-06-03 00:24:12 +05305093 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
5094
5095 meParam := me.ParamData{EntityID: entityID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00005096 Attributes: me.AttributeValueMap{me.EthernetFrameExtendedPm_ControlBlock: controlBlock},
Himani Chawla43f95ff2021-06-03 00:24:12 +05305097 }
5098 var meInstance *me.ManagedEntity
5099 var omciErr me.OmciErrors
5100 if classID == me.EthernetFrameExtendedPmClassID {
5101 meInstance, omciErr = me.NewEthernetFrameExtendedPm(meParam)
5102 } else {
5103 meInstance, omciErr = me.NewEthernetFrameExtendedPm64Bit(meParam)
5104 }
5105
5106 if omciErr.GetError() == nil {
5107 var omciLayer *omci.OMCI
5108 var msgLayer gopacket.SerializableLayer
5109 var err error
5110 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00005111 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
5112 oframe.AddDefaults(true))
Himani Chawla43f95ff2021-06-03 00:24:12 +05305113 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00005114 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
5115 oframe.AddDefaults(true))
Himani Chawla43f95ff2021-06-03 00:24:12 +05305116 }
5117 if err != nil {
5118 logger.Errorw(ctx, "cannot-encode-ethernet-frame-extended-pm-me",
5119 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5120 return nil, err
5121 }
5122
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00005123 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Himani Chawla43f95ff2021-06-03 00:24:12 +05305124 if err != nil {
5125 logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me",
5126 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5127 return nil, err
5128 }
5129
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005130 omciRxCallbackPair := CallbackPair{CbKey: tid,
5131 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Himani Chawla43f95ff2021-06-03 00:24:12 +05305132 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005133 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawla43f95ff2021-06-03 00:24:12 +05305134 if err != nil {
5135 logger.Errorw(ctx, "Cannot send ethernet-frame-extended-pm-me",
5136 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5137 return nil, err
5138 }
5139 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-done",
5140 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5141 return meInstance, nil
5142 }
5143 logger.Errorw(ctx, "cannot-generate-ethernet-frame-extended-pm-me-instance",
5144 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5145 return nil, omciErr.GetError()
5146}
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005147
5148// RLockMutexMonReq lock read access to monitoredRequests
5149func (oo *OmciCC) RLockMutexMonReq() {
5150 oo.mutexMonReq.RLock()
5151}
5152
5153// RUnlockMutexMonReq unlock read access to monitoredRequests
5154func (oo *OmciCC) RUnlockMutexMonReq() {
5155 oo.mutexMonReq.RUnlock()
5156}
5157
5158// GetMonitoredRequest get OmciTransferStructure for an omciTransID
5159func (oo *OmciCC) GetMonitoredRequest(omciTransID uint16) (value OmciTransferStructure, exist bool) {
5160 value, exist = oo.monitoredRequests[omciTransID]
5161 return value, exist
5162}
5163
5164// SetChMonitoredRequest sets chSuccess to indicate whether response was received or not
5165func (oo *OmciCC) SetChMonitoredRequest(omciTransID uint16, chVal bool) {
5166 oo.monitoredRequests[omciTransID].chSuccess <- chVal
5167}
Himani Chawlaee10b542021-09-20 16:46:40 +05305168
5169// SendSetEthernetFrameExtendedPMME sends the set request for ethernet frame extended type me
5170func (oo *OmciCC) SendSetEthernetFrameExtendedPMME(ctx context.Context, timeout int, highPrio bool,
5171 rxChan chan Message, entityID uint16, classID me.ClassID, controlBlock []uint16) (*me.ManagedEntity, error) {
5172 tid := oo.GetNextTid(highPrio)
5173 logger.Debugw(ctx, "send-set-ethernet-frame-extended-pm-me-control-block:", log.Fields{"device-id": oo.deviceID,
5174 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16)})
5175
5176 meParams := me.ParamData{EntityID: entityID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00005177 Attributes: me.AttributeValueMap{me.EthernetFrameExtendedPm_ControlBlock: controlBlock},
Himani Chawlaee10b542021-09-20 16:46:40 +05305178 }
5179 var meInstance *me.ManagedEntity
5180 var omciErr me.OmciErrors
5181 if classID == me.EthernetFrameExtendedPmClassID {
5182 meInstance, omciErr = me.NewEthernetFrameExtendedPm(meParams)
5183 } else {
5184 meInstance, omciErr = me.NewEthernetFrameExtendedPm64Bit(meParams)
5185 }
5186
5187 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00005188 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Himani Chawlaee10b542021-09-20 16:46:40 +05305189 if err != nil {
5190 logger.Errorw(ctx, "cannot-encode-ethernet-frame-extended-pm-me",
5191 log.Fields{"err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5192 return nil, err
5193 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00005194 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Himani Chawlaee10b542021-09-20 16:46:40 +05305195 if err != nil {
5196 logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me-set-msg",
5197 log.Fields{"err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5198 return nil, err
5199 }
5200 omciRxCallbackPair := CallbackPair{
5201 CbKey: tid,
5202 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
5203 }
5204 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
5205 if err != nil {
5206 logger.Errorw(ctx, "Cannot send ethernet-frame-extended-pm-me",
5207 log.Fields{"Err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5208 return nil, err
5209 }
5210 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-set-msg-done",
5211 log.Fields{"device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5212 return meInstance, nil
5213 }
5214 logger.Errorw(ctx, "cannot-generate-ethernet-frame-extended-pm-me-instance",
5215 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5216 return nil, omciErr.GetError()
5217}
Holger Hildebrandte7cc6092022-02-01 11:37:03 +00005218
5219// PrepareForGarbageCollection - remove references to prepare for garbage collection
5220func (oo *OmciCC) PrepareForGarbageCollection(ctx context.Context, aDeviceID string) {
5221 logger.Debugw(ctx, "prepare for garbage collection", log.Fields{"device-id": aDeviceID})
5222 oo.pBaseDeviceHandler = nil
5223 oo.pOnuDeviceEntry = nil
5224 oo.pOnuAlarmManager = nil
5225}
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005226
5227// GetOmciCounters - TODO: add comment
5228func (oo *OmciCC) GetOmciCounters() *extension.SingleGetValueResponse {
5229 oo.mutexCounters.RLock()
5230 defer oo.mutexCounters.RUnlock()
5231 resp := extension.SingleGetValueResponse{
5232 Response: &extension.GetValueResponse{
5233 Status: extension.GetValueResponse_OK,
5234 Response: &extension.GetValueResponse_OnuOmciStats{
5235 OnuOmciStats: &extension.GetOnuOmciTxRxStatsResponse{},
5236 },
5237 },
5238 }
5239 resp.Response.GetOnuOmciStats().BaseTxArFrames = oo.countersBase.txArFrames
5240 resp.Response.GetOnuOmciStats().BaseTxNoArFrames = oo.countersBase.txNoArFrames
5241 resp.Response.GetOnuOmciStats().BaseRxAkFrames = oo.countersBase.rxAkFrames
5242 resp.Response.GetOnuOmciStats().BaseRxNoAkFrames = oo.countersBase.rxNoAkFrames
5243 resp.Response.GetOnuOmciStats().ExtTxArFrames = oo.countersExt.txArFrames
5244 resp.Response.GetOnuOmciStats().ExtTxNoArFrames = oo.countersExt.txNoArFrames
5245 resp.Response.GetOnuOmciStats().ExtRxAkFrames = oo.countersExt.rxAkFrames
5246 resp.Response.GetOnuOmciStats().ExtRxNoAkFrames = oo.countersExt.rxNoAkFrames
5247 resp.Response.GetOnuOmciStats().TxOmciCounterRetries = oo.txRetries
5248 resp.Response.GetOnuOmciStats().TxOmciCounterTimeouts = oo.txTimeouts
5249 return &resp
5250}
5251
5252// For more speed, separate functions for each counter
5253
5254func (oo *OmciCC) incrementBaseTxArFrames() {
5255 oo.mutexCounters.Lock()
5256 defer oo.mutexCounters.Unlock()
5257 oo.countersBase.txArFrames++
5258}
5259
5260func (oo *OmciCC) incrementExtTxArFrames() {
5261 oo.mutexCounters.Lock()
5262 defer oo.mutexCounters.Unlock()
5263 oo.countersExt.txArFrames++
5264}
5265
5266func (oo *OmciCC) incrementBaseRxAkFrames() {
5267 oo.mutexCounters.Lock()
5268 defer oo.mutexCounters.Unlock()
5269 oo.countersBase.rxAkFrames++
5270}
5271
5272func (oo *OmciCC) incrementExtRxAkFrames() {
5273 oo.mutexCounters.Lock()
5274 defer oo.mutexCounters.Unlock()
5275 oo.countersExt.rxAkFrames++
5276}
5277
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +05305278//nolint:unparam
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005279func (oo *OmciCC) increaseBaseTxNoArFramesBy(ctx context.Context, value uint32) {
5280 oo.mutexCounters.Lock()
5281 defer oo.mutexCounters.Unlock()
5282 oo.countersBase.txNoArFrames += value
5283}
5284
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +05305285//nolint:unparam
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005286func (oo *OmciCC) increaseExtTxNoArFramesBy(ctx context.Context, value uint32) {
5287 oo.mutexCounters.Lock()
5288 defer oo.mutexCounters.Unlock()
5289 oo.countersExt.txNoArFrames += value
5290}
5291
5292func (oo *OmciCC) incrementBaseRxNoAkFrames() {
5293 oo.mutexCounters.Lock()
5294 defer oo.mutexCounters.Unlock()
5295 oo.countersBase.rxNoAkFrames++
5296}
5297
5298func (oo *OmciCC) incrementExtRxNoAkFrames() {
5299 oo.mutexCounters.Lock()
5300 defer oo.mutexCounters.Unlock()
5301 oo.countersExt.rxNoAkFrames++
5302}
5303
5304func (oo *OmciCC) incrementTxRetries() {
5305 oo.mutexCounters.Lock()
5306 defer oo.mutexCounters.Unlock()
5307 oo.txRetries++
5308}
5309
5310func (oo *OmciCC) incrementTxTimesouts() {
5311 oo.mutexCounters.Lock()
5312 defer oo.mutexCounters.Unlock()
5313 oo.txTimeouts++
5314}
Holger Hildebrandt7e138462023-03-29 12:12:14 +00005315
5316// NotifyAboutOnuConfigFailure - trigger ONU DeviceEvent to notify about ONU config failure
5317func (oo *OmciCC) NotifyAboutOnuConfigFailure(ctx context.Context, errID string, meClassID me.ClassID, meEntityID uint16,
5318 meName string, meResult me.Results) {
5319 var description string
5320 if !oo.confFailMeAlreadyHandled(meClassID) {
5321 switch errID {
5322 case OnuConfigFailureResponseErr:
5323 description = OnuConfigFailureResponseErrDesc + meResult.String() +
5324 ", OMCI ME: " + meName + " / instance: " + fmt.Sprintf("%d", meEntityID) + " (only first instance reported)"
5325 case OnuConfigFailureTimeout:
5326 description = OnuConfigFailureTimeoutDesc + meName + " / instance: " + fmt.Sprintf("%d", meEntityID) +
5327 " (only first instance reported)"
5328 default:
5329 logger.Warnw(ctx, "method called with undefined errID", log.Fields{"errID": errID, "device-id": oo.deviceID})
5330 return
5331 }
5332 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, errID, description)
5333 oo.appendConfFailMe(meClassID)
5334 }
5335}
5336
5337func (oo *OmciCC) confFailMeAlreadyHandled(meClassID me.ClassID) bool {
5338 oo.mutexConfFailMEs.RLock()
5339 defer oo.mutexConfFailMEs.RUnlock()
5340 for _, v := range oo.confFailMEs {
5341 if v == meClassID {
5342 return true
5343 }
5344 }
5345 return false
5346}
5347
5348func (oo *OmciCC) appendConfFailMe(meClassID me.ClassID) {
5349 oo.mutexConfFailMEs.Lock()
5350 defer oo.mutexConfFailMEs.Unlock()
5351 oo.confFailMEs = append(oo.confFailMEs, meClassID)
5352}
5353
5354// ResetConfFailMEs - reset list of stored config failure MEs
5355func (oo *OmciCC) ResetConfFailMEs() {
5356 oo.mutexConfFailMEs.Lock()
5357 defer oo.mutexConfFailMEs.Unlock()
5358 oo.confFailMEs = nil
5359}