blob: 265bcab74e9ac0468e7b6ba345b4814c452334ad [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
pnalmasc6e916a2025-06-30 11:59:16 +0530652 //Remove the call back from the rxSchedulerMap
653 oo.mutexRxSchedMap.Lock()
654 delete(oo.rxSchedulerMap, queueElement.Value.(OmciTransferStructure).cbPair.CbKey)
655 oo.mutexRxSchedMap.Unlock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000656 return err
mpagenko80622a52021-02-09 16:53:23 +0000657 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000658 oo.highPrioTxQueue.Remove(queueElement) // Dequeue
659 }
660 return nil
661}
662
663func (oo *OmciCC) sendQueuedLowPrioRequests(ctx context.Context) error {
664 oo.mutexLowPrioTxQueue.Lock()
665 for oo.lowPrioTxQueue.Len() > 0 {
666 queueElement := oo.lowPrioTxQueue.Front() // First element
kesavand011d5162021-11-25 19:21:06 +0530667 // check if the element is for onu sw section
668 aOmciTxReq := queueElement.Value.(OmciTransferStructure)
669 if aOmciTxReq.OnuSwWindow != nil {
670 if err := oo.sendOnuSwSectionsOfWindow(ctx, aOmciTxReq); err != nil {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000671 // Element will be removed from the queue regardless of the send success, to prevent
672 // an accumulation of send requests for the same message in the event of an error.
673 // In this case, resend attempts for the message are ensured by our retry
674 // mechanism after omci-timeout.
675 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
kesavand011d5162021-11-25 19:21:06 +0530676 oo.mutexLowPrioTxQueue.Unlock()
pnalmasc6e916a2025-06-30 11:59:16 +0530677 //Remove the call back from the rxSchedulerMap
678 oo.mutexRxSchedMap.Lock()
679 delete(oo.rxSchedulerMap, queueElement.Value.(OmciTransferStructure).cbPair.CbKey)
680 oo.mutexRxSchedMap.Unlock()
kesavand011d5162021-11-25 19:21:06 +0530681 return err
682 }
683 } else {
684 err := oo.sendOMCIRequest(ctx, queueElement.Value.(OmciTransferStructure))
685 if err != nil {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000686 // Element will be removed from the queue regardless of the send success, to prevent
687 // an accumulation of send requests for the same message in the event of an error.
688 // In this case, resend attempts for the message are ensured by our retry
689 // mechanism after omci-timeout.
690 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
kesavand011d5162021-11-25 19:21:06 +0530691 oo.mutexLowPrioTxQueue.Unlock()
pnalmasc6e916a2025-06-30 11:59:16 +0530692 oo.mutexRxSchedMap.Lock()
693 delete(oo.rxSchedulerMap, queueElement.Value.(OmciTransferStructure).cbPair.CbKey)
694 oo.mutexRxSchedMap.Unlock()
kesavand011d5162021-11-25 19:21:06 +0530695 return err
696 }
amit.ghosh58b704b2021-06-18 03:45:52 +0200697 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000698 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
699 // Interrupt the sending of low priority requests to process any high priority requests
700 // that may have arrived in the meantime
701 oo.mutexLowPrioTxQueue.Unlock()
702 if err := oo.sendQueuedHighPrioRequests(ctx); err != nil {
703 return err
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000704 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000705 oo.mutexLowPrioTxQueue.Lock()
706 }
707
708 oo.mutexLowPrioTxQueue.Unlock()
709 return nil
710}
711
712func (oo *OmciCC) sendOMCIRequest(ctx context.Context, omciTxRequest OmciTransferStructure) error {
713 if omciTxRequest.withFramePrint {
714 logger.Debugw(ctx, "omci-message-to-send:", log.Fields{
715 "TxOmciMessage": hex.EncodeToString(omciTxRequest.txFrame),
716 "device-id": oo.deviceID,
717 "toDeviceType": oo.pBaseDeviceHandler.GetProxyAddressType(),
718 "proxyDeviceID": oo.pBaseDeviceHandler.GetProxyAddressID(),
719 "proxyAddress": oo.pBaseDeviceHandler.GetProxyAddress()})
720 }
khenaidoo42dcdfd2021-10-19 17:34:12 -0400721 omciMsg := &ia.OmciMessage{
Holger Hildebrandt34555512021-10-01 16:26:59 +0000722 ParentDeviceId: oo.pBaseDeviceHandler.GetProxyAddressID(),
723 ChildDeviceId: oo.deviceID,
724 Message: omciTxRequest.txFrame,
725 ProxyAddress: oo.pBaseDeviceHandler.GetProxyAddress(),
726 ConnectStatus: common.ConnectStatus_REACHABLE, // If we are sending OMCI messages means we are connected, else we should not be here
727 }
728 sendErr := oo.pBaseDeviceHandler.SendOMCIRequest(ctx, oo.pBaseDeviceHandler.GetProxyAddress().AdapterEndpoint, omciMsg)
729 if sendErr != nil {
Holger Hildebrandtabfef032022-02-25 12:40:20 +0000730 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 +0000731 return sendErr
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000732 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000733 if omciTxRequest.txFrame[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
734 oo.incrementBaseTxArFrames()
735 } else {
736 oo.incrementExtTxArFrames()
737 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000738 return nil
739}
740
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000741// GetNextTid - TODO: add comment
742func (oo *OmciCC) GetNextTid(highPriority bool) uint16 {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000743 var next uint16
744 if highPriority {
mpagenko900ee4b2020-10-12 11:56:34 +0000745 oo.mutexHpTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000746 next = oo.hpTid
Himani Chawla4d908332020-08-31 12:30:20 +0530747 oo.hpTid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000748 if oo.hpTid < 0x8000 {
749 oo.hpTid = 0x8000
750 }
mpagenko900ee4b2020-10-12 11:56:34 +0000751 oo.mutexHpTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000752 } else {
mpagenko900ee4b2020-10-12 11:56:34 +0000753 oo.mutexTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000754 next = oo.tid
Himani Chawla4d908332020-08-31 12:30:20 +0530755 oo.tid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000756 if oo.tid >= 0x8000 {
757 oo.tid = 1
758 }
mpagenko900ee4b2020-10-12 11:56:34 +0000759 oo.mutexTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000760 }
761 return next
762}
763
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530764// GetOnuSwSecNextTid get the next low prio tid for the onu sw sections
765// onu sw sections uses only low priority tids
766// The mutexTid lock should be taken prior to using this function
kesavand011d5162021-11-25 19:21:06 +0530767func (oo *OmciCC) GetOnuSwSecNextTid() uint16 {
kesavand011d5162021-11-25 19:21:06 +0530768 if oo.tid >= 0x8000 {
769 oo.tid = 1
770 }
bseenivad32c2742024-12-09 11:46:17 +0530771 next := oo.tid
772 oo.tid++
kesavand011d5162021-11-25 19:21:06 +0530773 return next
774}
775
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530776// GetOnuSwSecLastTid gets the last allocated tid
777// The mutexTid lock should be taken prior to using this function
kesavand011d5162021-11-25 19:21:06 +0530778func (oo *OmciCC) GetOnuSwSecLastTid() uint16 {
779 next := oo.tid
780 lastAllocatedTid := next - 1
781 return lastAllocatedTid
782}
783
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530784// LockMutexTID locks mutexTid
kesavand011d5162021-11-25 19:21:06 +0530785func (oo *OmciCC) LockMutexTID() {
786 oo.mutexTid.Lock()
787}
788
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530789// UnLockMutexTID unlocks mutexTid
kesavand011d5162021-11-25 19:21:06 +0530790func (oo *OmciCC) UnLockMutexTID() {
791 oo.mutexTid.Unlock()
792}
793
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000794// ###################################################################################
795// # utility methods provided to work on OMCI messages
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000796
797// Serialize - TODO: add comment
798func Serialize(ctx context.Context, msgType omci.MessageType, request gopacket.SerializableLayer, tid uint16) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000799 omciLayer := &omci.OMCI{
800 TransactionID: tid,
801 MessageType: msgType,
802 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000803 return SerializeOmciLayer(ctx, omciLayer, request)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000804}
805
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000806// SerializeOmciLayer - TODO: add comment
807func SerializeOmciLayer(ctx context.Context, aOmciLayer *omci.OMCI, aRequest gopacket.SerializableLayer) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000808 var options gopacket.SerializeOptions
809 options.FixLengths = true
810
811 buffer := gopacket.NewSerializeBuffer()
Himani Chawla4d908332020-08-31 12:30:20 +0530812 err := gopacket.SerializeLayers(buffer, options, aOmciLayer, aRequest)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000813 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000814 logger.Errorw(ctx, "Could not create goPacket Omci serial buffer", log.Fields{"Err": err})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000815 return nil, err
816 }
817 return buffer.Bytes(), nil
818}
819
Himani Chawla4d908332020-08-31 12:30:20 +0530820/*
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000821func hexEncode(omciPkt []byte) ([]byte, error) {
822 dst := make([]byte, hex.EncodedLen(len(omciPkt)))
823 hex.Encode(dst, omciPkt)
824 return dst, nil
825}
Himani Chawla4d908332020-08-31 12:30:20 +0530826*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000827
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530828// supply a response handler for omci response messages to be transferred to the requested FSM
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000829func (oo *OmciCC) receiveOmciResponse(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet, respChan chan Message) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000830
dbainbri4d3a0dc2020-12-02 00:33:42 +0000831 logger.Debugw(ctx, "omci-message-response - transfer on omciRespChannel", log.Fields{"omciMsgType": omciMsg.MessageType,
divyadesai4d299552020-08-18 07:13:49 +0000832 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000833
834 if oo.pOnuDeviceEntry == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000835 logger.Errorw(ctx, "Abort receiving OMCI response, DeviceEntryPointer is nil", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000836 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200837 return fmt.Errorf("deviceEntryPointer is nil %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000838 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000839 oo.mutexMonReq.RLock()
840 if _, exist := oo.monitoredRequests[omciMsg.TransactionID]; exist {
mpagenko8cd1bf72021-06-22 10:11:19 +0000841 //implement non-blocking channel send to avoid blocking on mutexMonReq later
842 select {
843 case oo.monitoredRequests[omciMsg.TransactionID].chSuccess <- true:
844 default:
845 logger.Debugw(ctx, "response not send on omciRespChannel (no receiver)", log.Fields{
846 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
847 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000848 } else {
849 logger.Infow(ctx, "reqMon: map entry does not exist!",
850 log.Fields{"tid": omciMsg.TransactionID, "device-id": oo.deviceID})
851 }
852 oo.mutexMonReq.RUnlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000853
854 // no further test on SeqNo is done here, assignment from rxScheduler is trusted
855 // MibSync responses are simply transferred via deviceEntry to MibSync, no specific analysis here
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000856 omciRespMsg := Message{
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000857 Type: OMCI,
858 Data: OmciMessage{
859 OmciMsg: omciMsg,
860 OmciPacket: packet,
861 },
862 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000863 //logger.Debugw(ctx,"Message to be sent into channel:", log.Fields{"mibSyncMsg": mibSyncMsg})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000864 respChan <- omciRespMsg
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000865
866 return nil
867}
868
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000869// SendMibReset sends MibResetRequest
870func (oo *OmciCC) SendMibReset(ctx context.Context, timeout int, highPrio bool) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000871
nikesh.krishnan1ffb8132023-05-23 03:44:13 +0530872 logger.Infow(ctx, "send MibReset-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000873 request := &omci.MibResetRequest{
874 MeBasePacket: omci.MeBasePacket{
875 EntityClass: me.OnuDataClassID,
876 },
877 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000878 tid := oo.GetNextTid(highPrio)
879 pkt, err := Serialize(ctx, omci.MibResetRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000880 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000881 logger.Errorw(ctx, "Cannot serialize MibResetRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000882 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000883 return err
884 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000885 omciRxCallbackPair := CallbackPair{
886 CbKey: tid,
887 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000888 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000889 return oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000890}
891
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000892// SendReboot sends RebootRequest
893func (oo *OmciCC) SendReboot(ctx context.Context, timeout int, highPrio bool, responseChannel chan Message) error {
894 logger.Debugw(ctx, "send reboot-msg to:", log.Fields{"device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300895 request := &omci.RebootRequest{
896 MeBasePacket: omci.MeBasePacket{
897 EntityClass: me.OnuGClassID,
898 },
899 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000900 tid := oo.GetNextTid(highPrio)
901 pkt, err := Serialize(ctx, omci.RebootRequestType, request, tid)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300902 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000903 logger.Errorw(ctx, "Cannot serialize 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 omciRxCallbackPair := CallbackPair{
908 CbKey: tid,
909 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetOmciRebootMsgRevChan(), oo.receiveOmciResponse, true},
ozgecanetsiae11479f2020-07-06 09:44:47 +0300910 }
911
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000912 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300913 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000914 logger.Errorw(ctx, "Cannot send RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000915 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300916 return err
917 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000918 err = oo.pOnuDeviceEntry.WaitForRebootResponse(ctx, responseChannel)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300919 if err != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000920 logger.Errorw(ctx, "aborting ONU reboot!", log.Fields{
Andrea Campanella6515c582020-10-05 11:25:00 +0200921 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300922 return err
923 }
924 return nil
925}
926
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000927// SendMibUpload sends MibUploadRequest
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000928func (oo *OmciCC) SendMibUpload(ctx context.Context, timeout int, highPrio bool, isExtOmciSupported bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000929 logger.Debugw(ctx, "send MibUpload-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000930
931 tid := oo.GetNextTid(highPrio)
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000932
933 omciLayer := &omci.OMCI{
934 TransactionID: tid,
935 MessageType: omci.MibUploadRequestType,
936 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000937 if isExtOmciSupported {
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000938 omciLayer.DeviceIdentifier = omci.ExtendedIdent
939 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000940 request := &omci.MibUploadRequest{
941 MeBasePacket: omci.MeBasePacket{
942 EntityClass: me.OnuDataClassID,
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000943 Extended: isExtOmciSupported,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000944 },
945 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000946 var options gopacket.SerializeOptions
947 options.FixLengths = true
948
949 buffer := gopacket.NewSerializeBuffer()
950 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000951 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000952 logger.Errorw(ctx, "Cannot serialize MibUploadRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000953 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000954 return err
955 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000956 oo.UploadSequNo = 0
957 oo.UploadNoOfCmds = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000958
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000959 omciRxCallbackPair := CallbackPair{
960 CbKey: tid,
961 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000962 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000963 return oo.Send(ctx, buffer.Bytes(), timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000964}
965
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000966// SendMibUploadNext sends MibUploadNextRequest
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000967func (oo *OmciCC) SendMibUploadNext(ctx context.Context, timeout int, highPrio bool, isExtOmciSupported bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000968 logger.Debugw(ctx, "send MibUploadNext-msg to:", log.Fields{"device-id": oo.deviceID, "UploadSequNo": oo.UploadSequNo})
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000969
970 tid := oo.GetNextTid(highPrio)
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000971
972 omciLayer := &omci.OMCI{
973 TransactionID: tid,
974 MessageType: omci.MibUploadNextRequestType,
975 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000976 if isExtOmciSupported {
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000977 omciLayer.DeviceIdentifier = omci.ExtendedIdent
978 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000979 request := &omci.MibUploadNextRequest{
980 MeBasePacket: omci.MeBasePacket{
981 EntityClass: me.OnuDataClassID,
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000982 Extended: isExtOmciSupported,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000983 },
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000984 CommandSequenceNumber: oo.UploadSequNo,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000985 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000986 var options gopacket.SerializeOptions
987 options.FixLengths = true
988
989 buffer := gopacket.NewSerializeBuffer()
990 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000991 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000992 logger.Errorw(ctx, "Cannot serialize MibUploadNextRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000993 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000994 return err
995 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000996 oo.UploadSequNo++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000997
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000998 omciRxCallbackPair := CallbackPair{
999 CbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001000 //frame printing for MibUpload frames disabled now per default to avoid log file abort situations (size/speed?)
1001 // if wanted, rx frame printing should be specifically done within the MibUpload FSM or controlled via extra parameter
1002 // compare also software upgrade download section handling
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001003 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001004 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +00001005 return oo.Send(ctx, buffer.Bytes(), timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001006}
1007
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001008// SendGetAllAlarm gets all alarm ME instances
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001009func (oo *OmciCC) SendGetAllAlarm(ctx context.Context, alarmRetreivalMode uint8, timeout int, highPrio bool, isExtendedOmci bool) error {
Himani Chawlad3dac422021-03-13 02:31:31 +05301010 logger.Debugw(ctx, "send GetAllAlarms-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001011
1012 tid := oo.GetNextTid(highPrio)
1013 omciLayer := &omci.OMCI{
1014 TransactionID: tid,
1015 MessageType: omci.GetAllAlarmsRequestType,
1016 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1017 }
1018 if isExtendedOmci {
1019 omciLayer.DeviceIdentifier = omci.ExtendedIdent
1020 }
Himani Chawlad3dac422021-03-13 02:31:31 +05301021 request := &omci.GetAllAlarmsRequest{
1022 MeBasePacket: omci.MeBasePacket{
1023 EntityClass: me.OnuDataClassID,
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001024 Extended: isExtendedOmci,
Himani Chawlad3dac422021-03-13 02:31:31 +05301025 },
1026 AlarmRetrievalMode: byte(alarmRetreivalMode),
1027 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001028 var options gopacket.SerializeOptions
1029 options.FixLengths = true
1030 buffer := gopacket.NewSerializeBuffer()
1031 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Himani Chawlad3dac422021-03-13 02:31:31 +05301032 if err != nil {
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001033 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsRequest", log.Fields{"Err": err,
1034 "device-id": oo.deviceID})
Himani Chawlad3dac422021-03-13 02:31:31 +05301035 return err
1036 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001037 outgoingPacket := buffer.Bytes()
1038
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001039 oo.pOnuAlarmManager.ResetAlarmUploadCounters()
Himani Chawlad3dac422021-03-13 02:31:31 +05301040
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001041 omciRxCallbackPair := CallbackPair{
1042 CbKey: tid,
1043 CbEntry: CallbackPairEntry{oo.pOnuAlarmManager.GetAlarmMgrEventChannel(), oo.receiveOmciResponse, true},
Himani Chawlad3dac422021-03-13 02:31:31 +05301044 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001045 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
1046 if err != nil {
1047 logger.Errorw(ctx, "Cannot send GetAllAlarmsRequest", log.Fields{"Err": err,
1048 "device-id": oo.deviceID})
1049 return err
1050 }
1051 logger.Debug(ctx, "send GetAllAlarmsRequest done")
1052 return nil
Himani Chawlad3dac422021-03-13 02:31:31 +05301053}
1054
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001055// SendGetAllAlarmNext gets next alarm ME instance
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001056func (oo *OmciCC) SendGetAllAlarmNext(ctx context.Context, timeout int, highPrio bool, isExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001057 alarmUploadSeqNo := oo.pOnuAlarmManager.GetAlarmUploadSeqNo()
1058 logger.Debugw(ctx, "send SendGetAllAlarmNext-msg to:", log.Fields{"device-id": oo.deviceID,
Himani Chawlad3dac422021-03-13 02:31:31 +05301059 "alarmUploadSeqNo": alarmUploadSeqNo})
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001060
1061 tid := oo.GetNextTid(highPrio)
1062 omciLayer := &omci.OMCI{
1063 TransactionID: tid,
1064 MessageType: omci.GetAllAlarmsNextRequestType,
1065 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1066 }
1067 if isExtendedOmci {
1068 omciLayer.DeviceIdentifier = omci.ExtendedIdent
1069 }
Himani Chawlad3dac422021-03-13 02:31:31 +05301070 request := &omci.GetAllAlarmsNextRequest{
1071 MeBasePacket: omci.MeBasePacket{
1072 EntityClass: me.OnuDataClassID,
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001073 Extended: isExtendedOmci,
Himani Chawlad3dac422021-03-13 02:31:31 +05301074 },
1075 CommandSequenceNumber: alarmUploadSeqNo,
1076 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001077 var options gopacket.SerializeOptions
1078 options.FixLengths = true
1079 buffer := gopacket.NewSerializeBuffer()
1080 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Himani Chawlad3dac422021-03-13 02:31:31 +05301081 if err != nil {
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001082 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsNextRequest", log.Fields{"Err": err,
1083 "device-id": oo.deviceID})
Himani Chawlad3dac422021-03-13 02:31:31 +05301084 return err
1085 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001086 outgoingPacket := buffer.Bytes()
1087
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001088 oo.pOnuAlarmManager.IncrementAlarmUploadSeqNo()
Himani Chawlad3dac422021-03-13 02:31:31 +05301089
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001090 omciRxCallbackPair := CallbackPair{
1091 CbKey: tid,
1092 CbEntry: CallbackPairEntry{oo.pOnuAlarmManager.GetAlarmMgrEventChannel(), oo.receiveOmciResponse, true},
Himani Chawlad3dac422021-03-13 02:31:31 +05301093 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001094 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
1095 if err != nil {
1096 logger.Errorw(ctx, "Cannot send GetAllAlarmsNextRequest", log.Fields{"Err": err,
1097 "device-id": oo.deviceID})
1098 return err
1099 }
1100 logger.Debug(ctx, "send GetAllAlarmsNextRequest done")
1101 return nil
Himani Chawlad3dac422021-03-13 02:31:31 +05301102}
1103
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001104// SendCreateGalEthernetProfile creates GalEthernetProfile ME instance
1105func (oo *OmciCC) SendCreateGalEthernetProfile(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1106 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001107 logger.Debugw(ctx, "send GalEnetProfile-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001108 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001109
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001110 meParams := me.ParamData{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001111 EntityID: GalEthernetEID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001112 Attributes: me.AttributeValueMap{me.GalEthernetProfile_MaximumGemPayloadSize: maxGemPayloadSize},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001113 }
1114 meInstance, omciErr := me.NewGalEthernetProfile(meParams)
1115 if omciErr.GetError() == nil {
1116 //all setByCreate parameters already set, no default option required ...
mpagenko836a1fd2021-11-01 16:12:42 +00001117 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001118 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001119 logger.Errorw(ctx, "Cannot encode GalEnetProfileInstance for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001120 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001121 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001122 }
1123
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001124 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001125 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001126 logger.Errorw(ctx, "Cannot serialize 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 }
1130
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001131 omciRxCallbackPair := CallbackPair{
1132 CbKey: tid,
1133 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001134 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001135 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001136 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001137 logger.Errorw(ctx, "Cannot send GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001138 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001139 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001140 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001141 logger.Debug(ctx, "send GalEnetProfile-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001142 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001143 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001144 logger.Errorw(ctx, "Cannot generate GalEnetProfileInstance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001145 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001146 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001147}
1148
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001149// SendSetOnu2g sets Onu2G ME instance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001150// might be needed to extend for parameter arguments, here just for setting the ConnectivityMode!!
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001151func (oo *OmciCC) SendSetOnu2g(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1152 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001153 logger.Debugw(ctx, "send ONU2-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001154 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001155
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001156 // ONU-G ME-ID is defined to be 0, but we could verify, if the ONU really supports the desired
1157 // connectivity mode 5 (in ConnCap)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001158 // By now we just use fix values to fire - this is anyway what the python adapter does
1159 // read ONU-2G from DB ???? //TODO!!!
1160 meParams := me.ParamData{
1161 EntityID: 0,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001162 Attributes: me.AttributeValueMap{me.Onu2G_CurrentConnectivityMode: connectivityModeValue},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001163 }
1164 meInstance, omciErr := me.NewOnu2G(meParams)
1165 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001166 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001167 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001168 logger.Errorw(ctx, "Cannot encode ONU2-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001169 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001170 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001171 }
1172
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001173 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001174 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001175 logger.Errorw(ctx, "Cannot serialize 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 }
1179
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001180 omciRxCallbackPair := CallbackPair{
1181 CbKey: tid,
1182 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001183 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001184 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001185 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001186 logger.Errorw(ctx, "Cannot send ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001187 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001188 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001189 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001190 logger.Debug(ctx, "send ONU2-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001191 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001192 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001193 logger.Errorw(ctx, "Cannot generate ONU2-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001194 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001195 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001196}
1197
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001198// SendCreateMBServiceProfile creates MacBridgeServiceProfile ME instance
1199func (oo *OmciCC) SendCreateMBServiceProfile(ctx context.Context,
1200 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1201 tid := oo.GetNextTid(highPrio)
1202 instID := MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001203 logger.Debugw(ctx, "send MBSP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001204 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001205
1206 meParams := me.ParamData{
1207 EntityID: instID,
1208 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001209 me.MacBridgeServiceProfile_Priority: 0x8000,
1210 me.MacBridgeServiceProfile_MaxAge: 20 * 256, //20s
1211 me.MacBridgeServiceProfile_HelloTime: 2 * 256, //2s
1212 me.MacBridgeServiceProfile_ForwardDelay: 15 * 256, //15s
1213 me.MacBridgeServiceProfile_DynamicFilteringAgeingTime: 0,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001214 },
1215 }
1216
1217 meInstance, omciErr := me.NewMacBridgeServiceProfile(meParams)
1218 if omciErr.GetError() == nil {
1219 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001220 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1221 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001222 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001223 logger.Errorw(ctx, "Cannot encode MBSP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001224 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001225 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001226 }
1227
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001228 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001229 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001230 logger.Errorw(ctx, "Cannot serialize 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 }
1234
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001235 omciRxCallbackPair := CallbackPair{
1236 CbKey: tid,
1237 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001238 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001239 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001240 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001241 logger.Errorw(ctx, "Cannot send MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001242 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001243 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001244 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001245 logger.Debug(ctx, "send MBSP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001246 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001247 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001248 logger.Errorw(ctx, "Cannot generate MBSP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001249 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001250 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001251}
1252
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001253// SendCreateMBPConfigDataUniSide creates MacBridgePortConfigurationData ME instance
1254func (oo *OmciCC) SendCreateMBPConfigDataUniSide(ctx context.Context,
1255 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1256 tid := oo.GetNextTid(highPrio)
1257 instID, idErr := GenerateUNISideMBPCDEID(uint16(aPUniPort.MacBpNo))
Mahir Gunyel6781f962021-05-16 23:30:08 -07001258 if idErr != nil {
1259 logger.Errorw(ctx, "Cannot generate MBPCD entity id", log.Fields{
1260 "Err": idErr, "device-id": oo.deviceID})
1261 return nil, idErr
1262 }
1263 logger.Debugw(ctx, "send MBPCD-Create-msg for uni side:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001264 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16), "macBpNo": aPUniPort.MacBpNo})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001265
1266 meParams := me.ParamData{
1267 EntityID: instID,
1268 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001269 me.MacBridgePortConfigurationData_BridgeIdPointer: MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo),
1270 me.MacBridgePortConfigurationData_PortNum: aPUniPort.MacBpNo,
1271 me.MacBridgePortConfigurationData_TpType: uint8(aPUniPort.PortType),
1272 me.MacBridgePortConfigurationData_TpPointer: aPUniPort.EntityID,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001273 },
1274 }
1275 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
1276 if omciErr.GetError() == nil {
1277 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001278 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1279 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001280 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001281 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001282 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001283 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001284 }
1285
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001286 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001287 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001288 logger.Errorw(ctx, "Cannot serialize 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 }
1292
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001293 omciRxCallbackPair := CallbackPair{
1294 CbKey: tid,
1295 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001296 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001297 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001298 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001299 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001300 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001301 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001302 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001303 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001304 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001305 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001306 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001307 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001308 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001309}
1310
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001311// SendCreateEVTOConfigData creates ExtendedVlanTaggingOperationConfigurationData ME instance
1312func (oo *OmciCC) SendCreateEVTOConfigData(ctx context.Context,
1313 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1314 tid := oo.GetNextTid(highPrio)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001315 //same entityId is used as for MBSP (see there), but just arbitrary ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001316 instID := MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001317 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001318 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001319
1320 // compare python adapter code WA VOL-1311: this is not done here!
1321 // (setting TPID values for the create would probably anyway be ignored by the omci lib)
1322 // but perhaps we have to be aware of possible problems at get(Next) Request handling for EVTOOCD tables later ...
1323 assType := uint8(2) // default AssociationType is PPTPEthUni
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001324 if aPUniPort.PortType == UniVEIP {
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001325 assType = uint8(10) // for VEIP
1326 }
1327 meParams := me.ParamData{
1328 EntityID: instID,
1329 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001330 me.ExtendedVlanTaggingOperationConfigurationData_AssociationType: assType,
1331 me.ExtendedVlanTaggingOperationConfigurationData_AssociatedMePointer: aPUniPort.EntityID,
mpagenko836a1fd2021-11-01 16:12:42 +00001332 //EnhancedMode not yet supported, used with default options
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001333 },
1334 }
1335 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(meParams)
1336 if omciErr.GetError() == nil {
1337 //all setByCreate parameters already set, no default option required ...
mpagenko836a1fd2021-11-01 16:12:42 +00001338 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1339 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001340 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001341 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001342 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001343 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001344 }
1345
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001346 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001347 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001348 logger.Errorw(ctx, "Cannot serialize 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 }
1352
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001353 omciRxCallbackPair := CallbackPair{
1354 CbKey: tid,
1355 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001356 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001357 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001358 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001359 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001360 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001361 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001362 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001363 logger.Debug(ctx, "send EVTOCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001364 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001365 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001366 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001367 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001368 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001369}
1370
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001371// SendSetOnuGLS sets OnuG ME instance
1372func (oo *OmciCC) SendSetOnuGLS(ctx context.Context, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001373 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001374 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001375 logger.Debugw(ctx, "send ONU-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001376 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001377
1378 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1379 meParams := me.ParamData{
1380 EntityID: 0,
1381 Attributes: requestedAttributes,
1382 }
1383 meInstance, omciErr := me.NewOnuG(meParams)
1384 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001385 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001386 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001387 logger.Errorw(ctx, "Cannot encode ONU-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001388 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001389 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001390 }
1391
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001392 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001393 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001394 logger.Errorw(ctx, "Cannot serialize 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 }
1398
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001399 omciRxCallbackPair := CallbackPair{
1400 CbKey: tid,
1401 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001402 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001403 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001404 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001405 logger.Errorw(ctx, "Cannot send ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001406 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001407 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001408 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001409 logger.Debug(ctx, "send ONU-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001410 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001411 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001412 logger.Errorw(ctx, "Cannot generate ONU-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001413 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001414 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001415}
1416
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001417// SendSetPptpEthUniLS sets PhysicalPathTerminationPointEthernetUni ME instance
1418func (oo *OmciCC) SendSetPptpEthUniLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001419 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001420 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001421 logger.Debugw(ctx, "send PPTPEthUni-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001422 "SequNo": strconv.FormatInt(int64(tid), 16)})
1423
1424 // PPTPEthUni ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1425 meParams := me.ParamData{
1426 EntityID: aInstNo,
1427 Attributes: requestedAttributes,
1428 }
1429 meInstance, omciErr := me.NewPhysicalPathTerminationPointEthernetUni(meParams)
1430 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001431 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001432 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001433 logger.Errorw(ctx, "Cannot encode PPTPEthUni instance for set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001434 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001435 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001436 }
1437
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001438 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001439 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001440 logger.Errorw(ctx, "Cannot serialize 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 }
1444
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001445 omciRxCallbackPair := CallbackPair{
1446 CbKey: tid,
1447 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001448 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001449 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001450 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001451 logger.Errorw(ctx, "Cannot send PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001452 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001453 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001454 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001455 logger.Debug(ctx, "send PPTPEthUni-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001456 return meInstance, nil
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001457 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001458 logger.Errorw(ctx, "Cannot generate PPTPEthUni", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001459 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001460 return nil, omciErr.GetError()
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001461}
1462
1463/* UniG obsolete by now, left here in case it should be needed once again
1464 UniG AdminState anyway should be ignored by ONU acc. to G988
Himani Chawla6d2ae152020-09-02 13:11:20 +05301465func (oo *omciCC) sendSetUniGLS(ctx context.Context, aInstNo uint16, timeout int,
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001466 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) *me.ManagedEntity {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001467 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001468 logger.Debugw(ctx,"send UNI-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001469 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001470
1471 // UNI-G ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1472 meParams := me.ParamData{
1473 EntityID: aInstNo,
1474 Attributes: requestedAttributes,
1475 }
1476 meInstance, omciErr := me.NewUniG(meParams)
1477 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001478 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001479 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001480 logger.Errorw(ctx,"Cannot encode UNI-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001481 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001482 return nil
1483 }
1484
1485 pkt, err := serializeOmciLayer(omciLayer, msgLayer)
1486 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001487 logger.Errorw(ctx,"Cannot serialize UNI-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
1490 }
1491
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001492 omciRxCallbackPair := CallbackPair{
1493 CbKey: tid,
1494 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001495 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001496 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001497 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001498 logger.Errorw(ctx,"Cannot send UNIG-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001499 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001500 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001501 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001502 logger.Debug(ctx,"send UNI-G-Set-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001503 return meInstance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001504 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001505 logger.Errorw(ctx,"Cannot generate UNI-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001506 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001507 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001508}
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001509*/
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001510
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001511// SendSetVeipLS sets VirtualEthernetInterfacePoint ME instance
1512func (oo *OmciCC) SendSetVeipLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001513 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001514 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001515 logger.Debugw(ctx, "send VEIP-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001516 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001517
1518 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1519 meParams := me.ParamData{
1520 EntityID: aInstNo,
1521 Attributes: requestedAttributes,
1522 }
1523 meInstance, omciErr := me.NewVirtualEthernetInterfacePoint(meParams)
1524 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001525 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001526 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001527 logger.Errorw(ctx, "Cannot encode VEIP instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001528 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001529 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001530 }
1531
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001532 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001533 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001534 logger.Errorw(ctx, "Cannot serialize 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 }
1538
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001539 omciRxCallbackPair := CallbackPair{
1540 CbKey: tid,
1541 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001542 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001543 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001544 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001545 logger.Errorw(ctx, "Cannot send VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001546 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001547 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001548 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001549 logger.Debug(ctx, "send VEIP-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001550 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001551 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001552 logger.Errorw(ctx, "Cannot generate VEIP", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001553 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001554 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001555}
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001556
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001557// SendGetMe gets ME instance
1558func (oo *OmciCC) SendGetMe(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributes me.AttributeValueMap,
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001559 timeout int, highPrio bool, rxChan chan Message, isExtendedOmci bool) (*me.ManagedEntity, error) {
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001560
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001561 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001562 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001563 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001564
1565 meParams := me.ParamData{
1566 EntityID: entityID,
1567 Attributes: requestedAttributes,
1568 }
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001569 var messageSet omci.DeviceIdent = omci.BaselineIdent
1570 if isExtendedOmci {
1571 messageSet = omci.ExtendedIdent
1572 }
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001573 meInstance, omciErr := me.LoadManagedEntityDefinition(classID, meParams)
1574 if omciErr.GetError() == nil {
Himani Chawla4d908332020-08-31 12:30:20 +05301575 meClassIDName := meInstance.GetName()
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001576 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.GetRequestType, oframe.TransactionID(tid), oframe.FrameFormat(messageSet))
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001577 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001578 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 +03001579 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001580 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001581 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001582 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001583 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001584 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001585 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001586 omciRxCallbackPair := CallbackPair{
1587 CbKey: tid,
1588 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001589 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001590 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001591 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001592 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001593 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001594 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001595 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": meClassIDName, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001596 return meInstance, nil
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001597 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001598 logger.Errorw(ctx, "Cannot generate meDefinition", log.Fields{"classID": classID, "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001599 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001600}
1601
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001602// SendGetMeWithAttributeMask gets ME instance with attribute mask
1603func (oo *OmciCC) SendGetMeWithAttributeMask(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributesMask uint16,
Himani Chawla43f95ff2021-06-03 00:24:12 +05301604 timeout int, highPrio bool, rxChan chan Message) error {
1605
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001606 tid := oo.GetNextTid(highPrio)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301607 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
1608 "SequNo": strconv.FormatInt(int64(tid), 16)})
1609
1610 request := &omci.GetRequest{
1611 MeBasePacket: omci.MeBasePacket{
1612 EntityInstance: entityID,
1613 EntityClass: classID,
1614 },
1615 AttributeMask: requestedAttributesMask,
1616 }
1617
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001618 pkt, err := Serialize(ctx, omci.GetRequestType, request, tid)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301619 if err != nil {
1620 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1621 return err
1622 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001623 omciRxCallbackPair := CallbackPair{
1624 CbKey: tid,
1625 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Himani Chawla43f95ff2021-06-03 00:24:12 +05301626 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001627 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301628 if err != nil {
1629 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1630 return err
1631 }
1632 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": classID, "device-id": oo.deviceID})
1633 return nil
1634}
1635
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001636// SendCreateDot1PMapper creates Ieee8021PMapperServiceProfile ME instance
1637func (oo *OmciCC) SendCreateDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001638 aInstID uint16, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001639 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001640 logger.Debugw(ctx, "send .1pMapper-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001641 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(aInstID), 16)})
1642
1643 meParams := me.ParamData{
mpagenko8b5fdd22020-12-17 17:58:32 +00001644 EntityID: aInstID,
1645 Attributes: me.AttributeValueMap{
1646 //workaround for unsuitable omci-lib default values, cmp VOL-3729
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001647 me.Ieee8021PMapperServiceProfile_TpPointer: 0xFFFF,
1648 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority0: 0xFFFF,
1649 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority1: 0xFFFF,
1650 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority2: 0xFFFF,
1651 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority3: 0xFFFF,
1652 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority4: 0xFFFF,
1653 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority5: 0xFFFF,
1654 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority6: 0xFFFF,
1655 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority7: 0xFFFF,
mpagenko8b5fdd22020-12-17 17:58:32 +00001656 },
mpagenko3dbcdd22020-07-22 07:38:45 +00001657 }
1658 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
1659 if omciErr.GetError() == nil {
1660 //we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001661 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1662 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001663 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001664 logger.Errorw(ctx, "Cannot encode .1pMapper for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001665 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001666 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001667 }
1668
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001669 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001670 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001671 logger.Errorw(ctx, "Cannot serialize .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 }
1675
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001676 omciRxCallbackPair := CallbackPair{
1677 CbKey: tid,
1678 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001679 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001680 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001681 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001682 logger.Errorw(ctx, "Cannot send .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001683 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001684 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001685 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001686 logger.Debug(ctx, "send .1pMapper-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001687 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001688 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001689 logger.Errorw(ctx, "Cannot generate .1pMapper", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001690 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001691 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001692}
1693
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001694// SendCreateMBPConfigDataVar creates MacBridgePortConfigurationData ME instance
1695func (oo *OmciCC) SendCreateMBPConfigDataVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001696 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001697 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001698 logger.Debugw(ctx, "send MBPCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001699 "SequNo": strconv.FormatInt(int64(tid), 16),
1700 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1701
1702 meInstance, omciErr := me.NewMacBridgePortConfigurationData(params[0])
1703 if omciErr.GetError() == nil {
1704 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001705 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1706 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001707 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001708 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001709 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001710 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001711 }
1712
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001713 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001714 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001715 logger.Errorw(ctx, "Cannot serialize 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 }
1719
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001720 omciRxCallbackPair := CallbackPair{
1721 CbKey: tid,
1722 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001723 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001724 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001725 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001726 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001727 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001728 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001729 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001730 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001731 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001732 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001733 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001734 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001735 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001736}
1737
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001738// SendCreateGemNCTPVar creates GemPortNetworkCtp ME instance
1739func (oo *OmciCC) SendCreateGemNCTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001740 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001741 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001742 logger.Debugw(ctx, "send GemNCTP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001743 "SequNo": strconv.FormatInt(int64(tid), 16),
1744 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1745
1746 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1747 if omciErr.GetError() == nil {
1748 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001749 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1750 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001751 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001752 logger.Errorw(ctx, "Cannot encode GemNCTP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001753 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001754 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001755 }
1756
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001757 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001758 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001759 logger.Errorw(ctx, "Cannot serialize 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 }
1763
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001764 omciRxCallbackPair := CallbackPair{
1765 CbKey: tid,
1766 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001767 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001768 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001769 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001770 logger.Errorw(ctx, "Cannot send GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001771 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001772 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001773 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001774 logger.Debug(ctx, "send GemNCTP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001775 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001776 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001777 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001778 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001779 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001780}
1781
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001782// SendSetGemNCTPVar sets GemPortNetworkCtp ME instance
1783func (oo *OmciCC) SendSetGemNCTPVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
1784 tid := oo.GetNextTid(highPrio)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001785 logger.Debugw(ctx, "send GemNCTP-Set-msg:", log.Fields{"device-id": oo.deviceID,
1786 "SequNo": strconv.FormatInt(int64(tid), 16),
1787 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1788
1789 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1790 if omciErr.GetError() == nil {
1791 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001792 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType,
1793 oframe.TransactionID(tid), oframe.AddDefaults(true))
ozgecanetsia82b91a62021-05-21 18:54:49 +03001794 if err != nil {
1795 logger.Errorw(ctx, "Cannot encode GemNCTP for set", log.Fields{
1796 "Err": err, "device-id": oo.deviceID})
1797 return nil, err
1798 }
1799
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001800 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001801 if err != nil {
1802 logger.Errorw(ctx, "Cannot serialize GemNCTP set", log.Fields{
1803 "Err": err, "device-id": oo.deviceID})
1804 return nil, err
1805 }
1806
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001807 omciRxCallbackPair := CallbackPair{
1808 CbKey: tid,
1809 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia82b91a62021-05-21 18:54:49 +03001810 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001811 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001812 if err != nil {
1813 logger.Errorw(ctx, "Cannot send GemNCTP set", log.Fields{
1814 "Err": err, "device-id": oo.deviceID})
1815 return nil, err
1816 }
1817 logger.Debug(ctx, "send GemNCTP-Set-msg done", log.Fields{"device-id": oo.deviceID})
1818 return meInstance, nil
1819 }
1820 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
1821 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1822 return nil, omciErr.GetError()
1823}
1824
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001825// SendCreateGemIWTPVar creates GemInterworkingTerminationPoint ME instance
1826func (oo *OmciCC) SendCreateGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001827 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001828 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001829 logger.Debugw(ctx, "send GemIwTp-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001830 "SequNo": strconv.FormatInt(int64(tid), 16),
1831 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1832
1833 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(params[0])
1834 if omciErr.GetError() == nil {
1835 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
mpagenko836a1fd2021-11-01 16:12:42 +00001836 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1837 oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001838 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001839 logger.Errorw(ctx, "Cannot encode GemIwTp for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001840 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001841 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001842 }
1843
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001844 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001845 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001846 logger.Errorw(ctx, "Cannot serialize 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 }
1850
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001851 omciRxCallbackPair := CallbackPair{
1852 CbKey: tid,
1853 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001854 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001855 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001856 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001857 logger.Errorw(ctx, "Cannot send GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001858 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001859 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001860 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001861 logger.Debug(ctx, "send GemIwTp-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001862 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001863 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001864 logger.Errorw(ctx, "Cannot generate GemIwTp Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001865 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001866 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001867}
1868
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001869// SendSetTcontVar sets TCont ME instance
1870func (oo *OmciCC) SendSetTcontVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001871 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001872 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001873 logger.Debugw(ctx, "send TCont-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001874 "SequNo": strconv.FormatInt(int64(tid), 16),
1875 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1876
1877 meInstance, omciErr := me.NewTCont(params[0])
1878 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001879 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001880 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001881 logger.Errorw(ctx, "Cannot encode TCont for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001882 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001883 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001884 }
1885
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001886 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001887 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001888 logger.Errorw(ctx, "Cannot serialize 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 }
1892
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001893 omciRxCallbackPair := CallbackPair{
1894 CbKey: tid,
1895 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001896 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001897 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001898 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001899 logger.Errorw(ctx, "Cannot send TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001900 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001901 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001902 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001903 logger.Debug(ctx, "send TCont-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001904 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001905 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001906 logger.Errorw(ctx, "Cannot generate TCont Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001907 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001908 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001909}
1910
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001911// SendSetPrioQueueVar sets PriorityQueue ME instance
1912func (oo *OmciCC) SendSetPrioQueueVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001913 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001914 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001915 logger.Debugw(ctx, "send PrioQueue-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001916 "SequNo": strconv.FormatInt(int64(tid), 16),
1917 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1918
1919 meInstance, omciErr := me.NewPriorityQueue(params[0])
1920 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001921 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001922 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001923 logger.Errorw(ctx, "Cannot encode PrioQueue for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001924 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001925 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001926 }
1927
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001928 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001929 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001930 logger.Errorw(ctx, "Cannot serialize 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 }
1934
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001935 omciRxCallbackPair := CallbackPair{
1936 CbKey: tid,
1937 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001938 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001939 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001940 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001941 logger.Errorw(ctx, "Cannot send PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001942 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001943 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001944 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001945 logger.Debug(ctx, "send PrioQueue-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001946 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001947 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001948 logger.Errorw(ctx, "Cannot generate PrioQueue Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001949 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001950 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001951}
1952
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001953// SendSetDot1PMapperVar sets Ieee8021PMapperServiceProfile ME instance
1954func (oo *OmciCC) SendSetDot1PMapperVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001955 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001956 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001957 logger.Debugw(ctx, "send 1PMapper-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001958 "SequNo": strconv.FormatInt(int64(tid), 16),
1959 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1960
1961 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(params[0])
1962 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001963 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001964 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001965 logger.Errorw(ctx, "Cannot encode 1PMapper for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001966 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001967 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001968 }
1969
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001970 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001971 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001972 logger.Errorw(ctx, "Cannot serialize 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 }
1976
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001977 omciRxCallbackPair := CallbackPair{
1978 CbKey: tid,
1979 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001980 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001981 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001982 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001983 logger.Errorw(ctx, "Cannot send 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001984 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001985 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001986 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001987 logger.Debug(ctx, "send 1PMapper-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001988 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001989 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001990 logger.Errorw(ctx, "Cannot generate 1PMapper Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001991 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001992 return nil, omciErr.GetError()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001993}
mpagenkodff5dda2020-08-28 11:52:01 +00001994
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001995// SendCreateVtfdVar creates VlanTaggingFilterData ME instance
1996func (oo *OmciCC) SendCreateVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001997 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001998 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001999 logger.Debugw(ctx, "send VTFD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002000 "SequNo": strconv.FormatInt(int64(tid), 16),
2001 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2002
2003 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
2004 if omciErr.GetError() == nil {
2005 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
mpagenko836a1fd2021-11-01 16:12:42 +00002006 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
2007 oframe.TransactionID(tid))
mpagenkodff5dda2020-08-28 11:52:01 +00002008 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002009 logger.Errorw(ctx, "Cannot encode VTFD for create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002010 "Err": err, "device-id": oo.deviceID})
2011 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2012 // return (dual format) error code that can be used at caller for immediate error treatment
2013 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002014 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002015 }
2016
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002017 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00002018 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002019 logger.Errorw(ctx, "Cannot serialize 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 }
2023
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002024 omciRxCallbackPair := CallbackPair{
2025 CbKey: tid,
2026 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00002027 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002028 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00002029 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002030 logger.Errorw(ctx, "Cannot send VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002031 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002032 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002033 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002034 logger.Debug(ctx, "send VTFD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002035 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00002036 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002037 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002038 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002039 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00002040}
2041
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002042// nolint: unused
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002043func (oo *OmciCC) sendSetVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002044 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002045 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002046 logger.Debugw(ctx, "send VTFD-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002047 "SequNo": strconv.FormatInt(int64(tid), 16),
2048 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2049
2050 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
2051 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002052 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType,
2053 oframe.TransactionID(tid))
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002054 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002055 logger.Errorw(ctx, "Cannot encode VTFD for set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002056 "Err": err, "device-id": oo.deviceID})
2057 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2058 // return (dual format) error code that can be used at caller for immediate error treatment
2059 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002060 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002061 }
2062
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002063 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002064 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002065 logger.Errorw(ctx, "Cannot serialize 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 }
2069
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002070 omciRxCallbackPair := CallbackPair{
2071 CbKey: tid,
2072 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002073 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002074 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002075 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002076 logger.Errorw(ctx, "Cannot send VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002077 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002078 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002079 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002080 logger.Debug(ctx, "send VTFD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002081 return meInstance, nil
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002082 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002083 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002084 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002085 return nil, omciErr.GetError()
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002086}
2087
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002088// SendCreateEvtocdVar creates ExtendedVlanTaggingOperationConfigurationData ME instance
2089func (oo *OmciCC) SendCreateEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002090 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002091 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002092 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002093 "SequNo": strconv.FormatInt(int64(tid), 16),
2094 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2095
2096 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2097 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002098 //EnhancedMode not yet supported, used with default options
2099 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
2100 oframe.TransactionID(tid), oframe.AddDefaults(true))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002101 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002102 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002103 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002104 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002105 }
2106
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002107 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002108 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002109 logger.Errorw(ctx, "Cannot serialize 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 }
2113
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002114 omciRxCallbackPair := CallbackPair{
2115 CbKey: tid,
2116 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002117 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002118 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002119 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002120 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002121 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002122 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002123 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002124 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002125 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002126 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002127 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002128 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002129 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002130}
2131
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002132// SendSetEvtocdVar sets ExtendedVlanTaggingOperationConfigurationData ME instance
2133func (oo *OmciCC) SendSetEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002134 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002135 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002136 logger.Debugw(ctx, "send EVTOCD-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002137 "SequNo": strconv.FormatInt(int64(tid), 16),
2138 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2139
2140 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2141 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002142 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenkodff5dda2020-08-28 11:52:01 +00002143 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002144 logger.Errorw(ctx, "Cannot encode EVTOCD for set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002145 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002146 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002147 }
2148
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002149 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00002150 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002151 logger.Errorw(ctx, "Cannot serialize 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 }
2155
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002156 omciRxCallbackPair := CallbackPair{
2157 CbKey: tid,
2158 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00002159 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002160 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00002161 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002162 logger.Errorw(ctx, "Cannot send EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002163 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002164 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002165 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002166 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002167 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00002168 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002169 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002170 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002171 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00002172}
mpagenko01e726e2020-10-23 09:45:29 +00002173
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002174// SendDeleteEvtocd deletes ExtendedVlanTaggingOperationConfigurationData ME instance
2175func (oo *OmciCC) SendDeleteEvtocd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002176 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002177 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002178 logger.Debugw(ctx, "send EVTOCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002179 "SequNo": strconv.FormatInt(int64(tid), 16),
2180 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2181
2182 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2183 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002184 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002185 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002186 logger.Errorw(ctx, "Cannot encode EVTOCD for delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002187 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002188 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002189 }
2190
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002191 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002192 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002193 logger.Errorw(ctx, "Cannot serialize 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 }
2197
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002198 omciRxCallbackPair := CallbackPair{
2199 CbKey: tid,
2200 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002201 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002202 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002203 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002204 logger.Errorw(ctx, "Cannot send EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002205 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002206 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002207 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002208 logger.Debug(ctx, "send EVTOCD-delete msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002209 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002210 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002211 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002212 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002213 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002214}
2215
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002216// SendDeleteVtfd deletes VlanTaggingFilterData ME instance
2217func (oo *OmciCC) SendDeleteVtfd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002218 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002219 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002220 logger.Debugw(ctx, "send VTFD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko01e726e2020-10-23 09:45:29 +00002221 "SequNo": strconv.FormatInt(int64(tid), 16),
2222 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2223
2224 meParams := me.ParamData{EntityID: aInstID}
2225 meInstance, omciErr := me.NewVlanTaggingFilterData(meParams)
2226 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002227 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2228 oframe.TransactionID(tid))
mpagenko01e726e2020-10-23 09:45:29 +00002229 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002230 logger.Errorw(ctx, "Cannot encode VTFD for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002231 "Err": err, "device-id": oo.deviceID})
2232 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2233 // return (dual format) error code that can be used at caller for immediate error treatment
2234 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002235 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002236 }
2237
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002238 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko01e726e2020-10-23 09:45:29 +00002239 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002240 logger.Errorw(ctx, "Cannot serialize 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 }
2244
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002245 omciRxCallbackPair := CallbackPair{
2246 CbKey: tid,
2247 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko01e726e2020-10-23 09:45:29 +00002248 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002249 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko01e726e2020-10-23 09:45:29 +00002250 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002251 logger.Errorw(ctx, "Cannot send VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002252 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002253 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002254 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002255 logger.Debug(ctx, "send VTFD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002256 return meInstance, nil
mpagenko01e726e2020-10-23 09:45:29 +00002257 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002258 logger.Errorw(ctx, "Cannot generate VTFD Instance for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002259 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002260 return nil, omciErr.GetError()
mpagenko01e726e2020-10-23 09:45:29 +00002261}
ozgecanetsia422dbf32020-10-28 14:07:19 +03002262
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002263// SendCreateTDVar creates TrafficDescriptor ME instance
2264func (oo *OmciCC) SendCreateTDVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2265 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002266 logger.Debugw(ctx, "send TD-Create-msg:", log.Fields{"device-id": oo.deviceID,
2267 "SequNo": strconv.FormatInt(int64(tid), 16),
2268 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2269 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2270 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002271 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002272 if err != nil {
2273 logger.Errorw(ctx, "Cannot encode TD for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002274 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002275 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002276 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002277 if err != nil {
2278 logger.Errorw(ctx, "Cannot serialize TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002279 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002280 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002281 omciRxCallbackPair := CallbackPair{
2282 CbKey: tid,
2283 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002284 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002285 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002286 if err != nil {
2287 logger.Errorw(ctx, "Cannot send TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002288 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002289 }
2290 logger.Debug(ctx, "send TD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002291 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002292 }
2293 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002294 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002295}
2296
2297// nolint: unused
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002298func (oo *OmciCC) sendSetTDVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002299 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002300 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002301 logger.Debugw(ctx, "send TD-Set-msg:", log.Fields{"device-id": oo.deviceID,
2302 "SequNo": strconv.FormatInt(int64(tid), 16),
2303 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2304
2305 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2306 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002307 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002308 if err != nil {
2309 logger.Errorw(ctx, "Cannot encode TD for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002310 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002311 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002312 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002313 if err != nil {
2314 logger.Errorw(ctx, "Cannot serialize TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002315 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002316 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002317 omciRxCallbackPair := CallbackPair{
2318 CbKey: tid,
2319 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002320 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002321 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002322 if err != nil {
2323 logger.Errorw(ctx, "Cannot send TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002324 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002325 }
2326 logger.Debug(ctx, "send TD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002327 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002328 }
2329 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002330 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002331
2332}
2333
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002334// SendDeleteTD - TODO: add comment
2335func (oo *OmciCC) SendDeleteTD(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002336 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002337 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002338 logger.Debugw(ctx, "send TD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2339 "SequNo": strconv.FormatInt(int64(tid), 16),
2340 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2341
2342 meParams := me.ParamData{EntityID: aInstID}
2343 meInstance, omciErr := me.NewTrafficDescriptor(meParams)
2344 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002345 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002346 if err != nil {
2347 logger.Errorw(ctx, "Cannot encode TD for delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002348 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002349 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002350 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002351 if err != nil {
2352 logger.Errorw(ctx, "Cannot serialize TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002353 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002354 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002355 omciRxCallbackPair := CallbackPair{
2356 CbKey: tid,
2357 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002358 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002359 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002360 if err != nil {
2361 logger.Errorw(ctx, "Cannot send TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002362 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002363 }
2364 logger.Debug(ctx, "send TD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002365 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002366 }
2367 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002368 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002369
2370}
2371
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002372// SendDeleteGemIWTP deletes GemInterworkingTerminationPoint ME instance
2373func (oo *OmciCC) SendDeleteGemIWTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002374 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002375 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002376 logger.Debugw(ctx, "send GemIwTp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002377 "SequNo": strconv.FormatInt(int64(tid), 16),
2378 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2379
2380 meParams := me.ParamData{EntityID: aInstID}
2381 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(meParams)
2382 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002383 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2384 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002385 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002386 logger.Errorw(ctx, "Cannot encode GemIwTp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002387 "Err": err, "device-id": oo.deviceID})
2388 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2389 // return (dual format) error code that can be used at caller for immediate error treatment
2390 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002391 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002392 }
2393
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002394 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002395 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002396 logger.Errorw(ctx, "Cannot serialize 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 }
2400
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002401 omciRxCallbackPair := CallbackPair{
2402 CbKey: tid,
2403 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002404 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002405 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002406 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002407 logger.Errorw(ctx, "Cannot send GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002408 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002409 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002410 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002411 logger.Debug(ctx, "send GemIwTp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002412 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002413 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002414 logger.Errorw(ctx, "Cannot generate GemIwTp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002415 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002416 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002417}
2418
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002419// SendDeleteGemNCTP deletes GemPortNetworkCtp ME instance
2420func (oo *OmciCC) SendDeleteGemNCTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002421 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002422 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002423 logger.Debugw(ctx, "send GemNCtp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002424 "SequNo": strconv.FormatInt(int64(tid), 16),
2425 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2426
2427 meParams := me.ParamData{EntityID: aInstID}
2428 meInstance, omciErr := me.NewGemPortNetworkCtp(meParams)
2429 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002430 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2431 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002432 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002433 logger.Errorw(ctx, "Cannot encode GemNCtp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002434 "Err": err, "device-id": oo.deviceID})
2435 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2436 // return (dual format) error code that can be used at caller for immediate error treatment
2437 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002438 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002439 }
2440
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002441 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002442 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002443 logger.Errorw(ctx, "Cannot serialize 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 }
2447
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002448 omciRxCallbackPair := CallbackPair{
2449 CbKey: tid,
2450 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002451 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002452 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002453 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002454 logger.Errorw(ctx, "Cannot send GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002455 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002456 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002457 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002458 logger.Debug(ctx, "send GemNCtp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002459 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002460 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002461 logger.Errorw(ctx, "Cannot generate GemNCtp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002462 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002463 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002464}
2465
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002466// SendDeleteDot1PMapper deletes Ieee8021PMapperServiceProfile ME instance
2467func (oo *OmciCC) SendDeleteDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002468 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002469 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002470 logger.Debugw(ctx, "send .1pMapper-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002471 "SequNo": strconv.FormatInt(int64(tid), 16),
2472 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2473
2474 meParams := me.ParamData{EntityID: aInstID}
2475 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
2476 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002477 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2478 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002479 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002480 logger.Errorw(ctx, "Cannot encode .1pMapper for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002481 "Err": err, "device-id": oo.deviceID})
2482 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2483 // return (dual format) error code that can be used at caller for immediate error treatment
2484 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002485 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002486 }
2487
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002488 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002489 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002490 logger.Errorw(ctx, "Cannot serialize .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 }
2494
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002495 omciRxCallbackPair := CallbackPair{
2496 CbKey: tid,
2497 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002498 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002499 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002500 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002501 logger.Errorw(ctx, "Cannot send .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002502 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002503 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002504 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002505 logger.Debug(ctx, "send .1pMapper-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002506 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002507 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002508 logger.Errorw(ctx, "Cannot generate .1pMapper Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002509 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002510 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002511}
2512
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002513// SendDeleteMBPConfigData deletes MacBridgePortConfigurationData ME instance
2514func (oo *OmciCC) SendDeleteMBPConfigData(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002515 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002516 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002517 logger.Debugw(ctx, "send MBPCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002518 "SequNo": strconv.FormatInt(int64(tid), 16),
2519 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2520
2521 meParams := me.ParamData{EntityID: aInstID}
2522 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
2523 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002524 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2525 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002526 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002527 logger.Errorw(ctx, "Cannot encode MBPCD for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002528 "Err": err, "device-id": oo.deviceID})
2529 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2530 // return (dual format) error code that can be used at caller for immediate error treatment
2531 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002532 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002533 }
2534
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002535 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002536 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002537 logger.Errorw(ctx, "Cannot serialize 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 }
2541
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002542 omciRxCallbackPair := CallbackPair{
2543 CbKey: tid,
2544 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002545 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002546 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002547 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002548 logger.Errorw(ctx, "Cannot send MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002549 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002550 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002551 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002552 logger.Debug(ctx, "send MBPCD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002553 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002554 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002555 logger.Errorw(ctx, "Cannot generate MBPCD Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002556 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002557 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002558}
2559
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002560// SendCreateMulticastGemIWTPVar creates MulticastGemInterworkingTerminationPoint ME instance
2561func (oo *OmciCC) SendCreateMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002562 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002563 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002564 logger.Debugw(ctx, "send MulticastGemIWTP-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002565 "SequNo": strconv.FormatInt(int64(tid), 16),
2566 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2567
2568 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2569 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002570 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2571 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002572 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002573 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002574 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002575 }
2576
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002577 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002578 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002579 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002580 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002581 }
2582
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002583 omciRxCallbackPair := CallbackPair{CbKey: tid,
2584 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002585 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002586 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002587 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002588 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002589 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002590 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002591 logger.Debug(ctx, "send MulticastGEMIWTP-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002592 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002593 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002594 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002595 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002596 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002597}
2598
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002599// SendSetMulticastGemIWTPVar sets MulticastGemInterworkingTerminationPoint ME instance
2600func (oo *OmciCC) SendSetMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002601 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002602 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002603 logger.Debugw(ctx, "send MulticastGemIWTP-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002604 "SequNo": strconv.FormatInt(int64(tid), 16),
2605 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2606
2607 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2608 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002609 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2610 oframe.AddDefaults(true))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002611 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002612 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002613 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002614 }
2615
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002616 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002617 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002618 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002619 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002620 }
2621
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002622 omciRxCallbackPair := CallbackPair{CbKey: tid,
2623 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002624 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002625 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002626 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002627 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002628 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002629 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002630 logger.Debug(ctx, "send MulticastGEMIWTP-set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002631 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002632 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002633 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002634 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002635 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002636}
2637
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002638// SendCreateMulticastOperationProfileVar creates MulticastOperationsProfile ME instance
2639func (oo *OmciCC) SendCreateMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002640 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002641 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002642 logger.Debugw(ctx, "send MulticastOperationProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002643 "SequNo": strconv.FormatInt(int64(tid), 16),
2644 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2645
2646 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2647 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002648 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2649 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002650 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002651 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002652 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002653 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002654 }
2655
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002656 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002657 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002658 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002659 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002660 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002661 }
2662
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002663 omciRxCallbackPair := CallbackPair{CbKey: tid,
2664 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002665 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002666 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002667 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002668 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002669 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002670 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002671 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002672 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002673 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002674 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002675 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002676 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002677 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002678}
2679
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002680// SendSetMulticastOperationProfileVar sets MulticastOperationsProfile ME instance
2681func (oo *OmciCC) SendSetMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002682 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002683 tid := oo.GetNextTid(highPrio)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002684 logger.Debugw(ctx, "send MulticastOperationProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002685 "SequNo": strconv.FormatInt(int64(tid), 16),
2686 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2687
2688 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2689 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002690 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2691 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002692 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002693 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002694 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002695 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002696 }
2697
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002698 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002699 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002700 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002701 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002702 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002703 }
2704
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002705 omciRxCallbackPair := CallbackPair{CbKey: tid,
2706 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002707 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002708 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002709 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002710 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002711 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002712 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002713 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002714 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002715 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002716 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002717 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002718 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002719 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002720}
2721
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002722// SendCreateMulticastSubConfigInfoVar creates MulticastSubscriberConfigInfo ME instance
2723func (oo *OmciCC) SendCreateMulticastSubConfigInfoVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002724 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002725 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002726 logger.Debugw(ctx, "send MulticastSubConfigInfo-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002727 "SequNo": strconv.FormatInt(int64(tid), 16),
2728 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2729
2730 meInstance, omciErr := me.NewMulticastSubscriberConfigInfo(params[0])
2731 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002732 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2733 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002734 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002735 logger.Errorw(ctx, "Cannot encode MulticastSubConfigInfo for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002736 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002737 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002738 }
2739
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002740 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002741 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002742 logger.Errorw(ctx, "Cannot serialize MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002743 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002744 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002745 }
2746
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002747 omciRxCallbackPair := CallbackPair{CbKey: tid,
2748 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002749 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002750 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002751 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002752 logger.Errorw(ctx, "Cannot send MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002753 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002754 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002755 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002756 logger.Debug(ctx, "send MulticastSubConfigInfo-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002757 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002758 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002759 logger.Errorw(ctx, "Cannot generate MulticastSubConfigInfo Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002760 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002761 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002762}
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00002763
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002764// SendCreateVoipVoiceCTP nolint: unused
2765func (oo *OmciCC) SendCreateVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2766 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2767 tid := oo.GetNextTid(highPrio)
2768 logger.Debugw(ctx, "send VoipVoiceCTP-create-msg:", log.Fields{"device-id": oo.deviceID,
2769 "SequNo": strconv.FormatInt(int64(tid), 16),
2770 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2771
2772 meInstance, omciErr := me.NewVoipVoiceCtp(params[0])
2773 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002774 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2775 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002776 if err != nil {
2777 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for create", log.Fields{"Err": err,
2778 "device-id": oo.deviceID})
2779 return nil, err
2780 }
2781
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002782 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002783 if err != nil {
2784 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP create", log.Fields{"Err": err,
2785 "device-id": oo.deviceID})
2786 return nil, err
2787 }
2788
2789 omciRxCallbackPair := CallbackPair{CbKey: tid,
2790 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2791 }
2792 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2793 if err != nil {
2794 logger.Errorw(ctx, "Cannot send VoipVoiceCTP create", log.Fields{"Err": err,
2795 "device-id": oo.deviceID})
2796 return nil, err
2797 }
2798 logger.Debug(ctx, "send VoipVoiceCTP-create-msg done")
2799 return meInstance, nil
2800 }
2801 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance", log.Fields{"Err": omciErr.GetError(),
2802 "device-id": oo.deviceID})
2803 return nil, omciErr.GetError()
2804}
2805
2806// SendSetVoipVoiceCTP nolint: unused
2807func (oo *OmciCC) SendSetVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2808 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2809 tid := oo.GetNextTid(highPrio)
2810 logger.Debugw(ctx, "send VoipVoiceCTP-set-msg:", log.Fields{"device-id": oo.deviceID,
2811 "SequNo": strconv.FormatInt(int64(tid), 16),
2812 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2813
2814 meInstance, omciErr := me.NewVoipVoiceCtp(params[0])
2815 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002816 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2817 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002818 if err != nil {
2819 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for set", log.Fields{"Err": err,
2820 "device-id": oo.deviceID})
2821 return nil, err
2822 }
2823
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002824 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002825 if err != nil {
2826 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP set", log.Fields{"Err": err,
2827 "device-id": oo.deviceID})
2828 return nil, err
2829 }
2830
2831 omciRxCallbackPair := CallbackPair{CbKey: tid,
2832 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2833 }
2834 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2835 if err != nil {
2836 logger.Errorw(ctx, "Cannot send VoipVoiceCTP set", log.Fields{"Err": err,
2837 "device-id": oo.deviceID})
2838 return nil, err
2839 }
2840 logger.Debug(ctx, "send VoipVoiceCTP-set-msg done")
2841 return meInstance, nil
2842 }
2843 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance", log.Fields{"Err": omciErr.GetError(),
2844 "device-id": oo.deviceID})
2845 return nil, omciErr.GetError()
2846}
2847
2848// SendDeleteVoipVoiceCTP nolint: unused
2849func (oo *OmciCC) SendDeleteVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2850 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
2851 tid := oo.GetNextTid(highPrio)
2852 logger.Debugw(ctx, "send VoipVoiceCTP-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2853 "SequNo": strconv.FormatInt(int64(tid), 16),
2854 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2855
2856 meParams := me.ParamData{EntityID: aInstID}
2857 meInstance, omciErr := me.NewVoipVoiceCtp(meParams)
2858 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002859 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2860 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002861 if err != nil {
2862 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for delete", log.Fields{
2863 "Err": err, "device-id": oo.deviceID})
2864 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2865 // return (dual format) error code that can be used at caller for immediate error treatment
2866 // (relevant to all used sendXX() methods and their error conditions)
2867 return nil, err
2868 }
2869
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002870 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002871 if err != nil {
2872 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP delete", log.Fields{
2873 "Err": err, "device-id": oo.deviceID})
2874 return nil, err
2875 }
2876
2877 omciRxCallbackPair := CallbackPair{
2878 CbKey: tid,
2879 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2880 }
2881 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2882 if err != nil {
2883 logger.Errorw(ctx, "Cannot send VoipVoiceCTP delete", log.Fields{
2884 "Err": err, "device-id": oo.deviceID})
2885 return nil, err
2886 }
2887 logger.Debug(ctx, "send VoipVoiceCTP-Delete-msg done")
2888 return meInstance, nil
2889 }
2890 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance for delete", log.Fields{
2891 "Err": omciErr.GetError(), "device-id": oo.deviceID})
2892 return nil, omciErr.GetError()
2893}
2894
2895// SendCreateVoipMediaProfile nolint: unused
2896func (oo *OmciCC) SendCreateVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2897 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2898 tid := oo.GetNextTid(highPrio)
2899 logger.Debugw(ctx, "send VoipMediaProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
2900 "SequNo": strconv.FormatInt(int64(tid), 16),
2901 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2902
2903 meInstance, omciErr := me.NewVoipMediaProfile(params[0])
2904 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002905 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2906 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002907 if err != nil {
2908 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for create", log.Fields{"Err": err,
2909 "device-id": oo.deviceID})
2910 return nil, err
2911 }
2912
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002913 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002914 if err != nil {
2915 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile create", log.Fields{"Err": err,
2916 "device-id": oo.deviceID})
2917 return nil, err
2918 }
2919
2920 omciRxCallbackPair := CallbackPair{CbKey: tid,
2921 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2922 }
2923 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2924 if err != nil {
2925 logger.Errorw(ctx, "Cannot send VoipMediaProfile create", log.Fields{"Err": err,
2926 "device-id": oo.deviceID})
2927 return nil, err
2928 }
2929 logger.Debug(ctx, "send VoipMediaProfile-create-msg done")
2930 return meInstance, nil
2931 }
2932 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance", log.Fields{"Err": omciErr.GetError(),
2933 "device-id": oo.deviceID})
2934 return nil, omciErr.GetError()
2935}
2936
2937// SendSetVoipMediaProfile nolint: unused
2938func (oo *OmciCC) SendSetVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2939 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2940 tid := oo.GetNextTid(highPrio)
2941 logger.Debugw(ctx, "send VoipMediaProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
2942 "SequNo": strconv.FormatInt(int64(tid), 16),
2943 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2944
2945 meInstance, omciErr := me.NewVoipMediaProfile(params[0])
2946 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002947 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2948 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002949 if err != nil {
2950 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for set", log.Fields{"Err": err,
2951 "device-id": oo.deviceID})
2952 return nil, err
2953 }
2954
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002955 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002956 if err != nil {
2957 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile set", log.Fields{"Err": err,
2958 "device-id": oo.deviceID})
2959 return nil, err
2960 }
2961
2962 omciRxCallbackPair := CallbackPair{CbKey: tid,
2963 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2964 }
2965 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2966 if err != nil {
2967 logger.Errorw(ctx, "Cannot send VoipMediaProfile set", log.Fields{"Err": err,
2968 "device-id": oo.deviceID})
2969 return nil, err
2970 }
2971 logger.Debug(ctx, "send VoipMediaProfile-set-msg done")
2972 return meInstance, nil
2973 }
2974 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance", log.Fields{"Err": omciErr.GetError(),
2975 "device-id": oo.deviceID})
2976 return nil, omciErr.GetError()
2977}
2978
2979// SendDeleteVoipMediaProfile nolint: unused
2980func (oo *OmciCC) SendDeleteVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2981 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
2982 tid := oo.GetNextTid(highPrio)
2983 logger.Debugw(ctx, "send VoipMediaProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2984 "SequNo": strconv.FormatInt(int64(tid), 16),
2985 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2986
2987 meParams := me.ParamData{EntityID: aInstID}
2988 meInstance, omciErr := me.NewVoipMediaProfile(meParams)
2989 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002990 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2991 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002992 if err != nil {
2993 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for delete", log.Fields{
2994 "Err": err, "device-id": oo.deviceID})
2995 return nil, err
2996 }
2997
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002998 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002999 if err != nil {
3000 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile delete", log.Fields{
3001 "Err": err, "device-id": oo.deviceID})
3002 return nil, err
3003 }
3004
3005 omciRxCallbackPair := CallbackPair{
3006 CbKey: tid,
3007 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3008 }
3009 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3010 if err != nil {
3011 logger.Errorw(ctx, "Cannot send VoipMediaProfile delete", log.Fields{
3012 "Err": err, "device-id": oo.deviceID})
3013 return nil, err
3014 }
3015 logger.Debug(ctx, "send VoipMediaProfile-Delete-msg done")
3016 return meInstance, nil
3017 }
3018 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance for delete", log.Fields{
3019 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3020 return nil, omciErr.GetError()
3021}
3022
3023// SendCreateVoiceServiceProfile nolint: unused
3024func (oo *OmciCC) SendCreateVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3025 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3026 tid := oo.GetNextTid(highPrio)
3027 logger.Debugw(ctx, "send VoiceServiceProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
3028 "SequNo": strconv.FormatInt(int64(tid), 16),
3029 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3030
3031 meInstance, omciErr := me.NewVoiceServiceProfile(params[0])
3032 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003033 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3034 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003035 if err != nil {
3036 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for create", log.Fields{"Err": err,
3037 "device-id": oo.deviceID})
3038 return nil, err
3039 }
3040
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003041 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003042 if err != nil {
3043 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile create", log.Fields{"Err": err,
3044 "device-id": oo.deviceID})
3045 return nil, err
3046 }
3047
3048 omciRxCallbackPair := CallbackPair{CbKey: tid,
3049 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3050 }
3051 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3052 if err != nil {
3053 logger.Errorw(ctx, "Cannot send VoiceServiceProfile create", log.Fields{"Err": err,
3054 "device-id": oo.deviceID})
3055 return nil, err
3056 }
3057 logger.Debug(ctx, "send VoiceServiceProfile-create-msg done")
3058 return meInstance, nil
3059 }
3060 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3061 "device-id": oo.deviceID})
3062 return nil, omciErr.GetError()
3063}
3064
3065// SendSetVoiceServiceProfile nolint: unused
3066func (oo *OmciCC) SendSetVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3067 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3068 tid := oo.GetNextTid(highPrio)
3069 logger.Debugw(ctx, "send VoiceServiceProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
3070 "SequNo": strconv.FormatInt(int64(tid), 16),
3071 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3072
3073 meInstance, omciErr := me.NewVoiceServiceProfile(params[0])
3074 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003075 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3076 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003077 if err != nil {
3078 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for set", log.Fields{"Err": err,
3079 "device-id": oo.deviceID})
3080 return nil, err
3081 }
3082
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003083 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003084 if err != nil {
3085 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile set", log.Fields{"Err": err,
3086 "device-id": oo.deviceID})
3087 return nil, err
3088 }
3089
3090 omciRxCallbackPair := CallbackPair{CbKey: tid,
3091 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3092 }
3093 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3094 if err != nil {
3095 logger.Errorw(ctx, "Cannot send VoiceServiceProfile set", log.Fields{"Err": err,
3096 "device-id": oo.deviceID})
3097 return nil, err
3098 }
3099 logger.Debug(ctx, "send VoiceServiceProfile-set-msg done")
3100 return meInstance, nil
3101 }
3102 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3103 "device-id": oo.deviceID})
3104 return nil, omciErr.GetError()
3105}
3106
3107// SendDeleteVoiceServiceProfile nolint: unused
3108func (oo *OmciCC) SendDeleteVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3109 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3110 tid := oo.GetNextTid(highPrio)
3111 logger.Debugw(ctx, "send VoiceServiceProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3112 "SequNo": strconv.FormatInt(int64(tid), 16),
3113 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3114
3115 meParams := me.ParamData{EntityID: aInstID}
3116 meInstance, omciErr := me.NewVoiceServiceProfile(meParams)
3117 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003118 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3119 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003120 if err != nil {
3121 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for delete", log.Fields{
3122 "Err": err, "device-id": oo.deviceID})
3123 return nil, err
3124 }
3125
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003126 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003127 if err != nil {
3128 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile delete", log.Fields{
3129 "Err": err, "device-id": oo.deviceID})
3130 return nil, err
3131 }
3132
3133 omciRxCallbackPair := CallbackPair{
3134 CbKey: tid,
3135 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3136 }
3137 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3138 if err != nil {
3139 logger.Errorw(ctx, "Cannot send VoiceServiceProfile delete", log.Fields{
3140 "Err": err, "device-id": oo.deviceID})
3141 return nil, err
3142 }
3143 logger.Debug(ctx, "send VoiceServiceProfile-Delete-msg done")
3144 return meInstance, nil
3145 }
3146 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance for delete", log.Fields{
3147 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3148 return nil, omciErr.GetError()
3149}
3150
3151// SendCreateSIPUserData nolint: unused
3152func (oo *OmciCC) SendCreateSIPUserData(ctx context.Context, timeout int, highPrio bool,
3153 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3154 tid := oo.GetNextTid(highPrio)
3155 logger.Debugw(ctx, "send SIPUserData-create-msg:", log.Fields{"device-id": oo.deviceID,
3156 "SequNo": strconv.FormatInt(int64(tid), 16),
3157 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3158
3159 meInstance, omciErr := me.NewSipUserData(params[0])
3160 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003161 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3162 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003163 if err != nil {
3164 logger.Errorw(ctx, "Cannot encode SIPUserData for create", log.Fields{"Err": err,
3165 "device-id": oo.deviceID})
3166 return nil, err
3167 }
3168
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003169 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003170 if err != nil {
3171 logger.Errorw(ctx, "Cannot serialize SIPUserData create", log.Fields{"Err": err,
3172 "device-id": oo.deviceID})
3173 return nil, err
3174 }
3175
3176 omciRxCallbackPair := CallbackPair{CbKey: tid,
3177 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3178 }
3179 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3180 if err != nil {
3181 logger.Errorw(ctx, "Cannot send SIPUserData create", log.Fields{"Err": err,
3182 "device-id": oo.deviceID})
3183 return nil, err
3184 }
3185 logger.Debug(ctx, "send SIPUserData-create-msg done")
3186 return meInstance, nil
3187 }
3188 logger.Errorw(ctx, "Cannot generate SIPUserData Instance", log.Fields{"Err": omciErr.GetError(),
3189 "device-id": oo.deviceID})
3190 return nil, omciErr.GetError()
3191}
3192
3193// SendSetSIPUserData nolint: unused
3194func (oo *OmciCC) SendSetSIPUserData(ctx context.Context, timeout int, highPrio bool,
3195 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3196 tid := oo.GetNextTid(highPrio)
3197 logger.Debugw(ctx, "send SIPUserData-set-msg:", log.Fields{"device-id": oo.deviceID,
3198 "SequNo": strconv.FormatInt(int64(tid), 16),
3199 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3200
3201 meInstance, omciErr := me.NewSipUserData(params[0])
3202 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003203 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3204 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003205 if err != nil {
3206 logger.Errorw(ctx, "Cannot encode SIPUserData for set", log.Fields{"Err": err,
3207 "device-id": oo.deviceID})
3208 return nil, err
3209 }
3210
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003211 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003212 if err != nil {
3213 logger.Errorw(ctx, "Cannot serialize SIPUserData set", log.Fields{"Err": err,
3214 "device-id": oo.deviceID})
3215 return nil, err
3216 }
3217
3218 omciRxCallbackPair := CallbackPair{CbKey: tid,
3219 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3220 }
3221 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3222 if err != nil {
3223 logger.Errorw(ctx, "Cannot send SIPUserData set", log.Fields{"Err": err,
3224 "device-id": oo.deviceID})
3225 return nil, err
3226 }
3227 logger.Debug(ctx, "send SIPUserData-set-msg done")
3228 return meInstance, nil
3229 }
3230 logger.Errorw(ctx, "Cannot generate SIPUserData Instance", log.Fields{"Err": omciErr.GetError(),
3231 "device-id": oo.deviceID})
3232 return nil, omciErr.GetError()
3233}
3234
3235// SendDeleteSIPUserData nolint: unused
3236func (oo *OmciCC) SendDeleteSIPUserData(ctx context.Context, timeout int, highPrio bool,
3237 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3238 tid := oo.GetNextTid(highPrio)
3239 logger.Debugw(ctx, "send SIPUserData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3240 "SequNo": strconv.FormatInt(int64(tid), 16),
3241 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3242
3243 meParams := me.ParamData{EntityID: aInstID}
3244 meInstance, omciErr := me.NewSipUserData(meParams)
3245 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003246 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3247 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003248 if err != nil {
3249 logger.Errorw(ctx, "Cannot encode SIPUserData for delete", log.Fields{
3250 "Err": err, "device-id": oo.deviceID})
3251 return nil, err
3252 }
3253
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003254 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003255 if err != nil {
3256 logger.Errorw(ctx, "Cannot serialize SIPUserData delete", log.Fields{
3257 "Err": err, "device-id": oo.deviceID})
3258 return nil, err
3259 }
3260
3261 omciRxCallbackPair := CallbackPair{
3262 CbKey: tid,
3263 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3264 }
3265 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3266 if err != nil {
3267 logger.Errorw(ctx, "Cannot send SIPUserData delete", log.Fields{
3268 "Err": err, "device-id": oo.deviceID})
3269 return nil, err
3270 }
3271 logger.Debug(ctx, "send SIPUserData-Delete-msg done")
3272 return meInstance, nil
3273 }
3274 logger.Errorw(ctx, "Cannot generate SIPUserData Instance for delete", log.Fields{
3275 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3276 return nil, omciErr.GetError()
3277}
3278
3279// SendCreateVoipApplicationServiceProfile nolint: unused
3280func (oo *OmciCC) SendCreateVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3281 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3282 tid := oo.GetNextTid(highPrio)
3283 logger.Debugw(ctx, "send VoipApplicationServiceProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
3284 "SequNo": strconv.FormatInt(int64(tid), 16),
3285 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3286
3287 meInstance, omciErr := me.NewVoipApplicationServiceProfile(params[0])
3288 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003289 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3290 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003291 if err != nil {
3292 logger.Errorw(ctx, "Cannot encode VoipApplicationServiceProfile for create", log.Fields{"Err": err,
3293 "device-id": oo.deviceID})
3294 return nil, err
3295 }
3296
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003297 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003298 if err != nil {
3299 logger.Errorw(ctx, "Cannot serialize VoipApplicationServiceProfile create", log.Fields{"Err": err,
3300 "device-id": oo.deviceID})
3301 return nil, err
3302 }
3303
3304 omciRxCallbackPair := CallbackPair{CbKey: tid,
3305 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3306 }
3307 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3308 if err != nil {
3309 logger.Errorw(ctx, "Cannot send VoipApplicationServiceProfile create", log.Fields{"Err": err,
3310 "device-id": oo.deviceID})
3311 return nil, err
3312 }
3313 logger.Debug(ctx, "send VoipApplicationServiceProfile-create-msg done")
3314 return meInstance, nil
3315 }
3316 logger.Errorw(ctx, "Cannot generate VoipApplicationServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3317 "device-id": oo.deviceID})
3318 return nil, omciErr.GetError()
3319}
3320
3321// SendSetVoipApplicationServiceProfile nolint: unused
3322func (oo *OmciCC) SendSetVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3323 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3324 tid := oo.GetNextTid(highPrio)
3325 logger.Debugw(ctx, "send VoipApplicationServiceProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
3326 "SequNo": strconv.FormatInt(int64(tid), 16),
3327 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3328
3329 meInstance, omciErr := me.NewVoipApplicationServiceProfile(params[0])
3330 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003331 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3332 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003333 if err != nil {
3334 logger.Errorw(ctx, "Cannot encode VoipApplicationServiceProfile for set", log.Fields{"Err": err,
3335 "device-id": oo.deviceID})
3336 return nil, err
3337 }
3338
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003339 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003340 if err != nil {
3341 logger.Errorw(ctx, "Cannot serialize VoipApplicationServiceProfile set", log.Fields{"Err": err,
3342 "device-id": oo.deviceID})
3343 return nil, err
3344 }
3345
3346 omciRxCallbackPair := CallbackPair{CbKey: tid,
3347 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3348 }
3349 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3350 if err != nil {
3351 logger.Errorw(ctx, "Cannot send VoipApplicationServiceProfile set", log.Fields{"Err": err,
3352 "device-id": oo.deviceID})
3353 return nil, err
3354 }
3355 logger.Debug(ctx, "send VoipApplicationServiceProfile-set-msg done")
3356 return meInstance, nil
3357 }
3358 logger.Errorw(ctx, "Cannot generate VoipApplicationServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3359 "device-id": oo.deviceID})
3360 return nil, omciErr.GetError()
3361}
3362
3363// SendDeleteVoipApplicationServiceProfile nolint: unused
3364func (oo *OmciCC) SendDeleteVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3365 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3366 tid := oo.GetNextTid(highPrio)
3367 logger.Debugw(ctx, "send SIPVoipApplicationServiceProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3368 "SequNo": strconv.FormatInt(int64(tid), 16),
3369 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3370
3371 meParams := me.ParamData{EntityID: aInstID}
3372 meInstance, omciErr := me.NewVoipApplicationServiceProfile(meParams)
3373 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003374 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3375 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003376 if err != nil {
3377 logger.Errorw(ctx, "Cannot encode SIPVoipApplicationServiceProfile for delete", log.Fields{
3378 "Err": err, "device-id": oo.deviceID})
3379 return nil, err
3380 }
3381
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003382 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003383 if err != nil {
3384 logger.Errorw(ctx, "Cannot serialize SIPVoipApplicationServiceProfile delete", log.Fields{
3385 "Err": err, "device-id": oo.deviceID})
3386 return nil, err
3387 }
3388
3389 omciRxCallbackPair := CallbackPair{
3390 CbKey: tid,
3391 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3392 }
3393 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3394 if err != nil {
3395 logger.Errorw(ctx, "Cannot send SIPVoipApplicationServiceProfile delete", log.Fields{
3396 "Err": err, "device-id": oo.deviceID})
3397 return nil, err
3398 }
3399 logger.Debug(ctx, "send SIPVoipApplicationServiceProfile-Delete-msg done")
3400 return meInstance, nil
3401 }
3402 logger.Errorw(ctx, "Cannot generate SIPVoipApplicationServiceProfile Instance for delete", log.Fields{
3403 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3404 return nil, omciErr.GetError()
3405}
3406
3407// SendCreateSIPAgentConfigData nolint: unused
3408func (oo *OmciCC) SendCreateSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3409 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3410 tid := oo.GetNextTid(highPrio)
3411 logger.Debugw(ctx, "send SIPAgentConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3412 "SequNo": strconv.FormatInt(int64(tid), 16),
3413 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3414
3415 meInstance, omciErr := me.NewSipAgentConfigData(params[0])
3416 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003417 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3418 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003419 if err != nil {
3420 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for create", log.Fields{"Err": err,
3421 "device-id": oo.deviceID})
3422 return nil, err
3423 }
3424
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003425 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003426 if err != nil {
3427 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData create", log.Fields{"Err": err,
3428 "device-id": oo.deviceID})
3429 return nil, err
3430 }
3431
3432 omciRxCallbackPair := CallbackPair{CbKey: tid,
3433 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3434 }
3435 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3436 if err != nil {
3437 logger.Errorw(ctx, "Cannot send SIPAgentConfigData create", log.Fields{"Err": err,
3438 "device-id": oo.deviceID})
3439 return nil, err
3440 }
3441 logger.Debug(ctx, "send SIPAgentConfigData-create-msg done")
3442 return meInstance, nil
3443 }
3444 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3445 "device-id": oo.deviceID})
3446 return nil, omciErr.GetError()
3447}
3448
3449// SendSetSIPAgentConfigData nolint: unused
3450func (oo *OmciCC) SendSetSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3451 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3452 tid := oo.GetNextTid(highPrio)
3453 logger.Debugw(ctx, "send SIPAgentConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3454 "SequNo": strconv.FormatInt(int64(tid), 16),
3455 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3456
3457 meInstance, omciErr := me.NewSipAgentConfigData(params[0])
3458 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003459 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3460 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003461 if err != nil {
3462 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for set", log.Fields{"Err": err,
3463 "device-id": oo.deviceID})
3464 return nil, err
3465 }
3466
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003467 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003468 if err != nil {
3469 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData set", log.Fields{"Err": err,
3470 "device-id": oo.deviceID})
3471 return nil, err
3472 }
3473
3474 omciRxCallbackPair := CallbackPair{CbKey: tid,
3475 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3476 }
3477 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3478 if err != nil {
3479 logger.Errorw(ctx, "Cannot send SIPAgentConfigData set", log.Fields{"Err": err,
3480 "device-id": oo.deviceID})
3481 return nil, err
3482 }
3483 logger.Debug(ctx, "send SIPAgentConfigData-set-msg done")
3484 return meInstance, nil
3485 }
3486 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3487 "device-id": oo.deviceID})
3488 return nil, omciErr.GetError()
3489}
3490
3491// SendDeleteSIPAgentConfigData nolint: unused
3492func (oo *OmciCC) SendDeleteSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3493 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3494 tid := oo.GetNextTid(highPrio)
3495 logger.Debugw(ctx, "send SIPAgentConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3496 "SequNo": strconv.FormatInt(int64(tid), 16),
3497 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3498
3499 meParams := me.ParamData{EntityID: aInstID}
3500 meInstance, omciErr := me.NewSipAgentConfigData(meParams)
3501 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003502 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3503 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003504 if err != nil {
3505 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for delete", log.Fields{
3506 "Err": err, "device-id": oo.deviceID})
3507 return nil, err
3508 }
3509
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003510 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003511 if err != nil {
3512 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData delete", log.Fields{
3513 "Err": err, "device-id": oo.deviceID})
3514 return nil, err
3515 }
3516
3517 omciRxCallbackPair := CallbackPair{
3518 CbKey: tid,
3519 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3520 }
3521 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3522 if err != nil {
3523 logger.Errorw(ctx, "Cannot send SIPAgentConfigData delete", log.Fields{
3524 "Err": err, "device-id": oo.deviceID})
3525 return nil, err
3526 }
3527 logger.Debug(ctx, "send SIPAgentConfigData-Delete-msg done")
3528 return meInstance, nil
3529 }
3530 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance for delete", log.Fields{
3531 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3532 return nil, omciErr.GetError()
3533}
3534
3535// SendCreateTCPUDPConfigData nolint: unused
3536func (oo *OmciCC) SendCreateTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3537 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3538 tid := oo.GetNextTid(highPrio)
3539 logger.Debugw(ctx, "send TCPUDPConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3540 "SequNo": strconv.FormatInt(int64(tid), 16),
3541 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3542
3543 meInstance, omciErr := me.NewTcpUdpConfigData(params[0])
3544 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003545 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3546 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003547 if err != nil {
3548 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for create", log.Fields{"Err": err,
3549 "device-id": oo.deviceID})
3550 return nil, err
3551 }
3552
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003553 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003554 if err != nil {
3555 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData create", log.Fields{"Err": err,
3556 "device-id": oo.deviceID})
3557 return nil, err
3558 }
3559
3560 omciRxCallbackPair := CallbackPair{CbKey: tid,
3561 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3562 }
3563 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3564 if err != nil {
3565 logger.Errorw(ctx, "Cannot send TCPUDPConfigData create", log.Fields{"Err": err,
3566 "device-id": oo.deviceID})
3567 return nil, err
3568 }
3569 logger.Debug(ctx, "send TCPUDPConfigData-create-msg done")
3570 return meInstance, nil
3571 }
3572 logger.Errorw(ctx, "Cannot generate TCPUDPConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3573 "device-id": oo.deviceID})
3574 return nil, omciErr.GetError()
3575}
3576
3577// SendSetTCPUDPConfigData nolint: unused
3578func (oo *OmciCC) SendSetTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3579 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3580 tid := oo.GetNextTid(highPrio)
3581 logger.Debugw(ctx, "send TCPUDPConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3582 "SequNo": strconv.FormatInt(int64(tid), 16),
3583 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3584
3585 meInstance, omciErr := me.NewTcpUdpConfigData(params[0])
3586 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003587 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3588 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003589 if err != nil {
3590 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for set", log.Fields{"Err": err,
3591 "device-id": oo.deviceID})
3592 return nil, err
3593 }
3594
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003595 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003596 if err != nil {
3597 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData set", log.Fields{"Err": err,
3598 "device-id": oo.deviceID})
3599 return nil, err
3600 }
3601
3602 omciRxCallbackPair := CallbackPair{CbKey: tid,
3603 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3604 }
3605 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3606 if err != nil {
3607 logger.Errorw(ctx, "Cannot send TCPUDPConfigData set", log.Fields{"Err": err,
3608 "device-id": oo.deviceID})
3609 return nil, err
3610 }
3611 logger.Debug(ctx, "send TCPUDPConfigData-set-msg done")
3612 return meInstance, nil
3613 }
3614 logger.Errorw(ctx, "Cannot generate TCPUDPConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3615 "device-id": oo.deviceID})
3616 return nil, omciErr.GetError()
3617}
3618
3619// SendDeleteTCPUDPConfigData nolint: unused
3620func (oo *OmciCC) SendDeleteTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3621 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3622 tid := oo.GetNextTid(highPrio)
3623 logger.Debugw(ctx, "send TCPUDPConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3624 "SequNo": strconv.FormatInt(int64(tid), 16),
3625 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3626
3627 meParams := me.ParamData{EntityID: aInstID}
3628 meInstance, omciErr := me.NewTcpUdpConfigData(meParams)
3629 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003630 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3631 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003632 if err != nil {
3633 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for delete", log.Fields{
3634 "Err": err, "device-id": oo.deviceID})
3635 return nil, err
3636 }
3637
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003638 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003639 if err != nil {
3640 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData delete", log.Fields{
3641 "Err": err, "device-id": oo.deviceID})
3642 return nil, err
3643 }
3644
3645 omciRxCallbackPair := CallbackPair{
3646 CbKey: tid,
3647 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3648 }
3649 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3650 if err != nil {
3651 logger.Errorw(ctx, "Cannot send TCPUDPConfigData delete", log.Fields{
3652 "Err": err, "device-id": oo.deviceID})
3653 return nil, err
3654 }
3655 logger.Debug(ctx, "send TCPUDPConfigData-Delete-msg done")
3656 return meInstance, nil
3657 }
3658 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance for delete", log.Fields{
3659 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3660 return nil, omciErr.GetError()
3661}
3662
3663// SendCreateIPHostConfigData nolint: unused
3664func (oo *OmciCC) SendCreateIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3665 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3666 tid := oo.GetNextTid(highPrio)
3667 logger.Debugw(ctx, "send IPHostConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3668 "SequNo": strconv.FormatInt(int64(tid), 16),
3669 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3670
3671 meInstance, omciErr := me.NewIpHostConfigData(params[0])
3672 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003673 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3674 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003675 if err != nil {
3676 logger.Errorw(ctx, "Cannot encode IPHostConfigData for create", log.Fields{"Err": err,
3677 "device-id": oo.deviceID})
3678 return nil, err
3679 }
3680
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003681 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003682 if err != nil {
3683 logger.Errorw(ctx, "Cannot serialize IPHostConfigData create", log.Fields{"Err": err,
3684 "device-id": oo.deviceID})
3685 return nil, err
3686 }
3687
3688 omciRxCallbackPair := CallbackPair{CbKey: tid,
3689 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3690 }
3691 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3692 if err != nil {
3693 logger.Errorw(ctx, "Cannot send IPHostConfigData create", log.Fields{"Err": err,
3694 "device-id": oo.deviceID})
3695 return nil, err
3696 }
3697 logger.Debug(ctx, "send IPHostConfigData-create-msg done")
3698 return meInstance, nil
3699 }
3700 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3701 "device-id": oo.deviceID})
3702 return nil, omciErr.GetError()
3703}
3704
3705// SendSetIPHostConfigData nolint: unused
3706func (oo *OmciCC) SendSetIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3707 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3708 tid := oo.GetNextTid(highPrio)
3709 logger.Debugw(ctx, "send IPHostConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3710 "SequNo": strconv.FormatInt(int64(tid), 16),
3711 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3712
3713 meInstance, omciErr := me.NewIpHostConfigData(params[0])
3714 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003715 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3716 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003717 if err != nil {
3718 logger.Errorw(ctx, "Cannot encode IPHostConfigData for set", log.Fields{"Err": err,
3719 "device-id": oo.deviceID})
3720 return nil, err
3721 }
3722
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003723 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003724 if err != nil {
3725 logger.Errorw(ctx, "Cannot serialize IPHostConfigData set", log.Fields{"Err": err,
3726 "device-id": oo.deviceID})
3727 return nil, err
3728 }
3729
3730 omciRxCallbackPair := CallbackPair{CbKey: tid,
3731 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3732 }
3733 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3734 if err != nil {
3735 logger.Errorw(ctx, "Cannot send IPHostConfigData set", log.Fields{"Err": err,
3736 "device-id": oo.deviceID})
3737 return nil, err
3738 }
3739 logger.Debug(ctx, "send IPHostConfigData-set-msg done")
3740 return meInstance, nil
3741 }
3742 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3743 "device-id": oo.deviceID})
3744 return nil, omciErr.GetError()
3745}
3746
3747// SendDeleteIPHostConfigData nolint: unused
3748func (oo *OmciCC) SendDeleteIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3749 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3750 tid := oo.GetNextTid(highPrio)
3751 logger.Debugw(ctx, "send IPHostConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3752 "SequNo": strconv.FormatInt(int64(tid), 16),
3753 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3754
3755 meParams := me.ParamData{EntityID: aInstID}
3756 meInstance, omciErr := me.NewIpHostConfigData(meParams)
3757 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003758 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3759 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003760 if err != nil {
3761 logger.Errorw(ctx, "Cannot encode IPHostConfigData for delete", log.Fields{
3762 "Err": err, "device-id": oo.deviceID})
3763 return nil, err
3764 }
3765
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003766 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003767 if err != nil {
3768 logger.Errorw(ctx, "Cannot serialize IPHostConfigData delete", log.Fields{
3769 "Err": err, "device-id": oo.deviceID})
3770 return nil, err
3771 }
3772
3773 omciRxCallbackPair := CallbackPair{
3774 CbKey: tid,
3775 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3776 }
3777 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3778 if err != nil {
3779 logger.Errorw(ctx, "Cannot send IPHostConfigData delete", log.Fields{
3780 "Err": err, "device-id": oo.deviceID})
3781 return nil, err
3782 }
3783 logger.Debug(ctx, "send IPHostConfigData-Delete-msg done")
3784 return meInstance, nil
3785 }
3786 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance for delete", log.Fields{
3787 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3788 return nil, omciErr.GetError()
3789}
3790
3791// SendCreateRTPProfileData nolint: unused
3792func (oo *OmciCC) SendCreateRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3793 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3794 tid := oo.GetNextTid(highPrio)
3795 logger.Debugw(ctx, "send RTPProfileData-create-msg:", log.Fields{"device-id": oo.deviceID,
3796 "SequNo": strconv.FormatInt(int64(tid), 16),
3797 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3798
3799 meInstance, omciErr := me.NewRtpProfileData(params[0])
3800 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003801 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3802 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003803 if err != nil {
3804 logger.Errorw(ctx, "Cannot encode RTPProfileData for create", log.Fields{"Err": err,
3805 "device-id": oo.deviceID})
3806 return nil, err
3807 }
3808
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003809 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003810 if err != nil {
3811 logger.Errorw(ctx, "Cannot serialize RTPProfileData create", log.Fields{"Err": err,
3812 "device-id": oo.deviceID})
3813 return nil, err
3814 }
3815
3816 omciRxCallbackPair := CallbackPair{CbKey: tid,
3817 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3818 }
3819 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3820 if err != nil {
3821 logger.Errorw(ctx, "Cannot send RTPProfileData create", log.Fields{"Err": err,
3822 "device-id": oo.deviceID})
3823 return nil, err
3824 }
3825 logger.Debug(ctx, "send RTPProfileData-create-msg done")
3826 return meInstance, nil
3827 }
3828 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance", log.Fields{"Err": omciErr.GetError(),
3829 "device-id": oo.deviceID})
3830 return nil, omciErr.GetError()
3831}
3832
3833// SendSetRTPProfileData nolint: unused
3834func (oo *OmciCC) SendSetRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3835 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3836 tid := oo.GetNextTid(highPrio)
3837 logger.Debugw(ctx, "send RTPProfileData-set-msg:", log.Fields{"device-id": oo.deviceID,
3838 "SequNo": strconv.FormatInt(int64(tid), 16),
3839 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3840
3841 meInstance, omciErr := me.NewRtpProfileData(params[0])
3842 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003843 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3844 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003845 if err != nil {
3846 logger.Errorw(ctx, "Cannot encode RTPProfileData for set", log.Fields{"Err": err,
3847 "device-id": oo.deviceID})
3848 return nil, err
3849 }
3850
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003851 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003852 if err != nil {
3853 logger.Errorw(ctx, "Cannot serialize RTPProfileData set", log.Fields{"Err": err,
3854 "device-id": oo.deviceID})
3855 return nil, err
3856 }
3857
3858 omciRxCallbackPair := CallbackPair{CbKey: tid,
3859 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3860 }
3861 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3862 if err != nil {
3863 logger.Errorw(ctx, "Cannot send RTPProfileData set", log.Fields{"Err": err,
3864 "device-id": oo.deviceID})
3865 return nil, err
3866 }
3867 logger.Debug(ctx, "send RTPProfileData-set-msg done")
3868 return meInstance, nil
3869 }
3870 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance", log.Fields{"Err": omciErr.GetError(),
3871 "device-id": oo.deviceID})
3872 return nil, omciErr.GetError()
3873}
3874
3875// SendDeleteRTPProfileData nolint: unused
3876func (oo *OmciCC) SendDeleteRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3877 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3878 tid := oo.GetNextTid(highPrio)
3879 logger.Debugw(ctx, "send RTPProfileData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3880 "SequNo": strconv.FormatInt(int64(tid), 16),
3881 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3882
3883 meParams := me.ParamData{EntityID: aInstID}
3884 meInstance, omciErr := me.NewRtpProfileData(meParams)
3885 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003886 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3887 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003888 if err != nil {
3889 logger.Errorw(ctx, "Cannot encode RTPProfileData for delete", log.Fields{
3890 "Err": err, "device-id": oo.deviceID})
3891 return nil, err
3892 }
3893
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003894 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003895 if err != nil {
3896 logger.Errorw(ctx, "Cannot serialize RTPProfileData delete", log.Fields{
3897 "Err": err, "device-id": oo.deviceID})
3898 return nil, err
3899 }
3900
3901 omciRxCallbackPair := CallbackPair{
3902 CbKey: tid,
3903 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3904 }
3905 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3906 if err != nil {
3907 logger.Errorw(ctx, "Cannot send RTPProfileData delete", log.Fields{
3908 "Err": err, "device-id": oo.deviceID})
3909 return nil, err
3910 }
3911 logger.Debug(ctx, "send RTPProfileData-Delete-msg done")
3912 return meInstance, nil
3913 }
3914 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance for delete", log.Fields{
3915 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3916 return nil, omciErr.GetError()
3917}
3918
3919// SendCreateNetworkDialPlanTable nolint: unused
3920func (oo *OmciCC) SendCreateNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
3921 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3922 tid := oo.GetNextTid(highPrio)
3923 logger.Debugw(ctx, "send NetworkDialPlanTable-create-msg:", log.Fields{"device-id": oo.deviceID,
3924 "SequNo": strconv.FormatInt(int64(tid), 16),
3925 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3926
3927 meInstance, omciErr := me.NewNetworkDialPlanTable(params[0])
3928 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003929 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3930 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003931 if err != nil {
3932 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for create", log.Fields{"Err": err,
3933 "device-id": oo.deviceID})
3934 return nil, err
3935 }
3936
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003937 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003938 if err != nil {
3939 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable create", log.Fields{"Err": err,
3940 "device-id": oo.deviceID})
3941 return nil, err
3942 }
3943
3944 omciRxCallbackPair := CallbackPair{CbKey: tid,
3945 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3946 }
3947 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3948 if err != nil {
3949 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable create", log.Fields{"Err": err,
3950 "device-id": oo.deviceID})
3951 return nil, err
3952 }
3953 logger.Debug(ctx, "send NetworkDialPlanTable-create-msg done")
3954 return meInstance, nil
3955 }
3956 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance", log.Fields{"Err": omciErr.GetError(),
3957 "device-id": oo.deviceID})
3958 return nil, omciErr.GetError()
3959}
3960
3961// SendSetNetworkDialPlanTable nolint: unused
3962func (oo *OmciCC) SendSetNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
3963 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3964 tid := oo.GetNextTid(highPrio)
3965 logger.Debugw(ctx, "send NetworkDialPlanTable-set-msg:", log.Fields{"device-id": oo.deviceID,
3966 "SequNo": strconv.FormatInt(int64(tid), 16),
3967 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3968
3969 meInstance, omciErr := me.NewNetworkDialPlanTable(params[0])
3970 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003971 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3972 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003973 if err != nil {
3974 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for set", log.Fields{"Err": err,
3975 "device-id": oo.deviceID})
3976 return nil, err
3977 }
3978
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003979 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003980 if err != nil {
3981 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable set", log.Fields{"Err": err,
3982 "device-id": oo.deviceID})
3983 return nil, err
3984 }
3985
3986 omciRxCallbackPair := CallbackPair{CbKey: tid,
3987 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3988 }
3989 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3990 if err != nil {
3991 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable set", log.Fields{"Err": err,
3992 "device-id": oo.deviceID})
3993 return nil, err
3994 }
3995 logger.Debug(ctx, "send NetworkDialPlanTable-set-msg done")
3996 return meInstance, nil
3997 }
3998 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance", log.Fields{"Err": omciErr.GetError(),
3999 "device-id": oo.deviceID})
4000 return nil, omciErr.GetError()
4001}
4002
4003// SendDeleteNetworkDialPlanTable nolint: unused
4004func (oo *OmciCC) SendDeleteNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
4005 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
4006 tid := oo.GetNextTid(highPrio)
4007 logger.Debugw(ctx, "send NetworkDialPlanTable-Delete-msg:", log.Fields{"device-id": oo.deviceID,
4008 "SequNo": strconv.FormatInt(int64(tid), 16),
4009 "InstId": strconv.FormatInt(int64(aInstID), 16)})
4010
4011 meParams := me.ParamData{EntityID: aInstID}
4012 meInstance, omciErr := me.NewNetworkDialPlanTable(meParams)
4013 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00004014 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
4015 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004016 if err != nil {
4017 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for delete", log.Fields{
4018 "Err": err, "device-id": oo.deviceID})
4019 return nil, err
4020 }
4021
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004022 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004023 if err != nil {
4024 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable delete", log.Fields{
4025 "Err": err, "device-id": oo.deviceID})
4026 return nil, err
4027 }
4028
4029 omciRxCallbackPair := CallbackPair{
4030 CbKey: tid,
4031 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4032 }
4033 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
4034 if err != nil {
4035 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable delete", log.Fields{
4036 "Err": err, "device-id": oo.deviceID})
4037 return nil, err
4038 }
4039 logger.Debug(ctx, "send NetworkDialPlanTable-Delete-msg done")
4040 return meInstance, nil
4041 }
4042 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance for delete", log.Fields{
4043 "Err": omciErr.GetError(), "device-id": oo.deviceID})
4044 return nil, omciErr.GetError()
4045}
4046
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004047// SendSyncTime sends SynchronizeTimeRequest
4048func (oo *OmciCC) SendSyncTime(ctx context.Context, timeout int, highPrio bool, rxChan chan Message) error {
4049 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004050 logger.Debugw(ctx, "send synchronize time request:", log.Fields{"device-id": oo.deviceID,
4051 "SequNo": strconv.FormatInt(int64(tid), 16)})
4052
4053 omciLayer := &omci.OMCI{
4054 TransactionID: tid,
4055 MessageType: omci.SynchronizeTimeRequestType,
4056 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4057 // Length: 0x28, // Optional, defaults to 40 octets
4058 }
4059 utcTime := time.Now().UTC()
4060 request := &omci.SynchronizeTimeRequest{
4061 MeBasePacket: omci.MeBasePacket{
4062 EntityClass: me.OnuGClassID,
4063 // Default Instance ID is 0
4064 },
4065 Year: uint16(utcTime.Year()),
4066 Month: uint8(utcTime.Month()),
4067 Day: uint8(utcTime.Day()),
4068 Hour: uint8(utcTime.Hour()),
4069 Minute: uint8(utcTime.Minute()),
4070 Second: uint8(utcTime.Second()),
4071 }
4072
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004073 pkt, err := SerializeOmciLayer(ctx, omciLayer, request)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004074 if err != nil {
4075 logger.Errorw(ctx, "Cannot serialize synchronize time request", log.Fields{"Err": err,
4076 "device-id": oo.deviceID})
4077 return err
4078 }
4079
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004080 omciRxCallbackPair := CallbackPair{CbKey: tid,
4081 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004082 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004083 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004084 if err != nil {
4085 logger.Errorw(ctx, "Cannot send synchronize time request", log.Fields{"Err": err,
4086 "device-id": oo.deviceID})
4087 return err
4088 }
4089 logger.Debug(ctx, "send synchronize time request done")
4090 return nil
4091}
4092
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004093// SendCreateOrDeleteEthernetPerformanceMonitoringHistoryME creates or deletes EthernetFramePerformanceMonitoringHistoryData ME instance
4094func (oo *OmciCC) SendCreateOrDeleteEthernetPerformanceMonitoringHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004095 upstream bool, create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004096 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004097 logger.Debugw(ctx, "send ethernet-performance-monitoring-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4098 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
4099 meParam := me.ParamData{EntityID: entityID}
4100 var meInstance *me.ManagedEntity
4101 var omciErr me.OmciErrors
4102 if upstream {
4103 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataUpstream(meParam)
4104 } else {
4105 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataDownstream(meParam)
4106 }
4107 if omciErr.GetError() == nil {
4108 var omciLayer *omci.OMCI
4109 var msgLayer gopacket.SerializableLayer
4110 var err error
4111 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004112 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4113 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004114 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004115 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4116 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004117 }
4118 if err != nil {
4119 logger.Errorw(ctx, "Cannot encode ethernet frame performance monitoring history data ME",
4120 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004121 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004122 }
4123
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004124 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004125 if err != nil {
4126 logger.Errorw(ctx, "Cannot serialize ethernet frame performance monitoring history data ME",
4127 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004128 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004129 }
4130
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004131 omciRxCallbackPair := CallbackPair{CbKey: tid,
4132 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004133 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004134 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004135 if err != nil {
4136 logger.Errorw(ctx, "Cannot send ethernet frame performance monitoring history data ME",
4137 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004138 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004139 }
4140 logger.Debugw(ctx, "send ethernet frame performance monitoring history data ME done",
4141 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004142 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08004143 }
4144 logger.Errorw(ctx, "Cannot generate ethernet frame performance monitoring history data ME Instance",
4145 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 +03004146 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08004147}
4148
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004149// SendCreateOrDeleteEthernetUniHistoryME creates or deletes EthernetPerformanceMonitoringHistoryData ME instance
4150func (oo *OmciCC) SendCreateOrDeleteEthernetUniHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004151 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004152 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004153 logger.Debugw(ctx, "send ethernet-uni-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4154 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4155 meParam := me.ParamData{EntityID: entityID}
4156 var meInstance *me.ManagedEntity
4157 var omciErr me.OmciErrors
4158 meInstance, omciErr = me.NewEthernetPerformanceMonitoringHistoryData(meParam)
4159
4160 if omciErr.GetError() == nil {
4161 var omciLayer *omci.OMCI
4162 var msgLayer gopacket.SerializableLayer
4163 var err error
4164 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004165 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4166 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004167 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004168 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4169 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004170 }
4171 if err != nil {
4172 logger.Errorw(ctx, "Cannot encode ethernet uni history data ME",
4173 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004174 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004175 }
4176
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004177 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004178 if err != nil {
4179 logger.Errorw(ctx, "Cannot serialize ethernet uni history data ME",
4180 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004181 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004182 }
4183
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004184 omciRxCallbackPair := CallbackPair{CbKey: tid,
4185 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004186 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004187 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004188 if err != nil {
4189 logger.Errorw(ctx, "Cannot send ethernet uni history data ME",
4190 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004191 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004192 }
4193 logger.Debugw(ctx, "send ethernet uni history data ME done",
4194 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004195 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08004196 }
4197 logger.Errorw(ctx, "Cannot generate ethernet uni history data ME Instance",
4198 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004199 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08004200}
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004201
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004202// SendCreateOrDeleteFecHistoryME creates or deletes FecPerformanceMonitoringHistoryData ME instance
4203func (oo *OmciCC) SendCreateOrDeleteFecHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004204 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004205 tid := oo.GetNextTid(highPrio)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004206 logger.Debugw(ctx, "send fec-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4207 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4208 meParam := me.ParamData{EntityID: entityID}
4209 var meInstance *me.ManagedEntity
4210 var omciErr me.OmciErrors
4211 meInstance, omciErr = me.NewFecPerformanceMonitoringHistoryData(meParam)
4212
4213 if omciErr.GetError() == nil {
4214 var omciLayer *omci.OMCI
4215 var msgLayer gopacket.SerializableLayer
4216 var err error
4217 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004218 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4219 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004220 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004221 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4222 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004223 }
4224 if err != nil {
4225 logger.Errorw(ctx, "Cannot encode fec history data ME",
4226 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004227 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004228 }
4229
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004230 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004231 if err != nil {
4232 logger.Errorw(ctx, "Cannot serialize fec history data ME",
4233 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004234 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004235 }
4236
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004237 omciRxCallbackPair := CallbackPair{CbKey: tid,
4238 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004239 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004240 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004241 if err != nil {
4242 logger.Errorw(ctx, "Cannot send fec history data ME",
4243 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004244 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004245 }
4246 logger.Debugw(ctx, "send fec history data ME done",
4247 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004248 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004249 }
4250 logger.Errorw(ctx, "Cannot generate fec history data ME Instance",
4251 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004252 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004253}
4254
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004255// SendCreateOrDeleteGemPortHistoryME deletes GemPortNetworkCtpPerformanceMonitoringHistoryData ME instance
4256func (oo *OmciCC) SendCreateOrDeleteGemPortHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004257 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004258 tid := oo.GetNextTid(highPrio)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004259 logger.Debugw(ctx, "send gemport-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4260 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4261 meParam := me.ParamData{EntityID: entityID}
4262 var meInstance *me.ManagedEntity
4263 var omciErr me.OmciErrors
4264 meInstance, omciErr = me.NewGemPortNetworkCtpPerformanceMonitoringHistoryData(meParam)
4265
4266 if omciErr.GetError() == nil {
4267 var omciLayer *omci.OMCI
4268 var msgLayer gopacket.SerializableLayer
4269 var err error
4270 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004271 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4272 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004273 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004274 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4275 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004276 }
4277 if err != nil {
4278 logger.Errorw(ctx, "Cannot encode gemport history data ME",
4279 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004280 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004281 }
4282
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004283 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004284 if err != nil {
4285 logger.Errorw(ctx, "Cannot serialize gemport history data ME",
4286 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004287 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004288 }
4289
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004290 omciRxCallbackPair := CallbackPair{CbKey: tid,
4291 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004292 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004293 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004294 if err != nil {
4295 logger.Errorw(ctx, "Cannot send gemport history data ME",
4296 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004297 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004298 }
4299 logger.Debugw(ctx, "send gemport history data ME done",
4300 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004301 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004302 }
4303 logger.Errorw(ctx, "Cannot generate gemport history data ME Instance",
4304 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004305 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004306}
4307
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004308// SendStartSoftwareDownload sends StartSoftwareDownloadRequest
4309func (oo *OmciCC) SendStartSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004310 rxChan chan Message, aImageMeID uint16, aDownloadWindowSize uint8, aFileLen uint32, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004311 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004312 logger.Debugw(ctx, "send StartSwDlRequest:", log.Fields{"device-id": oo.deviceID,
4313 "SequNo": strconv.FormatInt(int64(tid), 16),
4314 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4315
4316 omciLayer := &omci.OMCI{
4317 TransactionID: tid,
4318 MessageType: omci.StartSoftwareDownloadRequestType,
4319 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4320 // Length: 0x28, // Optional, defaults to 40 octets
4321 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004322 if aIsExtendedOmci {
4323 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4324 }
mpagenko80622a52021-02-09 16:53:23 +00004325 request := &omci.StartSoftwareDownloadRequest{
4326 MeBasePacket: omci.MeBasePacket{
4327 EntityClass: me.SoftwareImageClassID,
4328 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004329 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004330 },
4331 WindowSize: aDownloadWindowSize,
4332 ImageSize: aFileLen,
4333 NumberOfCircuitPacks: 1, //parallel download to multiple circuit packs not supported
4334 CircuitPacks: []uint16{0}, //circuit pack indication don't care for NumberOfCircuitPacks=1, but needed by omci-lib
4335 }
4336
4337 var options gopacket.SerializeOptions
4338 options.FixLengths = true
4339 buffer := gopacket.NewSerializeBuffer()
4340 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4341 if err != nil {
4342 logger.Errorw(ctx, "Cannot serialize StartSwDlRequest", log.Fields{"Err": err,
4343 "device-id": oo.deviceID})
4344 return err
4345 }
4346 outgoingPacket := buffer.Bytes()
4347
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004348 omciRxCallbackPair := CallbackPair{CbKey: tid,
4349 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko80622a52021-02-09 16:53:23 +00004350 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004351 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004352 if err != nil {
4353 logger.Errorw(ctx, "Cannot send StartSwDlRequest", log.Fields{"Err": err,
4354 "device-id": oo.deviceID})
4355 return err
4356 }
4357 logger.Debug(ctx, "send StartSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004358 return nil
4359}
4360
kesavand011d5162021-11-25 19:21:06 +05304361// PrepareOnuSectionsOfWindow prepares a list of sections for each window
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304362// Before invoking this function the oo.mutexTid needs to be be locked so that
4363// GetOnuSwSecNextTid can be invoked without further locking
kesavand011d5162021-11-25 19:21:06 +05304364func (oo *OmciCC) PrepareOnuSectionsOfWindow(ctx context.Context,
4365 aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004366 omciMsgsPerWindow *ia.OmciMessages, aIsExtendedOmci bool) (OmciTransferStructure, error) {
kesavand011d5162021-11-25 19:21:06 +05304367 //onuswsections uses only low prioirity tids
4368 tid := oo.GetOnuSwSecNextTid()
4369 logger.Infow(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
4370 "SequNo": strconv.FormatInt(int64(tid), 16),
4371 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest, "sectionNo": aDownloadSectionNo, "sectionData": aSection})
4372
4373 var omciTxReq OmciTransferStructure
4374 msgType := omci.DownloadSectionRequestType
4375
4376 if aAckRequest > 0 {
4377 msgType = omci.DownloadSectionRequestWithResponseType
4378
4379 }
4380 omciLayer := &omci.OMCI{
4381 TransactionID: tid,
4382 MessageType: msgType,
4383 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4384 // Length: 0x28, // Optional, defaults to 40 octets
4385 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004386 if aIsExtendedOmci {
4387 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4388 }
kesavand011d5162021-11-25 19:21:06 +05304389 localSectionData := make([]byte, len(aSection))
4390
4391 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
4392 request := &omci.DownloadSectionRequest{
4393 MeBasePacket: omci.MeBasePacket{
4394 EntityClass: me.SoftwareImageClassID,
4395 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004396 Extended: aIsExtendedOmci,
kesavand011d5162021-11-25 19:21:06 +05304397 },
4398 SectionNumber: aDownloadSectionNo,
4399 SectionData: localSectionData,
4400 }
4401
4402 var options gopacket.SerializeOptions
4403 options.FixLengths = true
4404 buffer := gopacket.NewSerializeBuffer()
4405 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4406 if err != nil {
4407 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
4408 "device-id": oo.deviceID})
4409 return omciTxReq, err
4410 }
4411 outgoingPacket := buffer.Bytes()
4412
4413 omciMsgsPerWindow.Messages = append(omciMsgsPerWindow.Messages, outgoingPacket)
4414
4415 if aAckRequest > 0 {
4416 // only the last section should have a timeout as an ack is required only for the last section of the window
4417 omciTxReq = OmciTransferStructure{
4418 withFramePrint: true,
4419 OnuSwWindow: omciMsgsPerWindow,
4420 }
4421 return omciTxReq, nil
4422 }
4423
4424 return omciTxReq, nil
4425}
4426
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304427// SendOnuSwSectionsWindowWithRxSupervision sends onu swd sections
kesavand011d5162021-11-25 19:21:06 +05304428func (oo *OmciCC) SendOnuSwSectionsWindowWithRxSupervision(ctx context.Context,
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304429 aOmciTxRequest OmciTransferStructure, aTimeout int, rxChan chan Message) error {
kesavand011d5162021-11-25 19:21:06 +05304430 if aOmciTxRequest.OnuSwWindow == nil {
4431 logger.Errorw(ctx, "SendOnuSwSectionsWindowWithRxSupervision: omciTxRequest.OnuSwWindow is nil",
4432 log.Fields{"device-id": oo.deviceID})
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304433 return fmt.Errorf("sendOnuSwSectionsWindowWithRxSupervision: omciTxRequest.OnuSwWindow is nil device-id: %v",
4434 oo.deviceID)
kesavand011d5162021-11-25 19:21:06 +05304435 }
4436
4437 tid := oo.GetOnuSwSecLastTid()
4438 logger.Debugw(ctx, "SendOnuSwSectionsWindowWithRxSupervision tid for the last segment is ", log.Fields{"TID": tid})
4439 omciRxCallbackPair := CallbackPair{CbKey: tid,
4440 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4441 }
4442
4443 aOmciTxRequest.cbPair = omciRxCallbackPair
4444 logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TansCorrId": aOmciTxRequest.cbPair.CbKey})
4445 oo.mutexRxSchedMap.Lock()
4446 // it could be checked, if the callback key is already registered - but simply overwrite may be acceptable ...
4447 oo.rxSchedulerMap[aOmciTxRequest.cbPair.CbKey] = aOmciTxRequest.cbPair.CbEntry
4448 oo.mutexRxSchedMap.Unlock()
4449
4450 chSuccess := make(chan bool)
4451 aOmciTxRequest.chSuccess = chSuccess
4452 aOmciTxRequest.timeout = aTimeout
4453 aOmciTxRequest.retries = CDefaultRetries
4454
4455 //tid := aOmciTxRequest.cbPair.CbKey
4456 oo.mutexMonReq.Lock()
4457 oo.monitoredRequests[tid] = aOmciTxRequest
4458 oo.mutexMonReq.Unlock()
4459
4460 retries := aOmciTxRequest.retries
4461 retryCounter := 0
4462 if aTimeout == 0 {
4463 logger.Errorw(ctx, "no timeout present for last section of window", log.Fields{"device-id": oo.deviceID})
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304464 return fmt.Errorf("no timeout present for last section of window device-id: %v", oo.deviceID)
kesavand011d5162021-11-25 19:21:06 +05304465 }
4466loop:
4467 for retryCounter <= retries {
4468 // the onu sw sections are enqueued only to the low priority queue
4469 oo.mutexLowPrioTxQueue.Lock()
4470 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4471 oo.mutexLowPrioTxQueue.Unlock()
4472
pnalmasc6e916a2025-06-30 11:59:16 +05304473 //Register the call back again as we clean up the Map entry when we failed to send the message
4474 oo.mutexRxSchedMap.Lock()
4475 oo.rxSchedulerMap[aOmciTxRequest.cbPair.CbKey] = aOmciTxRequest.cbPair.CbEntry
4476 oo.mutexRxSchedMap.Unlock()
4477
kesavand011d5162021-11-25 19:21:06 +05304478 go oo.sendQueuedRequests(ctx)
4479
4480 select {
4481 case success := <-chSuccess:
4482 if success {
4483 logger.Debugw(ctx, "reqMon: response received in time",
4484 log.Fields{"tid": tid, "device-id": oo.deviceID})
4485 } else {
4486 logger.Debugw(ctx, "reqMon: wait for response aborted",
4487 log.Fields{"tid": tid, "device-id": oo.deviceID})
4488 }
4489 break loop
4490 case <-time.After(time.Duration(aTimeout) * time.Second):
4491 if retryCounter == retries {
Holger Hildebrandt2b107642022-12-09 07:56:23 +00004492 if oo.pBaseDeviceHandler.IsOltAvailable() {
4493 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - send ONU device event!",
4494 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4495 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationFailureSwUpgrade, OnuOmciCommunicationFailureSwUpgradeDesc)
4496 } else {
4497 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - skip ONU device event: OLT unavailable!",
4498 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4499 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004500 oo.incrementTxTimesouts()
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304501 oo.mutexMonReq.Lock()
4502 delete(oo.monitoredRequests, tid)
4503 oo.mutexMonReq.Unlock()
4504 return fmt.Errorf("reqMon: timeout waiting for response - no of max retries reached device-id: %v", oo.deviceID)
kesavand011d5162021-11-25 19:21:06 +05304505 }
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304506 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
4507 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4508 oo.incrementTxRetries()
4509 case _, ok := <-oo.pBaseDeviceHandler.GetDeviceDeleteCommChan(ctx):
4510 if !ok {
4511 logger.Warnw(ctx, "device deletion channel is closed", log.Fields{"device-id": oo.deviceID})
4512 oo.mutexMonReq.Lock()
4513 delete(oo.monitoredRequests, tid)
4514 oo.mutexMonReq.Unlock()
4515 return fmt.Errorf("device deletion channel is closed device-id: %v", oo.deviceID)
4516 }
4517 oo.mutexMonReq.Lock()
4518 delete(oo.monitoredRequests, tid)
4519 oo.mutexMonReq.Unlock()
4520 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 +05304521 }
4522 retryCounter++
4523 }
4524 oo.mutexMonReq.Lock()
4525 delete(oo.monitoredRequests, tid)
4526 oo.mutexMonReq.Unlock()
Balaji Seenivasana52fb0c2024-12-18 07:50:42 +05304527 return nil
kesavand011d5162021-11-25 19:21:06 +05304528}
4529
4530func (oo *OmciCC) sendOnuSwSectionsOfWindow(ctx context.Context, omciTxRequest OmciTransferStructure) error {
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004531 var lastSection []byte
4532 if omciTxRequest.OnuSwWindow != nil {
4533 lastSection = omciTxRequest.OnuSwWindow.Messages[len(omciTxRequest.OnuSwWindow.Messages)-1]
4534 } else {
4535 logger.Errorw(ctx, "invalid sw window received", log.Fields{"device-id": oo.deviceID})
4536 return fmt.Errorf("invalid sw window received")
4537 }
4538 if omciTxRequest.withFramePrint {
4539 logger.Debugw(ctx, "sw-section-omci-message-to-send:", log.Fields{
kesavand011d5162021-11-25 19:21:06 +05304540 "TxOmciMessage": hex.EncodeToString(lastSection),
4541 "device-id": oo.deviceID,
4542 "toDeviceType": oo.pBaseDeviceHandler.GetProxyAddressType(),
4543 "proxyDeviceID": oo.pBaseDeviceHandler.GetProxyAddressID(),
4544 "proxyAddress": oo.pBaseDeviceHandler.GetProxyAddress()})
4545 }
4546 sendErr := oo.pBaseDeviceHandler.SendOnuSwSectionsOfWindow(ctx, oo.pBaseDeviceHandler.GetProxyAddress().AdapterEndpoint, omciTxRequest.OnuSwWindow)
4547 if sendErr != nil {
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004548 logger.Errorw(ctx, "send onu sw sections omci request error", log.Fields{"device-id": oo.deviceID, "error": sendErr})
kesavand011d5162021-11-25 19:21:06 +05304549 return sendErr
4550 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004551 numberOfNoArSections := len(omciTxRequest.OnuSwWindow.Messages) - 1 // last section of window is sent with AR expected
4552 if lastSection[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
4553 oo.increaseBaseTxNoArFramesBy(ctx, uint32(numberOfNoArSections))
4554 oo.incrementBaseTxArFrames()
4555 } else {
4556 oo.increaseExtTxNoArFramesBy(ctx, uint32(numberOfNoArSections))
4557 oo.incrementExtTxArFrames()
4558 }
kesavand011d5162021-11-25 19:21:06 +05304559 return nil
4560}
4561
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004562// SendDownloadSection sends DownloadSectionRequestWithResponse
4563func (oo *OmciCC) SendDownloadSection(ctx context.Context, aTimeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004564 rxChan chan Message, aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte, aPrint bool, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004565 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004566 logger.Debugw(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
4567 "SequNo": strconv.FormatInt(int64(tid), 16),
mpagenko15ff4a52021-03-02 10:09:20 +00004568 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest})
mpagenko80622a52021-02-09 16:53:23 +00004569
4570 //TODO!!!: don't know by now on how to generate the possibly needed AR (or enforce it to 0) with current omci-lib
4571 // by now just try to send it as defined by omci-lib
mpagenko15ff4a52021-03-02 10:09:20 +00004572 msgType := omci.DownloadSectionRequestType
mpagenkoc26d4c02021-05-06 14:27:57 +00004573 var timeout int = 0 //default value for no response expected
mpagenko15ff4a52021-03-02 10:09:20 +00004574 if aAckRequest > 0 {
4575 msgType = omci.DownloadSectionRequestWithResponseType
mpagenkoc26d4c02021-05-06 14:27:57 +00004576 timeout = aTimeout
mpagenko15ff4a52021-03-02 10:09:20 +00004577 }
mpagenko80622a52021-02-09 16:53:23 +00004578 omciLayer := &omci.OMCI{
4579 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004580 MessageType: msgType,
mpagenko80622a52021-02-09 16:53:23 +00004581 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4582 // Length: 0x28, // Optional, defaults to 40 octets
4583 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004584 if aIsExtendedOmci {
4585 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4586 }
Himani Chawla43f95ff2021-06-03 00:24:12 +05304587 localSectionData := make([]byte, len(aSection))
4588
mpagenko15ff4a52021-03-02 10:09:20 +00004589 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
mpagenko80622a52021-02-09 16:53:23 +00004590 request := &omci.DownloadSectionRequest{
4591 MeBasePacket: omci.MeBasePacket{
4592 EntityClass: me.SoftwareImageClassID,
4593 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004594 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004595 },
4596 SectionNumber: aDownloadSectionNo,
4597 SectionData: localSectionData,
4598 }
4599
4600 var options gopacket.SerializeOptions
4601 options.FixLengths = true
4602 buffer := gopacket.NewSerializeBuffer()
4603 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4604 if err != nil {
4605 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
4606 "device-id": oo.deviceID})
4607 return err
4608 }
4609 outgoingPacket := buffer.Bytes()
4610
mpagenko15ff4a52021-03-02 10:09:20 +00004611 //for initial debug purpose overrule the requested print state for some frames
4612 printFrame := aPrint
4613 if aAckRequest > 0 || aDownloadSectionNo == 0 {
4614 printFrame = true
4615 }
4616
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004617 omciRxCallbackPair := CallbackPair{CbKey: tid,
mpagenkoc26d4c02021-05-06 14:27:57 +00004618 // the callback is set even though no response might be required here, the tid (key) setting is needed here anyway
4619 // (used to avoid retransmission of frames with the same TID)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004620 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, printFrame /*aPrint*/},
mpagenko80622a52021-02-09 16:53:23 +00004621 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004622 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004623 if err != nil {
4624 logger.Errorw(ctx, "Cannot send DlSectionRequest", log.Fields{"Err": err,
4625 "device-id": oo.deviceID})
4626 return err
4627 }
4628 logger.Debug(ctx, "send DlSectionRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004629 return nil
4630}
4631
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304632// SendEndSoftwareDownload sends EndSoftwareDownloadRequest
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004633func (oo *OmciCC) SendEndSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004634 rxChan chan Message, aImageMeID uint16, aFileLen uint32, aImageCrc uint32, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004635 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004636 logger.Debugw(ctx, "send EndSwDlRequest:", log.Fields{"device-id": oo.deviceID,
4637 "SequNo": strconv.FormatInt(int64(tid), 16),
4638 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4639
mpagenko15ff4a52021-03-02 10:09:20 +00004640 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00004641 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004642 MessageType: omci.EndSoftwareDownloadRequestType,
mpagenko80622a52021-02-09 16:53:23 +00004643 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4644 // Length: 0x28, // Optional, defaults to 40 octets
4645 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004646 if aIsExtendedOmci {
4647 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4648 }
mpagenko15ff4a52021-03-02 10:09:20 +00004649 request := &omci.EndSoftwareDownloadRequest{
mpagenko80622a52021-02-09 16:53:23 +00004650 MeBasePacket: omci.MeBasePacket{
4651 EntityClass: me.SoftwareImageClassID,
4652 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004653 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004654 },
mpagenko15ff4a52021-03-02 10:09:20 +00004655 CRC32: aImageCrc,
4656 ImageSize: aFileLen,
4657 NumberOfInstances: 1, //parallel download to multiple circuit packs not supported
4658 ImageInstances: []uint16{0}, //don't care for NumberOfInstances=1, but probably needed by omci-lib as in startSwDlRequest
mpagenko80622a52021-02-09 16:53:23 +00004659 }
mpagenko15ff4a52021-03-02 10:09:20 +00004660
4661 var options gopacket.SerializeOptions
4662 options.FixLengths = true
4663 buffer := gopacket.NewSerializeBuffer()
4664 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4665 if err != nil {
4666 logger.Errorw(ctx, "Cannot serialize EndSwDlRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00004667 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00004668 return err
mpagenko80622a52021-02-09 16:53:23 +00004669 }
mpagenko15ff4a52021-03-02 10:09:20 +00004670 outgoingPacket := buffer.Bytes()
4671
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004672 omciRxCallbackPair := CallbackPair{CbKey: tid,
4673 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko15ff4a52021-03-02 10:09:20 +00004674 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004675 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00004676 if err != nil {
4677 logger.Errorw(ctx, "Cannot send EndSwDlRequest", log.Fields{"Err": err,
4678 "device-id": oo.deviceID})
4679 return err
4680 }
4681 logger.Debug(ctx, "send EndSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004682 return nil
4683}
4684
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004685// SendActivateSoftware sends ActivateSoftwareRequest
4686func (oo *OmciCC) SendActivateSoftware(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004687 rxChan chan Message, aImageMeID uint16, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004688 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004689 logger.Debugw(ctx, "send ActivateSwRequest:", log.Fields{"device-id": oo.deviceID,
4690 "SequNo": strconv.FormatInt(int64(tid), 16),
4691 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4692
4693 omciLayer := &omci.OMCI{
4694 TransactionID: tid,
4695 MessageType: omci.ActivateSoftwareRequestType,
4696 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4697 // Length: 0x28, // Optional, defaults to 40 octets
4698 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004699 if aIsExtendedOmci {
4700 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4701 }
mpagenko80622a52021-02-09 16:53:23 +00004702 request := &omci.ActivateSoftwareRequest{
4703 MeBasePacket: omci.MeBasePacket{
4704 EntityClass: me.SoftwareImageClassID,
4705 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004706 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004707 },
4708 ActivateFlags: 0, //unconditionally reset as the only relevant option here (regardless of VOIP)
4709 }
4710
4711 var options gopacket.SerializeOptions
4712 options.FixLengths = true
4713 buffer := gopacket.NewSerializeBuffer()
4714 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4715 if err != nil {
4716 logger.Errorw(ctx, "Cannot serialize ActivateSwRequest", log.Fields{"Err": err,
4717 "device-id": oo.deviceID})
4718 return err
4719 }
4720 outgoingPacket := buffer.Bytes()
4721
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004722 omciRxCallbackPair := CallbackPair{CbKey: tid,
4723 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko80622a52021-02-09 16:53:23 +00004724 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004725 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004726 if err != nil {
4727 logger.Errorw(ctx, "Cannot send ActivateSwRequest", log.Fields{"Err": err,
4728 "device-id": oo.deviceID})
4729 return err
4730 }
4731 logger.Debug(ctx, "send ActivateSwRequest done")
mpagenko15ff4a52021-03-02 10:09:20 +00004732 return nil
4733}
mpagenko80622a52021-02-09 16:53:23 +00004734
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004735// SendCommitSoftware sends CommitSoftwareRequest
4736func (oo *OmciCC) SendCommitSoftware(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004737 rxChan chan Message, aImageMeID uint16, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004738 tid := oo.GetNextTid(highPrio)
mpagenko15ff4a52021-03-02 10:09:20 +00004739 logger.Debugw(ctx, "send CommitSwRequest:", log.Fields{"device-id": oo.deviceID,
4740 "SequNo": strconv.FormatInt(int64(tid), 16),
4741 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4742
4743 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00004744 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004745 MessageType: omci.CommitSoftwareRequestType,
mpagenko80622a52021-02-09 16:53:23 +00004746 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4747 // Length: 0x28, // Optional, defaults to 40 octets
4748 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004749 if aIsExtendedOmci {
4750 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4751 }
mpagenko15ff4a52021-03-02 10:09:20 +00004752 request := &omci.CommitSoftwareRequest{
mpagenko80622a52021-02-09 16:53:23 +00004753 MeBasePacket: omci.MeBasePacket{
4754 EntityClass: me.SoftwareImageClassID,
4755 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004756 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004757 },
mpagenko80622a52021-02-09 16:53:23 +00004758 }
mpagenko15ff4a52021-03-02 10:09:20 +00004759
4760 var options gopacket.SerializeOptions
4761 options.FixLengths = true
4762 buffer := gopacket.NewSerializeBuffer()
4763 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4764 if err != nil {
4765 logger.Errorw(ctx, "Cannot serialize CommitSwRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00004766 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00004767 return err
mpagenko80622a52021-02-09 16:53:23 +00004768 }
mpagenko15ff4a52021-03-02 10:09:20 +00004769 outgoingPacket := buffer.Bytes()
4770
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004771 omciRxCallbackPair := CallbackPair{CbKey: tid,
4772 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko15ff4a52021-03-02 10:09:20 +00004773 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004774 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00004775 if err != nil {
4776 logger.Errorw(ctx, "Cannot send CommitSwRequest", log.Fields{"Err": err,
4777 "device-id": oo.deviceID})
4778 return err
4779 }
4780 logger.Debug(ctx, "send CommitSwRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004781 return nil
4782}
4783
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304784// SendSelfTestReq sends TestRequest
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004785func (oo *OmciCC) SendSelfTestReq(ctx context.Context, classID me.ClassID, instdID uint16, timeout int, highPrio bool, rxChan chan Message) error {
4786 tid := oo.GetNextTid(highPrio)
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004787 logger.Debugw(ctx, "send self test request:", log.Fields{"device-id": oo.deviceID,
4788 "SequNo": strconv.FormatInt(int64(tid), 16),
4789 "InstId": strconv.FormatInt(int64(instdID), 16)})
4790 omciLayer := &omci.OMCI{
4791 TransactionID: tid,
4792 MessageType: omci.TestRequestType,
4793 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4794 // Length: 0x28, // Optional, defaults to 40 octets
4795 }
4796
4797 var request *omci.OpticalLineSupervisionTestRequest
4798 switch classID {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004799 case me.AniGClassID:
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004800 request = &omci.OpticalLineSupervisionTestRequest{
4801 MeBasePacket: omci.MeBasePacket{
4802 EntityClass: classID,
4803 EntityInstance: instdID,
4804 },
4805 SelectTest: uint8(7), // self test
4806 GeneralPurposeBuffer: uint16(0),
4807 VendorSpecificParameters: uint16(0),
4808 }
4809 default:
4810 logger.Errorw(ctx, "unsupported class id for self test request", log.Fields{"device-id": oo.deviceID, "classID": classID})
4811 return fmt.Errorf("unsupported-class-id-for-self-test-request-%v", classID)
4812 }
4813 // Test serialization back to former string
4814 var options gopacket.SerializeOptions
4815 options.FixLengths = true
4816
4817 buffer := gopacket.NewSerializeBuffer()
4818 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4819 if err != nil {
4820 logger.Errorw(ctx, "Cannot serialize self test request", log.Fields{"Err": err,
4821 "device-id": oo.deviceID})
4822 return err
4823 }
4824 outgoingPacket := buffer.Bytes()
4825
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004826 omciRxCallbackPair := CallbackPair{CbKey: tid,
4827 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004828 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004829 err = oo.Send(ctx, outgoingPacket, timeout, 0, highPrio, omciRxCallbackPair)
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004830 if err != nil {
4831 logger.Errorw(ctx, "Cannot send self test request", log.Fields{"Err": err,
4832 "device-id": oo.deviceID})
4833 return err
4834 }
4835 logger.Debug(ctx, "send self test request done")
4836 return nil
4837}
4838
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304839// nolint: gocyclo
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004840func (oo *OmciCC) isSuccessfulResponseWithMibDataSync(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet) (bool, error) {
4841
4842 nextLayer, err := omci.MsgTypeToNextLayer(omciMsg.MessageType, false)
4843 if err != nil {
4844 logger.Errorw(ctx, "omci-message: could not map msgType to nextLayer", log.Fields{"device-id": oo.deviceID})
4845 return false, fmt.Errorf("could not map msgType to nextLayer - %s", oo.deviceID)
4846 }
4847 msgLayer := (*packet).Layer(nextLayer)
4848 if msgLayer != nil {
4849 // Note: Due to relaxed decoding, you may now still have a decoding error attached to the layers
4850 if failure := (*packet).ErrorLayer(); failure != nil {
4851 if nextLayer == omci.LayerTypeMibUploadNextResponse {
4852 // In the case of MibUploadNextResponse, we let the packet pass so that later processing
4853 // can examine for UnkonwnMEs and UnknownAttributes
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05304854 logger.Debug(ctx, "omci-message: MibUploadNextResponse packet with ErrorLayer - let it pass",
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004855 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4856 return false, nil
4857 } else if nextLayer == omci.LayerTypeGetResponse {
4858 if resp := msgLayer.(*omci.GetResponse); resp != nil {
4859 if resp.NextLayerType() == omci.LayerTypeUnknownAttributes {
4860 unknownAttrLayer := (*packet).Layer(omci.LayerTypeUnknownAttributes)
4861 if unknownAttrLayer != nil {
4862 logger.Errorw(ctx, "omci-message: GetResponse packet contains unknownAttrLayer - skip it!",
4863 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "unknownAttrLayer": unknownAttrLayer})
4864 return false, fmt.Errorf("packet contains unknownAttrLayer - %s", oo.deviceID)
4865 }
4866 }
4867 }
4868 }
4869 // Try to decode any further error information
4870 if decodeFailure, ok := failure.(*gopacket.DecodeFailure); ok && decodeFailure != nil {
4871 logger.Errorw(ctx, "omci-message: packet contains ErrorLayer with further info - skip it!",
4872 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "decodeFailure": decodeFailure.String()})
4873 return false, fmt.Errorf("packet contains ErrorLayer with further info - %s", oo.deviceID)
4874 }
4875 logger.Errorw(ctx, "omci-message: packet contains ErrorLayer - skip it!",
4876 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4877 return false, fmt.Errorf("packet contains ErrorLayer - %s", oo.deviceID)
4878 }
4879 } else if failure := (*packet).ErrorLayer(); failure != nil {
4880 // message layer could not be decoded, but at least check if additional failure information is available
4881 if decodeFailure, ok := failure.(*gopacket.DecodeFailure); ok && decodeFailure != nil {
Holger Hildebrandt93d183f2022-04-22 15:50:26 +00004882 errMsg := decodeFailure.String()
4883 if nextLayer == omci.LayerTypeMibUploadNextResponse {
4884 if strings.Contains(strings.ToLower(errMsg), "table decode") {
4885 // In the case of MibUploadNextResponse with non-standard table attributes, we let the packet pass
4886 // so that later processing can deal with it
4887 logger.Infow(ctx, "omci-message: MibUploadNextResponse packet with table attributes - let it pass",
4888 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4889 return false, nil
4890 }
4891 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004892 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet, further info available - skip it!",
Holger Hildebrandt93d183f2022-04-22 15:50:26 +00004893 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "decodeFailure": errMsg})
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004894 return false, fmt.Errorf("could not decode msgLayer of packet, further info available - %s", oo.deviceID)
4895 }
4896 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet, ErrorLayer available",
4897 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4898 return false, fmt.Errorf("could not decode msgLayer of packet, ErrorLayer available - %s", oo.deviceID)
4899 } else {
4900 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet", log.Fields{"device-id": oo.deviceID})
4901 return false, fmt.Errorf("could not decode msgLayer of packet - %s", oo.deviceID)
4902 }
4903
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004904 for _, v := range responsesWithMibDataSync {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004905 if v == omciMsg.MessageType {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004906 switch nextLayer {
4907 case omci.LayerTypeCreateResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004908 if resp := msgLayer.(*omci.CreateResponse); resp != nil {
4909 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004910 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004911 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004912 }
4913 case omci.LayerTypeDeleteResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004914 if resp := msgLayer.(*omci.DeleteResponse); resp != nil {
4915 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004916 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004917 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004918 }
4919 case omci.LayerTypeSetResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004920 if resp := msgLayer.(*omci.SetResponse); resp != nil {
4921 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004922 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004923 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004924 }
4925 case omci.LayerTypeStartSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004926 if resp := msgLayer.(*omci.StartSoftwareDownloadResponse); resp != nil {
4927 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004928 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004929 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004930 }
4931 case omci.LayerTypeEndSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004932 if resp := msgLayer.(*omci.EndSoftwareDownloadResponse); resp != nil {
4933 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004934 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004935 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004936 }
4937 case omci.LayerTypeActivateSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004938 if resp := msgLayer.(*omci.ActivateSoftwareResponse); resp != nil {
4939 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004940 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004941 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004942 }
4943 case omci.LayerTypeCommitSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004944 if resp := msgLayer.(*omci.CommitSoftwareResponse); resp != nil {
4945 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004946 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004947 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004948 }
4949 }
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004950 }
4951 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004952 return false, nil
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004953}
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004954
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004955func (oo *OmciCC) processRequestMonitoring(ctx context.Context, aOmciTxRequest OmciTransferStructure) {
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004956 timeout := aOmciTxRequest.timeout
mpagenkoc26d4c02021-05-06 14:27:57 +00004957 if timeout == 0 {
4958 //timeout 0 indicates that no response is expected - fire and forget
Holger Hildebrandt34555512021-10-01 16:26:59 +00004959 // enqueue
4960 if aOmciTxRequest.highPrio {
4961 oo.mutexHighPrioTxQueue.Lock()
4962 oo.highPrioTxQueue.PushBack(aOmciTxRequest)
4963 oo.mutexHighPrioTxQueue.Unlock()
4964 } else {
4965 oo.mutexLowPrioTxQueue.Lock()
4966 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4967 oo.mutexLowPrioTxQueue.Unlock()
4968 }
4969 go oo.sendQueuedRequests(ctx)
mpagenkoc26d4c02021-05-06 14:27:57 +00004970 } else {
mpagenko7455fd42021-06-10 16:25:55 +00004971 //the supervised sending with waiting on the response (based on TID) is called in background
4972 // to avoid blocking of the sender for the complete OMCI handshake procedure
4973 // to stay consistent with the processing tested so far, sending of next messages of the same control procedure
4974 // is ensured by the according control instances (FSM's etc.) (by waiting for the respective responses there)
4975 go oo.sendWithRxSupervision(ctx, aOmciTxRequest, timeout)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004976 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004977}
4978
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004979func (oo *OmciCC) sendWithRxSupervision(ctx context.Context, aOmciTxRequest OmciTransferStructure, aTimeout int) {
mpagenko7455fd42021-06-10 16:25:55 +00004980 chSuccess := make(chan bool)
4981 aOmciTxRequest.chSuccess = chSuccess
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004982 tid := aOmciTxRequest.cbPair.CbKey
mpagenko7455fd42021-06-10 16:25:55 +00004983 oo.mutexMonReq.Lock()
4984 oo.monitoredRequests[tid] = aOmciTxRequest
4985 oo.mutexMonReq.Unlock()
4986
4987 retries := aOmciTxRequest.retries
4988 retryCounter := 0
4989loop:
4990 for retryCounter <= retries {
Holger Hildebrandt34555512021-10-01 16:26:59 +00004991 // enqueue
4992 if aOmciTxRequest.highPrio {
4993 oo.mutexHighPrioTxQueue.Lock()
4994 oo.highPrioTxQueue.PushBack(aOmciTxRequest)
4995 oo.mutexHighPrioTxQueue.Unlock()
4996 } else {
4997 oo.mutexLowPrioTxQueue.Lock()
4998 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4999 oo.mutexLowPrioTxQueue.Unlock()
5000 }
pnalmasc6e916a2025-06-30 11:59:16 +05305001
5002 //Register the call back again as we clean up the Map entry when we failed to send the message .
5003 oo.mutexRxSchedMap.Lock()
5004 oo.rxSchedulerMap[aOmciTxRequest.cbPair.CbKey] = aOmciTxRequest.cbPair.CbEntry
5005 oo.mutexRxSchedMap.Unlock()
5006
Holger Hildebrandt34555512021-10-01 16:26:59 +00005007 go oo.sendQueuedRequests(ctx)
mpagenko7455fd42021-06-10 16:25:55 +00005008
5009 select {
5010 case success := <-chSuccess:
5011 if success {
5012 logger.Debugw(ctx, "reqMon: response received in time",
5013 log.Fields{"tid": tid, "device-id": oo.deviceID})
5014 } else {
5015 logger.Debugw(ctx, "reqMon: wait for response aborted",
5016 log.Fields{"tid": tid, "device-id": oo.deviceID})
5017 }
5018 break loop
5019 case <-time.After(time.Duration(aTimeout) * time.Second):
5020 if retryCounter == retries {
Holger Hildebrandt2b107642022-12-09 07:56:23 +00005021 if oo.pBaseDeviceHandler.IsOltAvailable() {
5022 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - send ONU device event!",
5023 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
5024 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationFailureConfig, OnuOmciCommunicationFailureConfigDesc)
5025 } else {
5026 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - skip ONU device event: OLT unavailable!",
5027 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
5028 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005029 oo.incrementTxTimesouts()
mpagenko7455fd42021-06-10 16:25:55 +00005030 break loop
5031 } else {
5032 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
5033 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005034 oo.incrementTxRetries()
mpagenko7455fd42021-06-10 16:25:55 +00005035 }
5036 }
5037 retryCounter++
5038 }
5039 oo.mutexMonReq.Lock()
5040 delete(oo.monitoredRequests, tid)
5041 oo.mutexMonReq.Unlock()
5042}
5043
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05305044// CancelRequestMonitoring terminates monitoring of outstanding omci requests
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005045func (oo *OmciCC) CancelRequestMonitoring(ctx context.Context) {
Holger Hildebrandt12609a12022-03-25 13:23:25 +00005046 logger.Debugw(ctx, "CancelRequestMonitoring entered", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005047 oo.mutexMonReq.RLock()
5048 for k := range oo.monitoredRequests {
mpagenko8cd1bf72021-06-22 10:11:19 +00005049 //implement non-blocking channel send to avoid blocking on mutexMonReq later
5050 select {
5051 case oo.monitoredRequests[k].chSuccess <- false:
Holger Hildebrandt12609a12022-03-25 13:23:25 +00005052 logger.Debugw(ctx, "send cancellation on omciRespChannel",
5053 log.Fields{"index": k, "device-id": oo.deviceID})
mpagenko8cd1bf72021-06-22 10:11:19 +00005054 default:
Holger Hildebrandt12609a12022-03-25 13:23:25 +00005055 logger.Debugw(ctx, "cancellation could not be send on omciRespChannel (no receiver)",
5056 log.Fields{"index": k, "device-id": oo.deviceID})
mpagenko8cd1bf72021-06-22 10:11:19 +00005057 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005058 }
5059 oo.mutexMonReq.RUnlock()
5060}
5061
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05305062// GetMaxOmciTimeoutWithRetries provides a timeout value greater than the maximum
5063// time consumed for retry processing of a particular OMCI-request
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005064func (oo *OmciCC) GetMaxOmciTimeoutWithRetries() time.Duration {
5065 return time.Duration((CDefaultRetries+1)*oo.pBaseDeviceHandler.GetOmciTimeout() + 1)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005066}
Himani Chawla43f95ff2021-06-03 00:24:12 +05305067
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005068// SendCreateOrDeleteEthernetFrameExtendedPMME deletes EthernetFrameExtendedPm ME instance
5069func (oo *OmciCC) SendCreateOrDeleteEthernetFrameExtendedPMME(ctx context.Context, timeout int, highPrio bool,
Himani Chawla43f95ff2021-06-03 00:24:12 +05305070 upstream bool, create bool, rxChan chan Message, entityID uint16, classID me.ClassID, controlBlock []uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005071 tid := oo.GetNextTid(highPrio)
nikesh.krishnan1ffb8132023-05-23 03:44:13 +05305072 logger.Info(ctx, "send-ethernet-frame-extended-pm-me-msg:", log.Fields{"device-id": oo.deviceID,
Himani Chawla43f95ff2021-06-03 00:24:12 +05305073 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
5074
5075 meParam := me.ParamData{EntityID: entityID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00005076 Attributes: me.AttributeValueMap{me.EthernetFrameExtendedPm_ControlBlock: controlBlock},
Himani Chawla43f95ff2021-06-03 00:24:12 +05305077 }
5078 var meInstance *me.ManagedEntity
5079 var omciErr me.OmciErrors
5080 if classID == me.EthernetFrameExtendedPmClassID {
5081 meInstance, omciErr = me.NewEthernetFrameExtendedPm(meParam)
5082 } else {
5083 meInstance, omciErr = me.NewEthernetFrameExtendedPm64Bit(meParam)
5084 }
5085
5086 if omciErr.GetError() == nil {
5087 var omciLayer *omci.OMCI
5088 var msgLayer gopacket.SerializableLayer
5089 var err error
5090 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00005091 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
5092 oframe.AddDefaults(true))
Himani Chawla43f95ff2021-06-03 00:24:12 +05305093 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00005094 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
5095 oframe.AddDefaults(true))
Himani Chawla43f95ff2021-06-03 00:24:12 +05305096 }
5097 if err != nil {
5098 logger.Errorw(ctx, "cannot-encode-ethernet-frame-extended-pm-me",
5099 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5100 return nil, err
5101 }
5102
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00005103 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Himani Chawla43f95ff2021-06-03 00:24:12 +05305104 if err != nil {
5105 logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me",
5106 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5107 return nil, err
5108 }
5109
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005110 omciRxCallbackPair := CallbackPair{CbKey: tid,
5111 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Himani Chawla43f95ff2021-06-03 00:24:12 +05305112 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005113 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawla43f95ff2021-06-03 00:24:12 +05305114 if err != nil {
5115 logger.Errorw(ctx, "Cannot send ethernet-frame-extended-pm-me",
5116 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5117 return nil, err
5118 }
5119 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-done",
5120 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5121 return meInstance, nil
5122 }
5123 logger.Errorw(ctx, "cannot-generate-ethernet-frame-extended-pm-me-instance",
5124 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5125 return nil, omciErr.GetError()
5126}
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005127
5128// RLockMutexMonReq lock read access to monitoredRequests
5129func (oo *OmciCC) RLockMutexMonReq() {
5130 oo.mutexMonReq.RLock()
5131}
5132
5133// RUnlockMutexMonReq unlock read access to monitoredRequests
5134func (oo *OmciCC) RUnlockMutexMonReq() {
5135 oo.mutexMonReq.RUnlock()
5136}
5137
5138// GetMonitoredRequest get OmciTransferStructure for an omciTransID
5139func (oo *OmciCC) GetMonitoredRequest(omciTransID uint16) (value OmciTransferStructure, exist bool) {
5140 value, exist = oo.monitoredRequests[omciTransID]
5141 return value, exist
5142}
5143
5144// SetChMonitoredRequest sets chSuccess to indicate whether response was received or not
5145func (oo *OmciCC) SetChMonitoredRequest(omciTransID uint16, chVal bool) {
5146 oo.monitoredRequests[omciTransID].chSuccess <- chVal
5147}
Himani Chawlaee10b542021-09-20 16:46:40 +05305148
5149// SendSetEthernetFrameExtendedPMME sends the set request for ethernet frame extended type me
5150func (oo *OmciCC) SendSetEthernetFrameExtendedPMME(ctx context.Context, timeout int, highPrio bool,
5151 rxChan chan Message, entityID uint16, classID me.ClassID, controlBlock []uint16) (*me.ManagedEntity, error) {
5152 tid := oo.GetNextTid(highPrio)
5153 logger.Debugw(ctx, "send-set-ethernet-frame-extended-pm-me-control-block:", log.Fields{"device-id": oo.deviceID,
5154 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16)})
5155
5156 meParams := me.ParamData{EntityID: entityID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00005157 Attributes: me.AttributeValueMap{me.EthernetFrameExtendedPm_ControlBlock: controlBlock},
Himani Chawlaee10b542021-09-20 16:46:40 +05305158 }
5159 var meInstance *me.ManagedEntity
5160 var omciErr me.OmciErrors
5161 if classID == me.EthernetFrameExtendedPmClassID {
5162 meInstance, omciErr = me.NewEthernetFrameExtendedPm(meParams)
5163 } else {
5164 meInstance, omciErr = me.NewEthernetFrameExtendedPm64Bit(meParams)
5165 }
5166
5167 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00005168 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Himani Chawlaee10b542021-09-20 16:46:40 +05305169 if err != nil {
5170 logger.Errorw(ctx, "cannot-encode-ethernet-frame-extended-pm-me",
5171 log.Fields{"err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5172 return nil, err
5173 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00005174 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Himani Chawlaee10b542021-09-20 16:46:40 +05305175 if err != nil {
5176 logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me-set-msg",
5177 log.Fields{"err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5178 return nil, err
5179 }
5180 omciRxCallbackPair := CallbackPair{
5181 CbKey: tid,
5182 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
5183 }
5184 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
5185 if err != nil {
5186 logger.Errorw(ctx, "Cannot send ethernet-frame-extended-pm-me",
5187 log.Fields{"Err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5188 return nil, err
5189 }
5190 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-set-msg-done",
5191 log.Fields{"device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5192 return meInstance, nil
5193 }
5194 logger.Errorw(ctx, "cannot-generate-ethernet-frame-extended-pm-me-instance",
5195 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5196 return nil, omciErr.GetError()
5197}
Holger Hildebrandte7cc6092022-02-01 11:37:03 +00005198
5199// PrepareForGarbageCollection - remove references to prepare for garbage collection
5200func (oo *OmciCC) PrepareForGarbageCollection(ctx context.Context, aDeviceID string) {
5201 logger.Debugw(ctx, "prepare for garbage collection", log.Fields{"device-id": aDeviceID})
5202 oo.pBaseDeviceHandler = nil
5203 oo.pOnuDeviceEntry = nil
5204 oo.pOnuAlarmManager = nil
5205}
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005206
5207// GetOmciCounters - TODO: add comment
5208func (oo *OmciCC) GetOmciCounters() *extension.SingleGetValueResponse {
5209 oo.mutexCounters.RLock()
5210 defer oo.mutexCounters.RUnlock()
5211 resp := extension.SingleGetValueResponse{
5212 Response: &extension.GetValueResponse{
5213 Status: extension.GetValueResponse_OK,
5214 Response: &extension.GetValueResponse_OnuOmciStats{
5215 OnuOmciStats: &extension.GetOnuOmciTxRxStatsResponse{},
5216 },
5217 },
5218 }
5219 resp.Response.GetOnuOmciStats().BaseTxArFrames = oo.countersBase.txArFrames
5220 resp.Response.GetOnuOmciStats().BaseTxNoArFrames = oo.countersBase.txNoArFrames
5221 resp.Response.GetOnuOmciStats().BaseRxAkFrames = oo.countersBase.rxAkFrames
5222 resp.Response.GetOnuOmciStats().BaseRxNoAkFrames = oo.countersBase.rxNoAkFrames
5223 resp.Response.GetOnuOmciStats().ExtTxArFrames = oo.countersExt.txArFrames
5224 resp.Response.GetOnuOmciStats().ExtTxNoArFrames = oo.countersExt.txNoArFrames
5225 resp.Response.GetOnuOmciStats().ExtRxAkFrames = oo.countersExt.rxAkFrames
5226 resp.Response.GetOnuOmciStats().ExtRxNoAkFrames = oo.countersExt.rxNoAkFrames
5227 resp.Response.GetOnuOmciStats().TxOmciCounterRetries = oo.txRetries
5228 resp.Response.GetOnuOmciStats().TxOmciCounterTimeouts = oo.txTimeouts
5229 return &resp
5230}
5231
5232// For more speed, separate functions for each counter
5233
5234func (oo *OmciCC) incrementBaseTxArFrames() {
5235 oo.mutexCounters.Lock()
5236 defer oo.mutexCounters.Unlock()
5237 oo.countersBase.txArFrames++
5238}
5239
5240func (oo *OmciCC) incrementExtTxArFrames() {
5241 oo.mutexCounters.Lock()
5242 defer oo.mutexCounters.Unlock()
5243 oo.countersExt.txArFrames++
5244}
5245
5246func (oo *OmciCC) incrementBaseRxAkFrames() {
5247 oo.mutexCounters.Lock()
5248 defer oo.mutexCounters.Unlock()
5249 oo.countersBase.rxAkFrames++
5250}
5251
5252func (oo *OmciCC) incrementExtRxAkFrames() {
5253 oo.mutexCounters.Lock()
5254 defer oo.mutexCounters.Unlock()
5255 oo.countersExt.rxAkFrames++
5256}
5257
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +05305258//nolint:unparam
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005259func (oo *OmciCC) increaseBaseTxNoArFramesBy(ctx context.Context, value uint32) {
5260 oo.mutexCounters.Lock()
5261 defer oo.mutexCounters.Unlock()
5262 oo.countersBase.txNoArFrames += value
5263}
5264
Akash Reddy Kankanala92dfdf82025-03-23 22:07:09 +05305265//nolint:unparam
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005266func (oo *OmciCC) increaseExtTxNoArFramesBy(ctx context.Context, value uint32) {
5267 oo.mutexCounters.Lock()
5268 defer oo.mutexCounters.Unlock()
5269 oo.countersExt.txNoArFrames += value
5270}
5271
5272func (oo *OmciCC) incrementBaseRxNoAkFrames() {
5273 oo.mutexCounters.Lock()
5274 defer oo.mutexCounters.Unlock()
5275 oo.countersBase.rxNoAkFrames++
5276}
5277
5278func (oo *OmciCC) incrementExtRxNoAkFrames() {
5279 oo.mutexCounters.Lock()
5280 defer oo.mutexCounters.Unlock()
5281 oo.countersExt.rxNoAkFrames++
5282}
5283
5284func (oo *OmciCC) incrementTxRetries() {
5285 oo.mutexCounters.Lock()
5286 defer oo.mutexCounters.Unlock()
5287 oo.txRetries++
5288}
5289
5290func (oo *OmciCC) incrementTxTimesouts() {
5291 oo.mutexCounters.Lock()
5292 defer oo.mutexCounters.Unlock()
5293 oo.txTimeouts++
5294}
Holger Hildebrandt7e138462023-03-29 12:12:14 +00005295
5296// NotifyAboutOnuConfigFailure - trigger ONU DeviceEvent to notify about ONU config failure
5297func (oo *OmciCC) NotifyAboutOnuConfigFailure(ctx context.Context, errID string, meClassID me.ClassID, meEntityID uint16,
5298 meName string, meResult me.Results) {
5299 var description string
5300 if !oo.confFailMeAlreadyHandled(meClassID) {
5301 switch errID {
5302 case OnuConfigFailureResponseErr:
5303 description = OnuConfigFailureResponseErrDesc + meResult.String() +
5304 ", OMCI ME: " + meName + " / instance: " + fmt.Sprintf("%d", meEntityID) + " (only first instance reported)"
5305 case OnuConfigFailureTimeout:
5306 description = OnuConfigFailureTimeoutDesc + meName + " / instance: " + fmt.Sprintf("%d", meEntityID) +
5307 " (only first instance reported)"
5308 default:
5309 logger.Warnw(ctx, "method called with undefined errID", log.Fields{"errID": errID, "device-id": oo.deviceID})
5310 return
5311 }
5312 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, errID, description)
5313 oo.appendConfFailMe(meClassID)
5314 }
5315}
5316
5317func (oo *OmciCC) confFailMeAlreadyHandled(meClassID me.ClassID) bool {
5318 oo.mutexConfFailMEs.RLock()
5319 defer oo.mutexConfFailMEs.RUnlock()
5320 for _, v := range oo.confFailMEs {
5321 if v == meClassID {
5322 return true
5323 }
5324 }
5325 return false
5326}
5327
5328func (oo *OmciCC) appendConfFailMe(meClassID me.ClassID) {
5329 oo.mutexConfFailMEs.Lock()
5330 defer oo.mutexConfFailMEs.Unlock()
5331 oo.confFailMEs = append(oo.confFailMEs, meClassID)
5332}
5333
5334// ResetConfFailMEs - reset list of stored config failure MEs
5335func (oo *OmciCC) ResetConfFailMEs() {
5336 oo.mutexConfFailMEs.Lock()
5337 defer oo.mutexConfFailMEs.Unlock()
5338 oo.confFailMEs = nil
5339}