blob: ab12ef7f69ef205545f99c9093b3f93a75c76550 [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 {
645 queueElement := oo.highPrioTxQueue.Front() // First element
646 if err := oo.sendOMCIRequest(ctx, queueElement.Value.(OmciTransferStructure)); err != nil {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000647 // Element will be removed from the queue regardless of the send success, to prevent
648 // an accumulation of send requests for the same message in the event of an error.
649 // In this case, resend attempts for the message are ensured by our retry
650 // mechanism after omci-timeout.
651 oo.highPrioTxQueue.Remove(queueElement) // Dequeue
Holger Hildebrandt34555512021-10-01 16:26:59 +0000652 return err
mpagenko80622a52021-02-09 16:53:23 +0000653 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000654 oo.highPrioTxQueue.Remove(queueElement) // Dequeue
655 }
656 return nil
657}
658
659func (oo *OmciCC) sendQueuedLowPrioRequests(ctx context.Context) error {
660 oo.mutexLowPrioTxQueue.Lock()
661 for oo.lowPrioTxQueue.Len() > 0 {
662 queueElement := oo.lowPrioTxQueue.Front() // First element
kesavand011d5162021-11-25 19:21:06 +0530663 // check if the element is for onu sw section
664 aOmciTxReq := queueElement.Value.(OmciTransferStructure)
665 if aOmciTxReq.OnuSwWindow != nil {
666 if err := oo.sendOnuSwSectionsOfWindow(ctx, aOmciTxReq); err != nil {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000667 // Element will be removed from the queue regardless of the send success, to prevent
668 // an accumulation of send requests for the same message in the event of an error.
669 // In this case, resend attempts for the message are ensured by our retry
670 // mechanism after omci-timeout.
671 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
kesavand011d5162021-11-25 19:21:06 +0530672 oo.mutexLowPrioTxQueue.Unlock()
673 return err
674 }
675 } else {
676 err := oo.sendOMCIRequest(ctx, queueElement.Value.(OmciTransferStructure))
677 if err != nil {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000678 // Element will be removed from the queue regardless of the send success, to prevent
679 // an accumulation of send requests for the same message in the event of an error.
680 // In this case, resend attempts for the message are ensured by our retry
681 // mechanism after omci-timeout.
682 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
kesavand011d5162021-11-25 19:21:06 +0530683 oo.mutexLowPrioTxQueue.Unlock()
684 return err
685 }
amit.ghosh58b704b2021-06-18 03:45:52 +0200686 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000687 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
688 // Interrupt the sending of low priority requests to process any high priority requests
689 // that may have arrived in the meantime
690 oo.mutexLowPrioTxQueue.Unlock()
691 if err := oo.sendQueuedHighPrioRequests(ctx); err != nil {
692 return err
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000693 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000694 oo.mutexLowPrioTxQueue.Lock()
695 }
696
697 oo.mutexLowPrioTxQueue.Unlock()
698 return nil
699}
700
701func (oo *OmciCC) sendOMCIRequest(ctx context.Context, omciTxRequest OmciTransferStructure) error {
702 if omciTxRequest.withFramePrint {
703 logger.Debugw(ctx, "omci-message-to-send:", log.Fields{
704 "TxOmciMessage": hex.EncodeToString(omciTxRequest.txFrame),
705 "device-id": oo.deviceID,
706 "toDeviceType": oo.pBaseDeviceHandler.GetProxyAddressType(),
707 "proxyDeviceID": oo.pBaseDeviceHandler.GetProxyAddressID(),
708 "proxyAddress": oo.pBaseDeviceHandler.GetProxyAddress()})
709 }
khenaidoo42dcdfd2021-10-19 17:34:12 -0400710 omciMsg := &ia.OmciMessage{
Holger Hildebrandt34555512021-10-01 16:26:59 +0000711 ParentDeviceId: oo.pBaseDeviceHandler.GetProxyAddressID(),
712 ChildDeviceId: oo.deviceID,
713 Message: omciTxRequest.txFrame,
714 ProxyAddress: oo.pBaseDeviceHandler.GetProxyAddress(),
715 ConnectStatus: common.ConnectStatus_REACHABLE, // If we are sending OMCI messages means we are connected, else we should not be here
716 }
717 sendErr := oo.pBaseDeviceHandler.SendOMCIRequest(ctx, oo.pBaseDeviceHandler.GetProxyAddress().AdapterEndpoint, omciMsg)
718 if sendErr != nil {
Holger Hildebrandtabfef032022-02-25 12:40:20 +0000719 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 +0000720 return sendErr
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000721 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000722 if omciTxRequest.txFrame[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
723 oo.incrementBaseTxArFrames()
724 } else {
725 oo.incrementExtTxArFrames()
726 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000727 return nil
728}
729
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000730// GetNextTid - TODO: add comment
731func (oo *OmciCC) GetNextTid(highPriority bool) uint16 {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000732 var next uint16
733 if highPriority {
mpagenko900ee4b2020-10-12 11:56:34 +0000734 oo.mutexHpTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000735 next = oo.hpTid
Himani Chawla4d908332020-08-31 12:30:20 +0530736 oo.hpTid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000737 if oo.hpTid < 0x8000 {
738 oo.hpTid = 0x8000
739 }
mpagenko900ee4b2020-10-12 11:56:34 +0000740 oo.mutexHpTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000741 } else {
mpagenko900ee4b2020-10-12 11:56:34 +0000742 oo.mutexTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000743 next = oo.tid
Himani Chawla4d908332020-08-31 12:30:20 +0530744 oo.tid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000745 if oo.tid >= 0x8000 {
746 oo.tid = 1
747 }
mpagenko900ee4b2020-10-12 11:56:34 +0000748 oo.mutexTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000749 }
750 return next
751}
752
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530753// GetOnuSwSecNextTid get the next low prio tid for the onu sw sections
754// onu sw sections uses only low priority tids
755// The mutexTid lock should be taken prior to using this function
kesavand011d5162021-11-25 19:21:06 +0530756func (oo *OmciCC) GetOnuSwSecNextTid() uint16 {
kesavand011d5162021-11-25 19:21:06 +0530757 if oo.tid >= 0x8000 {
758 oo.tid = 1
759 }
bseenivad32c2742024-12-09 11:46:17 +0530760 next := oo.tid
761 oo.tid++
kesavand011d5162021-11-25 19:21:06 +0530762 return next
763}
764
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530765// GetOnuSwSecLastTid gets the last allocated tid
766// The mutexTid lock should be taken prior to using this function
kesavand011d5162021-11-25 19:21:06 +0530767func (oo *OmciCC) GetOnuSwSecLastTid() uint16 {
768 next := oo.tid
769 lastAllocatedTid := next - 1
770 return lastAllocatedTid
771}
772
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530773// LockMutexTID locks mutexTid
kesavand011d5162021-11-25 19:21:06 +0530774func (oo *OmciCC) LockMutexTID() {
775 oo.mutexTid.Lock()
776}
777
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530778// UnLockMutexTID unlocks mutexTid
kesavand011d5162021-11-25 19:21:06 +0530779func (oo *OmciCC) UnLockMutexTID() {
780 oo.mutexTid.Unlock()
781}
782
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000783// ###################################################################################
784// # utility methods provided to work on OMCI messages
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000785
786// Serialize - TODO: add comment
787func Serialize(ctx context.Context, msgType omci.MessageType, request gopacket.SerializableLayer, tid uint16) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000788 omciLayer := &omci.OMCI{
789 TransactionID: tid,
790 MessageType: msgType,
791 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000792 return SerializeOmciLayer(ctx, omciLayer, request)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000793}
794
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000795// SerializeOmciLayer - TODO: add comment
796func SerializeOmciLayer(ctx context.Context, aOmciLayer *omci.OMCI, aRequest gopacket.SerializableLayer) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000797 var options gopacket.SerializeOptions
798 options.FixLengths = true
799
800 buffer := gopacket.NewSerializeBuffer()
Himani Chawla4d908332020-08-31 12:30:20 +0530801 err := gopacket.SerializeLayers(buffer, options, aOmciLayer, aRequest)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000802 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000803 logger.Errorw(ctx, "Could not create goPacket Omci serial buffer", log.Fields{"Err": err})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000804 return nil, err
805 }
806 return buffer.Bytes(), nil
807}
808
Himani Chawla4d908332020-08-31 12:30:20 +0530809/*
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000810func hexEncode(omciPkt []byte) ([]byte, error) {
811 dst := make([]byte, hex.EncodedLen(len(omciPkt)))
812 hex.Encode(dst, omciPkt)
813 return dst, nil
814}
Himani Chawla4d908332020-08-31 12:30:20 +0530815*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000816
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530817// supply a response handler for omci response messages to be transferred to the requested FSM
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000818func (oo *OmciCC) receiveOmciResponse(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet, respChan chan Message) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000819
dbainbri4d3a0dc2020-12-02 00:33:42 +0000820 logger.Debugw(ctx, "omci-message-response - transfer on omciRespChannel", log.Fields{"omciMsgType": omciMsg.MessageType,
divyadesai4d299552020-08-18 07:13:49 +0000821 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000822
823 if oo.pOnuDeviceEntry == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000824 logger.Errorw(ctx, "Abort receiving OMCI response, DeviceEntryPointer is nil", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000825 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200826 return fmt.Errorf("deviceEntryPointer is nil %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000827 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000828 oo.mutexMonReq.RLock()
829 if _, exist := oo.monitoredRequests[omciMsg.TransactionID]; exist {
mpagenko8cd1bf72021-06-22 10:11:19 +0000830 //implement non-blocking channel send to avoid blocking on mutexMonReq later
831 select {
832 case oo.monitoredRequests[omciMsg.TransactionID].chSuccess <- true:
833 default:
834 logger.Debugw(ctx, "response not send on omciRespChannel (no receiver)", log.Fields{
835 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
836 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000837 } else {
838 logger.Infow(ctx, "reqMon: map entry does not exist!",
839 log.Fields{"tid": omciMsg.TransactionID, "device-id": oo.deviceID})
840 }
841 oo.mutexMonReq.RUnlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000842
843 // no further test on SeqNo is done here, assignment from rxScheduler is trusted
844 // MibSync responses are simply transferred via deviceEntry to MibSync, no specific analysis here
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000845 omciRespMsg := Message{
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000846 Type: OMCI,
847 Data: OmciMessage{
848 OmciMsg: omciMsg,
849 OmciPacket: packet,
850 },
851 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000852 //logger.Debugw(ctx,"Message to be sent into channel:", log.Fields{"mibSyncMsg": mibSyncMsg})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000853 respChan <- omciRespMsg
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000854
855 return nil
856}
857
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000858// SendMibReset sends MibResetRequest
859func (oo *OmciCC) SendMibReset(ctx context.Context, timeout int, highPrio bool) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000860
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530861 logger.Infow(ctx, "send MibReset-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000862 request := &omci.MibResetRequest{
863 MeBasePacket: omci.MeBasePacket{
864 EntityClass: me.OnuDataClassID,
865 },
866 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000867 tid := oo.GetNextTid(highPrio)
868 pkt, err := Serialize(ctx, omci.MibResetRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000869 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000870 logger.Errorw(ctx, "Cannot serialize MibResetRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000871 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000872 return err
873 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000874 omciRxCallbackPair := CallbackPair{
875 CbKey: tid,
876 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000877 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000878 return oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000879}
880
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000881// SendReboot sends RebootRequest
882func (oo *OmciCC) SendReboot(ctx context.Context, timeout int, highPrio bool, responseChannel chan Message) error {
883 logger.Debugw(ctx, "send reboot-msg to:", log.Fields{"device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300884 request := &omci.RebootRequest{
885 MeBasePacket: omci.MeBasePacket{
886 EntityClass: me.OnuGClassID,
887 },
888 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000889 tid := oo.GetNextTid(highPrio)
890 pkt, err := Serialize(ctx, omci.RebootRequestType, request, tid)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300891 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000892 logger.Errorw(ctx, "Cannot serialize RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000893 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300894 return err
895 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000896 omciRxCallbackPair := CallbackPair{
897 CbKey: tid,
898 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetOmciRebootMsgRevChan(), oo.receiveOmciResponse, true},
ozgecanetsiae11479f2020-07-06 09:44:47 +0300899 }
900
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000901 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300902 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000903 logger.Errorw(ctx, "Cannot send RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000904 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300905 return err
906 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000907 err = oo.pOnuDeviceEntry.WaitForRebootResponse(ctx, responseChannel)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300908 if err != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000909 logger.Errorw(ctx, "aborting ONU reboot!", log.Fields{
Andrea Campanella6515c582020-10-05 11:25:00 +0200910 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300911 return err
912 }
913 return nil
914}
915
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000916// SendMibUpload sends MibUploadRequest
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000917func (oo *OmciCC) SendMibUpload(ctx context.Context, timeout int, highPrio bool, isExtOmciSupported bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000918 logger.Debugw(ctx, "send MibUpload-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000919
920 tid := oo.GetNextTid(highPrio)
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000921
922 omciLayer := &omci.OMCI{
923 TransactionID: tid,
924 MessageType: omci.MibUploadRequestType,
925 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000926 if isExtOmciSupported {
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000927 omciLayer.DeviceIdentifier = omci.ExtendedIdent
928 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000929 request := &omci.MibUploadRequest{
930 MeBasePacket: omci.MeBasePacket{
931 EntityClass: me.OnuDataClassID,
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000932 Extended: isExtOmciSupported,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000933 },
934 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000935 var options gopacket.SerializeOptions
936 options.FixLengths = true
937
938 buffer := gopacket.NewSerializeBuffer()
939 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000940 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000941 logger.Errorw(ctx, "Cannot serialize MibUploadRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000942 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000943 return err
944 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000945 oo.UploadSequNo = 0
946 oo.UploadNoOfCmds = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000947
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000948 omciRxCallbackPair := CallbackPair{
949 CbKey: tid,
950 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000951 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000952 return oo.Send(ctx, buffer.Bytes(), timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000953}
954
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000955// SendMibUploadNext sends MibUploadNextRequest
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000956func (oo *OmciCC) SendMibUploadNext(ctx context.Context, timeout int, highPrio bool, isExtOmciSupported bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000957 logger.Debugw(ctx, "send MibUploadNext-msg to:", log.Fields{"device-id": oo.deviceID, "UploadSequNo": oo.UploadSequNo})
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000958
959 tid := oo.GetNextTid(highPrio)
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000960
961 omciLayer := &omci.OMCI{
962 TransactionID: tid,
963 MessageType: omci.MibUploadNextRequestType,
964 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000965 if isExtOmciSupported {
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000966 omciLayer.DeviceIdentifier = omci.ExtendedIdent
967 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000968 request := &omci.MibUploadNextRequest{
969 MeBasePacket: omci.MeBasePacket{
970 EntityClass: me.OnuDataClassID,
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000971 Extended: isExtOmciSupported,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000972 },
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000973 CommandSequenceNumber: oo.UploadSequNo,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000974 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000975 var options gopacket.SerializeOptions
976 options.FixLengths = true
977
978 buffer := gopacket.NewSerializeBuffer()
979 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000980 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000981 logger.Errorw(ctx, "Cannot serialize MibUploadNextRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000982 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000983 return err
984 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000985 oo.UploadSequNo++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000986
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000987 omciRxCallbackPair := CallbackPair{
988 CbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000989 //frame printing for MibUpload frames disabled now per default to avoid log file abort situations (size/speed?)
990 // if wanted, rx frame printing should be specifically done within the MibUpload FSM or controlled via extra parameter
991 // compare also software upgrade download section handling
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000992 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000993 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000994 return oo.Send(ctx, buffer.Bytes(), timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000995}
996
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000997// SendGetAllAlarm gets all alarm ME instances
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +0000998func (oo *OmciCC) SendGetAllAlarm(ctx context.Context, alarmRetreivalMode uint8, timeout int, highPrio bool, isExtendedOmci bool) error {
Himani Chawlad3dac422021-03-13 02:31:31 +0530999 logger.Debugw(ctx, "send GetAllAlarms-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001000
1001 tid := oo.GetNextTid(highPrio)
1002 omciLayer := &omci.OMCI{
1003 TransactionID: tid,
1004 MessageType: omci.GetAllAlarmsRequestType,
1005 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1006 }
1007 if isExtendedOmci {
1008 omciLayer.DeviceIdentifier = omci.ExtendedIdent
1009 }
Himani Chawlad3dac422021-03-13 02:31:31 +05301010 request := &omci.GetAllAlarmsRequest{
1011 MeBasePacket: omci.MeBasePacket{
1012 EntityClass: me.OnuDataClassID,
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001013 Extended: isExtendedOmci,
Himani Chawlad3dac422021-03-13 02:31:31 +05301014 },
1015 AlarmRetrievalMode: byte(alarmRetreivalMode),
1016 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001017 var options gopacket.SerializeOptions
1018 options.FixLengths = true
1019 buffer := gopacket.NewSerializeBuffer()
1020 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Himani Chawlad3dac422021-03-13 02:31:31 +05301021 if err != nil {
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001022 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsRequest", log.Fields{"Err": err,
1023 "device-id": oo.deviceID})
Himani Chawlad3dac422021-03-13 02:31:31 +05301024 return err
1025 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001026 outgoingPacket := buffer.Bytes()
1027
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001028 oo.pOnuAlarmManager.ResetAlarmUploadCounters()
Himani Chawlad3dac422021-03-13 02:31:31 +05301029
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001030 omciRxCallbackPair := CallbackPair{
1031 CbKey: tid,
1032 CbEntry: CallbackPairEntry{oo.pOnuAlarmManager.GetAlarmMgrEventChannel(), oo.receiveOmciResponse, true},
Himani Chawlad3dac422021-03-13 02:31:31 +05301033 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001034 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
1035 if err != nil {
1036 logger.Errorw(ctx, "Cannot send GetAllAlarmsRequest", log.Fields{"Err": err,
1037 "device-id": oo.deviceID})
1038 return err
1039 }
1040 logger.Debug(ctx, "send GetAllAlarmsRequest done")
1041 return nil
Himani Chawlad3dac422021-03-13 02:31:31 +05301042}
1043
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001044// SendGetAllAlarmNext gets next alarm ME instance
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001045func (oo *OmciCC) SendGetAllAlarmNext(ctx context.Context, timeout int, highPrio bool, isExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001046 alarmUploadSeqNo := oo.pOnuAlarmManager.GetAlarmUploadSeqNo()
1047 logger.Debugw(ctx, "send SendGetAllAlarmNext-msg to:", log.Fields{"device-id": oo.deviceID,
Himani Chawlad3dac422021-03-13 02:31:31 +05301048 "alarmUploadSeqNo": alarmUploadSeqNo})
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001049
1050 tid := oo.GetNextTid(highPrio)
1051 omciLayer := &omci.OMCI{
1052 TransactionID: tid,
1053 MessageType: omci.GetAllAlarmsNextRequestType,
1054 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1055 }
1056 if isExtendedOmci {
1057 omciLayer.DeviceIdentifier = omci.ExtendedIdent
1058 }
Himani Chawlad3dac422021-03-13 02:31:31 +05301059 request := &omci.GetAllAlarmsNextRequest{
1060 MeBasePacket: omci.MeBasePacket{
1061 EntityClass: me.OnuDataClassID,
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001062 Extended: isExtendedOmci,
Himani Chawlad3dac422021-03-13 02:31:31 +05301063 },
1064 CommandSequenceNumber: alarmUploadSeqNo,
1065 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001066 var options gopacket.SerializeOptions
1067 options.FixLengths = true
1068 buffer := gopacket.NewSerializeBuffer()
1069 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Himani Chawlad3dac422021-03-13 02:31:31 +05301070 if err != nil {
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001071 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsNextRequest", log.Fields{"Err": err,
1072 "device-id": oo.deviceID})
Himani Chawlad3dac422021-03-13 02:31:31 +05301073 return err
1074 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001075 outgoingPacket := buffer.Bytes()
1076
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001077 oo.pOnuAlarmManager.IncrementAlarmUploadSeqNo()
Himani Chawlad3dac422021-03-13 02:31:31 +05301078
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001079 omciRxCallbackPair := CallbackPair{
1080 CbKey: tid,
1081 CbEntry: CallbackPairEntry{oo.pOnuAlarmManager.GetAlarmMgrEventChannel(), oo.receiveOmciResponse, true},
Himani Chawlad3dac422021-03-13 02:31:31 +05301082 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001083 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
1084 if err != nil {
1085 logger.Errorw(ctx, "Cannot send GetAllAlarmsNextRequest", log.Fields{"Err": err,
1086 "device-id": oo.deviceID})
1087 return err
1088 }
1089 logger.Debug(ctx, "send GetAllAlarmsNextRequest done")
1090 return nil
Himani Chawlad3dac422021-03-13 02:31:31 +05301091}
1092
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001093// SendCreateGalEthernetProfile creates GalEthernetProfile ME instance
1094func (oo *OmciCC) SendCreateGalEthernetProfile(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1095 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001096 logger.Debugw(ctx, "send GalEnetProfile-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001097 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001098
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001099 meParams := me.ParamData{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001100 EntityID: GalEthernetEID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001101 Attributes: me.AttributeValueMap{me.GalEthernetProfile_MaximumGemPayloadSize: maxGemPayloadSize},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001102 }
1103 meInstance, omciErr := me.NewGalEthernetProfile(meParams)
1104 if omciErr.GetError() == nil {
1105 //all setByCreate parameters already set, no default option required ...
mpagenko836a1fd2021-11-01 16:12:42 +00001106 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001107 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001108 logger.Errorw(ctx, "Cannot encode GalEnetProfileInstance for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001109 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001110 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001111 }
1112
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001113 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001114 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001115 logger.Errorw(ctx, "Cannot serialize GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001116 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001117 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001118 }
1119
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001120 omciRxCallbackPair := CallbackPair{
1121 CbKey: tid,
1122 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001123 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001124 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001125 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001126 logger.Errorw(ctx, "Cannot send GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001127 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001128 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001129 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001130 logger.Debug(ctx, "send GalEnetProfile-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001131 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001132 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001133 logger.Errorw(ctx, "Cannot generate GalEnetProfileInstance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001134 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001135 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001136}
1137
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001138// SendSetOnu2g sets Onu2G ME instance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001139// might be needed to extend for parameter arguments, here just for setting the ConnectivityMode!!
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001140func (oo *OmciCC) SendSetOnu2g(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1141 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001142 logger.Debugw(ctx, "send ONU2-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001143 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001144
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001145 // ONU-G ME-ID is defined to be 0, but we could verify, if the ONU really supports the desired
1146 // connectivity mode 5 (in ConnCap)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001147 // By now we just use fix values to fire - this is anyway what the python adapter does
1148 // read ONU-2G from DB ???? //TODO!!!
1149 meParams := me.ParamData{
1150 EntityID: 0,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001151 Attributes: me.AttributeValueMap{me.Onu2G_CurrentConnectivityMode: connectivityModeValue},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001152 }
1153 meInstance, omciErr := me.NewOnu2G(meParams)
1154 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001155 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001156 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001157 logger.Errorw(ctx, "Cannot encode ONU2-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001158 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001159 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001160 }
1161
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001162 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001163 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001164 logger.Errorw(ctx, "Cannot serialize ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001165 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001166 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001167 }
1168
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001169 omciRxCallbackPair := CallbackPair{
1170 CbKey: tid,
1171 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001172 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001173 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001174 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001175 logger.Errorw(ctx, "Cannot send ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001176 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001177 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001178 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001179 logger.Debug(ctx, "send ONU2-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001180 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001181 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001182 logger.Errorw(ctx, "Cannot generate ONU2-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001183 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001184 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001185}
1186
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001187// SendCreateMBServiceProfile creates MacBridgeServiceProfile ME instance
1188func (oo *OmciCC) SendCreateMBServiceProfile(ctx context.Context,
1189 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1190 tid := oo.GetNextTid(highPrio)
1191 instID := MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001192 logger.Debugw(ctx, "send MBSP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001193 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001194
1195 meParams := me.ParamData{
1196 EntityID: instID,
1197 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001198 me.MacBridgeServiceProfile_Priority: 0x8000,
1199 me.MacBridgeServiceProfile_MaxAge: 20 * 256, //20s
1200 me.MacBridgeServiceProfile_HelloTime: 2 * 256, //2s
1201 me.MacBridgeServiceProfile_ForwardDelay: 15 * 256, //15s
1202 me.MacBridgeServiceProfile_DynamicFilteringAgeingTime: 0,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001203 },
1204 }
1205
1206 meInstance, omciErr := me.NewMacBridgeServiceProfile(meParams)
1207 if omciErr.GetError() == nil {
1208 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001209 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1210 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001211 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001212 logger.Errorw(ctx, "Cannot encode MBSP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001213 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001214 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001215 }
1216
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001217 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001218 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001219 logger.Errorw(ctx, "Cannot serialize MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001220 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001221 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001222 }
1223
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001224 omciRxCallbackPair := CallbackPair{
1225 CbKey: tid,
1226 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001227 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001228 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001229 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001230 logger.Errorw(ctx, "Cannot send MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001231 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001232 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001233 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001234 logger.Debug(ctx, "send MBSP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001235 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001236 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001237 logger.Errorw(ctx, "Cannot generate MBSP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001238 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001239 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001240}
1241
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001242// SendCreateMBPConfigDataUniSide creates MacBridgePortConfigurationData ME instance
1243func (oo *OmciCC) SendCreateMBPConfigDataUniSide(ctx context.Context,
1244 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1245 tid := oo.GetNextTid(highPrio)
1246 instID, idErr := GenerateUNISideMBPCDEID(uint16(aPUniPort.MacBpNo))
Mahir Gunyel6781f962021-05-16 23:30:08 -07001247 if idErr != nil {
1248 logger.Errorw(ctx, "Cannot generate MBPCD entity id", log.Fields{
1249 "Err": idErr, "device-id": oo.deviceID})
1250 return nil, idErr
1251 }
1252 logger.Debugw(ctx, "send MBPCD-Create-msg for uni side:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001253 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16), "macBpNo": aPUniPort.MacBpNo})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001254
1255 meParams := me.ParamData{
1256 EntityID: instID,
1257 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001258 me.MacBridgePortConfigurationData_BridgeIdPointer: MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo),
1259 me.MacBridgePortConfigurationData_PortNum: aPUniPort.MacBpNo,
1260 me.MacBridgePortConfigurationData_TpType: uint8(aPUniPort.PortType),
1261 me.MacBridgePortConfigurationData_TpPointer: aPUniPort.EntityID,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001262 },
1263 }
1264 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
1265 if omciErr.GetError() == nil {
1266 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001267 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1268 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001269 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001270 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001271 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001272 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001273 }
1274
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001275 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001276 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001277 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001278 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001279 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001280 }
1281
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001282 omciRxCallbackPair := CallbackPair{
1283 CbKey: tid,
1284 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001285 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001286 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001287 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001288 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001289 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001290 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001291 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001292 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001293 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001294 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001295 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001296 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001297 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001298}
1299
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001300// SendCreateEVTOConfigData creates ExtendedVlanTaggingOperationConfigurationData ME instance
1301func (oo *OmciCC) SendCreateEVTOConfigData(ctx context.Context,
1302 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1303 tid := oo.GetNextTid(highPrio)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001304 //same entityId is used as for MBSP (see there), but just arbitrary ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001305 instID := MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001306 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001307 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001308
1309 // compare python adapter code WA VOL-1311: this is not done here!
1310 // (setting TPID values for the create would probably anyway be ignored by the omci lib)
1311 // but perhaps we have to be aware of possible problems at get(Next) Request handling for EVTOOCD tables later ...
1312 assType := uint8(2) // default AssociationType is PPTPEthUni
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001313 if aPUniPort.PortType == UniVEIP {
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001314 assType = uint8(10) // for VEIP
1315 }
1316 meParams := me.ParamData{
1317 EntityID: instID,
1318 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001319 me.ExtendedVlanTaggingOperationConfigurationData_AssociationType: assType,
1320 me.ExtendedVlanTaggingOperationConfigurationData_AssociatedMePointer: aPUniPort.EntityID,
mpagenko836a1fd2021-11-01 16:12:42 +00001321 //EnhancedMode not yet supported, used with default options
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001322 },
1323 }
1324 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(meParams)
1325 if omciErr.GetError() == nil {
1326 //all setByCreate parameters already set, no default option required ...
mpagenko836a1fd2021-11-01 16:12:42 +00001327 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1328 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001329 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001330 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001331 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001332 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001333 }
1334
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001335 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001336 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001337 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001338 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001339 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001340 }
1341
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001342 omciRxCallbackPair := CallbackPair{
1343 CbKey: tid,
1344 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001345 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001346 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001347 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001348 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001349 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001350 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001351 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001352 logger.Debug(ctx, "send EVTOCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001353 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001354 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001355 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001356 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001357 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001358}
1359
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001360// SendSetOnuGLS sets OnuG ME instance
1361func (oo *OmciCC) SendSetOnuGLS(ctx context.Context, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001362 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001363 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001364 logger.Debugw(ctx, "send ONU-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001365 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001366
1367 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1368 meParams := me.ParamData{
1369 EntityID: 0,
1370 Attributes: requestedAttributes,
1371 }
1372 meInstance, omciErr := me.NewOnuG(meParams)
1373 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001374 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001375 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001376 logger.Errorw(ctx, "Cannot encode ONU-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001377 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001378 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001379 }
1380
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001381 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001382 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001383 logger.Errorw(ctx, "Cannot serialize ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001384 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001385 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001386 }
1387
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001388 omciRxCallbackPair := CallbackPair{
1389 CbKey: tid,
1390 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001391 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001392 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001393 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001394 logger.Errorw(ctx, "Cannot send ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001395 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001396 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001397 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001398 logger.Debug(ctx, "send ONU-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001399 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001400 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001401 logger.Errorw(ctx, "Cannot generate ONU-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001402 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001403 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001404}
1405
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001406// SendSetPptpEthUniLS sets PhysicalPathTerminationPointEthernetUni ME instance
1407func (oo *OmciCC) SendSetPptpEthUniLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001408 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001409 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001410 logger.Debugw(ctx, "send PPTPEthUni-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001411 "SequNo": strconv.FormatInt(int64(tid), 16)})
1412
1413 // PPTPEthUni ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1414 meParams := me.ParamData{
1415 EntityID: aInstNo,
1416 Attributes: requestedAttributes,
1417 }
1418 meInstance, omciErr := me.NewPhysicalPathTerminationPointEthernetUni(meParams)
1419 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001420 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001421 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001422 logger.Errorw(ctx, "Cannot encode PPTPEthUni instance for set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001423 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001424 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001425 }
1426
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001427 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001428 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001429 logger.Errorw(ctx, "Cannot serialize PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001430 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001431 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001432 }
1433
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001434 omciRxCallbackPair := CallbackPair{
1435 CbKey: tid,
1436 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001437 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001438 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001439 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001440 logger.Errorw(ctx, "Cannot send PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001441 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001442 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001443 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001444 logger.Debug(ctx, "send PPTPEthUni-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001445 return meInstance, nil
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001446 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001447 logger.Errorw(ctx, "Cannot generate PPTPEthUni", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001448 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001449 return nil, omciErr.GetError()
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001450}
1451
1452/* UniG obsolete by now, left here in case it should be needed once again
1453 UniG AdminState anyway should be ignored by ONU acc. to G988
Himani Chawla6d2ae152020-09-02 13:11:20 +05301454func (oo *omciCC) sendSetUniGLS(ctx context.Context, aInstNo uint16, timeout int,
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001455 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) *me.ManagedEntity {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001456 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001457 logger.Debugw(ctx,"send UNI-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001458 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001459
1460 // UNI-G ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1461 meParams := me.ParamData{
1462 EntityID: aInstNo,
1463 Attributes: requestedAttributes,
1464 }
1465 meInstance, omciErr := me.NewUniG(meParams)
1466 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001467 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001468 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001469 logger.Errorw(ctx,"Cannot encode UNI-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001470 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001471 return nil
1472 }
1473
1474 pkt, err := serializeOmciLayer(omciLayer, msgLayer)
1475 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001476 logger.Errorw(ctx,"Cannot serialize UNI-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001477 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001478 return nil
1479 }
1480
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001481 omciRxCallbackPair := CallbackPair{
1482 CbKey: tid,
1483 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001484 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001485 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001486 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001487 logger.Errorw(ctx,"Cannot send UNIG-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001488 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001489 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001490 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001491 logger.Debug(ctx,"send UNI-G-Set-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001492 return meInstance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001493 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001494 logger.Errorw(ctx,"Cannot generate UNI-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001495 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001496 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001497}
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001498*/
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001499
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001500// SendSetVeipLS sets VirtualEthernetInterfacePoint ME instance
1501func (oo *OmciCC) SendSetVeipLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001502 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001503 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001504 logger.Debugw(ctx, "send VEIP-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001505 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001506
1507 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1508 meParams := me.ParamData{
1509 EntityID: aInstNo,
1510 Attributes: requestedAttributes,
1511 }
1512 meInstance, omciErr := me.NewVirtualEthernetInterfacePoint(meParams)
1513 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001514 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001515 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001516 logger.Errorw(ctx, "Cannot encode VEIP instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001517 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001518 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001519 }
1520
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001521 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001522 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001523 logger.Errorw(ctx, "Cannot serialize VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001524 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001525 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001526 }
1527
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001528 omciRxCallbackPair := CallbackPair{
1529 CbKey: tid,
1530 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001531 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001532 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001533 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001534 logger.Errorw(ctx, "Cannot send VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001535 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001536 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001537 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001538 logger.Debug(ctx, "send VEIP-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001539 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001540 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001541 logger.Errorw(ctx, "Cannot generate VEIP", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001542 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001543 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001544}
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001545
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001546// SendGetMe gets ME instance
1547func (oo *OmciCC) SendGetMe(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributes me.AttributeValueMap,
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001548 timeout int, highPrio bool, rxChan chan Message, isExtendedOmci bool) (*me.ManagedEntity, error) {
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001549
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001550 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001551 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001552 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001553
1554 meParams := me.ParamData{
1555 EntityID: entityID,
1556 Attributes: requestedAttributes,
1557 }
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001558 var messageSet omci.DeviceIdent = omci.BaselineIdent
1559 if isExtendedOmci {
1560 messageSet = omci.ExtendedIdent
1561 }
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001562 meInstance, omciErr := me.LoadManagedEntityDefinition(classID, meParams)
1563 if omciErr.GetError() == nil {
Himani Chawla4d908332020-08-31 12:30:20 +05301564 meClassIDName := meInstance.GetName()
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001565 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.GetRequestType, oframe.TransactionID(tid), oframe.FrameFormat(messageSet))
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001566 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001567 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 +03001568 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001569 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001570 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001571 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001572 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001573 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001574 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001575 omciRxCallbackPair := CallbackPair{
1576 CbKey: tid,
1577 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001578 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001579 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001580 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001581 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001582 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001583 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001584 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": meClassIDName, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001585 return meInstance, nil
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001586 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001587 logger.Errorw(ctx, "Cannot generate meDefinition", log.Fields{"classID": classID, "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001588 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001589}
1590
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001591// SendGetMeWithAttributeMask gets ME instance with attribute mask
1592func (oo *OmciCC) SendGetMeWithAttributeMask(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributesMask uint16,
Himani Chawla43f95ff2021-06-03 00:24:12 +05301593 timeout int, highPrio bool, rxChan chan Message) error {
1594
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001595 tid := oo.GetNextTid(highPrio)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301596 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
1597 "SequNo": strconv.FormatInt(int64(tid), 16)})
1598
1599 request := &omci.GetRequest{
1600 MeBasePacket: omci.MeBasePacket{
1601 EntityInstance: entityID,
1602 EntityClass: classID,
1603 },
1604 AttributeMask: requestedAttributesMask,
1605 }
1606
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001607 pkt, err := Serialize(ctx, omci.GetRequestType, request, tid)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301608 if err != nil {
1609 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1610 return err
1611 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001612 omciRxCallbackPair := CallbackPair{
1613 CbKey: tid,
1614 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Himani Chawla43f95ff2021-06-03 00:24:12 +05301615 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001616 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301617 if err != nil {
1618 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1619 return err
1620 }
1621 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": classID, "device-id": oo.deviceID})
1622 return nil
1623}
1624
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001625// SendCreateDot1PMapper creates Ieee8021PMapperServiceProfile ME instance
1626func (oo *OmciCC) SendCreateDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001627 aInstID uint16, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001628 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001629 logger.Debugw(ctx, "send .1pMapper-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001630 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(aInstID), 16)})
1631
1632 meParams := me.ParamData{
mpagenko8b5fdd22020-12-17 17:58:32 +00001633 EntityID: aInstID,
1634 Attributes: me.AttributeValueMap{
1635 //workaround for unsuitable omci-lib default values, cmp VOL-3729
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001636 me.Ieee8021PMapperServiceProfile_TpPointer: 0xFFFF,
1637 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority0: 0xFFFF,
1638 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority1: 0xFFFF,
1639 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority2: 0xFFFF,
1640 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority3: 0xFFFF,
1641 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority4: 0xFFFF,
1642 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority5: 0xFFFF,
1643 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority6: 0xFFFF,
1644 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority7: 0xFFFF,
mpagenko8b5fdd22020-12-17 17:58:32 +00001645 },
mpagenko3dbcdd22020-07-22 07:38:45 +00001646 }
1647 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
1648 if omciErr.GetError() == nil {
1649 //we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001650 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1651 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001652 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001653 logger.Errorw(ctx, "Cannot encode .1pMapper for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001654 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001655 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001656 }
1657
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001658 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001659 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001660 logger.Errorw(ctx, "Cannot serialize .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001661 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001662 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001663 }
1664
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001665 omciRxCallbackPair := CallbackPair{
1666 CbKey: tid,
1667 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001668 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001669 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001670 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001671 logger.Errorw(ctx, "Cannot send .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001672 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001673 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001674 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001675 logger.Debug(ctx, "send .1pMapper-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001676 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001677 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001678 logger.Errorw(ctx, "Cannot generate .1pMapper", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001679 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001680 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001681}
1682
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001683// SendCreateMBPConfigDataVar creates MacBridgePortConfigurationData ME instance
1684func (oo *OmciCC) SendCreateMBPConfigDataVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001685 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001686 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001687 logger.Debugw(ctx, "send MBPCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001688 "SequNo": strconv.FormatInt(int64(tid), 16),
1689 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1690
1691 meInstance, omciErr := me.NewMacBridgePortConfigurationData(params[0])
1692 if omciErr.GetError() == nil {
1693 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001694 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1695 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001696 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001697 logger.Errorw(ctx, "Cannot encode MBPCD for 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 }
1701
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001702 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001703 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001704 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001705 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001706 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001707 }
1708
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001709 omciRxCallbackPair := CallbackPair{
1710 CbKey: tid,
1711 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001712 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001713 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001714 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001715 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001716 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001717 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001718 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001719 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001720 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001721 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001722 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001723 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001724 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001725}
1726
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001727// SendCreateGemNCTPVar creates GemPortNetworkCtp ME instance
1728func (oo *OmciCC) SendCreateGemNCTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001729 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001730 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001731 logger.Debugw(ctx, "send GemNCTP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001732 "SequNo": strconv.FormatInt(int64(tid), 16),
1733 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1734
1735 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1736 if omciErr.GetError() == nil {
1737 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001738 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1739 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001740 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001741 logger.Errorw(ctx, "Cannot encode GemNCTP for 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 }
1745
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001746 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001747 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001748 logger.Errorw(ctx, "Cannot serialize GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001749 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001750 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001751 }
1752
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001753 omciRxCallbackPair := CallbackPair{
1754 CbKey: tid,
1755 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001756 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001757 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001758 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001759 logger.Errorw(ctx, "Cannot send GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001760 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001761 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001762 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001763 logger.Debug(ctx, "send GemNCTP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001764 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001765 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001766 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001767 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001768 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001769}
1770
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001771// SendSetGemNCTPVar sets GemPortNetworkCtp ME instance
1772func (oo *OmciCC) SendSetGemNCTPVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
1773 tid := oo.GetNextTid(highPrio)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001774 logger.Debugw(ctx, "send GemNCTP-Set-msg:", log.Fields{"device-id": oo.deviceID,
1775 "SequNo": strconv.FormatInt(int64(tid), 16),
1776 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1777
1778 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1779 if omciErr.GetError() == nil {
1780 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001781 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType,
1782 oframe.TransactionID(tid), oframe.AddDefaults(true))
ozgecanetsia82b91a62021-05-21 18:54:49 +03001783 if err != nil {
1784 logger.Errorw(ctx, "Cannot encode GemNCTP for set", log.Fields{
1785 "Err": err, "device-id": oo.deviceID})
1786 return nil, err
1787 }
1788
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001789 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001790 if err != nil {
1791 logger.Errorw(ctx, "Cannot serialize GemNCTP set", log.Fields{
1792 "Err": err, "device-id": oo.deviceID})
1793 return nil, err
1794 }
1795
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001796 omciRxCallbackPair := CallbackPair{
1797 CbKey: tid,
1798 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia82b91a62021-05-21 18:54:49 +03001799 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001800 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001801 if err != nil {
1802 logger.Errorw(ctx, "Cannot send GemNCTP set", log.Fields{
1803 "Err": err, "device-id": oo.deviceID})
1804 return nil, err
1805 }
1806 logger.Debug(ctx, "send GemNCTP-Set-msg done", log.Fields{"device-id": oo.deviceID})
1807 return meInstance, nil
1808 }
1809 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
1810 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1811 return nil, omciErr.GetError()
1812}
1813
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001814// SendCreateGemIWTPVar creates GemInterworkingTerminationPoint ME instance
1815func (oo *OmciCC) SendCreateGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001816 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001817 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001818 logger.Debugw(ctx, "send GemIwTp-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001819 "SequNo": strconv.FormatInt(int64(tid), 16),
1820 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1821
1822 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(params[0])
1823 if omciErr.GetError() == nil {
1824 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
mpagenko836a1fd2021-11-01 16:12:42 +00001825 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1826 oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001827 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001828 logger.Errorw(ctx, "Cannot encode GemIwTp for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001829 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001830 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001831 }
1832
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001833 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001834 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001835 logger.Errorw(ctx, "Cannot serialize GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001836 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001837 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001838 }
1839
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001840 omciRxCallbackPair := CallbackPair{
1841 CbKey: tid,
1842 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001843 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001844 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001845 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001846 logger.Errorw(ctx, "Cannot send GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001847 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001848 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001849 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001850 logger.Debug(ctx, "send GemIwTp-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001851 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001852 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001853 logger.Errorw(ctx, "Cannot generate GemIwTp Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001854 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001855 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001856}
1857
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001858// SendSetTcontVar sets TCont ME instance
1859func (oo *OmciCC) SendSetTcontVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001860 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001861 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001862 logger.Debugw(ctx, "send TCont-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001863 "SequNo": strconv.FormatInt(int64(tid), 16),
1864 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1865
1866 meInstance, omciErr := me.NewTCont(params[0])
1867 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001868 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001869 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001870 logger.Errorw(ctx, "Cannot encode TCont for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001871 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001872 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001873 }
1874
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001875 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001876 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001877 logger.Errorw(ctx, "Cannot serialize TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001878 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001879 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001880 }
1881
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001882 omciRxCallbackPair := CallbackPair{
1883 CbKey: tid,
1884 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001885 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001886 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001887 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001888 logger.Errorw(ctx, "Cannot send TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001889 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001890 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001891 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001892 logger.Debug(ctx, "send TCont-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001893 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001894 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001895 logger.Errorw(ctx, "Cannot generate TCont Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001896 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001897 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001898}
1899
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001900// SendSetPrioQueueVar sets PriorityQueue ME instance
1901func (oo *OmciCC) SendSetPrioQueueVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001902 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001903 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001904 logger.Debugw(ctx, "send PrioQueue-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001905 "SequNo": strconv.FormatInt(int64(tid), 16),
1906 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1907
1908 meInstance, omciErr := me.NewPriorityQueue(params[0])
1909 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001910 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001911 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001912 logger.Errorw(ctx, "Cannot encode PrioQueue for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001913 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001914 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001915 }
1916
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001917 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001918 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001919 logger.Errorw(ctx, "Cannot serialize PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001920 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001921 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001922 }
1923
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001924 omciRxCallbackPair := CallbackPair{
1925 CbKey: tid,
1926 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001927 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001928 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001929 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001930 logger.Errorw(ctx, "Cannot send PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001931 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001932 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001933 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001934 logger.Debug(ctx, "send PrioQueue-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001935 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001936 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001937 logger.Errorw(ctx, "Cannot generate PrioQueue Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001938 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001939 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001940}
1941
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001942// SendSetDot1PMapperVar sets Ieee8021PMapperServiceProfile ME instance
1943func (oo *OmciCC) SendSetDot1PMapperVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001944 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001945 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001946 logger.Debugw(ctx, "send 1PMapper-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001947 "SequNo": strconv.FormatInt(int64(tid), 16),
1948 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1949
1950 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(params[0])
1951 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001952 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001953 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001954 logger.Errorw(ctx, "Cannot encode 1PMapper for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001955 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001956 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001957 }
1958
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001959 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001960 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001961 logger.Errorw(ctx, "Cannot serialize 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001962 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001963 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001964 }
1965
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001966 omciRxCallbackPair := CallbackPair{
1967 CbKey: tid,
1968 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001969 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001970 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001971 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001972 logger.Errorw(ctx, "Cannot send 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001973 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001974 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001975 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001976 logger.Debug(ctx, "send 1PMapper-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001977 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001978 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001979 logger.Errorw(ctx, "Cannot generate 1PMapper Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001980 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001981 return nil, omciErr.GetError()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001982}
mpagenkodff5dda2020-08-28 11:52:01 +00001983
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001984// SendCreateVtfdVar creates VlanTaggingFilterData ME instance
1985func (oo *OmciCC) SendCreateVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001986 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001987 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001988 logger.Debugw(ctx, "send VTFD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00001989 "SequNo": strconv.FormatInt(int64(tid), 16),
1990 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1991
1992 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
1993 if omciErr.GetError() == nil {
1994 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
mpagenko836a1fd2021-11-01 16:12:42 +00001995 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1996 oframe.TransactionID(tid))
mpagenkodff5dda2020-08-28 11:52:01 +00001997 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001998 logger.Errorw(ctx, "Cannot encode VTFD for create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001999 "Err": err, "device-id": oo.deviceID})
2000 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2001 // return (dual format) error code that can be used at caller for immediate error treatment
2002 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002003 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002004 }
2005
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002006 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00002007 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002008 logger.Errorw(ctx, "Cannot serialize VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002009 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002010 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002011 }
2012
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002013 omciRxCallbackPair := CallbackPair{
2014 CbKey: tid,
2015 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00002016 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002017 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00002018 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002019 logger.Errorw(ctx, "Cannot send VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002020 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002021 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002022 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002023 logger.Debug(ctx, "send VTFD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002024 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00002025 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002026 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002027 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002028 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00002029}
2030
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002031// nolint: unused
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002032func (oo *OmciCC) sendSetVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002033 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002034 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002035 logger.Debugw(ctx, "send VTFD-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002036 "SequNo": strconv.FormatInt(int64(tid), 16),
2037 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2038
2039 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
2040 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002041 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType,
2042 oframe.TransactionID(tid))
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002043 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002044 logger.Errorw(ctx, "Cannot encode VTFD for set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002045 "Err": err, "device-id": oo.deviceID})
2046 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2047 // return (dual format) error code that can be used at caller for immediate error treatment
2048 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002049 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002050 }
2051
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002052 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002053 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002054 logger.Errorw(ctx, "Cannot serialize VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002055 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002056 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002057 }
2058
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002059 omciRxCallbackPair := CallbackPair{
2060 CbKey: tid,
2061 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002062 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002063 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002064 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002065 logger.Errorw(ctx, "Cannot send VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002066 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002067 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002068 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002069 logger.Debug(ctx, "send VTFD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002070 return meInstance, nil
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002071 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002072 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002073 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002074 return nil, omciErr.GetError()
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002075}
2076
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002077// SendCreateEvtocdVar creates ExtendedVlanTaggingOperationConfigurationData ME instance
2078func (oo *OmciCC) SendCreateEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002079 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002080 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002081 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002082 "SequNo": strconv.FormatInt(int64(tid), 16),
2083 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2084
2085 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2086 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002087 //EnhancedMode not yet supported, used with default options
2088 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
2089 oframe.TransactionID(tid), oframe.AddDefaults(true))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002090 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002091 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002092 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002093 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002094 }
2095
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002096 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002097 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002098 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002099 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002100 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002101 }
2102
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002103 omciRxCallbackPair := CallbackPair{
2104 CbKey: tid,
2105 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002106 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002107 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002108 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002109 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002110 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002111 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002112 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002113 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002114 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002115 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002116 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002117 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002118 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002119}
2120
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002121// SendSetEvtocdVar sets ExtendedVlanTaggingOperationConfigurationData ME instance
2122func (oo *OmciCC) SendSetEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002123 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002124 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002125 logger.Debugw(ctx, "send EVTOCD-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002126 "SequNo": strconv.FormatInt(int64(tid), 16),
2127 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2128
2129 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2130 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002131 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenkodff5dda2020-08-28 11:52:01 +00002132 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002133 logger.Errorw(ctx, "Cannot encode EVTOCD for set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002134 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002135 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002136 }
2137
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002138 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00002139 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002140 logger.Errorw(ctx, "Cannot serialize EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002141 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002142 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002143 }
2144
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002145 omciRxCallbackPair := CallbackPair{
2146 CbKey: tid,
2147 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00002148 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002149 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00002150 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002151 logger.Errorw(ctx, "Cannot send EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002152 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002153 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002154 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002155 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002156 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00002157 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002158 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002159 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002160 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00002161}
mpagenko01e726e2020-10-23 09:45:29 +00002162
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002163// SendDeleteEvtocd deletes ExtendedVlanTaggingOperationConfigurationData ME instance
2164func (oo *OmciCC) SendDeleteEvtocd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002165 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002166 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002167 logger.Debugw(ctx, "send EVTOCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002168 "SequNo": strconv.FormatInt(int64(tid), 16),
2169 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2170
2171 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2172 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002173 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002174 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002175 logger.Errorw(ctx, "Cannot encode EVTOCD for delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002176 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002177 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002178 }
2179
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002180 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002181 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002182 logger.Errorw(ctx, "Cannot serialize EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002183 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002184 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002185 }
2186
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002187 omciRxCallbackPair := CallbackPair{
2188 CbKey: tid,
2189 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002190 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002191 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002192 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002193 logger.Errorw(ctx, "Cannot send EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002194 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002195 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002196 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002197 logger.Debug(ctx, "send EVTOCD-delete msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002198 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002199 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002200 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002201 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002202 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002203}
2204
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002205// SendDeleteVtfd deletes VlanTaggingFilterData ME instance
2206func (oo *OmciCC) SendDeleteVtfd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002207 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002208 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002209 logger.Debugw(ctx, "send VTFD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko01e726e2020-10-23 09:45:29 +00002210 "SequNo": strconv.FormatInt(int64(tid), 16),
2211 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2212
2213 meParams := me.ParamData{EntityID: aInstID}
2214 meInstance, omciErr := me.NewVlanTaggingFilterData(meParams)
2215 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002216 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2217 oframe.TransactionID(tid))
mpagenko01e726e2020-10-23 09:45:29 +00002218 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002219 logger.Errorw(ctx, "Cannot encode VTFD for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002220 "Err": err, "device-id": oo.deviceID})
2221 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2222 // return (dual format) error code that can be used at caller for immediate error treatment
2223 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002224 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002225 }
2226
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002227 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko01e726e2020-10-23 09:45:29 +00002228 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002229 logger.Errorw(ctx, "Cannot serialize VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002230 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002231 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002232 }
2233
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002234 omciRxCallbackPair := CallbackPair{
2235 CbKey: tid,
2236 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko01e726e2020-10-23 09:45:29 +00002237 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002238 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko01e726e2020-10-23 09:45:29 +00002239 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002240 logger.Errorw(ctx, "Cannot send VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002241 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002242 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002243 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002244 logger.Debug(ctx, "send VTFD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002245 return meInstance, nil
mpagenko01e726e2020-10-23 09:45:29 +00002246 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002247 logger.Errorw(ctx, "Cannot generate VTFD Instance for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002248 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002249 return nil, omciErr.GetError()
mpagenko01e726e2020-10-23 09:45:29 +00002250}
ozgecanetsia422dbf32020-10-28 14:07:19 +03002251
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002252// SendCreateTDVar creates TrafficDescriptor ME instance
2253func (oo *OmciCC) SendCreateTDVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2254 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002255 logger.Debugw(ctx, "send TD-Create-msg:", log.Fields{"device-id": oo.deviceID,
2256 "SequNo": strconv.FormatInt(int64(tid), 16),
2257 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2258 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2259 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002260 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002261 if err != nil {
2262 logger.Errorw(ctx, "Cannot encode TD for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002263 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002264 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002265 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002266 if err != nil {
2267 logger.Errorw(ctx, "Cannot serialize TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002268 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002269 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002270 omciRxCallbackPair := CallbackPair{
2271 CbKey: tid,
2272 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002273 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002274 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002275 if err != nil {
2276 logger.Errorw(ctx, "Cannot send TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002277 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002278 }
2279 logger.Debug(ctx, "send TD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002280 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002281 }
2282 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002283 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002284}
2285
2286// nolint: unused
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002287func (oo *OmciCC) sendSetTDVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002288 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002289 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002290 logger.Debugw(ctx, "send TD-Set-msg:", log.Fields{"device-id": oo.deviceID,
2291 "SequNo": strconv.FormatInt(int64(tid), 16),
2292 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2293
2294 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2295 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002296 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002297 if err != nil {
2298 logger.Errorw(ctx, "Cannot encode TD for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002299 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002300 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002301 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002302 if err != nil {
2303 logger.Errorw(ctx, "Cannot serialize TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002304 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002305 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002306 omciRxCallbackPair := CallbackPair{
2307 CbKey: tid,
2308 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002309 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002310 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002311 if err != nil {
2312 logger.Errorw(ctx, "Cannot send TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002313 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002314 }
2315 logger.Debug(ctx, "send TD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002316 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002317 }
2318 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002319 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002320
2321}
2322
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002323// SendDeleteTD - TODO: add comment
2324func (oo *OmciCC) SendDeleteTD(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002325 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002326 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002327 logger.Debugw(ctx, "send TD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2328 "SequNo": strconv.FormatInt(int64(tid), 16),
2329 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2330
2331 meParams := me.ParamData{EntityID: aInstID}
2332 meInstance, omciErr := me.NewTrafficDescriptor(meParams)
2333 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002334 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002335 if err != nil {
2336 logger.Errorw(ctx, "Cannot encode TD for delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002337 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002338 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002339 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002340 if err != nil {
2341 logger.Errorw(ctx, "Cannot serialize TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002342 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002343 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002344 omciRxCallbackPair := CallbackPair{
2345 CbKey: tid,
2346 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002347 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002348 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002349 if err != nil {
2350 logger.Errorw(ctx, "Cannot send TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002351 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002352 }
2353 logger.Debug(ctx, "send TD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002354 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002355 }
2356 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002357 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002358
2359}
2360
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002361// SendDeleteGemIWTP deletes GemInterworkingTerminationPoint ME instance
2362func (oo *OmciCC) SendDeleteGemIWTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002363 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002364 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002365 logger.Debugw(ctx, "send GemIwTp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002366 "SequNo": strconv.FormatInt(int64(tid), 16),
2367 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2368
2369 meParams := me.ParamData{EntityID: aInstID}
2370 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(meParams)
2371 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002372 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2373 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002374 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002375 logger.Errorw(ctx, "Cannot encode GemIwTp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002376 "Err": err, "device-id": oo.deviceID})
2377 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2378 // return (dual format) error code that can be used at caller for immediate error treatment
2379 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002380 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002381 }
2382
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002383 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002384 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002385 logger.Errorw(ctx, "Cannot serialize GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002386 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002387 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002388 }
2389
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002390 omciRxCallbackPair := CallbackPair{
2391 CbKey: tid,
2392 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002393 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002394 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002395 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002396 logger.Errorw(ctx, "Cannot send GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002397 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002398 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002399 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002400 logger.Debug(ctx, "send GemIwTp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002401 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002402 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002403 logger.Errorw(ctx, "Cannot generate GemIwTp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002404 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002405 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002406}
2407
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002408// SendDeleteGemNCTP deletes GemPortNetworkCtp ME instance
2409func (oo *OmciCC) SendDeleteGemNCTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002410 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002411 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002412 logger.Debugw(ctx, "send GemNCtp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002413 "SequNo": strconv.FormatInt(int64(tid), 16),
2414 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2415
2416 meParams := me.ParamData{EntityID: aInstID}
2417 meInstance, omciErr := me.NewGemPortNetworkCtp(meParams)
2418 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002419 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2420 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002421 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002422 logger.Errorw(ctx, "Cannot encode GemNCtp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002423 "Err": err, "device-id": oo.deviceID})
2424 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2425 // return (dual format) error code that can be used at caller for immediate error treatment
2426 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002427 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002428 }
2429
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002430 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002431 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002432 logger.Errorw(ctx, "Cannot serialize GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002433 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002434 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002435 }
2436
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002437 omciRxCallbackPair := CallbackPair{
2438 CbKey: tid,
2439 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002440 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002441 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002442 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002443 logger.Errorw(ctx, "Cannot send GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002444 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002445 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002446 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002447 logger.Debug(ctx, "send GemNCtp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002448 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002449 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002450 logger.Errorw(ctx, "Cannot generate GemNCtp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002451 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002452 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002453}
2454
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002455// SendDeleteDot1PMapper deletes Ieee8021PMapperServiceProfile ME instance
2456func (oo *OmciCC) SendDeleteDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002457 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002458 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002459 logger.Debugw(ctx, "send .1pMapper-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002460 "SequNo": strconv.FormatInt(int64(tid), 16),
2461 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2462
2463 meParams := me.ParamData{EntityID: aInstID}
2464 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
2465 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002466 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2467 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002468 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002469 logger.Errorw(ctx, "Cannot encode .1pMapper for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002470 "Err": err, "device-id": oo.deviceID})
2471 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2472 // return (dual format) error code that can be used at caller for immediate error treatment
2473 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002474 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002475 }
2476
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002477 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002478 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002479 logger.Errorw(ctx, "Cannot serialize .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002480 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002481 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002482 }
2483
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002484 omciRxCallbackPair := CallbackPair{
2485 CbKey: tid,
2486 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002487 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002488 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002489 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002490 logger.Errorw(ctx, "Cannot send .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002491 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002492 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002493 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002494 logger.Debug(ctx, "send .1pMapper-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002495 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002496 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002497 logger.Errorw(ctx, "Cannot generate .1pMapper Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002498 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002499 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002500}
2501
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002502// SendDeleteMBPConfigData deletes MacBridgePortConfigurationData ME instance
2503func (oo *OmciCC) SendDeleteMBPConfigData(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002504 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002505 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002506 logger.Debugw(ctx, "send MBPCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002507 "SequNo": strconv.FormatInt(int64(tid), 16),
2508 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2509
2510 meParams := me.ParamData{EntityID: aInstID}
2511 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
2512 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002513 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2514 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002515 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002516 logger.Errorw(ctx, "Cannot encode MBPCD for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002517 "Err": err, "device-id": oo.deviceID})
2518 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2519 // return (dual format) error code that can be used at caller for immediate error treatment
2520 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002521 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002522 }
2523
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002524 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002525 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002526 logger.Errorw(ctx, "Cannot serialize MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002527 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002528 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002529 }
2530
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002531 omciRxCallbackPair := CallbackPair{
2532 CbKey: tid,
2533 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002534 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002535 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002536 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002537 logger.Errorw(ctx, "Cannot send MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002538 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002539 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002540 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002541 logger.Debug(ctx, "send MBPCD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002542 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002543 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002544 logger.Errorw(ctx, "Cannot generate MBPCD Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002545 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002546 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002547}
2548
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002549// SendCreateMulticastGemIWTPVar creates MulticastGemInterworkingTerminationPoint ME instance
2550func (oo *OmciCC) SendCreateMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002551 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002552 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002553 logger.Debugw(ctx, "send MulticastGemIWTP-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002554 "SequNo": strconv.FormatInt(int64(tid), 16),
2555 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2556
2557 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2558 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002559 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2560 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002561 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002562 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002563 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002564 }
2565
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002566 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002567 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002568 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002569 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002570 }
2571
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002572 omciRxCallbackPair := CallbackPair{CbKey: tid,
2573 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002574 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002575 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002576 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002577 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002578 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002579 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002580 logger.Debug(ctx, "send MulticastGEMIWTP-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002581 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002582 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002583 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002584 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002585 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002586}
2587
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002588// SendSetMulticastGemIWTPVar sets MulticastGemInterworkingTerminationPoint ME instance
2589func (oo *OmciCC) SendSetMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002590 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002591 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002592 logger.Debugw(ctx, "send MulticastGemIWTP-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002593 "SequNo": strconv.FormatInt(int64(tid), 16),
2594 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2595
2596 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2597 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002598 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2599 oframe.AddDefaults(true))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002600 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002601 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002602 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002603 }
2604
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002605 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002606 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002607 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002608 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002609 }
2610
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002611 omciRxCallbackPair := CallbackPair{CbKey: tid,
2612 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002613 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002614 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002615 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002616 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002617 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002618 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002619 logger.Debug(ctx, "send MulticastGEMIWTP-set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002620 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002621 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002622 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002623 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002624 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002625}
2626
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002627// SendCreateMulticastOperationProfileVar creates MulticastOperationsProfile ME instance
2628func (oo *OmciCC) SendCreateMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002629 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002630 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002631 logger.Debugw(ctx, "send MulticastOperationProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002632 "SequNo": strconv.FormatInt(int64(tid), 16),
2633 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2634
2635 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2636 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002637 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2638 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002639 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002640 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002641 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002642 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002643 }
2644
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002645 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002646 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002647 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002648 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002649 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002650 }
2651
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002652 omciRxCallbackPair := CallbackPair{CbKey: tid,
2653 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002654 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002655 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002656 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002657 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002658 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002659 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002660 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002661 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002662 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002663 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002664 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002665 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002666 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002667}
2668
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002669// SendSetMulticastOperationProfileVar sets MulticastOperationsProfile ME instance
2670func (oo *OmciCC) SendSetMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002671 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002672 tid := oo.GetNextTid(highPrio)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002673 logger.Debugw(ctx, "send MulticastOperationProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002674 "SequNo": strconv.FormatInt(int64(tid), 16),
2675 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2676
2677 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2678 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002679 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2680 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002681 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002682 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002683 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002684 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002685 }
2686
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002687 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002688 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002689 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002690 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002691 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002692 }
2693
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002694 omciRxCallbackPair := CallbackPair{CbKey: tid,
2695 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002696 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002697 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002698 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002699 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002700 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002701 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002702 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002703 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002704 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002705 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002706 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002707 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002708 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002709}
2710
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002711// SendCreateMulticastSubConfigInfoVar creates MulticastSubscriberConfigInfo ME instance
2712func (oo *OmciCC) SendCreateMulticastSubConfigInfoVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002713 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002714 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002715 logger.Debugw(ctx, "send MulticastSubConfigInfo-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002716 "SequNo": strconv.FormatInt(int64(tid), 16),
2717 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2718
2719 meInstance, omciErr := me.NewMulticastSubscriberConfigInfo(params[0])
2720 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002721 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2722 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002723 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002724 logger.Errorw(ctx, "Cannot encode MulticastSubConfigInfo for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002725 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002726 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002727 }
2728
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002729 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002730 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002731 logger.Errorw(ctx, "Cannot serialize MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002732 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002733 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002734 }
2735
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002736 omciRxCallbackPair := CallbackPair{CbKey: tid,
2737 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002738 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002739 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002740 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002741 logger.Errorw(ctx, "Cannot send MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002742 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002743 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002744 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002745 logger.Debug(ctx, "send MulticastSubConfigInfo-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002746 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002747 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002748 logger.Errorw(ctx, "Cannot generate MulticastSubConfigInfo Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002749 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002750 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002751}
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00002752
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002753// SendCreateVoipVoiceCTP nolint: unused
2754func (oo *OmciCC) SendCreateVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2755 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2756 tid := oo.GetNextTid(highPrio)
2757 logger.Debugw(ctx, "send VoipVoiceCTP-create-msg:", log.Fields{"device-id": oo.deviceID,
2758 "SequNo": strconv.FormatInt(int64(tid), 16),
2759 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2760
2761 meInstance, omciErr := me.NewVoipVoiceCtp(params[0])
2762 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002763 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2764 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002765 if err != nil {
2766 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for create", log.Fields{"Err": err,
2767 "device-id": oo.deviceID})
2768 return nil, err
2769 }
2770
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002771 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002772 if err != nil {
2773 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP create", log.Fields{"Err": err,
2774 "device-id": oo.deviceID})
2775 return nil, err
2776 }
2777
2778 omciRxCallbackPair := CallbackPair{CbKey: tid,
2779 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2780 }
2781 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2782 if err != nil {
2783 logger.Errorw(ctx, "Cannot send VoipVoiceCTP create", log.Fields{"Err": err,
2784 "device-id": oo.deviceID})
2785 return nil, err
2786 }
2787 logger.Debug(ctx, "send VoipVoiceCTP-create-msg done")
2788 return meInstance, nil
2789 }
2790 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance", log.Fields{"Err": omciErr.GetError(),
2791 "device-id": oo.deviceID})
2792 return nil, omciErr.GetError()
2793}
2794
2795// SendSetVoipVoiceCTP nolint: unused
2796func (oo *OmciCC) SendSetVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2797 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2798 tid := oo.GetNextTid(highPrio)
2799 logger.Debugw(ctx, "send VoipVoiceCTP-set-msg:", log.Fields{"device-id": oo.deviceID,
2800 "SequNo": strconv.FormatInt(int64(tid), 16),
2801 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2802
2803 meInstance, omciErr := me.NewVoipVoiceCtp(params[0])
2804 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002805 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2806 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002807 if err != nil {
2808 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for set", log.Fields{"Err": err,
2809 "device-id": oo.deviceID})
2810 return nil, err
2811 }
2812
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002813 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002814 if err != nil {
2815 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP set", log.Fields{"Err": err,
2816 "device-id": oo.deviceID})
2817 return nil, err
2818 }
2819
2820 omciRxCallbackPair := CallbackPair{CbKey: tid,
2821 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2822 }
2823 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2824 if err != nil {
2825 logger.Errorw(ctx, "Cannot send VoipVoiceCTP set", log.Fields{"Err": err,
2826 "device-id": oo.deviceID})
2827 return nil, err
2828 }
2829 logger.Debug(ctx, "send VoipVoiceCTP-set-msg done")
2830 return meInstance, nil
2831 }
2832 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance", log.Fields{"Err": omciErr.GetError(),
2833 "device-id": oo.deviceID})
2834 return nil, omciErr.GetError()
2835}
2836
2837// SendDeleteVoipVoiceCTP nolint: unused
2838func (oo *OmciCC) SendDeleteVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2839 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
2840 tid := oo.GetNextTid(highPrio)
2841 logger.Debugw(ctx, "send VoipVoiceCTP-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2842 "SequNo": strconv.FormatInt(int64(tid), 16),
2843 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2844
2845 meParams := me.ParamData{EntityID: aInstID}
2846 meInstance, omciErr := me.NewVoipVoiceCtp(meParams)
2847 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002848 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2849 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002850 if err != nil {
2851 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for delete", log.Fields{
2852 "Err": err, "device-id": oo.deviceID})
2853 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2854 // return (dual format) error code that can be used at caller for immediate error treatment
2855 // (relevant to all used sendXX() methods and their error conditions)
2856 return nil, err
2857 }
2858
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002859 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002860 if err != nil {
2861 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP delete", log.Fields{
2862 "Err": err, "device-id": oo.deviceID})
2863 return nil, err
2864 }
2865
2866 omciRxCallbackPair := CallbackPair{
2867 CbKey: tid,
2868 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2869 }
2870 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2871 if err != nil {
2872 logger.Errorw(ctx, "Cannot send VoipVoiceCTP delete", log.Fields{
2873 "Err": err, "device-id": oo.deviceID})
2874 return nil, err
2875 }
2876 logger.Debug(ctx, "send VoipVoiceCTP-Delete-msg done")
2877 return meInstance, nil
2878 }
2879 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance for delete", log.Fields{
2880 "Err": omciErr.GetError(), "device-id": oo.deviceID})
2881 return nil, omciErr.GetError()
2882}
2883
2884// SendCreateVoipMediaProfile nolint: unused
2885func (oo *OmciCC) SendCreateVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2886 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2887 tid := oo.GetNextTid(highPrio)
2888 logger.Debugw(ctx, "send VoipMediaProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
2889 "SequNo": strconv.FormatInt(int64(tid), 16),
2890 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2891
2892 meInstance, omciErr := me.NewVoipMediaProfile(params[0])
2893 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002894 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2895 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002896 if err != nil {
2897 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for create", log.Fields{"Err": err,
2898 "device-id": oo.deviceID})
2899 return nil, err
2900 }
2901
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002902 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002903 if err != nil {
2904 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile create", log.Fields{"Err": err,
2905 "device-id": oo.deviceID})
2906 return nil, err
2907 }
2908
2909 omciRxCallbackPair := CallbackPair{CbKey: tid,
2910 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2911 }
2912 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2913 if err != nil {
2914 logger.Errorw(ctx, "Cannot send VoipMediaProfile create", log.Fields{"Err": err,
2915 "device-id": oo.deviceID})
2916 return nil, err
2917 }
2918 logger.Debug(ctx, "send VoipMediaProfile-create-msg done")
2919 return meInstance, nil
2920 }
2921 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance", log.Fields{"Err": omciErr.GetError(),
2922 "device-id": oo.deviceID})
2923 return nil, omciErr.GetError()
2924}
2925
2926// SendSetVoipMediaProfile nolint: unused
2927func (oo *OmciCC) SendSetVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2928 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2929 tid := oo.GetNextTid(highPrio)
2930 logger.Debugw(ctx, "send VoipMediaProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
2931 "SequNo": strconv.FormatInt(int64(tid), 16),
2932 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2933
2934 meInstance, omciErr := me.NewVoipMediaProfile(params[0])
2935 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002936 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2937 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002938 if err != nil {
2939 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for set", log.Fields{"Err": err,
2940 "device-id": oo.deviceID})
2941 return nil, err
2942 }
2943
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002944 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002945 if err != nil {
2946 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile set", log.Fields{"Err": err,
2947 "device-id": oo.deviceID})
2948 return nil, err
2949 }
2950
2951 omciRxCallbackPair := CallbackPair{CbKey: tid,
2952 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2953 }
2954 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2955 if err != nil {
2956 logger.Errorw(ctx, "Cannot send VoipMediaProfile set", log.Fields{"Err": err,
2957 "device-id": oo.deviceID})
2958 return nil, err
2959 }
2960 logger.Debug(ctx, "send VoipMediaProfile-set-msg done")
2961 return meInstance, nil
2962 }
2963 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance", log.Fields{"Err": omciErr.GetError(),
2964 "device-id": oo.deviceID})
2965 return nil, omciErr.GetError()
2966}
2967
2968// SendDeleteVoipMediaProfile nolint: unused
2969func (oo *OmciCC) SendDeleteVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2970 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
2971 tid := oo.GetNextTid(highPrio)
2972 logger.Debugw(ctx, "send VoipMediaProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2973 "SequNo": strconv.FormatInt(int64(tid), 16),
2974 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2975
2976 meParams := me.ParamData{EntityID: aInstID}
2977 meInstance, omciErr := me.NewVoipMediaProfile(meParams)
2978 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002979 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2980 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002981 if err != nil {
2982 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for delete", log.Fields{
2983 "Err": err, "device-id": oo.deviceID})
2984 return nil, err
2985 }
2986
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002987 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002988 if err != nil {
2989 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile delete", log.Fields{
2990 "Err": err, "device-id": oo.deviceID})
2991 return nil, err
2992 }
2993
2994 omciRxCallbackPair := CallbackPair{
2995 CbKey: tid,
2996 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2997 }
2998 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2999 if err != nil {
3000 logger.Errorw(ctx, "Cannot send VoipMediaProfile delete", log.Fields{
3001 "Err": err, "device-id": oo.deviceID})
3002 return nil, err
3003 }
3004 logger.Debug(ctx, "send VoipMediaProfile-Delete-msg done")
3005 return meInstance, nil
3006 }
3007 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance for delete", log.Fields{
3008 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3009 return nil, omciErr.GetError()
3010}
3011
3012// SendCreateVoiceServiceProfile nolint: unused
3013func (oo *OmciCC) SendCreateVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3014 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3015 tid := oo.GetNextTid(highPrio)
3016 logger.Debugw(ctx, "send VoiceServiceProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
3017 "SequNo": strconv.FormatInt(int64(tid), 16),
3018 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3019
3020 meInstance, omciErr := me.NewVoiceServiceProfile(params[0])
3021 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003022 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3023 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003024 if err != nil {
3025 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for create", log.Fields{"Err": err,
3026 "device-id": oo.deviceID})
3027 return nil, err
3028 }
3029
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003030 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003031 if err != nil {
3032 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile create", log.Fields{"Err": err,
3033 "device-id": oo.deviceID})
3034 return nil, err
3035 }
3036
3037 omciRxCallbackPair := CallbackPair{CbKey: tid,
3038 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3039 }
3040 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3041 if err != nil {
3042 logger.Errorw(ctx, "Cannot send VoiceServiceProfile create", log.Fields{"Err": err,
3043 "device-id": oo.deviceID})
3044 return nil, err
3045 }
3046 logger.Debug(ctx, "send VoiceServiceProfile-create-msg done")
3047 return meInstance, nil
3048 }
3049 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3050 "device-id": oo.deviceID})
3051 return nil, omciErr.GetError()
3052}
3053
3054// SendSetVoiceServiceProfile nolint: unused
3055func (oo *OmciCC) SendSetVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3056 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3057 tid := oo.GetNextTid(highPrio)
3058 logger.Debugw(ctx, "send VoiceServiceProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
3059 "SequNo": strconv.FormatInt(int64(tid), 16),
3060 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3061
3062 meInstance, omciErr := me.NewVoiceServiceProfile(params[0])
3063 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003064 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3065 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003066 if err != nil {
3067 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for set", log.Fields{"Err": err,
3068 "device-id": oo.deviceID})
3069 return nil, err
3070 }
3071
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003072 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003073 if err != nil {
3074 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile set", log.Fields{"Err": err,
3075 "device-id": oo.deviceID})
3076 return nil, err
3077 }
3078
3079 omciRxCallbackPair := CallbackPair{CbKey: tid,
3080 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3081 }
3082 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3083 if err != nil {
3084 logger.Errorw(ctx, "Cannot send VoiceServiceProfile set", log.Fields{"Err": err,
3085 "device-id": oo.deviceID})
3086 return nil, err
3087 }
3088 logger.Debug(ctx, "send VoiceServiceProfile-set-msg done")
3089 return meInstance, nil
3090 }
3091 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3092 "device-id": oo.deviceID})
3093 return nil, omciErr.GetError()
3094}
3095
3096// SendDeleteVoiceServiceProfile nolint: unused
3097func (oo *OmciCC) SendDeleteVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3098 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3099 tid := oo.GetNextTid(highPrio)
3100 logger.Debugw(ctx, "send VoiceServiceProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3101 "SequNo": strconv.FormatInt(int64(tid), 16),
3102 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3103
3104 meParams := me.ParamData{EntityID: aInstID}
3105 meInstance, omciErr := me.NewVoiceServiceProfile(meParams)
3106 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003107 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3108 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003109 if err != nil {
3110 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for delete", log.Fields{
3111 "Err": err, "device-id": oo.deviceID})
3112 return nil, err
3113 }
3114
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003115 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003116 if err != nil {
3117 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile delete", log.Fields{
3118 "Err": err, "device-id": oo.deviceID})
3119 return nil, err
3120 }
3121
3122 omciRxCallbackPair := CallbackPair{
3123 CbKey: tid,
3124 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3125 }
3126 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3127 if err != nil {
3128 logger.Errorw(ctx, "Cannot send VoiceServiceProfile delete", log.Fields{
3129 "Err": err, "device-id": oo.deviceID})
3130 return nil, err
3131 }
3132 logger.Debug(ctx, "send VoiceServiceProfile-Delete-msg done")
3133 return meInstance, nil
3134 }
3135 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance for delete", log.Fields{
3136 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3137 return nil, omciErr.GetError()
3138}
3139
3140// SendCreateSIPUserData nolint: unused
3141func (oo *OmciCC) SendCreateSIPUserData(ctx context.Context, timeout int, highPrio bool,
3142 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3143 tid := oo.GetNextTid(highPrio)
3144 logger.Debugw(ctx, "send SIPUserData-create-msg:", log.Fields{"device-id": oo.deviceID,
3145 "SequNo": strconv.FormatInt(int64(tid), 16),
3146 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3147
3148 meInstance, omciErr := me.NewSipUserData(params[0])
3149 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003150 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3151 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003152 if err != nil {
3153 logger.Errorw(ctx, "Cannot encode SIPUserData for create", log.Fields{"Err": err,
3154 "device-id": oo.deviceID})
3155 return nil, err
3156 }
3157
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003158 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003159 if err != nil {
3160 logger.Errorw(ctx, "Cannot serialize SIPUserData create", log.Fields{"Err": err,
3161 "device-id": oo.deviceID})
3162 return nil, err
3163 }
3164
3165 omciRxCallbackPair := CallbackPair{CbKey: tid,
3166 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3167 }
3168 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3169 if err != nil {
3170 logger.Errorw(ctx, "Cannot send SIPUserData create", log.Fields{"Err": err,
3171 "device-id": oo.deviceID})
3172 return nil, err
3173 }
3174 logger.Debug(ctx, "send SIPUserData-create-msg done")
3175 return meInstance, nil
3176 }
3177 logger.Errorw(ctx, "Cannot generate SIPUserData Instance", log.Fields{"Err": omciErr.GetError(),
3178 "device-id": oo.deviceID})
3179 return nil, omciErr.GetError()
3180}
3181
3182// SendSetSIPUserData nolint: unused
3183func (oo *OmciCC) SendSetSIPUserData(ctx context.Context, timeout int, highPrio bool,
3184 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3185 tid := oo.GetNextTid(highPrio)
3186 logger.Debugw(ctx, "send SIPUserData-set-msg:", log.Fields{"device-id": oo.deviceID,
3187 "SequNo": strconv.FormatInt(int64(tid), 16),
3188 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3189
3190 meInstance, omciErr := me.NewSipUserData(params[0])
3191 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003192 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3193 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003194 if err != nil {
3195 logger.Errorw(ctx, "Cannot encode SIPUserData for set", log.Fields{"Err": err,
3196 "device-id": oo.deviceID})
3197 return nil, err
3198 }
3199
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003200 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003201 if err != nil {
3202 logger.Errorw(ctx, "Cannot serialize SIPUserData set", log.Fields{"Err": err,
3203 "device-id": oo.deviceID})
3204 return nil, err
3205 }
3206
3207 omciRxCallbackPair := CallbackPair{CbKey: tid,
3208 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3209 }
3210 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3211 if err != nil {
3212 logger.Errorw(ctx, "Cannot send SIPUserData set", log.Fields{"Err": err,
3213 "device-id": oo.deviceID})
3214 return nil, err
3215 }
3216 logger.Debug(ctx, "send SIPUserData-set-msg done")
3217 return meInstance, nil
3218 }
3219 logger.Errorw(ctx, "Cannot generate SIPUserData Instance", log.Fields{"Err": omciErr.GetError(),
3220 "device-id": oo.deviceID})
3221 return nil, omciErr.GetError()
3222}
3223
3224// SendDeleteSIPUserData nolint: unused
3225func (oo *OmciCC) SendDeleteSIPUserData(ctx context.Context, timeout int, highPrio bool,
3226 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3227 tid := oo.GetNextTid(highPrio)
3228 logger.Debugw(ctx, "send SIPUserData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3229 "SequNo": strconv.FormatInt(int64(tid), 16),
3230 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3231
3232 meParams := me.ParamData{EntityID: aInstID}
3233 meInstance, omciErr := me.NewSipUserData(meParams)
3234 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003235 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3236 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003237 if err != nil {
3238 logger.Errorw(ctx, "Cannot encode SIPUserData for delete", log.Fields{
3239 "Err": err, "device-id": oo.deviceID})
3240 return nil, err
3241 }
3242
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003243 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003244 if err != nil {
3245 logger.Errorw(ctx, "Cannot serialize SIPUserData delete", log.Fields{
3246 "Err": err, "device-id": oo.deviceID})
3247 return nil, err
3248 }
3249
3250 omciRxCallbackPair := CallbackPair{
3251 CbKey: tid,
3252 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3253 }
3254 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3255 if err != nil {
3256 logger.Errorw(ctx, "Cannot send SIPUserData delete", log.Fields{
3257 "Err": err, "device-id": oo.deviceID})
3258 return nil, err
3259 }
3260 logger.Debug(ctx, "send SIPUserData-Delete-msg done")
3261 return meInstance, nil
3262 }
3263 logger.Errorw(ctx, "Cannot generate SIPUserData Instance for delete", log.Fields{
3264 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3265 return nil, omciErr.GetError()
3266}
3267
3268// SendCreateVoipApplicationServiceProfile nolint: unused
3269func (oo *OmciCC) SendCreateVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3270 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3271 tid := oo.GetNextTid(highPrio)
3272 logger.Debugw(ctx, "send VoipApplicationServiceProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
3273 "SequNo": strconv.FormatInt(int64(tid), 16),
3274 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3275
3276 meInstance, omciErr := me.NewVoipApplicationServiceProfile(params[0])
3277 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003278 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3279 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003280 if err != nil {
3281 logger.Errorw(ctx, "Cannot encode VoipApplicationServiceProfile for create", log.Fields{"Err": err,
3282 "device-id": oo.deviceID})
3283 return nil, err
3284 }
3285
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003286 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003287 if err != nil {
3288 logger.Errorw(ctx, "Cannot serialize VoipApplicationServiceProfile create", log.Fields{"Err": err,
3289 "device-id": oo.deviceID})
3290 return nil, err
3291 }
3292
3293 omciRxCallbackPair := CallbackPair{CbKey: tid,
3294 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3295 }
3296 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3297 if err != nil {
3298 logger.Errorw(ctx, "Cannot send VoipApplicationServiceProfile create", log.Fields{"Err": err,
3299 "device-id": oo.deviceID})
3300 return nil, err
3301 }
3302 logger.Debug(ctx, "send VoipApplicationServiceProfile-create-msg done")
3303 return meInstance, nil
3304 }
3305 logger.Errorw(ctx, "Cannot generate VoipApplicationServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3306 "device-id": oo.deviceID})
3307 return nil, omciErr.GetError()
3308}
3309
3310// SendSetVoipApplicationServiceProfile nolint: unused
3311func (oo *OmciCC) SendSetVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3312 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3313 tid := oo.GetNextTid(highPrio)
3314 logger.Debugw(ctx, "send VoipApplicationServiceProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
3315 "SequNo": strconv.FormatInt(int64(tid), 16),
3316 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3317
3318 meInstance, omciErr := me.NewVoipApplicationServiceProfile(params[0])
3319 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003320 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3321 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003322 if err != nil {
3323 logger.Errorw(ctx, "Cannot encode VoipApplicationServiceProfile for set", log.Fields{"Err": err,
3324 "device-id": oo.deviceID})
3325 return nil, err
3326 }
3327
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003328 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003329 if err != nil {
3330 logger.Errorw(ctx, "Cannot serialize VoipApplicationServiceProfile set", log.Fields{"Err": err,
3331 "device-id": oo.deviceID})
3332 return nil, err
3333 }
3334
3335 omciRxCallbackPair := CallbackPair{CbKey: tid,
3336 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3337 }
3338 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3339 if err != nil {
3340 logger.Errorw(ctx, "Cannot send VoipApplicationServiceProfile set", log.Fields{"Err": err,
3341 "device-id": oo.deviceID})
3342 return nil, err
3343 }
3344 logger.Debug(ctx, "send VoipApplicationServiceProfile-set-msg done")
3345 return meInstance, nil
3346 }
3347 logger.Errorw(ctx, "Cannot generate VoipApplicationServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3348 "device-id": oo.deviceID})
3349 return nil, omciErr.GetError()
3350}
3351
3352// SendDeleteVoipApplicationServiceProfile nolint: unused
3353func (oo *OmciCC) SendDeleteVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3354 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3355 tid := oo.GetNextTid(highPrio)
3356 logger.Debugw(ctx, "send SIPVoipApplicationServiceProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3357 "SequNo": strconv.FormatInt(int64(tid), 16),
3358 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3359
3360 meParams := me.ParamData{EntityID: aInstID}
3361 meInstance, omciErr := me.NewVoipApplicationServiceProfile(meParams)
3362 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003363 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3364 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003365 if err != nil {
3366 logger.Errorw(ctx, "Cannot encode SIPVoipApplicationServiceProfile for delete", log.Fields{
3367 "Err": err, "device-id": oo.deviceID})
3368 return nil, err
3369 }
3370
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003371 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003372 if err != nil {
3373 logger.Errorw(ctx, "Cannot serialize SIPVoipApplicationServiceProfile delete", log.Fields{
3374 "Err": err, "device-id": oo.deviceID})
3375 return nil, err
3376 }
3377
3378 omciRxCallbackPair := CallbackPair{
3379 CbKey: tid,
3380 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3381 }
3382 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3383 if err != nil {
3384 logger.Errorw(ctx, "Cannot send SIPVoipApplicationServiceProfile delete", log.Fields{
3385 "Err": err, "device-id": oo.deviceID})
3386 return nil, err
3387 }
3388 logger.Debug(ctx, "send SIPVoipApplicationServiceProfile-Delete-msg done")
3389 return meInstance, nil
3390 }
3391 logger.Errorw(ctx, "Cannot generate SIPVoipApplicationServiceProfile Instance for delete", log.Fields{
3392 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3393 return nil, omciErr.GetError()
3394}
3395
3396// SendCreateSIPAgentConfigData nolint: unused
3397func (oo *OmciCC) SendCreateSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3398 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3399 tid := oo.GetNextTid(highPrio)
3400 logger.Debugw(ctx, "send SIPAgentConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3401 "SequNo": strconv.FormatInt(int64(tid), 16),
3402 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3403
3404 meInstance, omciErr := me.NewSipAgentConfigData(params[0])
3405 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003406 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3407 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003408 if err != nil {
3409 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for create", log.Fields{"Err": err,
3410 "device-id": oo.deviceID})
3411 return nil, err
3412 }
3413
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003414 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003415 if err != nil {
3416 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData create", log.Fields{"Err": err,
3417 "device-id": oo.deviceID})
3418 return nil, err
3419 }
3420
3421 omciRxCallbackPair := CallbackPair{CbKey: tid,
3422 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3423 }
3424 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3425 if err != nil {
3426 logger.Errorw(ctx, "Cannot send SIPAgentConfigData create", log.Fields{"Err": err,
3427 "device-id": oo.deviceID})
3428 return nil, err
3429 }
3430 logger.Debug(ctx, "send SIPAgentConfigData-create-msg done")
3431 return meInstance, nil
3432 }
3433 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3434 "device-id": oo.deviceID})
3435 return nil, omciErr.GetError()
3436}
3437
3438// SendSetSIPAgentConfigData nolint: unused
3439func (oo *OmciCC) SendSetSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3440 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3441 tid := oo.GetNextTid(highPrio)
3442 logger.Debugw(ctx, "send SIPAgentConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3443 "SequNo": strconv.FormatInt(int64(tid), 16),
3444 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3445
3446 meInstance, omciErr := me.NewSipAgentConfigData(params[0])
3447 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003448 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3449 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003450 if err != nil {
3451 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for set", log.Fields{"Err": err,
3452 "device-id": oo.deviceID})
3453 return nil, err
3454 }
3455
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003456 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003457 if err != nil {
3458 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData set", log.Fields{"Err": err,
3459 "device-id": oo.deviceID})
3460 return nil, err
3461 }
3462
3463 omciRxCallbackPair := CallbackPair{CbKey: tid,
3464 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3465 }
3466 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3467 if err != nil {
3468 logger.Errorw(ctx, "Cannot send SIPAgentConfigData set", log.Fields{"Err": err,
3469 "device-id": oo.deviceID})
3470 return nil, err
3471 }
3472 logger.Debug(ctx, "send SIPAgentConfigData-set-msg done")
3473 return meInstance, nil
3474 }
3475 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3476 "device-id": oo.deviceID})
3477 return nil, omciErr.GetError()
3478}
3479
3480// SendDeleteSIPAgentConfigData nolint: unused
3481func (oo *OmciCC) SendDeleteSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3482 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3483 tid := oo.GetNextTid(highPrio)
3484 logger.Debugw(ctx, "send SIPAgentConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3485 "SequNo": strconv.FormatInt(int64(tid), 16),
3486 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3487
3488 meParams := me.ParamData{EntityID: aInstID}
3489 meInstance, omciErr := me.NewSipAgentConfigData(meParams)
3490 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003491 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3492 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003493 if err != nil {
3494 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for delete", log.Fields{
3495 "Err": err, "device-id": oo.deviceID})
3496 return nil, err
3497 }
3498
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003499 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003500 if err != nil {
3501 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData delete", log.Fields{
3502 "Err": err, "device-id": oo.deviceID})
3503 return nil, err
3504 }
3505
3506 omciRxCallbackPair := CallbackPair{
3507 CbKey: tid,
3508 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3509 }
3510 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3511 if err != nil {
3512 logger.Errorw(ctx, "Cannot send SIPAgentConfigData delete", log.Fields{
3513 "Err": err, "device-id": oo.deviceID})
3514 return nil, err
3515 }
3516 logger.Debug(ctx, "send SIPAgentConfigData-Delete-msg done")
3517 return meInstance, nil
3518 }
3519 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance for delete", log.Fields{
3520 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3521 return nil, omciErr.GetError()
3522}
3523
3524// SendCreateTCPUDPConfigData nolint: unused
3525func (oo *OmciCC) SendCreateTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3526 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3527 tid := oo.GetNextTid(highPrio)
3528 logger.Debugw(ctx, "send TCPUDPConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3529 "SequNo": strconv.FormatInt(int64(tid), 16),
3530 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3531
3532 meInstance, omciErr := me.NewTcpUdpConfigData(params[0])
3533 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003534 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3535 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003536 if err != nil {
3537 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for create", log.Fields{"Err": err,
3538 "device-id": oo.deviceID})
3539 return nil, err
3540 }
3541
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003542 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003543 if err != nil {
3544 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData create", log.Fields{"Err": err,
3545 "device-id": oo.deviceID})
3546 return nil, err
3547 }
3548
3549 omciRxCallbackPair := CallbackPair{CbKey: tid,
3550 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3551 }
3552 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3553 if err != nil {
3554 logger.Errorw(ctx, "Cannot send TCPUDPConfigData create", log.Fields{"Err": err,
3555 "device-id": oo.deviceID})
3556 return nil, err
3557 }
3558 logger.Debug(ctx, "send TCPUDPConfigData-create-msg done")
3559 return meInstance, nil
3560 }
3561 logger.Errorw(ctx, "Cannot generate TCPUDPConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3562 "device-id": oo.deviceID})
3563 return nil, omciErr.GetError()
3564}
3565
3566// SendSetTCPUDPConfigData nolint: unused
3567func (oo *OmciCC) SendSetTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3568 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3569 tid := oo.GetNextTid(highPrio)
3570 logger.Debugw(ctx, "send TCPUDPConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3571 "SequNo": strconv.FormatInt(int64(tid), 16),
3572 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3573
3574 meInstance, omciErr := me.NewTcpUdpConfigData(params[0])
3575 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003576 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3577 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003578 if err != nil {
3579 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for set", log.Fields{"Err": err,
3580 "device-id": oo.deviceID})
3581 return nil, err
3582 }
3583
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003584 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003585 if err != nil {
3586 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData set", log.Fields{"Err": err,
3587 "device-id": oo.deviceID})
3588 return nil, err
3589 }
3590
3591 omciRxCallbackPair := CallbackPair{CbKey: tid,
3592 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3593 }
3594 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3595 if err != nil {
3596 logger.Errorw(ctx, "Cannot send TCPUDPConfigData set", log.Fields{"Err": err,
3597 "device-id": oo.deviceID})
3598 return nil, err
3599 }
3600 logger.Debug(ctx, "send TCPUDPConfigData-set-msg done")
3601 return meInstance, nil
3602 }
3603 logger.Errorw(ctx, "Cannot generate TCPUDPConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3604 "device-id": oo.deviceID})
3605 return nil, omciErr.GetError()
3606}
3607
3608// SendDeleteTCPUDPConfigData nolint: unused
3609func (oo *OmciCC) SendDeleteTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3610 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3611 tid := oo.GetNextTid(highPrio)
3612 logger.Debugw(ctx, "send TCPUDPConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3613 "SequNo": strconv.FormatInt(int64(tid), 16),
3614 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3615
3616 meParams := me.ParamData{EntityID: aInstID}
3617 meInstance, omciErr := me.NewTcpUdpConfigData(meParams)
3618 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003619 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3620 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003621 if err != nil {
3622 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for delete", log.Fields{
3623 "Err": err, "device-id": oo.deviceID})
3624 return nil, err
3625 }
3626
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003627 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003628 if err != nil {
3629 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData delete", log.Fields{
3630 "Err": err, "device-id": oo.deviceID})
3631 return nil, err
3632 }
3633
3634 omciRxCallbackPair := CallbackPair{
3635 CbKey: tid,
3636 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3637 }
3638 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3639 if err != nil {
3640 logger.Errorw(ctx, "Cannot send TCPUDPConfigData delete", log.Fields{
3641 "Err": err, "device-id": oo.deviceID})
3642 return nil, err
3643 }
3644 logger.Debug(ctx, "send TCPUDPConfigData-Delete-msg done")
3645 return meInstance, nil
3646 }
3647 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance for delete", log.Fields{
3648 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3649 return nil, omciErr.GetError()
3650}
3651
3652// SendCreateIPHostConfigData nolint: unused
3653func (oo *OmciCC) SendCreateIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3654 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3655 tid := oo.GetNextTid(highPrio)
3656 logger.Debugw(ctx, "send IPHostConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3657 "SequNo": strconv.FormatInt(int64(tid), 16),
3658 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3659
3660 meInstance, omciErr := me.NewIpHostConfigData(params[0])
3661 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003662 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3663 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003664 if err != nil {
3665 logger.Errorw(ctx, "Cannot encode IPHostConfigData for create", log.Fields{"Err": err,
3666 "device-id": oo.deviceID})
3667 return nil, err
3668 }
3669
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003670 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003671 if err != nil {
3672 logger.Errorw(ctx, "Cannot serialize IPHostConfigData create", log.Fields{"Err": err,
3673 "device-id": oo.deviceID})
3674 return nil, err
3675 }
3676
3677 omciRxCallbackPair := CallbackPair{CbKey: tid,
3678 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3679 }
3680 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3681 if err != nil {
3682 logger.Errorw(ctx, "Cannot send IPHostConfigData create", log.Fields{"Err": err,
3683 "device-id": oo.deviceID})
3684 return nil, err
3685 }
3686 logger.Debug(ctx, "send IPHostConfigData-create-msg done")
3687 return meInstance, nil
3688 }
3689 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3690 "device-id": oo.deviceID})
3691 return nil, omciErr.GetError()
3692}
3693
3694// SendSetIPHostConfigData nolint: unused
3695func (oo *OmciCC) SendSetIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3696 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3697 tid := oo.GetNextTid(highPrio)
3698 logger.Debugw(ctx, "send IPHostConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3699 "SequNo": strconv.FormatInt(int64(tid), 16),
3700 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3701
3702 meInstance, omciErr := me.NewIpHostConfigData(params[0])
3703 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003704 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3705 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003706 if err != nil {
3707 logger.Errorw(ctx, "Cannot encode IPHostConfigData for set", log.Fields{"Err": err,
3708 "device-id": oo.deviceID})
3709 return nil, err
3710 }
3711
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003712 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003713 if err != nil {
3714 logger.Errorw(ctx, "Cannot serialize IPHostConfigData set", log.Fields{"Err": err,
3715 "device-id": oo.deviceID})
3716 return nil, err
3717 }
3718
3719 omciRxCallbackPair := CallbackPair{CbKey: tid,
3720 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3721 }
3722 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3723 if err != nil {
3724 logger.Errorw(ctx, "Cannot send IPHostConfigData set", log.Fields{"Err": err,
3725 "device-id": oo.deviceID})
3726 return nil, err
3727 }
3728 logger.Debug(ctx, "send IPHostConfigData-set-msg done")
3729 return meInstance, nil
3730 }
3731 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3732 "device-id": oo.deviceID})
3733 return nil, omciErr.GetError()
3734}
3735
3736// SendDeleteIPHostConfigData nolint: unused
3737func (oo *OmciCC) SendDeleteIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3738 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3739 tid := oo.GetNextTid(highPrio)
3740 logger.Debugw(ctx, "send IPHostConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3741 "SequNo": strconv.FormatInt(int64(tid), 16),
3742 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3743
3744 meParams := me.ParamData{EntityID: aInstID}
3745 meInstance, omciErr := me.NewIpHostConfigData(meParams)
3746 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003747 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3748 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003749 if err != nil {
3750 logger.Errorw(ctx, "Cannot encode IPHostConfigData for delete", log.Fields{
3751 "Err": err, "device-id": oo.deviceID})
3752 return nil, err
3753 }
3754
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003755 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003756 if err != nil {
3757 logger.Errorw(ctx, "Cannot serialize IPHostConfigData delete", log.Fields{
3758 "Err": err, "device-id": oo.deviceID})
3759 return nil, err
3760 }
3761
3762 omciRxCallbackPair := CallbackPair{
3763 CbKey: tid,
3764 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3765 }
3766 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3767 if err != nil {
3768 logger.Errorw(ctx, "Cannot send IPHostConfigData delete", log.Fields{
3769 "Err": err, "device-id": oo.deviceID})
3770 return nil, err
3771 }
3772 logger.Debug(ctx, "send IPHostConfigData-Delete-msg done")
3773 return meInstance, nil
3774 }
3775 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance for delete", log.Fields{
3776 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3777 return nil, omciErr.GetError()
3778}
3779
3780// SendCreateRTPProfileData nolint: unused
3781func (oo *OmciCC) SendCreateRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3782 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3783 tid := oo.GetNextTid(highPrio)
3784 logger.Debugw(ctx, "send RTPProfileData-create-msg:", log.Fields{"device-id": oo.deviceID,
3785 "SequNo": strconv.FormatInt(int64(tid), 16),
3786 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3787
3788 meInstance, omciErr := me.NewRtpProfileData(params[0])
3789 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003790 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3791 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003792 if err != nil {
3793 logger.Errorw(ctx, "Cannot encode RTPProfileData for create", log.Fields{"Err": err,
3794 "device-id": oo.deviceID})
3795 return nil, err
3796 }
3797
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003798 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003799 if err != nil {
3800 logger.Errorw(ctx, "Cannot serialize RTPProfileData create", log.Fields{"Err": err,
3801 "device-id": oo.deviceID})
3802 return nil, err
3803 }
3804
3805 omciRxCallbackPair := CallbackPair{CbKey: tid,
3806 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3807 }
3808 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3809 if err != nil {
3810 logger.Errorw(ctx, "Cannot send RTPProfileData create", log.Fields{"Err": err,
3811 "device-id": oo.deviceID})
3812 return nil, err
3813 }
3814 logger.Debug(ctx, "send RTPProfileData-create-msg done")
3815 return meInstance, nil
3816 }
3817 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance", log.Fields{"Err": omciErr.GetError(),
3818 "device-id": oo.deviceID})
3819 return nil, omciErr.GetError()
3820}
3821
3822// SendSetRTPProfileData nolint: unused
3823func (oo *OmciCC) SendSetRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3824 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3825 tid := oo.GetNextTid(highPrio)
3826 logger.Debugw(ctx, "send RTPProfileData-set-msg:", log.Fields{"device-id": oo.deviceID,
3827 "SequNo": strconv.FormatInt(int64(tid), 16),
3828 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3829
3830 meInstance, omciErr := me.NewRtpProfileData(params[0])
3831 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003832 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3833 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003834 if err != nil {
3835 logger.Errorw(ctx, "Cannot encode RTPProfileData for set", log.Fields{"Err": err,
3836 "device-id": oo.deviceID})
3837 return nil, err
3838 }
3839
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003840 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003841 if err != nil {
3842 logger.Errorw(ctx, "Cannot serialize RTPProfileData set", log.Fields{"Err": err,
3843 "device-id": oo.deviceID})
3844 return nil, err
3845 }
3846
3847 omciRxCallbackPair := CallbackPair{CbKey: tid,
3848 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3849 }
3850 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3851 if err != nil {
3852 logger.Errorw(ctx, "Cannot send RTPProfileData set", log.Fields{"Err": err,
3853 "device-id": oo.deviceID})
3854 return nil, err
3855 }
3856 logger.Debug(ctx, "send RTPProfileData-set-msg done")
3857 return meInstance, nil
3858 }
3859 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance", log.Fields{"Err": omciErr.GetError(),
3860 "device-id": oo.deviceID})
3861 return nil, omciErr.GetError()
3862}
3863
3864// SendDeleteRTPProfileData nolint: unused
3865func (oo *OmciCC) SendDeleteRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3866 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3867 tid := oo.GetNextTid(highPrio)
3868 logger.Debugw(ctx, "send RTPProfileData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3869 "SequNo": strconv.FormatInt(int64(tid), 16),
3870 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3871
3872 meParams := me.ParamData{EntityID: aInstID}
3873 meInstance, omciErr := me.NewRtpProfileData(meParams)
3874 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003875 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3876 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003877 if err != nil {
3878 logger.Errorw(ctx, "Cannot encode RTPProfileData for delete", log.Fields{
3879 "Err": err, "device-id": oo.deviceID})
3880 return nil, err
3881 }
3882
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003883 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003884 if err != nil {
3885 logger.Errorw(ctx, "Cannot serialize RTPProfileData delete", log.Fields{
3886 "Err": err, "device-id": oo.deviceID})
3887 return nil, err
3888 }
3889
3890 omciRxCallbackPair := CallbackPair{
3891 CbKey: tid,
3892 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3893 }
3894 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3895 if err != nil {
3896 logger.Errorw(ctx, "Cannot send RTPProfileData delete", log.Fields{
3897 "Err": err, "device-id": oo.deviceID})
3898 return nil, err
3899 }
3900 logger.Debug(ctx, "send RTPProfileData-Delete-msg done")
3901 return meInstance, nil
3902 }
3903 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance for delete", log.Fields{
3904 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3905 return nil, omciErr.GetError()
3906}
3907
3908// SendCreateNetworkDialPlanTable nolint: unused
3909func (oo *OmciCC) SendCreateNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
3910 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3911 tid := oo.GetNextTid(highPrio)
3912 logger.Debugw(ctx, "send NetworkDialPlanTable-create-msg:", log.Fields{"device-id": oo.deviceID,
3913 "SequNo": strconv.FormatInt(int64(tid), 16),
3914 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3915
3916 meInstance, omciErr := me.NewNetworkDialPlanTable(params[0])
3917 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003918 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3919 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003920 if err != nil {
3921 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for create", log.Fields{"Err": err,
3922 "device-id": oo.deviceID})
3923 return nil, err
3924 }
3925
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003926 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003927 if err != nil {
3928 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable create", log.Fields{"Err": err,
3929 "device-id": oo.deviceID})
3930 return nil, err
3931 }
3932
3933 omciRxCallbackPair := CallbackPair{CbKey: tid,
3934 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3935 }
3936 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3937 if err != nil {
3938 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable create", log.Fields{"Err": err,
3939 "device-id": oo.deviceID})
3940 return nil, err
3941 }
3942 logger.Debug(ctx, "send NetworkDialPlanTable-create-msg done")
3943 return meInstance, nil
3944 }
3945 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance", log.Fields{"Err": omciErr.GetError(),
3946 "device-id": oo.deviceID})
3947 return nil, omciErr.GetError()
3948}
3949
3950// SendSetNetworkDialPlanTable nolint: unused
3951func (oo *OmciCC) SendSetNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
3952 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3953 tid := oo.GetNextTid(highPrio)
3954 logger.Debugw(ctx, "send NetworkDialPlanTable-set-msg:", log.Fields{"device-id": oo.deviceID,
3955 "SequNo": strconv.FormatInt(int64(tid), 16),
3956 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3957
3958 meInstance, omciErr := me.NewNetworkDialPlanTable(params[0])
3959 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003960 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3961 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003962 if err != nil {
3963 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for set", log.Fields{"Err": err,
3964 "device-id": oo.deviceID})
3965 return nil, err
3966 }
3967
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003968 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003969 if err != nil {
3970 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable set", log.Fields{"Err": err,
3971 "device-id": oo.deviceID})
3972 return nil, err
3973 }
3974
3975 omciRxCallbackPair := CallbackPair{CbKey: tid,
3976 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3977 }
3978 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3979 if err != nil {
3980 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable set", log.Fields{"Err": err,
3981 "device-id": oo.deviceID})
3982 return nil, err
3983 }
3984 logger.Debug(ctx, "send NetworkDialPlanTable-set-msg done")
3985 return meInstance, nil
3986 }
3987 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance", log.Fields{"Err": omciErr.GetError(),
3988 "device-id": oo.deviceID})
3989 return nil, omciErr.GetError()
3990}
3991
3992// SendDeleteNetworkDialPlanTable nolint: unused
3993func (oo *OmciCC) SendDeleteNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
3994 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3995 tid := oo.GetNextTid(highPrio)
3996 logger.Debugw(ctx, "send NetworkDialPlanTable-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3997 "SequNo": strconv.FormatInt(int64(tid), 16),
3998 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3999
4000 meParams := me.ParamData{EntityID: aInstID}
4001 meInstance, omciErr := me.NewNetworkDialPlanTable(meParams)
4002 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00004003 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
4004 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004005 if err != nil {
4006 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for delete", log.Fields{
4007 "Err": err, "device-id": oo.deviceID})
4008 return nil, err
4009 }
4010
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004011 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004012 if err != nil {
4013 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable delete", log.Fields{
4014 "Err": err, "device-id": oo.deviceID})
4015 return nil, err
4016 }
4017
4018 omciRxCallbackPair := CallbackPair{
4019 CbKey: tid,
4020 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4021 }
4022 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
4023 if err != nil {
4024 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable delete", log.Fields{
4025 "Err": err, "device-id": oo.deviceID})
4026 return nil, err
4027 }
4028 logger.Debug(ctx, "send NetworkDialPlanTable-Delete-msg done")
4029 return meInstance, nil
4030 }
4031 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance for delete", log.Fields{
4032 "Err": omciErr.GetError(), "device-id": oo.deviceID})
4033 return nil, omciErr.GetError()
4034}
4035
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004036// SendSyncTime sends SynchronizeTimeRequest
4037func (oo *OmciCC) SendSyncTime(ctx context.Context, timeout int, highPrio bool, rxChan chan Message) error {
4038 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004039 logger.Debugw(ctx, "send synchronize time request:", log.Fields{"device-id": oo.deviceID,
4040 "SequNo": strconv.FormatInt(int64(tid), 16)})
4041
4042 omciLayer := &omci.OMCI{
4043 TransactionID: tid,
4044 MessageType: omci.SynchronizeTimeRequestType,
4045 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4046 // Length: 0x28, // Optional, defaults to 40 octets
4047 }
4048 utcTime := time.Now().UTC()
4049 request := &omci.SynchronizeTimeRequest{
4050 MeBasePacket: omci.MeBasePacket{
4051 EntityClass: me.OnuGClassID,
4052 // Default Instance ID is 0
4053 },
4054 Year: uint16(utcTime.Year()),
4055 Month: uint8(utcTime.Month()),
4056 Day: uint8(utcTime.Day()),
4057 Hour: uint8(utcTime.Hour()),
4058 Minute: uint8(utcTime.Minute()),
4059 Second: uint8(utcTime.Second()),
4060 }
4061
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004062 pkt, err := SerializeOmciLayer(ctx, omciLayer, request)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004063 if err != nil {
4064 logger.Errorw(ctx, "Cannot serialize synchronize time request", log.Fields{"Err": err,
4065 "device-id": oo.deviceID})
4066 return err
4067 }
4068
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004069 omciRxCallbackPair := CallbackPair{CbKey: tid,
4070 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004071 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004072 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004073 if err != nil {
4074 logger.Errorw(ctx, "Cannot send synchronize time request", log.Fields{"Err": err,
4075 "device-id": oo.deviceID})
4076 return err
4077 }
4078 logger.Debug(ctx, "send synchronize time request done")
4079 return nil
4080}
4081
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004082// SendCreateOrDeleteEthernetPerformanceMonitoringHistoryME creates or deletes EthernetFramePerformanceMonitoringHistoryData ME instance
4083func (oo *OmciCC) SendCreateOrDeleteEthernetPerformanceMonitoringHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004084 upstream bool, create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004085 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004086 logger.Debugw(ctx, "send ethernet-performance-monitoring-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4087 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
4088 meParam := me.ParamData{EntityID: entityID}
4089 var meInstance *me.ManagedEntity
4090 var omciErr me.OmciErrors
4091 if upstream {
4092 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataUpstream(meParam)
4093 } else {
4094 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataDownstream(meParam)
4095 }
4096 if omciErr.GetError() == nil {
4097 var omciLayer *omci.OMCI
4098 var msgLayer gopacket.SerializableLayer
4099 var err error
4100 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004101 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4102 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004103 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004104 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4105 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004106 }
4107 if err != nil {
4108 logger.Errorw(ctx, "Cannot encode ethernet frame performance monitoring history data ME",
4109 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004110 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004111 }
4112
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004113 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004114 if err != nil {
4115 logger.Errorw(ctx, "Cannot serialize ethernet frame performance monitoring history data ME",
4116 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004117 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004118 }
4119
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004120 omciRxCallbackPair := CallbackPair{CbKey: tid,
4121 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004122 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004123 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004124 if err != nil {
4125 logger.Errorw(ctx, "Cannot send ethernet frame performance monitoring history data ME",
4126 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004127 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004128 }
4129 logger.Debugw(ctx, "send ethernet frame performance monitoring history data ME done",
4130 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004131 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08004132 }
4133 logger.Errorw(ctx, "Cannot generate ethernet frame performance monitoring history data ME Instance",
4134 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 +03004135 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08004136}
4137
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004138// SendCreateOrDeleteEthernetUniHistoryME creates or deletes EthernetPerformanceMonitoringHistoryData ME instance
4139func (oo *OmciCC) SendCreateOrDeleteEthernetUniHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004140 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004141 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004142 logger.Debugw(ctx, "send ethernet-uni-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4143 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4144 meParam := me.ParamData{EntityID: entityID}
4145 var meInstance *me.ManagedEntity
4146 var omciErr me.OmciErrors
4147 meInstance, omciErr = me.NewEthernetPerformanceMonitoringHistoryData(meParam)
4148
4149 if omciErr.GetError() == nil {
4150 var omciLayer *omci.OMCI
4151 var msgLayer gopacket.SerializableLayer
4152 var err error
4153 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004154 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4155 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004156 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004157 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4158 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004159 }
4160 if err != nil {
4161 logger.Errorw(ctx, "Cannot encode ethernet uni history data ME",
4162 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004163 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004164 }
4165
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004166 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004167 if err != nil {
4168 logger.Errorw(ctx, "Cannot serialize ethernet uni history data ME",
4169 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004170 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004171 }
4172
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004173 omciRxCallbackPair := CallbackPair{CbKey: tid,
4174 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004175 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004176 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004177 if err != nil {
4178 logger.Errorw(ctx, "Cannot send ethernet uni history data ME",
4179 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004180 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004181 }
4182 logger.Debugw(ctx, "send ethernet uni history data ME done",
4183 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004184 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08004185 }
4186 logger.Errorw(ctx, "Cannot generate ethernet uni history data ME Instance",
4187 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004188 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08004189}
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004190
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004191// SendCreateOrDeleteFecHistoryME creates or deletes FecPerformanceMonitoringHistoryData ME instance
4192func (oo *OmciCC) SendCreateOrDeleteFecHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004193 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004194 tid := oo.GetNextTid(highPrio)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004195 logger.Debugw(ctx, "send fec-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4196 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4197 meParam := me.ParamData{EntityID: entityID}
4198 var meInstance *me.ManagedEntity
4199 var omciErr me.OmciErrors
4200 meInstance, omciErr = me.NewFecPerformanceMonitoringHistoryData(meParam)
4201
4202 if omciErr.GetError() == nil {
4203 var omciLayer *omci.OMCI
4204 var msgLayer gopacket.SerializableLayer
4205 var err error
4206 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004207 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4208 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004209 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004210 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4211 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004212 }
4213 if err != nil {
4214 logger.Errorw(ctx, "Cannot encode fec history data ME",
4215 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004216 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004217 }
4218
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004219 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004220 if err != nil {
4221 logger.Errorw(ctx, "Cannot serialize fec history data ME",
4222 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004223 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004224 }
4225
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004226 omciRxCallbackPair := CallbackPair{CbKey: tid,
4227 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004228 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004229 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004230 if err != nil {
4231 logger.Errorw(ctx, "Cannot send fec history data ME",
4232 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004233 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004234 }
4235 logger.Debugw(ctx, "send fec history data ME done",
4236 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004237 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004238 }
4239 logger.Errorw(ctx, "Cannot generate fec history data ME Instance",
4240 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004241 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004242}
4243
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004244// SendCreateOrDeleteGemPortHistoryME deletes GemPortNetworkCtpPerformanceMonitoringHistoryData ME instance
4245func (oo *OmciCC) SendCreateOrDeleteGemPortHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004246 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004247 tid := oo.GetNextTid(highPrio)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004248 logger.Debugw(ctx, "send gemport-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4249 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4250 meParam := me.ParamData{EntityID: entityID}
4251 var meInstance *me.ManagedEntity
4252 var omciErr me.OmciErrors
4253 meInstance, omciErr = me.NewGemPortNetworkCtpPerformanceMonitoringHistoryData(meParam)
4254
4255 if omciErr.GetError() == nil {
4256 var omciLayer *omci.OMCI
4257 var msgLayer gopacket.SerializableLayer
4258 var err error
4259 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004260 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4261 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004262 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004263 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4264 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004265 }
4266 if err != nil {
4267 logger.Errorw(ctx, "Cannot encode gemport history data ME",
4268 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004269 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004270 }
4271
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004272 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004273 if err != nil {
4274 logger.Errorw(ctx, "Cannot serialize gemport history data ME",
4275 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004276 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004277 }
4278
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004279 omciRxCallbackPair := CallbackPair{CbKey: tid,
4280 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004281 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004282 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004283 if err != nil {
4284 logger.Errorw(ctx, "Cannot send gemport history data ME",
4285 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004286 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004287 }
4288 logger.Debugw(ctx, "send gemport history data ME done",
4289 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004290 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004291 }
4292 logger.Errorw(ctx, "Cannot generate gemport history data ME Instance",
4293 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004294 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004295}
4296
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004297// SendStartSoftwareDownload sends StartSoftwareDownloadRequest
4298func (oo *OmciCC) SendStartSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004299 rxChan chan Message, aImageMeID uint16, aDownloadWindowSize uint8, aFileLen uint32, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004300 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004301 logger.Debugw(ctx, "send StartSwDlRequest:", log.Fields{"device-id": oo.deviceID,
4302 "SequNo": strconv.FormatInt(int64(tid), 16),
4303 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4304
4305 omciLayer := &omci.OMCI{
4306 TransactionID: tid,
4307 MessageType: omci.StartSoftwareDownloadRequestType,
4308 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4309 // Length: 0x28, // Optional, defaults to 40 octets
4310 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004311 if aIsExtendedOmci {
4312 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4313 }
mpagenko80622a52021-02-09 16:53:23 +00004314 request := &omci.StartSoftwareDownloadRequest{
4315 MeBasePacket: omci.MeBasePacket{
4316 EntityClass: me.SoftwareImageClassID,
4317 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004318 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004319 },
4320 WindowSize: aDownloadWindowSize,
4321 ImageSize: aFileLen,
4322 NumberOfCircuitPacks: 1, //parallel download to multiple circuit packs not supported
4323 CircuitPacks: []uint16{0}, //circuit pack indication don't care for NumberOfCircuitPacks=1, but needed by omci-lib
4324 }
4325
4326 var options gopacket.SerializeOptions
4327 options.FixLengths = true
4328 buffer := gopacket.NewSerializeBuffer()
4329 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4330 if err != nil {
4331 logger.Errorw(ctx, "Cannot serialize StartSwDlRequest", log.Fields{"Err": err,
4332 "device-id": oo.deviceID})
4333 return err
4334 }
4335 outgoingPacket := buffer.Bytes()
4336
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004337 omciRxCallbackPair := CallbackPair{CbKey: tid,
4338 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko80622a52021-02-09 16:53:23 +00004339 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004340 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004341 if err != nil {
4342 logger.Errorw(ctx, "Cannot send StartSwDlRequest", log.Fields{"Err": err,
4343 "device-id": oo.deviceID})
4344 return err
4345 }
4346 logger.Debug(ctx, "send StartSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004347 return nil
4348}
4349
kesavand011d5162021-11-25 19:21:06 +05304350// PrepareOnuSectionsOfWindow prepares a list of sections for each window
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304351// Before invoking this function the oo.mutexTid needs to be be locked so that
4352// GetOnuSwSecNextTid can be invoked without further locking
kesavand011d5162021-11-25 19:21:06 +05304353func (oo *OmciCC) PrepareOnuSectionsOfWindow(ctx context.Context,
4354 aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004355 omciMsgsPerWindow *ia.OmciMessages, aIsExtendedOmci bool) (OmciTransferStructure, error) {
kesavand011d5162021-11-25 19:21:06 +05304356 //onuswsections uses only low prioirity tids
4357 tid := oo.GetOnuSwSecNextTid()
4358 logger.Infow(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
4359 "SequNo": strconv.FormatInt(int64(tid), 16),
4360 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest, "sectionNo": aDownloadSectionNo, "sectionData": aSection})
4361
4362 var omciTxReq OmciTransferStructure
4363 msgType := omci.DownloadSectionRequestType
4364
4365 if aAckRequest > 0 {
4366 msgType = omci.DownloadSectionRequestWithResponseType
4367
4368 }
4369 omciLayer := &omci.OMCI{
4370 TransactionID: tid,
4371 MessageType: msgType,
4372 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4373 // Length: 0x28, // Optional, defaults to 40 octets
4374 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004375 if aIsExtendedOmci {
4376 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4377 }
kesavand011d5162021-11-25 19:21:06 +05304378 localSectionData := make([]byte, len(aSection))
4379
4380 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
4381 request := &omci.DownloadSectionRequest{
4382 MeBasePacket: omci.MeBasePacket{
4383 EntityClass: me.SoftwareImageClassID,
4384 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004385 Extended: aIsExtendedOmci,
kesavand011d5162021-11-25 19:21:06 +05304386 },
4387 SectionNumber: aDownloadSectionNo,
4388 SectionData: localSectionData,
4389 }
4390
4391 var options gopacket.SerializeOptions
4392 options.FixLengths = true
4393 buffer := gopacket.NewSerializeBuffer()
4394 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4395 if err != nil {
4396 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
4397 "device-id": oo.deviceID})
4398 return omciTxReq, err
4399 }
4400 outgoingPacket := buffer.Bytes()
4401
4402 omciMsgsPerWindow.Messages = append(omciMsgsPerWindow.Messages, outgoingPacket)
4403
4404 if aAckRequest > 0 {
4405 // only the last section should have a timeout as an ack is required only for the last section of the window
4406 omciTxReq = OmciTransferStructure{
4407 withFramePrint: true,
4408 OnuSwWindow: omciMsgsPerWindow,
4409 }
4410 return omciTxReq, nil
4411 }
4412
4413 return omciTxReq, nil
4414}
4415
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304416// SendOnuSwSectionsWindowWithRxSupervision sends onu swd sections
kesavand011d5162021-11-25 19:21:06 +05304417func (oo *OmciCC) SendOnuSwSectionsWindowWithRxSupervision(ctx context.Context,
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304418 aOmciTxRequest OmciTransferStructure, aTimeout int, rxChan chan Message) error {
kesavand011d5162021-11-25 19:21:06 +05304419 if aOmciTxRequest.OnuSwWindow == nil {
4420 logger.Errorw(ctx, "SendOnuSwSectionsWindowWithRxSupervision: omciTxRequest.OnuSwWindow is nil",
4421 log.Fields{"device-id": oo.deviceID})
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304422 return fmt.Errorf("sendOnuSwSectionsWindowWithRxSupervision: omciTxRequest.OnuSwWindow is nil device-id: %v",
4423 oo.deviceID)
kesavand011d5162021-11-25 19:21:06 +05304424 }
4425
4426 tid := oo.GetOnuSwSecLastTid()
4427 logger.Debugw(ctx, "SendOnuSwSectionsWindowWithRxSupervision tid for the last segment is ", log.Fields{"TID": tid})
4428 omciRxCallbackPair := CallbackPair{CbKey: tid,
4429 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4430 }
4431
4432 aOmciTxRequest.cbPair = omciRxCallbackPair
4433 logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TansCorrId": aOmciTxRequest.cbPair.CbKey})
4434 oo.mutexRxSchedMap.Lock()
4435 // it could be checked, if the callback key is already registered - but simply overwrite may be acceptable ...
4436 oo.rxSchedulerMap[aOmciTxRequest.cbPair.CbKey] = aOmciTxRequest.cbPair.CbEntry
4437 oo.mutexRxSchedMap.Unlock()
4438
4439 chSuccess := make(chan bool)
4440 aOmciTxRequest.chSuccess = chSuccess
4441 aOmciTxRequest.timeout = aTimeout
4442 aOmciTxRequest.retries = CDefaultRetries
4443
4444 //tid := aOmciTxRequest.cbPair.CbKey
4445 oo.mutexMonReq.Lock()
4446 oo.monitoredRequests[tid] = aOmciTxRequest
4447 oo.mutexMonReq.Unlock()
4448
4449 retries := aOmciTxRequest.retries
4450 retryCounter := 0
4451 if aTimeout == 0 {
4452 logger.Errorw(ctx, "no timeout present for last section of window", log.Fields{"device-id": oo.deviceID})
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304453 return fmt.Errorf("no timeout present for last section of window device-id: %v", oo.deviceID)
kesavand011d5162021-11-25 19:21:06 +05304454 }
4455loop:
4456 for retryCounter <= retries {
4457 // the onu sw sections are enqueued only to the low priority queue
4458 oo.mutexLowPrioTxQueue.Lock()
4459 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4460 oo.mutexLowPrioTxQueue.Unlock()
4461
4462 go oo.sendQueuedRequests(ctx)
4463
4464 select {
4465 case success := <-chSuccess:
4466 if success {
4467 logger.Debugw(ctx, "reqMon: response received in time",
4468 log.Fields{"tid": tid, "device-id": oo.deviceID})
4469 } else {
4470 logger.Debugw(ctx, "reqMon: wait for response aborted",
4471 log.Fields{"tid": tid, "device-id": oo.deviceID})
4472 }
4473 break loop
4474 case <-time.After(time.Duration(aTimeout) * time.Second):
4475 if retryCounter == retries {
Holger Hildebrandt2b107642022-12-09 07:56:23 +00004476 if oo.pBaseDeviceHandler.IsOltAvailable() {
4477 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - send ONU device event!",
4478 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4479 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationFailureSwUpgrade, OnuOmciCommunicationFailureSwUpgradeDesc)
4480 } else {
4481 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - skip ONU device event: OLT unavailable!",
4482 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4483 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004484 oo.incrementTxTimesouts()
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304485 oo.mutexMonReq.Lock()
4486 delete(oo.monitoredRequests, tid)
4487 oo.mutexMonReq.Unlock()
4488 return fmt.Errorf("reqMon: timeout waiting for response - no of max retries reached device-id: %v", oo.deviceID)
kesavand011d5162021-11-25 19:21:06 +05304489 }
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304490 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
4491 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4492 oo.incrementTxRetries()
4493 case _, ok := <-oo.pBaseDeviceHandler.GetDeviceDeleteCommChan(ctx):
4494 if !ok {
4495 logger.Warnw(ctx, "device deletion channel is closed", log.Fields{"device-id": oo.deviceID})
4496 oo.mutexMonReq.Lock()
4497 delete(oo.monitoredRequests, tid)
4498 oo.mutexMonReq.Unlock()
4499 return fmt.Errorf("device deletion channel is closed device-id: %v", oo.deviceID)
4500 }
4501 oo.mutexMonReq.Lock()
4502 delete(oo.monitoredRequests, tid)
4503 oo.mutexMonReq.Unlock()
4504 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 +05304505 }
4506 retryCounter++
4507 }
4508 oo.mutexMonReq.Lock()
4509 delete(oo.monitoredRequests, tid)
4510 oo.mutexMonReq.Unlock()
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304511 return nil
kesavand011d5162021-11-25 19:21:06 +05304512}
4513
4514func (oo *OmciCC) sendOnuSwSectionsOfWindow(ctx context.Context, omciTxRequest OmciTransferStructure) error {
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004515 var lastSection []byte
4516 if omciTxRequest.OnuSwWindow != nil {
4517 lastSection = omciTxRequest.OnuSwWindow.Messages[len(omciTxRequest.OnuSwWindow.Messages)-1]
4518 } else {
4519 logger.Errorw(ctx, "invalid sw window received", log.Fields{"device-id": oo.deviceID})
4520 return fmt.Errorf("invalid sw window received")
4521 }
4522 if omciTxRequest.withFramePrint {
4523 logger.Debugw(ctx, "sw-section-omci-message-to-send:", log.Fields{
kesavand011d5162021-11-25 19:21:06 +05304524 "TxOmciMessage": hex.EncodeToString(lastSection),
4525 "device-id": oo.deviceID,
4526 "toDeviceType": oo.pBaseDeviceHandler.GetProxyAddressType(),
4527 "proxyDeviceID": oo.pBaseDeviceHandler.GetProxyAddressID(),
4528 "proxyAddress": oo.pBaseDeviceHandler.GetProxyAddress()})
4529 }
4530 sendErr := oo.pBaseDeviceHandler.SendOnuSwSectionsOfWindow(ctx, oo.pBaseDeviceHandler.GetProxyAddress().AdapterEndpoint, omciTxRequest.OnuSwWindow)
4531 if sendErr != nil {
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004532 logger.Errorw(ctx, "send onu sw sections omci request error", log.Fields{"device-id": oo.deviceID, "error": sendErr})
kesavand011d5162021-11-25 19:21:06 +05304533 return sendErr
4534 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004535 numberOfNoArSections := len(omciTxRequest.OnuSwWindow.Messages) - 1 // last section of window is sent with AR expected
4536 if lastSection[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
4537 oo.increaseBaseTxNoArFramesBy(ctx, uint32(numberOfNoArSections))
4538 oo.incrementBaseTxArFrames()
4539 } else {
4540 oo.increaseExtTxNoArFramesBy(ctx, uint32(numberOfNoArSections))
4541 oo.incrementExtTxArFrames()
4542 }
kesavand011d5162021-11-25 19:21:06 +05304543 return nil
4544}
4545
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004546// SendDownloadSection sends DownloadSectionRequestWithResponse
4547func (oo *OmciCC) SendDownloadSection(ctx context.Context, aTimeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004548 rxChan chan Message, aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte, aPrint bool, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004549 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004550 logger.Debugw(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
4551 "SequNo": strconv.FormatInt(int64(tid), 16),
mpagenko15ff4a52021-03-02 10:09:20 +00004552 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest})
mpagenko80622a52021-02-09 16:53:23 +00004553
4554 //TODO!!!: don't know by now on how to generate the possibly needed AR (or enforce it to 0) with current omci-lib
4555 // by now just try to send it as defined by omci-lib
mpagenko15ff4a52021-03-02 10:09:20 +00004556 msgType := omci.DownloadSectionRequestType
mpagenkoc26d4c02021-05-06 14:27:57 +00004557 var timeout int = 0 //default value for no response expected
mpagenko15ff4a52021-03-02 10:09:20 +00004558 if aAckRequest > 0 {
4559 msgType = omci.DownloadSectionRequestWithResponseType
mpagenkoc26d4c02021-05-06 14:27:57 +00004560 timeout = aTimeout
mpagenko15ff4a52021-03-02 10:09:20 +00004561 }
mpagenko80622a52021-02-09 16:53:23 +00004562 omciLayer := &omci.OMCI{
4563 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004564 MessageType: msgType,
mpagenko80622a52021-02-09 16:53:23 +00004565 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4566 // Length: 0x28, // Optional, defaults to 40 octets
4567 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004568 if aIsExtendedOmci {
4569 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4570 }
Himani Chawla43f95ff2021-06-03 00:24:12 +05304571 localSectionData := make([]byte, len(aSection))
4572
mpagenko15ff4a52021-03-02 10:09:20 +00004573 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
mpagenko80622a52021-02-09 16:53:23 +00004574 request := &omci.DownloadSectionRequest{
4575 MeBasePacket: omci.MeBasePacket{
4576 EntityClass: me.SoftwareImageClassID,
4577 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004578 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004579 },
4580 SectionNumber: aDownloadSectionNo,
4581 SectionData: localSectionData,
4582 }
4583
4584 var options gopacket.SerializeOptions
4585 options.FixLengths = true
4586 buffer := gopacket.NewSerializeBuffer()
4587 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4588 if err != nil {
4589 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
4590 "device-id": oo.deviceID})
4591 return err
4592 }
4593 outgoingPacket := buffer.Bytes()
4594
mpagenko15ff4a52021-03-02 10:09:20 +00004595 //for initial debug purpose overrule the requested print state for some frames
4596 printFrame := aPrint
4597 if aAckRequest > 0 || aDownloadSectionNo == 0 {
4598 printFrame = true
4599 }
4600
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004601 omciRxCallbackPair := CallbackPair{CbKey: tid,
mpagenkoc26d4c02021-05-06 14:27:57 +00004602 // the callback is set even though no response might be required here, the tid (key) setting is needed here anyway
4603 // (used to avoid retransmission of frames with the same TID)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004604 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, printFrame /*aPrint*/},
mpagenko80622a52021-02-09 16:53:23 +00004605 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004606 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004607 if err != nil {
4608 logger.Errorw(ctx, "Cannot send DlSectionRequest", log.Fields{"Err": err,
4609 "device-id": oo.deviceID})
4610 return err
4611 }
4612 logger.Debug(ctx, "send DlSectionRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004613 return nil
4614}
4615
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304616// SendEndSoftwareDownload sends EndSoftwareDownloadRequest
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004617func (oo *OmciCC) SendEndSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004618 rxChan chan Message, aImageMeID uint16, aFileLen uint32, aImageCrc uint32, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004619 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004620 logger.Debugw(ctx, "send EndSwDlRequest:", log.Fields{"device-id": oo.deviceID,
4621 "SequNo": strconv.FormatInt(int64(tid), 16),
4622 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4623
mpagenko15ff4a52021-03-02 10:09:20 +00004624 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00004625 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004626 MessageType: omci.EndSoftwareDownloadRequestType,
mpagenko80622a52021-02-09 16:53:23 +00004627 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4628 // Length: 0x28, // Optional, defaults to 40 octets
4629 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004630 if aIsExtendedOmci {
4631 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4632 }
mpagenko15ff4a52021-03-02 10:09:20 +00004633 request := &omci.EndSoftwareDownloadRequest{
mpagenko80622a52021-02-09 16:53:23 +00004634 MeBasePacket: omci.MeBasePacket{
4635 EntityClass: me.SoftwareImageClassID,
4636 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004637 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004638 },
mpagenko15ff4a52021-03-02 10:09:20 +00004639 CRC32: aImageCrc,
4640 ImageSize: aFileLen,
4641 NumberOfInstances: 1, //parallel download to multiple circuit packs not supported
4642 ImageInstances: []uint16{0}, //don't care for NumberOfInstances=1, but probably needed by omci-lib as in startSwDlRequest
mpagenko80622a52021-02-09 16:53:23 +00004643 }
mpagenko15ff4a52021-03-02 10:09:20 +00004644
4645 var options gopacket.SerializeOptions
4646 options.FixLengths = true
4647 buffer := gopacket.NewSerializeBuffer()
4648 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4649 if err != nil {
4650 logger.Errorw(ctx, "Cannot serialize EndSwDlRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00004651 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00004652 return err
mpagenko80622a52021-02-09 16:53:23 +00004653 }
mpagenko15ff4a52021-03-02 10:09:20 +00004654 outgoingPacket := buffer.Bytes()
4655
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004656 omciRxCallbackPair := CallbackPair{CbKey: tid,
4657 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko15ff4a52021-03-02 10:09:20 +00004658 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004659 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00004660 if err != nil {
4661 logger.Errorw(ctx, "Cannot send EndSwDlRequest", log.Fields{"Err": err,
4662 "device-id": oo.deviceID})
4663 return err
4664 }
4665 logger.Debug(ctx, "send EndSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004666 return nil
4667}
4668
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004669// SendActivateSoftware sends ActivateSoftwareRequest
4670func (oo *OmciCC) SendActivateSoftware(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004671 rxChan chan Message, aImageMeID uint16, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004672 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004673 logger.Debugw(ctx, "send ActivateSwRequest:", log.Fields{"device-id": oo.deviceID,
4674 "SequNo": strconv.FormatInt(int64(tid), 16),
4675 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4676
4677 omciLayer := &omci.OMCI{
4678 TransactionID: tid,
4679 MessageType: omci.ActivateSoftwareRequestType,
4680 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4681 // Length: 0x28, // Optional, defaults to 40 octets
4682 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004683 if aIsExtendedOmci {
4684 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4685 }
mpagenko80622a52021-02-09 16:53:23 +00004686 request := &omci.ActivateSoftwareRequest{
4687 MeBasePacket: omci.MeBasePacket{
4688 EntityClass: me.SoftwareImageClassID,
4689 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004690 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004691 },
4692 ActivateFlags: 0, //unconditionally reset as the only relevant option here (regardless of VOIP)
4693 }
4694
4695 var options gopacket.SerializeOptions
4696 options.FixLengths = true
4697 buffer := gopacket.NewSerializeBuffer()
4698 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4699 if err != nil {
4700 logger.Errorw(ctx, "Cannot serialize ActivateSwRequest", log.Fields{"Err": err,
4701 "device-id": oo.deviceID})
4702 return err
4703 }
4704 outgoingPacket := buffer.Bytes()
4705
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004706 omciRxCallbackPair := CallbackPair{CbKey: tid,
4707 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko80622a52021-02-09 16:53:23 +00004708 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004709 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004710 if err != nil {
4711 logger.Errorw(ctx, "Cannot send ActivateSwRequest", log.Fields{"Err": err,
4712 "device-id": oo.deviceID})
4713 return err
4714 }
4715 logger.Debug(ctx, "send ActivateSwRequest done")
mpagenko15ff4a52021-03-02 10:09:20 +00004716 return nil
4717}
mpagenko80622a52021-02-09 16:53:23 +00004718
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004719// SendCommitSoftware sends CommitSoftwareRequest
4720func (oo *OmciCC) SendCommitSoftware(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004721 rxChan chan Message, aImageMeID uint16, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004722 tid := oo.GetNextTid(highPrio)
mpagenko15ff4a52021-03-02 10:09:20 +00004723 logger.Debugw(ctx, "send CommitSwRequest:", log.Fields{"device-id": oo.deviceID,
4724 "SequNo": strconv.FormatInt(int64(tid), 16),
4725 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4726
4727 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00004728 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004729 MessageType: omci.CommitSoftwareRequestType,
mpagenko80622a52021-02-09 16:53:23 +00004730 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4731 // Length: 0x28, // Optional, defaults to 40 octets
4732 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004733 if aIsExtendedOmci {
4734 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4735 }
mpagenko15ff4a52021-03-02 10:09:20 +00004736 request := &omci.CommitSoftwareRequest{
mpagenko80622a52021-02-09 16:53:23 +00004737 MeBasePacket: omci.MeBasePacket{
4738 EntityClass: me.SoftwareImageClassID,
4739 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004740 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004741 },
mpagenko80622a52021-02-09 16:53:23 +00004742 }
mpagenko15ff4a52021-03-02 10:09:20 +00004743
4744 var options gopacket.SerializeOptions
4745 options.FixLengths = true
4746 buffer := gopacket.NewSerializeBuffer()
4747 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4748 if err != nil {
4749 logger.Errorw(ctx, "Cannot serialize CommitSwRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00004750 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00004751 return err
mpagenko80622a52021-02-09 16:53:23 +00004752 }
mpagenko15ff4a52021-03-02 10:09:20 +00004753 outgoingPacket := buffer.Bytes()
4754
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004755 omciRxCallbackPair := CallbackPair{CbKey: tid,
4756 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko15ff4a52021-03-02 10:09:20 +00004757 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004758 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00004759 if err != nil {
4760 logger.Errorw(ctx, "Cannot send CommitSwRequest", log.Fields{"Err": err,
4761 "device-id": oo.deviceID})
4762 return err
4763 }
4764 logger.Debug(ctx, "send CommitSwRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004765 return nil
4766}
4767
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304768// SendSelfTestReq sends TestRequest
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004769func (oo *OmciCC) SendSelfTestReq(ctx context.Context, classID me.ClassID, instdID uint16, timeout int, highPrio bool, rxChan chan Message) error {
4770 tid := oo.GetNextTid(highPrio)
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004771 logger.Debugw(ctx, "send self test request:", log.Fields{"device-id": oo.deviceID,
4772 "SequNo": strconv.FormatInt(int64(tid), 16),
4773 "InstId": strconv.FormatInt(int64(instdID), 16)})
4774 omciLayer := &omci.OMCI{
4775 TransactionID: tid,
4776 MessageType: omci.TestRequestType,
4777 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4778 // Length: 0x28, // Optional, defaults to 40 octets
4779 }
4780
4781 var request *omci.OpticalLineSupervisionTestRequest
4782 switch classID {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004783 case me.AniGClassID:
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004784 request = &omci.OpticalLineSupervisionTestRequest{
4785 MeBasePacket: omci.MeBasePacket{
4786 EntityClass: classID,
4787 EntityInstance: instdID,
4788 },
4789 SelectTest: uint8(7), // self test
4790 GeneralPurposeBuffer: uint16(0),
4791 VendorSpecificParameters: uint16(0),
4792 }
4793 default:
4794 logger.Errorw(ctx, "unsupported class id for self test request", log.Fields{"device-id": oo.deviceID, "classID": classID})
4795 return fmt.Errorf("unsupported-class-id-for-self-test-request-%v", classID)
4796 }
4797 // Test serialization back to former string
4798 var options gopacket.SerializeOptions
4799 options.FixLengths = true
4800
4801 buffer := gopacket.NewSerializeBuffer()
4802 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4803 if err != nil {
4804 logger.Errorw(ctx, "Cannot serialize self test request", log.Fields{"Err": err,
4805 "device-id": oo.deviceID})
4806 return err
4807 }
4808 outgoingPacket := buffer.Bytes()
4809
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004810 omciRxCallbackPair := CallbackPair{CbKey: tid,
4811 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004812 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004813 err = oo.Send(ctx, outgoingPacket, timeout, 0, highPrio, omciRxCallbackPair)
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004814 if err != nil {
4815 logger.Errorw(ctx, "Cannot send self test request", log.Fields{"Err": err,
4816 "device-id": oo.deviceID})
4817 return err
4818 }
4819 logger.Debug(ctx, "send self test request done")
4820 return nil
4821}
4822
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304823// nolint: gocyclo
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004824func (oo *OmciCC) isSuccessfulResponseWithMibDataSync(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet) (bool, error) {
4825
4826 nextLayer, err := omci.MsgTypeToNextLayer(omciMsg.MessageType, false)
4827 if err != nil {
4828 logger.Errorw(ctx, "omci-message: could not map msgType to nextLayer", log.Fields{"device-id": oo.deviceID})
4829 return false, fmt.Errorf("could not map msgType to nextLayer - %s", oo.deviceID)
4830 }
4831 msgLayer := (*packet).Layer(nextLayer)
4832 if msgLayer != nil {
4833 // Note: Due to relaxed decoding, you may now still have a decoding error attached to the layers
4834 if failure := (*packet).ErrorLayer(); failure != nil {
4835 if nextLayer == omci.LayerTypeMibUploadNextResponse {
4836 // In the case of MibUploadNextResponse, we let the packet pass so that later processing
4837 // can examine for UnkonwnMEs and UnknownAttributes
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304838 logger.Debug(ctx, "omci-message: MibUploadNextResponse packet with ErrorLayer - let it pass",
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004839 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4840 return false, nil
4841 } else if nextLayer == omci.LayerTypeGetResponse {
4842 if resp := msgLayer.(*omci.GetResponse); resp != nil {
4843 if resp.NextLayerType() == omci.LayerTypeUnknownAttributes {
4844 unknownAttrLayer := (*packet).Layer(omci.LayerTypeUnknownAttributes)
4845 if unknownAttrLayer != nil {
4846 logger.Errorw(ctx, "omci-message: GetResponse packet contains unknownAttrLayer - skip it!",
4847 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "unknownAttrLayer": unknownAttrLayer})
4848 return false, fmt.Errorf("packet contains unknownAttrLayer - %s", oo.deviceID)
4849 }
4850 }
4851 }
4852 }
4853 // Try to decode any further error information
4854 if decodeFailure, ok := failure.(*gopacket.DecodeFailure); ok && decodeFailure != nil {
4855 logger.Errorw(ctx, "omci-message: packet contains ErrorLayer with further info - skip it!",
4856 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "decodeFailure": decodeFailure.String()})
4857 return false, fmt.Errorf("packet contains ErrorLayer with further info - %s", oo.deviceID)
4858 }
4859 logger.Errorw(ctx, "omci-message: packet contains ErrorLayer - skip it!",
4860 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4861 return false, fmt.Errorf("packet contains ErrorLayer - %s", oo.deviceID)
4862 }
4863 } else if failure := (*packet).ErrorLayer(); failure != nil {
4864 // message layer could not be decoded, but at least check if additional failure information is available
4865 if decodeFailure, ok := failure.(*gopacket.DecodeFailure); ok && decodeFailure != nil {
Holger Hildebrandt93d183f2022-04-22 15:50:26 +00004866 errMsg := decodeFailure.String()
4867 if nextLayer == omci.LayerTypeMibUploadNextResponse {
4868 if strings.Contains(strings.ToLower(errMsg), "table decode") {
4869 // In the case of MibUploadNextResponse with non-standard table attributes, we let the packet pass
4870 // so that later processing can deal with it
4871 logger.Infow(ctx, "omci-message: MibUploadNextResponse packet with table attributes - let it pass",
4872 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4873 return false, nil
4874 }
4875 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004876 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet, further info available - skip it!",
Holger Hildebrandt93d183f2022-04-22 15:50:26 +00004877 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "decodeFailure": errMsg})
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004878 return false, fmt.Errorf("could not decode msgLayer of packet, further info available - %s", oo.deviceID)
4879 }
4880 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet, ErrorLayer available",
4881 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4882 return false, fmt.Errorf("could not decode msgLayer of packet, ErrorLayer available - %s", oo.deviceID)
4883 } else {
4884 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet", log.Fields{"device-id": oo.deviceID})
4885 return false, fmt.Errorf("could not decode msgLayer of packet - %s", oo.deviceID)
4886 }
4887
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004888 for _, v := range responsesWithMibDataSync {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004889 if v == omciMsg.MessageType {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004890 switch nextLayer {
4891 case omci.LayerTypeCreateResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004892 if resp := msgLayer.(*omci.CreateResponse); resp != nil {
4893 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004894 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004895 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004896 }
4897 case omci.LayerTypeDeleteResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004898 if resp := msgLayer.(*omci.DeleteResponse); resp != nil {
4899 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004900 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004901 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004902 }
4903 case omci.LayerTypeSetResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004904 if resp := msgLayer.(*omci.SetResponse); resp != nil {
4905 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004906 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004907 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004908 }
4909 case omci.LayerTypeStartSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004910 if resp := msgLayer.(*omci.StartSoftwareDownloadResponse); resp != nil {
4911 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004912 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004913 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004914 }
4915 case omci.LayerTypeEndSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004916 if resp := msgLayer.(*omci.EndSoftwareDownloadResponse); resp != nil {
4917 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004918 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004919 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004920 }
4921 case omci.LayerTypeActivateSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004922 if resp := msgLayer.(*omci.ActivateSoftwareResponse); resp != nil {
4923 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004924 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004925 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004926 }
4927 case omci.LayerTypeCommitSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004928 if resp := msgLayer.(*omci.CommitSoftwareResponse); resp != nil {
4929 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004930 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004931 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004932 }
4933 }
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004934 }
4935 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004936 return false, nil
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004937}
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004938
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004939func (oo *OmciCC) processRequestMonitoring(ctx context.Context, aOmciTxRequest OmciTransferStructure) {
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004940 timeout := aOmciTxRequest.timeout
mpagenkoc26d4c02021-05-06 14:27:57 +00004941 if timeout == 0 {
4942 //timeout 0 indicates that no response is expected - fire and forget
Holger Hildebrandt34555512021-10-01 16:26:59 +00004943 // enqueue
4944 if aOmciTxRequest.highPrio {
4945 oo.mutexHighPrioTxQueue.Lock()
4946 oo.highPrioTxQueue.PushBack(aOmciTxRequest)
4947 oo.mutexHighPrioTxQueue.Unlock()
4948 } else {
4949 oo.mutexLowPrioTxQueue.Lock()
4950 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4951 oo.mutexLowPrioTxQueue.Unlock()
4952 }
4953 go oo.sendQueuedRequests(ctx)
mpagenkoc26d4c02021-05-06 14:27:57 +00004954 } else {
mpagenko7455fd42021-06-10 16:25:55 +00004955 //the supervised sending with waiting on the response (based on TID) is called in background
4956 // to avoid blocking of the sender for the complete OMCI handshake procedure
4957 // to stay consistent with the processing tested so far, sending of next messages of the same control procedure
4958 // is ensured by the according control instances (FSM's etc.) (by waiting for the respective responses there)
4959 go oo.sendWithRxSupervision(ctx, aOmciTxRequest, timeout)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004960 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004961}
4962
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004963func (oo *OmciCC) sendWithRxSupervision(ctx context.Context, aOmciTxRequest OmciTransferStructure, aTimeout int) {
mpagenko7455fd42021-06-10 16:25:55 +00004964 chSuccess := make(chan bool)
4965 aOmciTxRequest.chSuccess = chSuccess
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004966 tid := aOmciTxRequest.cbPair.CbKey
mpagenko7455fd42021-06-10 16:25:55 +00004967 oo.mutexMonReq.Lock()
4968 oo.monitoredRequests[tid] = aOmciTxRequest
4969 oo.mutexMonReq.Unlock()
4970
4971 retries := aOmciTxRequest.retries
4972 retryCounter := 0
4973loop:
4974 for retryCounter <= retries {
Holger Hildebrandt34555512021-10-01 16:26:59 +00004975 // enqueue
4976 if aOmciTxRequest.highPrio {
4977 oo.mutexHighPrioTxQueue.Lock()
4978 oo.highPrioTxQueue.PushBack(aOmciTxRequest)
4979 oo.mutexHighPrioTxQueue.Unlock()
4980 } else {
4981 oo.mutexLowPrioTxQueue.Lock()
4982 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4983 oo.mutexLowPrioTxQueue.Unlock()
4984 }
4985 go oo.sendQueuedRequests(ctx)
mpagenko7455fd42021-06-10 16:25:55 +00004986
4987 select {
4988 case success := <-chSuccess:
4989 if success {
4990 logger.Debugw(ctx, "reqMon: response received in time",
4991 log.Fields{"tid": tid, "device-id": oo.deviceID})
4992 } else {
4993 logger.Debugw(ctx, "reqMon: wait for response aborted",
4994 log.Fields{"tid": tid, "device-id": oo.deviceID})
4995 }
4996 break loop
4997 case <-time.After(time.Duration(aTimeout) * time.Second):
4998 if retryCounter == retries {
Holger Hildebrandt2b107642022-12-09 07:56:23 +00004999 if oo.pBaseDeviceHandler.IsOltAvailable() {
5000 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - send ONU device event!",
5001 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
5002 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationFailureConfig, OnuOmciCommunicationFailureConfigDesc)
5003 } else {
5004 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - skip ONU device event: OLT unavailable!",
5005 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
5006 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005007 oo.incrementTxTimesouts()
mpagenko7455fd42021-06-10 16:25:55 +00005008 break loop
5009 } else {
5010 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
5011 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005012 oo.incrementTxRetries()
mpagenko7455fd42021-06-10 16:25:55 +00005013 }
5014 }
5015 retryCounter++
5016 }
5017 oo.mutexMonReq.Lock()
5018 delete(oo.monitoredRequests, tid)
5019 oo.mutexMonReq.Unlock()
5020}
5021
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05305022// CancelRequestMonitoring terminates monitoring of outstanding omci requests
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005023func (oo *OmciCC) CancelRequestMonitoring(ctx context.Context) {
Holger Hildebrandt12609a12022-03-25 13:23:25 +00005024 logger.Debugw(ctx, "CancelRequestMonitoring entered", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005025 oo.mutexMonReq.RLock()
5026 for k := range oo.monitoredRequests {
mpagenko8cd1bf72021-06-22 10:11:19 +00005027 //implement non-blocking channel send to avoid blocking on mutexMonReq later
5028 select {
5029 case oo.monitoredRequests[k].chSuccess <- false:
Holger Hildebrandt12609a12022-03-25 13:23:25 +00005030 logger.Debugw(ctx, "send cancellation on omciRespChannel",
5031 log.Fields{"index": k, "device-id": oo.deviceID})
mpagenko8cd1bf72021-06-22 10:11:19 +00005032 default:
Holger Hildebrandt12609a12022-03-25 13:23:25 +00005033 logger.Debugw(ctx, "cancellation could not be send on omciRespChannel (no receiver)",
5034 log.Fields{"index": k, "device-id": oo.deviceID})
mpagenko8cd1bf72021-06-22 10:11:19 +00005035 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005036 }
5037 oo.mutexMonReq.RUnlock()
5038}
5039
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05305040// GetMaxOmciTimeoutWithRetries provides a timeout value greater than the maximum
5041// time consumed for retry processing of a particular OMCI-request
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005042func (oo *OmciCC) GetMaxOmciTimeoutWithRetries() time.Duration {
5043 return time.Duration((CDefaultRetries+1)*oo.pBaseDeviceHandler.GetOmciTimeout() + 1)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005044}
Himani Chawla43f95ff2021-06-03 00:24:12 +05305045
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005046// SendCreateOrDeleteEthernetFrameExtendedPMME deletes EthernetFrameExtendedPm ME instance
5047func (oo *OmciCC) SendCreateOrDeleteEthernetFrameExtendedPMME(ctx context.Context, timeout int, highPrio bool,
Himani Chawla43f95ff2021-06-03 00:24:12 +05305048 upstream bool, create bool, rxChan chan Message, entityID uint16, classID me.ClassID, controlBlock []uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005049 tid := oo.GetNextTid(highPrio)
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05305050 logger.Info(ctx, "send-ethernet-frame-extended-pm-me-msg:", log.Fields{"device-id": oo.deviceID,
Himani Chawla43f95ff2021-06-03 00:24:12 +05305051 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
5052
5053 meParam := me.ParamData{EntityID: entityID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00005054 Attributes: me.AttributeValueMap{me.EthernetFrameExtendedPm_ControlBlock: controlBlock},
Himani Chawla43f95ff2021-06-03 00:24:12 +05305055 }
5056 var meInstance *me.ManagedEntity
5057 var omciErr me.OmciErrors
5058 if classID == me.EthernetFrameExtendedPmClassID {
5059 meInstance, omciErr = me.NewEthernetFrameExtendedPm(meParam)
5060 } else {
5061 meInstance, omciErr = me.NewEthernetFrameExtendedPm64Bit(meParam)
5062 }
5063
5064 if omciErr.GetError() == nil {
5065 var omciLayer *omci.OMCI
5066 var msgLayer gopacket.SerializableLayer
5067 var err error
5068 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00005069 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
5070 oframe.AddDefaults(true))
Himani Chawla43f95ff2021-06-03 00:24:12 +05305071 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00005072 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
5073 oframe.AddDefaults(true))
Himani Chawla43f95ff2021-06-03 00:24:12 +05305074 }
5075 if err != nil {
5076 logger.Errorw(ctx, "cannot-encode-ethernet-frame-extended-pm-me",
5077 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5078 return nil, err
5079 }
5080
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00005081 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Himani Chawla43f95ff2021-06-03 00:24:12 +05305082 if err != nil {
5083 logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me",
5084 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5085 return nil, err
5086 }
5087
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005088 omciRxCallbackPair := CallbackPair{CbKey: tid,
5089 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Himani Chawla43f95ff2021-06-03 00:24:12 +05305090 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005091 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawla43f95ff2021-06-03 00:24:12 +05305092 if err != nil {
5093 logger.Errorw(ctx, "Cannot send ethernet-frame-extended-pm-me",
5094 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5095 return nil, err
5096 }
5097 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-done",
5098 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5099 return meInstance, nil
5100 }
5101 logger.Errorw(ctx, "cannot-generate-ethernet-frame-extended-pm-me-instance",
5102 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5103 return nil, omciErr.GetError()
5104}
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005105
5106// RLockMutexMonReq lock read access to monitoredRequests
5107func (oo *OmciCC) RLockMutexMonReq() {
5108 oo.mutexMonReq.RLock()
5109}
5110
5111// RUnlockMutexMonReq unlock read access to monitoredRequests
5112func (oo *OmciCC) RUnlockMutexMonReq() {
5113 oo.mutexMonReq.RUnlock()
5114}
5115
5116// GetMonitoredRequest get OmciTransferStructure for an omciTransID
5117func (oo *OmciCC) GetMonitoredRequest(omciTransID uint16) (value OmciTransferStructure, exist bool) {
5118 value, exist = oo.monitoredRequests[omciTransID]
5119 return value, exist
5120}
5121
5122// SetChMonitoredRequest sets chSuccess to indicate whether response was received or not
5123func (oo *OmciCC) SetChMonitoredRequest(omciTransID uint16, chVal bool) {
5124 oo.monitoredRequests[omciTransID].chSuccess <- chVal
5125}
Himani Chawlaee10b542021-09-20 16:46:40 +05305126
5127// SendSetEthernetFrameExtendedPMME sends the set request for ethernet frame extended type me
5128func (oo *OmciCC) SendSetEthernetFrameExtendedPMME(ctx context.Context, timeout int, highPrio bool,
5129 rxChan chan Message, entityID uint16, classID me.ClassID, controlBlock []uint16) (*me.ManagedEntity, error) {
5130 tid := oo.GetNextTid(highPrio)
5131 logger.Debugw(ctx, "send-set-ethernet-frame-extended-pm-me-control-block:", log.Fields{"device-id": oo.deviceID,
5132 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16)})
5133
5134 meParams := me.ParamData{EntityID: entityID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00005135 Attributes: me.AttributeValueMap{me.EthernetFrameExtendedPm_ControlBlock: controlBlock},
Himani Chawlaee10b542021-09-20 16:46:40 +05305136 }
5137 var meInstance *me.ManagedEntity
5138 var omciErr me.OmciErrors
5139 if classID == me.EthernetFrameExtendedPmClassID {
5140 meInstance, omciErr = me.NewEthernetFrameExtendedPm(meParams)
5141 } else {
5142 meInstance, omciErr = me.NewEthernetFrameExtendedPm64Bit(meParams)
5143 }
5144
5145 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00005146 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Himani Chawlaee10b542021-09-20 16:46:40 +05305147 if err != nil {
5148 logger.Errorw(ctx, "cannot-encode-ethernet-frame-extended-pm-me",
5149 log.Fields{"err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5150 return nil, err
5151 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00005152 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Himani Chawlaee10b542021-09-20 16:46:40 +05305153 if err != nil {
5154 logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me-set-msg",
5155 log.Fields{"err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5156 return nil, err
5157 }
5158 omciRxCallbackPair := CallbackPair{
5159 CbKey: tid,
5160 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
5161 }
5162 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
5163 if err != nil {
5164 logger.Errorw(ctx, "Cannot send ethernet-frame-extended-pm-me",
5165 log.Fields{"Err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5166 return nil, err
5167 }
5168 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-set-msg-done",
5169 log.Fields{"device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5170 return meInstance, nil
5171 }
5172 logger.Errorw(ctx, "cannot-generate-ethernet-frame-extended-pm-me-instance",
5173 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5174 return nil, omciErr.GetError()
5175}
Holger Hildebrandte7cc6092022-02-01 11:37:03 +00005176
5177// PrepareForGarbageCollection - remove references to prepare for garbage collection
5178func (oo *OmciCC) PrepareForGarbageCollection(ctx context.Context, aDeviceID string) {
5179 logger.Debugw(ctx, "prepare for garbage collection", log.Fields{"device-id": aDeviceID})
5180 oo.pBaseDeviceHandler = nil
5181 oo.pOnuDeviceEntry = nil
5182 oo.pOnuAlarmManager = nil
5183}
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005184
5185// GetOmciCounters - TODO: add comment
5186func (oo *OmciCC) GetOmciCounters() *extension.SingleGetValueResponse {
5187 oo.mutexCounters.RLock()
5188 defer oo.mutexCounters.RUnlock()
5189 resp := extension.SingleGetValueResponse{
5190 Response: &extension.GetValueResponse{
5191 Status: extension.GetValueResponse_OK,
5192 Response: &extension.GetValueResponse_OnuOmciStats{
5193 OnuOmciStats: &extension.GetOnuOmciTxRxStatsResponse{},
5194 },
5195 },
5196 }
5197 resp.Response.GetOnuOmciStats().BaseTxArFrames = oo.countersBase.txArFrames
5198 resp.Response.GetOnuOmciStats().BaseTxNoArFrames = oo.countersBase.txNoArFrames
5199 resp.Response.GetOnuOmciStats().BaseRxAkFrames = oo.countersBase.rxAkFrames
5200 resp.Response.GetOnuOmciStats().BaseRxNoAkFrames = oo.countersBase.rxNoAkFrames
5201 resp.Response.GetOnuOmciStats().ExtTxArFrames = oo.countersExt.txArFrames
5202 resp.Response.GetOnuOmciStats().ExtTxNoArFrames = oo.countersExt.txNoArFrames
5203 resp.Response.GetOnuOmciStats().ExtRxAkFrames = oo.countersExt.rxAkFrames
5204 resp.Response.GetOnuOmciStats().ExtRxNoAkFrames = oo.countersExt.rxNoAkFrames
5205 resp.Response.GetOnuOmciStats().TxOmciCounterRetries = oo.txRetries
5206 resp.Response.GetOnuOmciStats().TxOmciCounterTimeouts = oo.txTimeouts
5207 return &resp
5208}
5209
5210// For more speed, separate functions for each counter
5211
5212func (oo *OmciCC) incrementBaseTxArFrames() {
5213 oo.mutexCounters.Lock()
5214 defer oo.mutexCounters.Unlock()
5215 oo.countersBase.txArFrames++
5216}
5217
5218func (oo *OmciCC) incrementExtTxArFrames() {
5219 oo.mutexCounters.Lock()
5220 defer oo.mutexCounters.Unlock()
5221 oo.countersExt.txArFrames++
5222}
5223
5224func (oo *OmciCC) incrementBaseRxAkFrames() {
5225 oo.mutexCounters.Lock()
5226 defer oo.mutexCounters.Unlock()
5227 oo.countersBase.rxAkFrames++
5228}
5229
5230func (oo *OmciCC) incrementExtRxAkFrames() {
5231 oo.mutexCounters.Lock()
5232 defer oo.mutexCounters.Unlock()
5233 oo.countersExt.rxAkFrames++
5234}
5235
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +05305236//nolint:unparam
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005237func (oo *OmciCC) increaseBaseTxNoArFramesBy(ctx context.Context, value uint32) {
5238 oo.mutexCounters.Lock()
5239 defer oo.mutexCounters.Unlock()
5240 oo.countersBase.txNoArFrames += value
5241}
5242
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +05305243//nolint:unparam
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005244func (oo *OmciCC) increaseExtTxNoArFramesBy(ctx context.Context, value uint32) {
5245 oo.mutexCounters.Lock()
5246 defer oo.mutexCounters.Unlock()
5247 oo.countersExt.txNoArFrames += value
5248}
5249
5250func (oo *OmciCC) incrementBaseRxNoAkFrames() {
5251 oo.mutexCounters.Lock()
5252 defer oo.mutexCounters.Unlock()
5253 oo.countersBase.rxNoAkFrames++
5254}
5255
5256func (oo *OmciCC) incrementExtRxNoAkFrames() {
5257 oo.mutexCounters.Lock()
5258 defer oo.mutexCounters.Unlock()
5259 oo.countersExt.rxNoAkFrames++
5260}
5261
5262func (oo *OmciCC) incrementTxRetries() {
5263 oo.mutexCounters.Lock()
5264 defer oo.mutexCounters.Unlock()
5265 oo.txRetries++
5266}
5267
5268func (oo *OmciCC) incrementTxTimesouts() {
5269 oo.mutexCounters.Lock()
5270 defer oo.mutexCounters.Unlock()
5271 oo.txTimeouts++
5272}
Holger Hildebrandt7e138462023-03-29 12:12:14 +00005273
5274// NotifyAboutOnuConfigFailure - trigger ONU DeviceEvent to notify about ONU config failure
5275func (oo *OmciCC) NotifyAboutOnuConfigFailure(ctx context.Context, errID string, meClassID me.ClassID, meEntityID uint16,
5276 meName string, meResult me.Results) {
5277 var description string
5278 if !oo.confFailMeAlreadyHandled(meClassID) {
5279 switch errID {
5280 case OnuConfigFailureResponseErr:
5281 description = OnuConfigFailureResponseErrDesc + meResult.String() +
5282 ", OMCI ME: " + meName + " / instance: " + fmt.Sprintf("%d", meEntityID) + " (only first instance reported)"
5283 case OnuConfigFailureTimeout:
5284 description = OnuConfigFailureTimeoutDesc + meName + " / instance: " + fmt.Sprintf("%d", meEntityID) +
5285 " (only first instance reported)"
5286 default:
5287 logger.Warnw(ctx, "method called with undefined errID", log.Fields{"errID": errID, "device-id": oo.deviceID})
5288 return
5289 }
5290 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, errID, description)
5291 oo.appendConfFailMe(meClassID)
5292 }
5293}
5294
5295func (oo *OmciCC) confFailMeAlreadyHandled(meClassID me.ClassID) bool {
5296 oo.mutexConfFailMEs.RLock()
5297 defer oo.mutexConfFailMEs.RUnlock()
5298 for _, v := range oo.confFailMEs {
5299 if v == meClassID {
5300 return true
5301 }
5302 }
5303 return false
5304}
5305
5306func (oo *OmciCC) appendConfFailMe(meClassID me.ClassID) {
5307 oo.mutexConfFailMEs.Lock()
5308 defer oo.mutexConfFailMEs.Unlock()
5309 oo.confFailMEs = append(oo.confFailMEs, meClassID)
5310}
5311
5312// ResetConfFailMEs - reset list of stored config failure MEs
5313func (oo *OmciCC) ResetConfFailMEs() {
5314 oo.mutexConfFailMEs.Lock()
5315 defer oo.mutexConfFailMEs.Unlock()
5316 oo.confFailMEs = nil
5317}