blob: ef7711bda2b8794bbcf3855dd657483a82fb14b5 [file] [log] [blame]
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001/*
2 * Copyright 2020-present Open Networking Foundation
3 *
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
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000017//Package common provides global definitions
18package 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"
43 ia "github.com/opencord/voltha-protos/v5/go/inter_adapter"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000044)
45
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000046// ### OMCI related definitions - retrieved from Python adapter code/trace ####
Himani Chawla6d2ae152020-09-02 13:11:20 +053047
Holger Hildebrandt9b64e0b2022-04-21 08:02:00 +000048const maxGemPayloadSize = uint16(2048)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000049const connectivityModeValue = uint8(5)
Himani Chawla4d908332020-08-31 12:30:20 +053050
51//const defaultTPID = uint16(0x8100)
52//const broadComDefaultVID = uint16(4091)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000053
54// UnusedTcontAllocID - TODO: add comment
55const UnusedTcontAllocID = uint16(0xFFFF) //common unused AllocId for G.984 and G.987 systems
mpagenko8b07c1b2020-11-26 10:36:31 +000056
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +000057const cOmciDeviceIdentifierPos = 3
mpagenkoc8bba412021-01-15 15:38:44 +000058const cOmciBaseMessageTrailerLen = 40
59
60// tOmciReceiveError - enum type for detected problems/errors in the received OMCI message (format)
61type tOmciReceiveError uint8
62
63const (
64 // cOmciMessageReceiveNoError - default start state
65 cOmciMessageReceiveNoError tOmciReceiveError = iota
66 // Error indication wrong trailer length within the message
67 cOmciMessageReceiveErrorTrailerLen
68 // Error indication missing trailer within the message
69 cOmciMessageReceiveErrorMissTrailer
70)
71
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000072// CDefaultRetries - TODO: add comment
73const CDefaultRetries = 2
Holger Hildebrandt366ef192021-05-05 11:07:44 +000074
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000075// ### OMCI related definitions - end
76
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000077//CallbackPairEntry to be used for OMCI send/receive correlation
78type CallbackPairEntry struct {
79 CbRespChannel chan Message
80 CbFunction func(context.Context, *omci.OMCI, *gp.Packet, chan Message) error
81 FramePrint bool //true for printing
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000082}
83
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000084//CallbackPair to be used for ReceiveCallback init
85type CallbackPair struct {
86 CbKey uint16
87 CbEntry CallbackPairEntry
Holger Hildebrandtfa074992020-03-27 15:42:06 +000088}
89
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000090// OmciTransferStructure - TODO: add comment
91type OmciTransferStructure struct {
mpagenko80622a52021-02-09 16:53:23 +000092 txFrame []byte
93 timeout int
Holger Hildebrandt366ef192021-05-05 11:07:44 +000094 retries int
mpagenko80622a52021-02-09 16:53:23 +000095 highPrio bool
96 withFramePrint bool
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000097 cbPair CallbackPair
Holger Hildebrandt366ef192021-05-05 11:07:44 +000098 chSuccess chan bool
kesavand011d5162021-11-25 19:21:06 +053099 OnuSwWindow *ia.OmciMessages
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000100}
101
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000102//OmciCC structure holds information needed for OMCI communication (to/from OLT Adapter)
103type OmciCC struct {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000104 enabled bool
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000105 pBaseDeviceHandler IdeviceHandler
106 pOnuDeviceEntry IonuDeviceEntry
107 pOnuAlarmManager IonuAlarmManager
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000108 deviceID string
khenaidoo7d3c5582021-08-11 18:09:44 -0400109 coreClient *vgrpc.Client
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000110 supportExtMsg bool
mpagenkoc8bba412021-01-15 15:38:44 +0000111 rxOmciFrameError tOmciReceiveError
112
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000113 txFrames, txOnuFrames uint32
114 rxFrames, rxOnuFrames, rxOnuDiscards uint32
115
116 // OMCI params
117 mutexTid sync.Mutex
118 tid uint16
119 mutexHpTid sync.Mutex
120 hpTid uint16
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000121 UploadSequNo uint16
122 UploadNoOfCmds uint16
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000123
Holger Hildebrandt34555512021-10-01 16:26:59 +0000124 mutexSendQueuedRequests sync.Mutex
125 mutexLowPrioTxQueue sync.Mutex
126 lowPrioTxQueue *list.List
127 mutexHighPrioTxQueue sync.Mutex
128 highPrioTxQueue *list.List
129 mutexRxSchedMap sync.Mutex
130 rxSchedulerMap map[uint16]CallbackPairEntry
131 mutexMonReq sync.RWMutex
132 monitoredRequests map[uint16]OmciTransferStructure
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000133}
134
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000135var responsesWithMibDataSync = []omci.MessageType{
136 omci.CreateResponseType,
137 omci.DeleteResponseType,
138 omci.SetResponseType,
139 omci.StartSoftwareDownloadResponseType,
140 omci.EndSoftwareDownloadResponseType,
141 omci.ActivateSoftwareResponseType,
142 omci.CommitSoftwareResponseType,
143}
144
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000145//NewOmciCC constructor returns a new instance of a OmciCC
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000146//mib_db (as well as not inluded alarm_db not really used in this code? VERIFY!!)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000147func NewOmciCC(ctx context.Context, deviceID string, deviceHandler IdeviceHandler,
148 onuDeviceEntry IonuDeviceEntry, onuAlarmManager IonuAlarmManager,
149 coreClient *vgrpc.Client) *OmciCC {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000150 logger.Debugw(ctx, "init-omciCC", log.Fields{"device-id": deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000151 var omciCC OmciCC
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000152 omciCC.enabled = false
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000153 omciCC.pBaseDeviceHandler = deviceHandler
154 omciCC.pOnuAlarmManager = onuAlarmManager
Himani Chawla4d908332020-08-31 12:30:20 +0530155 omciCC.pOnuDeviceEntry = onuDeviceEntry
156 omciCC.deviceID = deviceID
khenaidoo7d3c5582021-08-11 18:09:44 -0400157 omciCC.coreClient = coreClient
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000158 omciCC.supportExtMsg = false
mpagenkoc8bba412021-01-15 15:38:44 +0000159 omciCC.rxOmciFrameError = cOmciMessageReceiveNoError
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000160 omciCC.txFrames = 0
161 omciCC.txOnuFrames = 0
162 omciCC.rxFrames = 0
163 omciCC.rxOnuFrames = 0
164 omciCC.rxOnuDiscards = 0
165 omciCC.tid = 0x1
166 omciCC.hpTid = 0x8000
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000167 omciCC.UploadSequNo = 0
168 omciCC.UploadNoOfCmds = 0
Holger Hildebrandt34555512021-10-01 16:26:59 +0000169 omciCC.lowPrioTxQueue = list.New()
170 omciCC.highPrioTxQueue = list.New()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000171 omciCC.rxSchedulerMap = make(map[uint16]CallbackPairEntry)
172 omciCC.monitoredRequests = make(map[uint16]OmciTransferStructure)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000173
174 return &omciCC
175}
176
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000177//Stop stops/resets the omciCC
178func (oo *OmciCC) Stop(ctx context.Context) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000179 logger.Debugw(ctx, "omciCC-stopping", log.Fields{"device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000180 //reseting all internal data, which might also be helpful for discarding any lingering tx/rx requests
mpagenko8cd1bf72021-06-22 10:11:19 +0000181 oo.CancelRequestMonitoring(ctx)
Holger Hildebrandt34555512021-10-01 16:26:59 +0000182 // clear the tx queues
183 oo.mutexHighPrioTxQueue.Lock()
184 oo.highPrioTxQueue.Init()
185 oo.mutexHighPrioTxQueue.Unlock()
186 oo.mutexLowPrioTxQueue.Lock()
187 oo.lowPrioTxQueue.Init()
188 oo.mutexLowPrioTxQueue.Unlock()
189 //clear the scheduler map
mpagenko900ee4b2020-10-12 11:56:34 +0000190 oo.mutexRxSchedMap.Lock()
191 for k := range oo.rxSchedulerMap {
Holger Hildebrandt34555512021-10-01 16:26:59 +0000192 delete(oo.rxSchedulerMap, k)
mpagenko900ee4b2020-10-12 11:56:34 +0000193 }
194 oo.mutexRxSchedMap.Unlock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000195 //reset the high prio transactionId
mpagenko900ee4b2020-10-12 11:56:34 +0000196 oo.mutexHpTid.Lock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000197 oo.hpTid = 0x8000
mpagenko900ee4b2020-10-12 11:56:34 +0000198 oo.mutexHpTid.Unlock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000199 //reset the low prio transactionId
mpagenko900ee4b2020-10-12 11:56:34 +0000200 oo.mutexTid.Lock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000201 oo.tid = 1
mpagenko900ee4b2020-10-12 11:56:34 +0000202 oo.mutexTid.Unlock()
203 //reset control values
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000204 oo.UploadSequNo = 0
205 oo.UploadNoOfCmds = 0
mpagenkoc8bba412021-01-15 15:38:44 +0000206 oo.rxOmciFrameError = cOmciMessageReceiveNoError
mpagenko900ee4b2020-10-12 11:56:34 +0000207 //reset the stats counter - which might be topic of discussion ...
208 oo.txFrames = 0
209 oo.txOnuFrames = 0
210 oo.rxFrames = 0
211 oo.rxOnuFrames = 0
212 oo.rxOnuDiscards = 0
213
214 return nil
215}
216
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000217// Rx handler for omci messages
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000218func (oo *OmciCC) receiveOnuMessage(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000219 logger.Debugw(ctx, "rx-onu-autonomous-message", log.Fields{"omciMsgType": omciMsg.MessageType,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000220 "payload": hex.EncodeToString(omciMsg.Payload)})
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530221 switch omciMsg.MessageType {
222 case omci.AlarmNotificationType:
223 data := OmciMessage{
224 OmciMsg: omciMsg,
225 OmciPacket: packet,
226 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000227 go oo.pOnuAlarmManager.HandleOmciAlarmNotificationMessage(ctx, data)
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530228 return nil
229 default:
230 return fmt.Errorf("receiveOnuMessageType %s unimplemented", omciMsg.MessageType.String())
231 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000232 /*
233 msgType = rxFrame.fields["message_type"] //assumed OmciOperationsValue
234 rxOnuFrames++
235
236 switch msgType {
237 case AlarmNotification:
238 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000239 logger.Info("Unhandled: received-onu-alarm-message")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000240 // python code was:
241 //if msg_type == EntityOperations.AlarmNotification.value:
242 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.Alarm_Notification)
243 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
244 //
245 return errors.New("RxAlarmNotification unimplemented")
246 }
247 case AttributeValueChange:
248 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000249 logger.Info("Unhandled: received-attribute-value-change")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000250 // python code was:
251 //elif msg_type == EntityOperations.AttributeValueChange.value:
252 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.AVC_Notification)
253 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
254 //
255 return errors.New("RxAttributeValueChange unimplemented")
256 }
257 case TestResult:
258 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000259 logger.Info("Unhandled: received-test-result")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000260 // python code was:
261 //elif msg_type == EntityOperations.TestResult.value:
262 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.Test_Result)
263 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
264 //
265 return errors.New("RxTestResult unimplemented")
266 }
267 default:
268 {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000269 logger.Errorw(ctx,"rx-onu-unsupported-autonomous-message", log.Fields{"msgType": msgType})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000270 rxOnuDiscards++
271 return errors.New("RxOnuMsgType unimplemented")
272 }
273 }
274 */
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000275}
276
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000277func (oo *OmciCC) printRxMessage(ctx context.Context, rxMsg []byte) {
mpagenko80622a52021-02-09 16:53:23 +0000278 //assuming omci message content is hex coded!
279 // with restricted output of 16bytes would be ...rxMsg[:16]
280 logger.Debugw(ctx, "omci-message-received:", log.Fields{
281 "RxOmciMessage": hex.EncodeToString(rxMsg),
282 "device-id": oo.deviceID})
283}
284
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000285// ReceiveMessage - Rx handler for onu messages
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000286// e.g. would call ReceiveOnuMessage() in case of TID=0 or Action=test ...
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000287// nolint: gocyclo
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000288func (oo *OmciCC) ReceiveMessage(ctx context.Context, rxMsg []byte) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000289 //logger.Debugw(ctx,"cc-receive-omci-message", log.Fields{"RxOmciMessage-x2s": hex.EncodeToString(rxMsg)})
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000290
291 if len(rxMsg) < 10 {
292 logger.Errorw(ctx, "rxOmciMessage has wrong length in general - abort",
293 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
294 if len(rxMsg) > 0 {
295 oo.printRxMessage(ctx, rxMsg)
mpagenkoc8bba412021-01-15 15:38:44 +0000296 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000297 return fmt.Errorf("rxOmciMessage has wrong length in general - abort %s", oo.deviceID)
298 }
299 if rxMsg[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
300 if len(rxMsg) >= 44 { // then it should normally include the BaseFormat trailer Len
301 // NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
302 // (an extendedFormat message could be destroyed this way!)
303 trailerLenData := rxMsg[42:44]
304 trailerLen := binary.BigEndian.Uint16(trailerLenData)
305 //logger.Debugw(ctx,"omci-received-trailer-len", log.Fields{"Length": trailerLen})
306 if trailerLen != cOmciBaseMessageTrailerLen { // invalid base Format entry -> autocorrect
307 binary.BigEndian.PutUint16(rxMsg[42:44], cOmciBaseMessageTrailerLen)
308 if oo.rxOmciFrameError != cOmciMessageReceiveErrorTrailerLen {
309 //do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
310 logger.Errorw(ctx, "wrong omci-message trailer length: trailer len auto-corrected",
311 log.Fields{"trailer-length": trailerLen, "device-id": oo.deviceID})
312 oo.rxOmciFrameError = cOmciMessageReceiveErrorTrailerLen
313 }
314 }
315 } else if len(rxMsg) >= cOmciBaseMessageTrailerLen { // workaround for Adtran OLT Sim, which currently does not send trailer bytes at all!
316 // NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
317 // (an extendedFormat message could be destroyed this way!)
318 // extend/overwrite with trailer
319 trailer := make([]byte, 8)
320 binary.BigEndian.PutUint16(trailer[2:], cOmciBaseMessageTrailerLen) //set the defined baseline length
321 rxMsg = append(rxMsg[:cOmciBaseMessageTrailerLen], trailer...)
322 if oo.rxOmciFrameError != cOmciMessageReceiveErrorMissTrailer {
323 //do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
324 logger.Errorw(ctx, "omci-message to short to include trailer len: trailer auto-corrected (added)",
325 log.Fields{"message-length": len(rxMsg), "device-id": oo.deviceID})
326 oo.rxOmciFrameError = cOmciMessageReceiveErrorMissTrailer
327 }
328 } else {
329 logger.Errorw(ctx, "received omci-message too small for OmciBaseFormat - abort",
330 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
331 oo.printRxMessage(ctx, rxMsg)
332 return fmt.Errorf("rxOmciMessage too small for BaseFormat %s", oo.deviceID)
333 }
334 } else if rxMsg[cOmciDeviceIdentifierPos] == byte(omci.ExtendedIdent) {
335 if len(rxMsg) > 1980 {
336 logger.Errorw(ctx, "rxOmciMessage has wrong length for OmciExtendedFormat - abort",
337 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
338 oo.printRxMessage(ctx, rxMsg)
339 return fmt.Errorf("rxOmciMessage has wrong length for OmciExtendedFormat %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000340 }
341 } else {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000342 logger.Errorw(ctx, "rxOmciMessage has wrong Device Identifier - abort",
mpagenkoc8bba412021-01-15 15:38:44 +0000343 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000344 oo.printRxMessage(ctx, rxMsg)
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000345 return fmt.Errorf("rxOmciMessage has wrong Device Identifier %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000346 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000347 decodeOptions := gopacket.DecodeOptions{
348 Lazy: true,
349 NoCopy: true,
350 }
351 packet := gopacket.NewPacket(rxMsg, omci.LayerTypeOMCI, decodeOptions)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000352 if packet == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000353 logger.Errorw(ctx, "omci-message could not be decoded", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000354 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200355 return fmt.Errorf("could not decode rxMsg as OMCI %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000356 }
357 omciLayer := packet.Layer(omci.LayerTypeOMCI)
358 if omciLayer == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000359 logger.Errorw(ctx, "omci-message could not decode omci layer", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000360 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200361 return fmt.Errorf("could not decode omci layer %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000362 }
mpagenko836a1fd2021-11-01 16:12:42 +0000363 // insert some check on detected OMCI decoding issues and log them
364 // e.g. should indicate problems when detecting some unknown attribute mask content (independent from message type)
365 // even though allowed from omci-lib due to set relaxed decoding
366 // application may dig into further details if wanted/needed on their own [but info is not transferred from here so far]
367 // (compare mib_sync.go unknownAttrLayer)
368 errLayer := packet.Layer(gopacket.LayerTypeDecodeFailure)
369 if failure, decodeOk := errLayer.(*gopacket.DecodeFailure); decodeOk {
370 errMsg := failure.Error()
371 logger.Warnw(ctx, "Detected decode issue on received OMCI frame", log.Fields{
372 "device-id": oo.deviceID, "issue": errMsg})
373 }
374 //anyway try continue OMCI decoding further on message type layer
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000375 omciMsg, ok := omciLayer.(*omci.OMCI)
376 if !ok {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000377 logger.Errorw(ctx, "omci-message could not assign 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 assign omci layer %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000380 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000381 logger.Debugw(ctx, "omci-message-decoded:", log.Fields{"omciMsgType": omciMsg.MessageType,
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000382 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16),
383 "DeviceIdent": omciMsg.DeviceIdentifier, "device-id": oo.deviceID})
mpagenko836a1fd2021-11-01 16:12:42 +0000384
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700385 // TestResult is asynchronous indication that carries the same TID as the TestResponse.
386 // We expect to find the TID in the oo.rxSchedulerMap
387 if byte(omciMsg.MessageType)&me.AK == 0 && omciMsg.MessageType != omci.TestResultType {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000388 // Not a response
mpagenko80622a52021-02-09 16:53:23 +0000389 oo.printRxMessage(ctx, rxMsg)
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000390 logger.Debugw(ctx, "RxMsg is no Omci Response Message", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000391 if omciMsg.TransactionID == 0 {
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530392 return oo.receiveOnuMessage(ctx, omciMsg, &packet)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000393 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000394 logger.Errorw(ctx, "Unexpected TransCorrId != 0 not accepted for autonomous messages",
Andrea Campanella6515c582020-10-05 11:25:00 +0200395 log.Fields{"msgType": omciMsg.MessageType, "payload": hex.EncodeToString(omciMsg.Payload),
mpagenko8b07c1b2020-11-26 10:36:31 +0000396 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200397 return fmt.Errorf("autonomous Omci Message with TranSCorrId != 0 not acccepted %s", oo.deviceID)
Himani Chawla4d908332020-08-31 12:30:20 +0530398 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000399 //logger.Debug(ctx,"RxMsg is a Omci Response Message: try to schedule it to the requester")
Himani Chawla4d908332020-08-31 12:30:20 +0530400 oo.mutexRxSchedMap.Lock()
401 rxCallbackEntry, ok := oo.rxSchedulerMap[omciMsg.TransactionID]
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000402 if ok && rxCallbackEntry.CbFunction != nil {
403 if rxCallbackEntry.FramePrint {
mpagenko80622a52021-02-09 16:53:23 +0000404 oo.printRxMessage(ctx, rxMsg)
405 }
Himani Chawla4d908332020-08-31 12:30:20 +0530406 //disadvantage of decoupling: error verification made difficult, but anyway the question is
407 // how to react on erroneous frame reception, maybe can simply be ignored
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000408 go rxCallbackEntry.CbFunction(ctx, omciMsg, &packet, rxCallbackEntry.CbRespChannel)
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000409 isSuccessfulResponse, err := oo.isSuccessfulResponseWithMibDataSync(ctx, omciMsg, &packet)
410 if err != nil {
411 // qualified error logging already done in function above
412 if !rxCallbackEntry.FramePrint {
413 oo.printRxMessage(ctx, rxMsg)
414 }
415 return fmt.Errorf("could not decode further layers %s", oo.deviceID)
416 }
417 if isSuccessfulResponse {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000418 oo.pOnuDeviceEntry.IncrementMibDataSync(ctx)
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000419 } else {
420 logger.Debugw(ctx, "mibDataSync counter not to be updated for this message type",
421 log.Fields{"omciMsg.MessageType": omciMsg.MessageType, "device-id": oo.deviceID})
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000422 }
mpagenkoc8bba412021-01-15 15:38:44 +0000423
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700424 // If omciMsg.MessageType is omci.TestResponseType, we still expect the TestResult OMCI message,
425 // so do not clean up the TransactionID in that case.
426 if omciMsg.MessageType != omci.TestResponseType {
427 // having posted the response the request is regarded as 'done'
428 delete(oo.rxSchedulerMap, omciMsg.TransactionID)
429 }
Himani Chawla4d908332020-08-31 12:30:20 +0530430 oo.mutexRxSchedMap.Unlock()
mpagenko80622a52021-02-09 16:53:23 +0000431 return nil
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000432 }
mpagenko80622a52021-02-09 16:53:23 +0000433 oo.mutexRxSchedMap.Unlock()
434 logger.Errorw(ctx, "omci-message-response for not registered transCorrId", log.Fields{"device-id": oo.deviceID})
435 oo.printRxMessage(ctx, rxMsg)
436 return fmt.Errorf("could not find registered response handler tor transCorrId %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000437
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000438 /* py code was:
439 Receive and OMCI message from the proxy channel to the OLT.
440
441 Call this from your ONU Adapter on a new OMCI Rx on the proxy channel
442 :param msg: (str) OMCI binary message (used as input to Scapy packet decoder)
443 """
444 if not self.enabled:
445 return
446
447 try:
448 now = arrow.utcnow()
449 d = None
450
451 # NOTE: Since we may need to do an independent ME map on a per-ONU basis
452 # save the current value of the entity_id_to_class_map, then
453 # replace it with our custom one before decode, and then finally
454 # restore it later. Tried other ways but really made the code messy.
455 saved_me_map = omci_entities.entity_id_to_class_map
456 omci_entities.entity_id_to_class_map = self._me_map
457
458 try:
459 rx_frame = msg if isinstance(msg, OmciFrame) else OmciFrame(msg)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000460 self.logger.debug('recv-omci-msg', omci_msg=hexlify(msg))
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000461 except KeyError as e:
462 # Unknown, Unsupported, or vendor-specific ME. Key is the unknown classID
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000463 self.logger.debug('frame-decode-key-error', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000464 rx_frame = self._decode_unknown_me(msg)
465 self._rx_unknown_me += 1
466
467 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000468 self.logger.exception('frame-decode', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000469 return
470
471 finally:
472 omci_entities.entity_id_to_class_map = saved_me_map # Always restore it.
473
474 rx_tid = rx_frame.fields['transaction_id']
475 msg_type = rx_frame.fields['message_type']
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000476 self.logger.debug('Received message for rx_tid', rx_tid = rx_tid, msg_type = msg_type)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000477 # Filter the Test Result frame and route through receive onu
478 # message method.
479 if rx_tid == 0 or msg_type == EntityOperations.TestResult.value:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000480 self.logger.debug('Receive ONU message', rx_tid=0)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000481 return self._receive_onu_message(rx_frame)
482
483 # Previously unreachable if this is the very first round-trip Rx or we
484 # have been running consecutive errors
485 if self._rx_frames == 0 or self._consecutive_errors != 0:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000486 self.logger.debug('Consecutive errors for rx', err = self._consecutive_errors)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000487 self.reactor.callLater(0, self._publish_connectivity_event, True)
488
489 self._rx_frames += 1
490 self._consecutive_errors = 0
491
492 try:
493 high_priority = self._tid_is_high_priority(rx_tid)
494 index = self._get_priority_index(high_priority)
495
496 # (timestamp, defer, frame, timeout, retry, delayedCall)
497 last_tx_tuple = self._tx_request[index]
498
499 if last_tx_tuple is None or \
500 last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id') != rx_tid:
501 # Possible late Rx on a message that timed-out
502 if last_tx_tuple:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000503 self.logger.debug('Unknown message', rx_tid=rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000504 tx_id=last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id'))
505 self._rx_unknown_tid += 1
506 self._rx_late += 1
507 return
508
509 ts, d, tx_frame, timeout, retry, dc = last_tx_tuple
510 if dc is not None and not dc.cancelled and not dc.called:
511 dc.cancel()
512
513 _secs = self._update_rx_tx_stats(now, ts)
514
515 # Late arrival already serviced by a timeout?
516 if d.called:
517 self._rx_late += 1
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000518 self.logger.debug('Serviced by timeout. Late arrival', rx_late = self._rx_late)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000519 return
520
521 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000522 self.logger.exception('frame-match', msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000523 if d is not None:
524 return d.errback(failure.Failure(e))
525 return
526
527 # Publish Rx event to listeners in a different task
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000528 self.logger.debug('Publish rx event', rx_tid = rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000529 tx_tid = tx_frame.fields['transaction_id'])
530 reactor.callLater(0, self._publish_rx_frame, tx_frame, rx_frame)
531
532 # begin success callback chain (will cancel timeout and queue next Tx message)
533 self._rx_response[index] = rx_frame
534 d.callback(rx_frame)
535
536 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000537 self.logger.exception('rx-msg', e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000538 */
539}
540
Himani Chawla6d2ae152020-09-02 13:11:20 +0530541/*
542func (oo *omciCC) publishRxResponseFrame(ctx context.Context, txFrame []byte, rxFrame []byte) error {
Himani Chawla4d908332020-08-31 12:30:20 +0530543 return errors.New("publishRxResponseFrame unimplemented")
Himani Chawla6d2ae152020-09-02 13:11:20 +0530544 //def _publish_rx_frame(self, tx_frame, rx_frame):
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000545}
Himani Chawla6d2ae152020-09-02 13:11:20 +0530546*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000547
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700548// ReleaseTid releases OMCI transaction identifier from rxSchedulerMap
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000549func (oo *OmciCC) ReleaseTid(ctx context.Context, tid uint16) {
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700550 logger.Debugw(ctx, "releasing tid from rxSchedulerMap", log.Fields{"tid": tid})
551 delete(oo.rxSchedulerMap, tid)
552}
553
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000554// Send - Queue the OMCI Frame for a transmit to the ONU via the proxy_channel
555func (oo *OmciCC) Send(ctx context.Context, txFrame []byte, timeout int, retry int, highPrio bool,
556 receiveCallbackPair CallbackPair) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000557
mpagenkoc26d4c02021-05-06 14:27:57 +0000558 if timeout != 0 {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000559 logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TransCorrId": receiveCallbackPair.CbKey})
mpagenkoc26d4c02021-05-06 14:27:57 +0000560 oo.mutexRxSchedMap.Lock()
561 // it could be checked, if the callback key is already registered - but simply overwrite may be acceptable ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000562 oo.rxSchedulerMap[receiveCallbackPair.CbKey] = receiveCallbackPair.CbEntry
mpagenkoc26d4c02021-05-06 14:27:57 +0000563 oo.mutexRxSchedMap.Unlock()
564 } //else timeout 0 indicates that no response is expected - fire and forget
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000565
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000566 printFrame := receiveCallbackPair.CbEntry.FramePrint //printFrame true means debug print of frame is requested
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000567 //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 +0000568 omciTxRequest := OmciTransferStructure{
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000569 txFrame,
570 timeout,
571 retry,
572 highPrio,
mpagenko80622a52021-02-09 16:53:23 +0000573 printFrame,
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000574 receiveCallbackPair,
575 nil,
kesavand011d5162021-11-25 19:21:06 +0530576 nil,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000577 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000578 oo.mutexMonReq.Lock()
579 defer oo.mutexMonReq.Unlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000580 if _, exist := oo.monitoredRequests[receiveCallbackPair.CbKey]; !exist {
mpagenko7455fd42021-06-10 16:25:55 +0000581 // do not call processRequestMonitoring in background here to ensure correct sequencing
582 // of requested messages into txQueue (especially for non-response-supervised messages)
583 oo.processRequestMonitoring(ctx, omciTxRequest)
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000584 return nil
585 }
586 logger.Errorw(ctx, "A message with this tid is processed already!",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000587 log.Fields{"tid": receiveCallbackPair.CbKey, "device-id": oo.deviceID})
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000588 return fmt.Errorf("message with tid is processed already %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000589}
590
Holger Hildebrandt34555512021-10-01 16:26:59 +0000591func (oo *OmciCC) sendQueuedRequests(ctx context.Context) {
592 // Avoid accessing the txQueues from parallel send routines to block
593 // parallel omci send requests at least until SendIAP is 'committed'.
594 // To guarantee window size 1 for one ONU it would be necessary to wait
595 // for the corresponding response too (t.b.d.).
596 oo.mutexSendQueuedRequests.Lock()
597 defer oo.mutexSendQueuedRequests.Unlock()
598 if err := oo.sendQueuedHighPrioRequests(ctx); err != nil {
599 logger.Errorw(ctx, "Error during sending high prio requests!",
600 log.Fields{"err": err, "device-id": oo.deviceID})
601 return
602 }
603 if err := oo.sendQueuedLowPrioRequests(ctx); err != nil {
604 logger.Errorw(ctx, "Error during sending low prio requests!",
605 log.Fields{"err": err, "device-id": oo.deviceID})
606 return
607 }
608}
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000609
Holger Hildebrandt34555512021-10-01 16:26:59 +0000610func (oo *OmciCC) sendQueuedHighPrioRequests(ctx context.Context) error {
611 oo.mutexHighPrioTxQueue.Lock()
612 defer oo.mutexHighPrioTxQueue.Unlock()
613 for oo.highPrioTxQueue.Len() > 0 {
614 queueElement := oo.highPrioTxQueue.Front() // First element
615 if err := oo.sendOMCIRequest(ctx, queueElement.Value.(OmciTransferStructure)); err != nil {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000616 // Element will be removed from the queue regardless of the send success, to prevent
617 // an accumulation of send requests for the same message in the event of an error.
618 // In this case, resend attempts for the message are ensured by our retry
619 // mechanism after omci-timeout.
620 oo.highPrioTxQueue.Remove(queueElement) // Dequeue
Holger Hildebrandt34555512021-10-01 16:26:59 +0000621 return err
mpagenko80622a52021-02-09 16:53:23 +0000622 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000623 oo.highPrioTxQueue.Remove(queueElement) // Dequeue
624 }
625 return nil
626}
627
628func (oo *OmciCC) sendQueuedLowPrioRequests(ctx context.Context) error {
629 oo.mutexLowPrioTxQueue.Lock()
630 for oo.lowPrioTxQueue.Len() > 0 {
631 queueElement := oo.lowPrioTxQueue.Front() // First element
kesavand011d5162021-11-25 19:21:06 +0530632 // check if the element is for onu sw section
633 aOmciTxReq := queueElement.Value.(OmciTransferStructure)
634 if aOmciTxReq.OnuSwWindow != nil {
635 if err := oo.sendOnuSwSectionsOfWindow(ctx, aOmciTxReq); err != nil {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000636 // Element will be removed from the queue regardless of the send success, to prevent
637 // an accumulation of send requests for the same message in the event of an error.
638 // In this case, resend attempts for the message are ensured by our retry
639 // mechanism after omci-timeout.
640 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
kesavand011d5162021-11-25 19:21:06 +0530641 oo.mutexLowPrioTxQueue.Unlock()
642 return err
643 }
644 } else {
645 err := oo.sendOMCIRequest(ctx, queueElement.Value.(OmciTransferStructure))
646 if 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.lowPrioTxQueue.Remove(queueElement) // Dequeue
kesavand011d5162021-11-25 19:21:06 +0530652 oo.mutexLowPrioTxQueue.Unlock()
653 return err
654 }
amit.ghosh58b704b2021-06-18 03:45:52 +0200655 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000656 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
657 // Interrupt the sending of low priority requests to process any high priority requests
658 // that may have arrived in the meantime
659 oo.mutexLowPrioTxQueue.Unlock()
660 if err := oo.sendQueuedHighPrioRequests(ctx); err != nil {
661 return err
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000662 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000663 oo.mutexLowPrioTxQueue.Lock()
664 }
665
666 oo.mutexLowPrioTxQueue.Unlock()
667 return nil
668}
669
670func (oo *OmciCC) sendOMCIRequest(ctx context.Context, omciTxRequest OmciTransferStructure) error {
671 if omciTxRequest.withFramePrint {
672 logger.Debugw(ctx, "omci-message-to-send:", log.Fields{
673 "TxOmciMessage": hex.EncodeToString(omciTxRequest.txFrame),
674 "device-id": oo.deviceID,
675 "toDeviceType": oo.pBaseDeviceHandler.GetProxyAddressType(),
676 "proxyDeviceID": oo.pBaseDeviceHandler.GetProxyAddressID(),
677 "proxyAddress": oo.pBaseDeviceHandler.GetProxyAddress()})
678 }
khenaidoo42dcdfd2021-10-19 17:34:12 -0400679 omciMsg := &ia.OmciMessage{
Holger Hildebrandt34555512021-10-01 16:26:59 +0000680 ParentDeviceId: oo.pBaseDeviceHandler.GetProxyAddressID(),
681 ChildDeviceId: oo.deviceID,
682 Message: omciTxRequest.txFrame,
683 ProxyAddress: oo.pBaseDeviceHandler.GetProxyAddress(),
684 ConnectStatus: common.ConnectStatus_REACHABLE, // If we are sending OMCI messages means we are connected, else we should not be here
685 }
686 sendErr := oo.pBaseDeviceHandler.SendOMCIRequest(ctx, oo.pBaseDeviceHandler.GetProxyAddress().AdapterEndpoint, omciMsg)
687 if sendErr != nil {
Holger Hildebrandtabfef032022-02-25 12:40:20 +0000688 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 +0000689 return sendErr
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000690 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000691 return nil
692}
693
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000694// GetNextTid - TODO: add comment
695func (oo *OmciCC) GetNextTid(highPriority bool) uint16 {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000696 var next uint16
697 if highPriority {
mpagenko900ee4b2020-10-12 11:56:34 +0000698 oo.mutexHpTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000699 next = oo.hpTid
Himani Chawla4d908332020-08-31 12:30:20 +0530700 oo.hpTid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000701 if oo.hpTid < 0x8000 {
702 oo.hpTid = 0x8000
703 }
mpagenko900ee4b2020-10-12 11:56:34 +0000704 oo.mutexHpTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000705 } else {
mpagenko900ee4b2020-10-12 11:56:34 +0000706 oo.mutexTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000707 next = oo.tid
Himani Chawla4d908332020-08-31 12:30:20 +0530708 oo.tid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000709 if oo.tid >= 0x8000 {
710 oo.tid = 1
711 }
mpagenko900ee4b2020-10-12 11:56:34 +0000712 oo.mutexTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000713 }
714 return next
715}
716
kesavand011d5162021-11-25 19:21:06 +0530717//GetOnuSwSecNextTid get the next low prio tid for the onu sw sections
718//onu sw sections uses only low priority tids
719//The mutexTid lock should be taken prior to using this function
720func (oo *OmciCC) GetOnuSwSecNextTid() uint16 {
721 next := oo.tid
722 oo.tid++
723 if oo.tid >= 0x8000 {
724 oo.tid = 1
725 }
726 return next
727}
728
729//GetOnuSwSecLastTid gets the last allocated tid
730//The mutexTid lock should be taken prior to using this function
731func (oo *OmciCC) GetOnuSwSecLastTid() uint16 {
732 next := oo.tid
733 lastAllocatedTid := next - 1
734 return lastAllocatedTid
735}
736
737//LockMutexTID locks mutexTid
738func (oo *OmciCC) LockMutexTID() {
739 oo.mutexTid.Lock()
740}
741
742//UnLockMutexTID unlocks mutexTid
743func (oo *OmciCC) UnLockMutexTID() {
744 oo.mutexTid.Unlock()
745}
746
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000747// ###################################################################################
748// # utility methods provided to work on OMCI messages
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000749
750// Serialize - TODO: add comment
751func Serialize(ctx context.Context, msgType omci.MessageType, request gopacket.SerializableLayer, tid uint16) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000752 omciLayer := &omci.OMCI{
753 TransactionID: tid,
754 MessageType: msgType,
755 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000756 return SerializeOmciLayer(ctx, omciLayer, request)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000757}
758
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000759// SerializeOmciLayer - TODO: add comment
760func SerializeOmciLayer(ctx context.Context, aOmciLayer *omci.OMCI, aRequest gopacket.SerializableLayer) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000761 var options gopacket.SerializeOptions
762 options.FixLengths = true
763
764 buffer := gopacket.NewSerializeBuffer()
Himani Chawla4d908332020-08-31 12:30:20 +0530765 err := gopacket.SerializeLayers(buffer, options, aOmciLayer, aRequest)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000766 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000767 logger.Errorw(ctx, "Could not create goPacket Omci serial buffer", log.Fields{"Err": err})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000768 return nil, err
769 }
770 return buffer.Bytes(), nil
771}
772
Himani Chawla4d908332020-08-31 12:30:20 +0530773/*
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000774func hexEncode(omciPkt []byte) ([]byte, error) {
775 dst := make([]byte, hex.EncodedLen(len(omciPkt)))
776 hex.Encode(dst, omciPkt)
777 return dst, nil
778}
Himani Chawla4d908332020-08-31 12:30:20 +0530779*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000780
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000781//supply a response handler for omci response messages to be transferred to the requested FSM
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000782func (oo *OmciCC) receiveOmciResponse(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet, respChan chan Message) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000783
dbainbri4d3a0dc2020-12-02 00:33:42 +0000784 logger.Debugw(ctx, "omci-message-response - transfer on omciRespChannel", log.Fields{"omciMsgType": omciMsg.MessageType,
divyadesai4d299552020-08-18 07:13:49 +0000785 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000786
787 if oo.pOnuDeviceEntry == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000788 logger.Errorw(ctx, "Abort receiving OMCI response, DeviceEntryPointer is nil", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000789 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200790 return fmt.Errorf("deviceEntryPointer is nil %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000791 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000792 oo.mutexMonReq.RLock()
793 if _, exist := oo.monitoredRequests[omciMsg.TransactionID]; exist {
mpagenko8cd1bf72021-06-22 10:11:19 +0000794 //implement non-blocking channel send to avoid blocking on mutexMonReq later
795 select {
796 case oo.monitoredRequests[omciMsg.TransactionID].chSuccess <- true:
797 default:
798 logger.Debugw(ctx, "response not send on omciRespChannel (no receiver)", log.Fields{
799 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
800 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000801 } else {
802 logger.Infow(ctx, "reqMon: map entry does not exist!",
803 log.Fields{"tid": omciMsg.TransactionID, "device-id": oo.deviceID})
804 }
805 oo.mutexMonReq.RUnlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000806
807 // no further test on SeqNo is done here, assignment from rxScheduler is trusted
808 // MibSync responses are simply transferred via deviceEntry to MibSync, no specific analysis here
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000809 omciRespMsg := Message{
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000810 Type: OMCI,
811 Data: OmciMessage{
812 OmciMsg: omciMsg,
813 OmciPacket: packet,
814 },
815 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000816 //logger.Debugw(ctx,"Message to be sent into channel:", log.Fields{"mibSyncMsg": mibSyncMsg})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000817 respChan <- omciRespMsg
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000818
819 return nil
820}
821
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000822// SendMibReset sends MibResetRequest
823func (oo *OmciCC) SendMibReset(ctx context.Context, timeout int, highPrio bool) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000824
dbainbri4d3a0dc2020-12-02 00:33:42 +0000825 logger.Debugw(ctx, "send MibReset-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000826 request := &omci.MibResetRequest{
827 MeBasePacket: omci.MeBasePacket{
828 EntityClass: me.OnuDataClassID,
829 },
830 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000831 tid := oo.GetNextTid(highPrio)
832 pkt, err := Serialize(ctx, omci.MibResetRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000833 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000834 logger.Errorw(ctx, "Cannot serialize MibResetRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000835 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000836 return err
837 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000838 omciRxCallbackPair := CallbackPair{
839 CbKey: tid,
840 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000841 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000842 return oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000843}
844
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000845// SendReboot sends RebootRequest
846func (oo *OmciCC) SendReboot(ctx context.Context, timeout int, highPrio bool, responseChannel chan Message) error {
847 logger.Debugw(ctx, "send reboot-msg to:", log.Fields{"device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300848 request := &omci.RebootRequest{
849 MeBasePacket: omci.MeBasePacket{
850 EntityClass: me.OnuGClassID,
851 },
852 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000853 tid := oo.GetNextTid(highPrio)
854 pkt, err := Serialize(ctx, omci.RebootRequestType, request, tid)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300855 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000856 logger.Errorw(ctx, "Cannot serialize RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000857 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300858 return err
859 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000860 omciRxCallbackPair := CallbackPair{
861 CbKey: tid,
862 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetOmciRebootMsgRevChan(), oo.receiveOmciResponse, true},
ozgecanetsiae11479f2020-07-06 09:44:47 +0300863 }
864
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000865 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300866 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000867 logger.Errorw(ctx, "Cannot send RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000868 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300869 return err
870 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000871 err = oo.pOnuDeviceEntry.WaitForRebootResponse(ctx, responseChannel)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300872 if err != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000873 logger.Errorw(ctx, "aborting ONU reboot!", log.Fields{
Andrea Campanella6515c582020-10-05 11:25:00 +0200874 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300875 return err
876 }
877 return nil
878}
879
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000880// SendMibUpload sends MibUploadRequest
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000881func (oo *OmciCC) SendMibUpload(ctx context.Context, timeout int, highPrio bool, isExtOmciSupported bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000882 logger.Debugw(ctx, "send MibUpload-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000883
884 tid := oo.GetNextTid(highPrio)
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000885
886 omciLayer := &omci.OMCI{
887 TransactionID: tid,
888 MessageType: omci.MibUploadRequestType,
889 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000890 if isExtOmciSupported {
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000891 omciLayer.DeviceIdentifier = omci.ExtendedIdent
892 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000893 request := &omci.MibUploadRequest{
894 MeBasePacket: omci.MeBasePacket{
895 EntityClass: me.OnuDataClassID,
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000896 Extended: isExtOmciSupported,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000897 },
898 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000899 var options gopacket.SerializeOptions
900 options.FixLengths = true
901
902 buffer := gopacket.NewSerializeBuffer()
903 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000904 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000905 logger.Errorw(ctx, "Cannot serialize MibUploadRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000906 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000907 return err
908 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000909 oo.UploadSequNo = 0
910 oo.UploadNoOfCmds = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000911
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000912 omciRxCallbackPair := CallbackPair{
913 CbKey: tid,
914 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000915 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000916 return oo.Send(ctx, buffer.Bytes(), timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000917}
918
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000919// SendMibUploadNext sends MibUploadNextRequest
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000920func (oo *OmciCC) SendMibUploadNext(ctx context.Context, timeout int, highPrio bool, isExtOmciSupported bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000921 logger.Debugw(ctx, "send MibUploadNext-msg to:", log.Fields{"device-id": oo.deviceID, "UploadSequNo": oo.UploadSequNo})
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000922
923 tid := oo.GetNextTid(highPrio)
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000924
925 omciLayer := &omci.OMCI{
926 TransactionID: tid,
927 MessageType: omci.MibUploadNextRequestType,
928 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000929 if isExtOmciSupported {
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000930 omciLayer.DeviceIdentifier = omci.ExtendedIdent
931 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000932 request := &omci.MibUploadNextRequest{
933 MeBasePacket: omci.MeBasePacket{
934 EntityClass: me.OnuDataClassID,
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000935 Extended: isExtOmciSupported,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000936 },
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000937 CommandSequenceNumber: oo.UploadSequNo,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000938 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000939 var options gopacket.SerializeOptions
940 options.FixLengths = true
941
942 buffer := gopacket.NewSerializeBuffer()
943 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000944 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000945 logger.Errorw(ctx, "Cannot serialize MibUploadNextRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000946 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000947 return err
948 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000949 oo.UploadSequNo++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000950
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000951 omciRxCallbackPair := CallbackPair{
952 CbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000953 //frame printing for MibUpload frames disabled now per default to avoid log file abort situations (size/speed?)
954 // if wanted, rx frame printing should be specifically done within the MibUpload FSM or controlled via extra parameter
955 // compare also software upgrade download section handling
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000956 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000957 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000958 return oo.Send(ctx, buffer.Bytes(), timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000959}
960
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000961// SendGetAllAlarm gets all alarm ME instances
962func (oo *OmciCC) SendGetAllAlarm(ctx context.Context, alarmRetreivalMode uint8, timeout int, highPrio bool) error {
Himani Chawlad3dac422021-03-13 02:31:31 +0530963 logger.Debugw(ctx, "send GetAllAlarms-msg to:", log.Fields{"device-id": oo.deviceID})
964 request := &omci.GetAllAlarmsRequest{
965 MeBasePacket: omci.MeBasePacket{
966 EntityClass: me.OnuDataClassID,
967 },
968 AlarmRetrievalMode: byte(alarmRetreivalMode),
969 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000970 tid := oo.GetNextTid(highPrio)
971 pkt, err := Serialize(ctx, omci.GetAllAlarmsRequestType, request, tid)
Himani Chawlad3dac422021-03-13 02:31:31 +0530972 if err != nil {
973 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsRequest", log.Fields{
974 "Err": err, "device-id": oo.deviceID})
975 return err
976 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000977 oo.pOnuAlarmManager.ResetAlarmUploadCounters()
Himani Chawlad3dac422021-03-13 02:31:31 +0530978
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000979 omciRxCallbackPair := CallbackPair{
980 CbKey: tid,
981 CbEntry: CallbackPairEntry{oo.pOnuAlarmManager.GetAlarmMgrEventChannel(), oo.receiveOmciResponse, true},
Himani Chawlad3dac422021-03-13 02:31:31 +0530982 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000983 return oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawlad3dac422021-03-13 02:31:31 +0530984}
985
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000986// SendGetAllAlarmNext gets next alarm ME instance
987func (oo *OmciCC) SendGetAllAlarmNext(ctx context.Context, timeout int, highPrio bool) error {
988 alarmUploadSeqNo := oo.pOnuAlarmManager.GetAlarmUploadSeqNo()
989 logger.Debugw(ctx, "send SendGetAllAlarmNext-msg to:", log.Fields{"device-id": oo.deviceID,
Himani Chawlad3dac422021-03-13 02:31:31 +0530990 "alarmUploadSeqNo": alarmUploadSeqNo})
991 request := &omci.GetAllAlarmsNextRequest{
992 MeBasePacket: omci.MeBasePacket{
993 EntityClass: me.OnuDataClassID,
994 },
995 CommandSequenceNumber: alarmUploadSeqNo,
996 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000997 tid := oo.GetNextTid(highPrio)
998 pkt, err := Serialize(ctx, omci.GetAllAlarmsNextRequestType, request, tid)
Himani Chawlad3dac422021-03-13 02:31:31 +0530999 if err != nil {
1000 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsNextRequest", log.Fields{
1001 "Err": err, "device-id": oo.deviceID})
1002 return err
1003 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001004 oo.pOnuAlarmManager.IncrementAlarmUploadSeqNo()
Himani Chawlad3dac422021-03-13 02:31:31 +05301005
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001006 omciRxCallbackPair := CallbackPair{
1007 CbKey: tid,
1008 CbEntry: CallbackPairEntry{oo.pOnuAlarmManager.GetAlarmMgrEventChannel(), oo.receiveOmciResponse, true},
Himani Chawlad3dac422021-03-13 02:31:31 +05301009 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001010 return oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawlad3dac422021-03-13 02:31:31 +05301011}
1012
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001013// SendCreateGalEthernetProfile creates GalEthernetProfile ME instance
1014func (oo *OmciCC) SendCreateGalEthernetProfile(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1015 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001016 logger.Debugw(ctx, "send GalEnetProfile-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001017 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001018
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001019 meParams := me.ParamData{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001020 EntityID: GalEthernetEID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001021 Attributes: me.AttributeValueMap{me.GalEthernetProfile_MaximumGemPayloadSize: maxGemPayloadSize},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001022 }
1023 meInstance, omciErr := me.NewGalEthernetProfile(meParams)
1024 if omciErr.GetError() == nil {
1025 //all setByCreate parameters already set, no default option required ...
mpagenko836a1fd2021-11-01 16:12:42 +00001026 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001027 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001028 logger.Errorw(ctx, "Cannot encode GalEnetProfileInstance for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001029 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001030 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001031 }
1032
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001033 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001034 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001035 logger.Errorw(ctx, "Cannot serialize GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001036 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001037 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001038 }
1039
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001040 omciRxCallbackPair := CallbackPair{
1041 CbKey: tid,
1042 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001043 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001044 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001045 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001046 logger.Errorw(ctx, "Cannot send GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001047 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001048 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001049 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001050 logger.Debug(ctx, "send GalEnetProfile-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001051 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001052 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001053 logger.Errorw(ctx, "Cannot generate GalEnetProfileInstance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001054 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001055 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001056}
1057
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001058// SendSetOnu2g sets Onu2G ME instance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001059// might be needed to extend for parameter arguments, here just for setting the ConnectivityMode!!
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001060func (oo *OmciCC) SendSetOnu2g(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1061 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001062 logger.Debugw(ctx, "send ONU2-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001063 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001064
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001065 // ONU-G ME-ID is defined to be 0, but we could verify, if the ONU really supports the desired
1066 // connectivity mode 5 (in ConnCap)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001067 // By now we just use fix values to fire - this is anyway what the python adapter does
1068 // read ONU-2G from DB ???? //TODO!!!
1069 meParams := me.ParamData{
1070 EntityID: 0,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001071 Attributes: me.AttributeValueMap{me.Onu2G_CurrentConnectivityMode: connectivityModeValue},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001072 }
1073 meInstance, omciErr := me.NewOnu2G(meParams)
1074 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001075 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001076 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001077 logger.Errorw(ctx, "Cannot encode ONU2-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001078 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001079 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001080 }
1081
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001082 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001083 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001084 logger.Errorw(ctx, "Cannot serialize ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001085 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001086 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001087 }
1088
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001089 omciRxCallbackPair := CallbackPair{
1090 CbKey: tid,
1091 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001092 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001093 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001094 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001095 logger.Errorw(ctx, "Cannot send ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001096 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001097 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001098 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001099 logger.Debug(ctx, "send ONU2-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001100 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001101 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001102 logger.Errorw(ctx, "Cannot generate ONU2-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001103 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001104 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001105}
1106
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001107// SendCreateMBServiceProfile creates MacBridgeServiceProfile ME instance
1108func (oo *OmciCC) SendCreateMBServiceProfile(ctx context.Context,
1109 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1110 tid := oo.GetNextTid(highPrio)
1111 instID := MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001112 logger.Debugw(ctx, "send MBSP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001113 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001114
1115 meParams := me.ParamData{
1116 EntityID: instID,
1117 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001118 me.MacBridgeServiceProfile_Priority: 0x8000,
1119 me.MacBridgeServiceProfile_MaxAge: 20 * 256, //20s
1120 me.MacBridgeServiceProfile_HelloTime: 2 * 256, //2s
1121 me.MacBridgeServiceProfile_ForwardDelay: 15 * 256, //15s
1122 me.MacBridgeServiceProfile_DynamicFilteringAgeingTime: 0,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001123 },
1124 }
1125
1126 meInstance, omciErr := me.NewMacBridgeServiceProfile(meParams)
1127 if omciErr.GetError() == nil {
1128 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001129 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1130 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001131 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001132 logger.Errorw(ctx, "Cannot encode MBSP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001133 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001134 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001135 }
1136
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001137 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001138 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001139 logger.Errorw(ctx, "Cannot serialize MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001140 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001141 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001142 }
1143
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001144 omciRxCallbackPair := CallbackPair{
1145 CbKey: tid,
1146 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001147 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001148 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001149 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001150 logger.Errorw(ctx, "Cannot send MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001151 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001152 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001153 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001154 logger.Debug(ctx, "send MBSP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001155 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001156 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001157 logger.Errorw(ctx, "Cannot generate MBSP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001158 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001159 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001160}
1161
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001162// SendCreateMBPConfigDataUniSide creates MacBridgePortConfigurationData ME instance
1163func (oo *OmciCC) SendCreateMBPConfigDataUniSide(ctx context.Context,
1164 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1165 tid := oo.GetNextTid(highPrio)
1166 instID, idErr := GenerateUNISideMBPCDEID(uint16(aPUniPort.MacBpNo))
Mahir Gunyel6781f962021-05-16 23:30:08 -07001167 if idErr != nil {
1168 logger.Errorw(ctx, "Cannot generate MBPCD entity id", log.Fields{
1169 "Err": idErr, "device-id": oo.deviceID})
1170 return nil, idErr
1171 }
1172 logger.Debugw(ctx, "send MBPCD-Create-msg for uni side:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001173 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16), "macBpNo": aPUniPort.MacBpNo})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001174
1175 meParams := me.ParamData{
1176 EntityID: instID,
1177 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001178 me.MacBridgePortConfigurationData_BridgeIdPointer: MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo),
1179 me.MacBridgePortConfigurationData_PortNum: aPUniPort.MacBpNo,
1180 me.MacBridgePortConfigurationData_TpType: uint8(aPUniPort.PortType),
1181 me.MacBridgePortConfigurationData_TpPointer: aPUniPort.EntityID,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001182 },
1183 }
1184 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
1185 if omciErr.GetError() == nil {
1186 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001187 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1188 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001189 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001190 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001191 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001192 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001193 }
1194
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001195 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001196 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001197 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001198 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001199 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001200 }
1201
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001202 omciRxCallbackPair := CallbackPair{
1203 CbKey: tid,
1204 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001205 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001206 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001207 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001208 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001209 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001210 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001211 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001212 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001213 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001214 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001215 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001216 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001217 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001218}
1219
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001220// SendCreateEVTOConfigData creates ExtendedVlanTaggingOperationConfigurationData ME instance
1221func (oo *OmciCC) SendCreateEVTOConfigData(ctx context.Context,
1222 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1223 tid := oo.GetNextTid(highPrio)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001224 //same entityId is used as for MBSP (see there), but just arbitrary ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001225 instID := MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001226 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001227 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001228
1229 // compare python adapter code WA VOL-1311: this is not done here!
1230 // (setting TPID values for the create would probably anyway be ignored by the omci lib)
1231 // but perhaps we have to be aware of possible problems at get(Next) Request handling for EVTOOCD tables later ...
1232 assType := uint8(2) // default AssociationType is PPTPEthUni
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001233 if aPUniPort.PortType == UniVEIP {
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001234 assType = uint8(10) // for VEIP
1235 }
1236 meParams := me.ParamData{
1237 EntityID: instID,
1238 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001239 me.ExtendedVlanTaggingOperationConfigurationData_AssociationType: assType,
1240 me.ExtendedVlanTaggingOperationConfigurationData_AssociatedMePointer: aPUniPort.EntityID,
mpagenko836a1fd2021-11-01 16:12:42 +00001241 //EnhancedMode not yet supported, used with default options
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001242 },
1243 }
1244 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(meParams)
1245 if omciErr.GetError() == nil {
1246 //all setByCreate parameters already set, no default option required ...
mpagenko836a1fd2021-11-01 16:12:42 +00001247 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1248 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001249 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001250 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001251 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001252 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001253 }
1254
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001255 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001256 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001257 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001258 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001259 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001260 }
1261
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001262 omciRxCallbackPair := CallbackPair{
1263 CbKey: tid,
1264 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001265 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001266 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001267 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001268 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001269 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001270 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001271 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001272 logger.Debug(ctx, "send EVTOCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001273 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001274 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001275 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001276 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001277 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001278}
1279
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001280// SendSetOnuGLS sets OnuG ME instance
1281func (oo *OmciCC) SendSetOnuGLS(ctx context.Context, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001282 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001283 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001284 logger.Debugw(ctx, "send ONU-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001285 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001286
1287 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1288 meParams := me.ParamData{
1289 EntityID: 0,
1290 Attributes: requestedAttributes,
1291 }
1292 meInstance, omciErr := me.NewOnuG(meParams)
1293 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001294 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001295 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001296 logger.Errorw(ctx, "Cannot encode ONU-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001297 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001298 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001299 }
1300
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001301 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001302 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001303 logger.Errorw(ctx, "Cannot serialize ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001304 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001305 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001306 }
1307
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001308 omciRxCallbackPair := CallbackPair{
1309 CbKey: tid,
1310 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001311 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001312 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001313 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001314 logger.Errorw(ctx, "Cannot send ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001315 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001316 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001317 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001318 logger.Debug(ctx, "send ONU-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001319 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001320 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001321 logger.Errorw(ctx, "Cannot generate ONU-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001322 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001323 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001324}
1325
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001326// SendSetPptpEthUniLS sets PhysicalPathTerminationPointEthernetUni ME instance
1327func (oo *OmciCC) SendSetPptpEthUniLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001328 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001329 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001330 logger.Debugw(ctx, "send PPTPEthUni-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001331 "SequNo": strconv.FormatInt(int64(tid), 16)})
1332
1333 // PPTPEthUni ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1334 meParams := me.ParamData{
1335 EntityID: aInstNo,
1336 Attributes: requestedAttributes,
1337 }
1338 meInstance, omciErr := me.NewPhysicalPathTerminationPointEthernetUni(meParams)
1339 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001340 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001341 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001342 logger.Errorw(ctx, "Cannot encode PPTPEthUni instance for set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001343 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001344 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001345 }
1346
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001347 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001348 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001349 logger.Errorw(ctx, "Cannot serialize PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001350 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001351 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001352 }
1353
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001354 omciRxCallbackPair := CallbackPair{
1355 CbKey: tid,
1356 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001357 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001358 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001359 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001360 logger.Errorw(ctx, "Cannot send PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001361 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001362 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001363 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001364 logger.Debug(ctx, "send PPTPEthUni-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001365 return meInstance, nil
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001366 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001367 logger.Errorw(ctx, "Cannot generate PPTPEthUni", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001368 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001369 return nil, omciErr.GetError()
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001370}
1371
1372/* UniG obsolete by now, left here in case it should be needed once again
1373 UniG AdminState anyway should be ignored by ONU acc. to G988
Himani Chawla6d2ae152020-09-02 13:11:20 +05301374func (oo *omciCC) sendSetUniGLS(ctx context.Context, aInstNo uint16, timeout int,
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001375 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) *me.ManagedEntity {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001376 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001377 logger.Debugw(ctx,"send UNI-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001378 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001379
1380 // UNI-G ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1381 meParams := me.ParamData{
1382 EntityID: aInstNo,
1383 Attributes: requestedAttributes,
1384 }
1385 meInstance, omciErr := me.NewUniG(meParams)
1386 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001387 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001388 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001389 logger.Errorw(ctx,"Cannot encode UNI-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001390 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001391 return nil
1392 }
1393
1394 pkt, err := serializeOmciLayer(omciLayer, msgLayer)
1395 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001396 logger.Errorw(ctx,"Cannot serialize UNI-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001397 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001398 return nil
1399 }
1400
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001401 omciRxCallbackPair := CallbackPair{
1402 CbKey: tid,
1403 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001404 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001405 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001406 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001407 logger.Errorw(ctx,"Cannot send UNIG-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001408 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001409 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001410 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001411 logger.Debug(ctx,"send UNI-G-Set-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001412 return meInstance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001413 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001414 logger.Errorw(ctx,"Cannot generate UNI-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001415 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001416 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001417}
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001418*/
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001419
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001420// SendSetVeipLS sets VirtualEthernetInterfacePoint ME instance
1421func (oo *OmciCC) SendSetVeipLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001422 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001423 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001424 logger.Debugw(ctx, "send VEIP-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001425 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001426
1427 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1428 meParams := me.ParamData{
1429 EntityID: aInstNo,
1430 Attributes: requestedAttributes,
1431 }
1432 meInstance, omciErr := me.NewVirtualEthernetInterfacePoint(meParams)
1433 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001434 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001435 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001436 logger.Errorw(ctx, "Cannot encode VEIP instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001437 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001438 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001439 }
1440
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001441 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001442 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001443 logger.Errorw(ctx, "Cannot serialize VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001444 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001445 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001446 }
1447
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001448 omciRxCallbackPair := CallbackPair{
1449 CbKey: tid,
1450 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001451 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001452 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001453 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001454 logger.Errorw(ctx, "Cannot send VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001455 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001456 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001457 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001458 logger.Debug(ctx, "send VEIP-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001459 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001460 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001461 logger.Errorw(ctx, "Cannot generate VEIP", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001462 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001463 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001464}
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001465
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001466// SendGetMe gets ME instance
1467func (oo *OmciCC) SendGetMe(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributes me.AttributeValueMap,
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001468 timeout int, highPrio bool, rxChan chan Message, isExtendedOmci bool) (*me.ManagedEntity, error) {
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001469
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001470 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001471 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001472 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001473
1474 meParams := me.ParamData{
1475 EntityID: entityID,
1476 Attributes: requestedAttributes,
1477 }
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001478 var messageSet omci.DeviceIdent = omci.BaselineIdent
1479 if isExtendedOmci {
1480 messageSet = omci.ExtendedIdent
1481 }
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001482 meInstance, omciErr := me.LoadManagedEntityDefinition(classID, meParams)
1483 if omciErr.GetError() == nil {
Himani Chawla4d908332020-08-31 12:30:20 +05301484 meClassIDName := meInstance.GetName()
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001485 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.GetRequestType, oframe.TransactionID(tid), oframe.FrameFormat(messageSet))
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001486 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001487 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 +03001488 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001489 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001490 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001491 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001492 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001493 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001494 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001495 omciRxCallbackPair := CallbackPair{
1496 CbKey: tid,
1497 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001498 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001499 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001500 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001501 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001502 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001503 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001504 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": meClassIDName, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001505 return meInstance, nil
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001506 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001507 logger.Errorw(ctx, "Cannot generate meDefinition", log.Fields{"classID": classID, "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001508 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001509}
1510
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001511// SendGetMeWithAttributeMask gets ME instance with attribute mask
1512func (oo *OmciCC) SendGetMeWithAttributeMask(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributesMask uint16,
Himani Chawla43f95ff2021-06-03 00:24:12 +05301513 timeout int, highPrio bool, rxChan chan Message) error {
1514
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001515 tid := oo.GetNextTid(highPrio)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301516 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
1517 "SequNo": strconv.FormatInt(int64(tid), 16)})
1518
1519 request := &omci.GetRequest{
1520 MeBasePacket: omci.MeBasePacket{
1521 EntityInstance: entityID,
1522 EntityClass: classID,
1523 },
1524 AttributeMask: requestedAttributesMask,
1525 }
1526
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001527 pkt, err := Serialize(ctx, omci.GetRequestType, request, tid)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301528 if err != nil {
1529 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1530 return err
1531 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001532 omciRxCallbackPair := CallbackPair{
1533 CbKey: tid,
1534 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Himani Chawla43f95ff2021-06-03 00:24:12 +05301535 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001536 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301537 if err != nil {
1538 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1539 return err
1540 }
1541 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": classID, "device-id": oo.deviceID})
1542 return nil
1543}
1544
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001545// SendCreateDot1PMapper creates Ieee8021PMapperServiceProfile ME instance
1546func (oo *OmciCC) SendCreateDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001547 aInstID uint16, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001548 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001549 logger.Debugw(ctx, "send .1pMapper-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001550 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(aInstID), 16)})
1551
1552 meParams := me.ParamData{
mpagenko8b5fdd22020-12-17 17:58:32 +00001553 EntityID: aInstID,
1554 Attributes: me.AttributeValueMap{
1555 //workaround for unsuitable omci-lib default values, cmp VOL-3729
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001556 me.Ieee8021PMapperServiceProfile_TpPointer: 0xFFFF,
1557 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority0: 0xFFFF,
1558 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority1: 0xFFFF,
1559 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority2: 0xFFFF,
1560 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority3: 0xFFFF,
1561 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority4: 0xFFFF,
1562 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority5: 0xFFFF,
1563 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority6: 0xFFFF,
1564 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority7: 0xFFFF,
mpagenko8b5fdd22020-12-17 17:58:32 +00001565 },
mpagenko3dbcdd22020-07-22 07:38:45 +00001566 }
1567 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
1568 if omciErr.GetError() == nil {
1569 //we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001570 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1571 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001572 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001573 logger.Errorw(ctx, "Cannot encode .1pMapper for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001574 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001575 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001576 }
1577
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001578 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001579 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001580 logger.Errorw(ctx, "Cannot serialize .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001581 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001582 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001583 }
1584
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001585 omciRxCallbackPair := CallbackPair{
1586 CbKey: tid,
1587 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001588 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001589 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001590 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001591 logger.Errorw(ctx, "Cannot send .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001592 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001593 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001594 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001595 logger.Debug(ctx, "send .1pMapper-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001596 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001597 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001598 logger.Errorw(ctx, "Cannot generate .1pMapper", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001599 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001600 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001601}
1602
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001603// SendCreateMBPConfigDataVar creates MacBridgePortConfigurationData ME instance
1604func (oo *OmciCC) SendCreateMBPConfigDataVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001605 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001606 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001607 logger.Debugw(ctx, "send MBPCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001608 "SequNo": strconv.FormatInt(int64(tid), 16),
1609 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1610
1611 meInstance, omciErr := me.NewMacBridgePortConfigurationData(params[0])
1612 if omciErr.GetError() == nil {
1613 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001614 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1615 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001616 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001617 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001618 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001619 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001620 }
1621
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001622 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001623 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001624 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001625 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001626 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001627 }
1628
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001629 omciRxCallbackPair := CallbackPair{
1630 CbKey: tid,
1631 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001632 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001633 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001634 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001635 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001636 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001637 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001638 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001639 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001640 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001641 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001642 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001643 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001644 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001645}
1646
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001647// SendCreateGemNCTPVar creates GemPortNetworkCtp ME instance
1648func (oo *OmciCC) SendCreateGemNCTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001649 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001650 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001651 logger.Debugw(ctx, "send GemNCTP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001652 "SequNo": strconv.FormatInt(int64(tid), 16),
1653 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1654
1655 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1656 if omciErr.GetError() == nil {
1657 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001658 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1659 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001660 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001661 logger.Errorw(ctx, "Cannot encode GemNCTP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001662 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001663 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001664 }
1665
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001666 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001667 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001668 logger.Errorw(ctx, "Cannot serialize GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001669 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001670 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001671 }
1672
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001673 omciRxCallbackPair := CallbackPair{
1674 CbKey: tid,
1675 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001676 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001677 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001678 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001679 logger.Errorw(ctx, "Cannot send GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001680 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001681 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001682 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001683 logger.Debug(ctx, "send GemNCTP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001684 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001685 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001686 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001687 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001688 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001689}
1690
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001691// SendSetGemNCTPVar sets GemPortNetworkCtp ME instance
1692func (oo *OmciCC) SendSetGemNCTPVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
1693 tid := oo.GetNextTid(highPrio)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001694 logger.Debugw(ctx, "send GemNCTP-Set-msg:", log.Fields{"device-id": oo.deviceID,
1695 "SequNo": strconv.FormatInt(int64(tid), 16),
1696 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1697
1698 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1699 if omciErr.GetError() == nil {
1700 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001701 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType,
1702 oframe.TransactionID(tid), oframe.AddDefaults(true))
ozgecanetsia82b91a62021-05-21 18:54:49 +03001703 if err != nil {
1704 logger.Errorw(ctx, "Cannot encode GemNCTP for set", log.Fields{
1705 "Err": err, "device-id": oo.deviceID})
1706 return nil, err
1707 }
1708
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001709 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001710 if err != nil {
1711 logger.Errorw(ctx, "Cannot serialize GemNCTP set", log.Fields{
1712 "Err": err, "device-id": oo.deviceID})
1713 return nil, err
1714 }
1715
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001716 omciRxCallbackPair := CallbackPair{
1717 CbKey: tid,
1718 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia82b91a62021-05-21 18:54:49 +03001719 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001720 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001721 if err != nil {
1722 logger.Errorw(ctx, "Cannot send GemNCTP set", log.Fields{
1723 "Err": err, "device-id": oo.deviceID})
1724 return nil, err
1725 }
1726 logger.Debug(ctx, "send GemNCTP-Set-msg done", log.Fields{"device-id": oo.deviceID})
1727 return meInstance, nil
1728 }
1729 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
1730 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1731 return nil, omciErr.GetError()
1732}
1733
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001734// SendCreateGemIWTPVar creates GemInterworkingTerminationPoint ME instance
1735func (oo *OmciCC) SendCreateGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001736 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001737 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001738 logger.Debugw(ctx, "send GemIwTp-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001739 "SequNo": strconv.FormatInt(int64(tid), 16),
1740 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1741
1742 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(params[0])
1743 if omciErr.GetError() == nil {
1744 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
mpagenko836a1fd2021-11-01 16:12:42 +00001745 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1746 oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001747 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001748 logger.Errorw(ctx, "Cannot encode GemIwTp for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001749 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001750 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001751 }
1752
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001753 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001754 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001755 logger.Errorw(ctx, "Cannot serialize GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001756 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001757 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001758 }
1759
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001760 omciRxCallbackPair := CallbackPair{
1761 CbKey: tid,
1762 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001763 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001764 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001765 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001766 logger.Errorw(ctx, "Cannot send GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001767 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001768 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001769 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001770 logger.Debug(ctx, "send GemIwTp-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001771 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001772 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001773 logger.Errorw(ctx, "Cannot generate GemIwTp Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001774 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001775 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001776}
1777
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001778// SendSetTcontVar sets TCont ME instance
1779func (oo *OmciCC) SendSetTcontVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001780 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001781 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001782 logger.Debugw(ctx, "send TCont-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001783 "SequNo": strconv.FormatInt(int64(tid), 16),
1784 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1785
1786 meInstance, omciErr := me.NewTCont(params[0])
1787 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001788 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001789 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001790 logger.Errorw(ctx, "Cannot encode TCont for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001791 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001792 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001793 }
1794
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001795 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001796 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001797 logger.Errorw(ctx, "Cannot serialize TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001798 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001799 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001800 }
1801
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001802 omciRxCallbackPair := CallbackPair{
1803 CbKey: tid,
1804 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001805 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001806 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001807 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001808 logger.Errorw(ctx, "Cannot send TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001809 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001810 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001811 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001812 logger.Debug(ctx, "send TCont-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001813 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001814 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001815 logger.Errorw(ctx, "Cannot generate TCont Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001816 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001817 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001818}
1819
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001820// SendSetPrioQueueVar sets PriorityQueue ME instance
1821func (oo *OmciCC) SendSetPrioQueueVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001822 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001823 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001824 logger.Debugw(ctx, "send PrioQueue-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001825 "SequNo": strconv.FormatInt(int64(tid), 16),
1826 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1827
1828 meInstance, omciErr := me.NewPriorityQueue(params[0])
1829 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001830 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001831 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001832 logger.Errorw(ctx, "Cannot encode PrioQueue for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001833 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001834 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001835 }
1836
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001837 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001838 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001839 logger.Errorw(ctx, "Cannot serialize PrioQueue set", 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 Hildebrandt4b5e73f2021-08-19 06:51:21 +00001844 omciRxCallbackPair := CallbackPair{
1845 CbKey: tid,
1846 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001847 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001848 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001849 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001850 logger.Errorw(ctx, "Cannot send PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001851 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001852 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001853 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001854 logger.Debug(ctx, "send PrioQueue-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001855 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001856 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001857 logger.Errorw(ctx, "Cannot generate PrioQueue Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001858 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001859 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001860}
1861
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001862// SendSetDot1PMapperVar sets Ieee8021PMapperServiceProfile ME instance
1863func (oo *OmciCC) SendSetDot1PMapperVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001864 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001865 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001866 logger.Debugw(ctx, "send 1PMapper-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001867 "SequNo": strconv.FormatInt(int64(tid), 16),
1868 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1869
1870 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(params[0])
1871 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001872 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001873 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001874 logger.Errorw(ctx, "Cannot encode 1PMapper for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001875 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001876 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001877 }
1878
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001879 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001880 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001881 logger.Errorw(ctx, "Cannot serialize 1PMapper 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 Hildebrandt4b5e73f2021-08-19 06:51:21 +00001886 omciRxCallbackPair := CallbackPair{
1887 CbKey: tid,
1888 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001889 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001890 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001891 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001892 logger.Errorw(ctx, "Cannot send 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001893 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001894 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001895 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001896 logger.Debug(ctx, "send 1PMapper-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001897 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001898 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001899 logger.Errorw(ctx, "Cannot generate 1PMapper Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001900 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001901 return nil, omciErr.GetError()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001902}
mpagenkodff5dda2020-08-28 11:52:01 +00001903
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001904// SendCreateVtfdVar creates VlanTaggingFilterData ME instance
1905func (oo *OmciCC) SendCreateVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001906 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001907 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001908 logger.Debugw(ctx, "send VTFD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00001909 "SequNo": strconv.FormatInt(int64(tid), 16),
1910 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1911
1912 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
1913 if omciErr.GetError() == nil {
1914 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
mpagenko836a1fd2021-11-01 16:12:42 +00001915 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1916 oframe.TransactionID(tid))
mpagenkodff5dda2020-08-28 11:52:01 +00001917 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001918 logger.Errorw(ctx, "Cannot encode VTFD for create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001919 "Err": err, "device-id": oo.deviceID})
1920 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1921 // return (dual format) error code that can be used at caller for immediate error treatment
1922 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03001923 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001924 }
1925
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001926 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00001927 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001928 logger.Errorw(ctx, "Cannot serialize VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001929 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001930 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001931 }
1932
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001933 omciRxCallbackPair := CallbackPair{
1934 CbKey: tid,
1935 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00001936 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001937 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00001938 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001939 logger.Errorw(ctx, "Cannot send VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001940 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001941 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001942 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001943 logger.Debug(ctx, "send VTFD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001944 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00001945 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001946 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001947 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001948 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00001949}
1950
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001951// nolint: unused
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001952func (oo *OmciCC) sendSetVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001953 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001954 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001955 logger.Debugw(ctx, "send VTFD-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001956 "SequNo": strconv.FormatInt(int64(tid), 16),
1957 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1958
1959 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
1960 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001961 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType,
1962 oframe.TransactionID(tid))
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001963 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001964 logger.Errorw(ctx, "Cannot encode VTFD for set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001965 "Err": err, "device-id": oo.deviceID})
1966 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1967 // return (dual format) error code that can be used at caller for immediate error treatment
1968 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03001969 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001970 }
1971
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001972 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001973 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001974 logger.Errorw(ctx, "Cannot serialize VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001975 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001976 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001977 }
1978
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001979 omciRxCallbackPair := CallbackPair{
1980 CbKey: tid,
1981 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001982 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001983 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001984 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001985 logger.Errorw(ctx, "Cannot send VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001986 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001987 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001988 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001989 logger.Debug(ctx, "send VTFD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001990 return meInstance, nil
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001991 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001992 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001993 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001994 return nil, omciErr.GetError()
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001995}
1996
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001997// SendCreateEvtocdVar creates ExtendedVlanTaggingOperationConfigurationData ME instance
1998func (oo *OmciCC) SendCreateEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001999 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002000 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002001 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002002 "SequNo": strconv.FormatInt(int64(tid), 16),
2003 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2004
2005 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2006 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002007 //EnhancedMode not yet supported, used with default options
2008 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
2009 oframe.TransactionID(tid), oframe.AddDefaults(true))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002010 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002011 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002012 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002013 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002014 }
2015
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002016 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002017 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002018 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002019 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002020 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002021 }
2022
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002023 omciRxCallbackPair := CallbackPair{
2024 CbKey: tid,
2025 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002026 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002027 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002028 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002029 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002030 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002031 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002032 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002033 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002034 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002035 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002036 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002037 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002038 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002039}
2040
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002041// SendSetEvtocdVar sets ExtendedVlanTaggingOperationConfigurationData ME instance
2042func (oo *OmciCC) SendSetEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002043 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002044 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002045 logger.Debugw(ctx, "send EVTOCD-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002046 "SequNo": strconv.FormatInt(int64(tid), 16),
2047 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2048
2049 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2050 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002051 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenkodff5dda2020-08-28 11:52:01 +00002052 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002053 logger.Errorw(ctx, "Cannot encode EVTOCD for set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002054 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002055 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002056 }
2057
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002058 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00002059 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002060 logger.Errorw(ctx, "Cannot serialize EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002061 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002062 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002063 }
2064
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002065 omciRxCallbackPair := CallbackPair{
2066 CbKey: tid,
2067 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00002068 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002069 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00002070 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002071 logger.Errorw(ctx, "Cannot send EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002072 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002073 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002074 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002075 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002076 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00002077 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002078 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002079 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002080 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00002081}
mpagenko01e726e2020-10-23 09:45:29 +00002082
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002083// SendDeleteEvtocd deletes ExtendedVlanTaggingOperationConfigurationData ME instance
2084func (oo *OmciCC) SendDeleteEvtocd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002085 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002086 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002087 logger.Debugw(ctx, "send EVTOCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002088 "SequNo": strconv.FormatInt(int64(tid), 16),
2089 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2090
2091 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2092 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002093 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002094 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002095 logger.Errorw(ctx, "Cannot encode EVTOCD for delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002096 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002097 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002098 }
2099
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002100 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002101 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002102 logger.Errorw(ctx, "Cannot serialize EVTOCD delete", 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 Hildebrandt4b5e73f2021-08-19 06:51:21 +00002107 omciRxCallbackPair := CallbackPair{
2108 CbKey: tid,
2109 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002110 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002111 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002112 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002113 logger.Errorw(ctx, "Cannot send EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002114 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002115 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002116 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002117 logger.Debug(ctx, "send EVTOCD-delete msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002118 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002119 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002120 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002121 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002122 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002123}
2124
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002125// SendDeleteVtfd deletes VlanTaggingFilterData ME instance
2126func (oo *OmciCC) SendDeleteVtfd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002127 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002128 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002129 logger.Debugw(ctx, "send VTFD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko01e726e2020-10-23 09:45:29 +00002130 "SequNo": strconv.FormatInt(int64(tid), 16),
2131 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2132
2133 meParams := me.ParamData{EntityID: aInstID}
2134 meInstance, omciErr := me.NewVlanTaggingFilterData(meParams)
2135 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002136 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2137 oframe.TransactionID(tid))
mpagenko01e726e2020-10-23 09:45:29 +00002138 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002139 logger.Errorw(ctx, "Cannot encode VTFD for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002140 "Err": err, "device-id": oo.deviceID})
2141 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2142 // return (dual format) error code that can be used at caller for immediate error treatment
2143 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002144 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002145 }
2146
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002147 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko01e726e2020-10-23 09:45:29 +00002148 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002149 logger.Errorw(ctx, "Cannot serialize VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002150 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002151 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002152 }
2153
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002154 omciRxCallbackPair := CallbackPair{
2155 CbKey: tid,
2156 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko01e726e2020-10-23 09:45:29 +00002157 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002158 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko01e726e2020-10-23 09:45:29 +00002159 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002160 logger.Errorw(ctx, "Cannot send VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002161 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002162 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002163 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002164 logger.Debug(ctx, "send VTFD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002165 return meInstance, nil
mpagenko01e726e2020-10-23 09:45:29 +00002166 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002167 logger.Errorw(ctx, "Cannot generate VTFD Instance for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002168 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002169 return nil, omciErr.GetError()
mpagenko01e726e2020-10-23 09:45:29 +00002170}
ozgecanetsia422dbf32020-10-28 14:07:19 +03002171
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002172// SendCreateTDVar creates TrafficDescriptor ME instance
2173func (oo *OmciCC) SendCreateTDVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2174 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002175 logger.Debugw(ctx, "send TD-Create-msg:", log.Fields{"device-id": oo.deviceID,
2176 "SequNo": strconv.FormatInt(int64(tid), 16),
2177 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2178 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2179 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002180 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002181 if err != nil {
2182 logger.Errorw(ctx, "Cannot encode TD for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002183 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002184 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002185 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002186 if err != nil {
2187 logger.Errorw(ctx, "Cannot serialize TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002188 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002189 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002190 omciRxCallbackPair := CallbackPair{
2191 CbKey: tid,
2192 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002193 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002194 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002195 if err != nil {
2196 logger.Errorw(ctx, "Cannot send TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002197 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002198 }
2199 logger.Debug(ctx, "send TD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002200 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002201 }
2202 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002203 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002204}
2205
2206// nolint: unused
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002207func (oo *OmciCC) sendSetTDVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002208 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002209 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002210 logger.Debugw(ctx, "send TD-Set-msg:", log.Fields{"device-id": oo.deviceID,
2211 "SequNo": strconv.FormatInt(int64(tid), 16),
2212 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2213
2214 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2215 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002216 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002217 if err != nil {
2218 logger.Errorw(ctx, "Cannot encode TD for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002219 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002220 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002221 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002222 if err != nil {
2223 logger.Errorw(ctx, "Cannot serialize TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002224 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002225 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002226 omciRxCallbackPair := CallbackPair{
2227 CbKey: tid,
2228 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002229 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002230 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002231 if err != nil {
2232 logger.Errorw(ctx, "Cannot send TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002233 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002234 }
2235 logger.Debug(ctx, "send TD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002236 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002237 }
2238 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002239 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002240
2241}
2242
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002243// SendDeleteTD - TODO: add comment
2244func (oo *OmciCC) SendDeleteTD(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002245 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002246 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002247 logger.Debugw(ctx, "send TD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2248 "SequNo": strconv.FormatInt(int64(tid), 16),
2249 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2250
2251 meParams := me.ParamData{EntityID: aInstID}
2252 meInstance, omciErr := me.NewTrafficDescriptor(meParams)
2253 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002254 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002255 if err != nil {
2256 logger.Errorw(ctx, "Cannot encode TD for delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002257 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002258 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002259 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002260 if err != nil {
2261 logger.Errorw(ctx, "Cannot serialize TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002262 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002263 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002264 omciRxCallbackPair := CallbackPair{
2265 CbKey: tid,
2266 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002267 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002268 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002269 if err != nil {
2270 logger.Errorw(ctx, "Cannot send TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002271 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002272 }
2273 logger.Debug(ctx, "send TD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002274 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002275 }
2276 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002277 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002278
2279}
2280
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002281// SendDeleteGemIWTP deletes GemInterworkingTerminationPoint ME instance
2282func (oo *OmciCC) SendDeleteGemIWTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002283 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002284 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002285 logger.Debugw(ctx, "send GemIwTp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002286 "SequNo": strconv.FormatInt(int64(tid), 16),
2287 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2288
2289 meParams := me.ParamData{EntityID: aInstID}
2290 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(meParams)
2291 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002292 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2293 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002294 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002295 logger.Errorw(ctx, "Cannot encode GemIwTp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002296 "Err": err, "device-id": oo.deviceID})
2297 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2298 // return (dual format) error code that can be used at caller for immediate error treatment
2299 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002300 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002301 }
2302
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002303 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002304 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002305 logger.Errorw(ctx, "Cannot serialize GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002306 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002307 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002308 }
2309
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002310 omciRxCallbackPair := CallbackPair{
2311 CbKey: tid,
2312 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002313 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002314 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002315 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002316 logger.Errorw(ctx, "Cannot send GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002317 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002318 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002319 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002320 logger.Debug(ctx, "send GemIwTp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002321 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002322 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002323 logger.Errorw(ctx, "Cannot generate GemIwTp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002324 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002325 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002326}
2327
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002328// SendDeleteGemNCTP deletes GemPortNetworkCtp ME instance
2329func (oo *OmciCC) SendDeleteGemNCTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002330 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002331 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002332 logger.Debugw(ctx, "send GemNCtp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002333 "SequNo": strconv.FormatInt(int64(tid), 16),
2334 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2335
2336 meParams := me.ParamData{EntityID: aInstID}
2337 meInstance, omciErr := me.NewGemPortNetworkCtp(meParams)
2338 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002339 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2340 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002341 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002342 logger.Errorw(ctx, "Cannot encode GemNCtp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002343 "Err": err, "device-id": oo.deviceID})
2344 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2345 // return (dual format) error code that can be used at caller for immediate error treatment
2346 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002347 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002348 }
2349
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002350 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002351 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002352 logger.Errorw(ctx, "Cannot serialize GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002353 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002354 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002355 }
2356
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002357 omciRxCallbackPair := CallbackPair{
2358 CbKey: tid,
2359 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002360 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002361 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002362 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002363 logger.Errorw(ctx, "Cannot send GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002364 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002365 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002366 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002367 logger.Debug(ctx, "send GemNCtp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002368 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002369 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002370 logger.Errorw(ctx, "Cannot generate GemNCtp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002371 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002372 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002373}
2374
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002375// SendDeleteDot1PMapper deletes Ieee8021PMapperServiceProfile ME instance
2376func (oo *OmciCC) SendDeleteDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002377 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002378 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002379 logger.Debugw(ctx, "send .1pMapper-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002380 "SequNo": strconv.FormatInt(int64(tid), 16),
2381 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2382
2383 meParams := me.ParamData{EntityID: aInstID}
2384 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
2385 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002386 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2387 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002388 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002389 logger.Errorw(ctx, "Cannot encode .1pMapper for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002390 "Err": err, "device-id": oo.deviceID})
2391 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2392 // return (dual format) error code that can be used at caller for immediate error treatment
2393 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002394 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002395 }
2396
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002397 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002398 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002399 logger.Errorw(ctx, "Cannot serialize .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002400 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002401 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002402 }
2403
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002404 omciRxCallbackPair := CallbackPair{
2405 CbKey: tid,
2406 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002407 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002408 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002409 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002410 logger.Errorw(ctx, "Cannot send .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002411 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002412 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002413 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002414 logger.Debug(ctx, "send .1pMapper-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002415 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002416 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002417 logger.Errorw(ctx, "Cannot generate .1pMapper Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002418 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002419 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002420}
2421
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002422// SendDeleteMBPConfigData deletes MacBridgePortConfigurationData ME instance
2423func (oo *OmciCC) SendDeleteMBPConfigData(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002424 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002425 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002426 logger.Debugw(ctx, "send MBPCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002427 "SequNo": strconv.FormatInt(int64(tid), 16),
2428 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2429
2430 meParams := me.ParamData{EntityID: aInstID}
2431 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
2432 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002433 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2434 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002435 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002436 logger.Errorw(ctx, "Cannot encode MBPCD for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002437 "Err": err, "device-id": oo.deviceID})
2438 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2439 // return (dual format) error code that can be used at caller for immediate error treatment
2440 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002441 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002442 }
2443
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002444 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002445 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002446 logger.Errorw(ctx, "Cannot serialize MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002447 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002448 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002449 }
2450
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002451 omciRxCallbackPair := CallbackPair{
2452 CbKey: tid,
2453 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002454 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002455 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002456 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002457 logger.Errorw(ctx, "Cannot send MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002458 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002459 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002460 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002461 logger.Debug(ctx, "send MBPCD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002462 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002463 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002464 logger.Errorw(ctx, "Cannot generate MBPCD Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002465 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002466 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002467}
2468
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002469// SendCreateMulticastGemIWTPVar creates MulticastGemInterworkingTerminationPoint ME instance
2470func (oo *OmciCC) SendCreateMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002471 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002472 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002473 logger.Debugw(ctx, "send MulticastGemIWTP-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002474 "SequNo": strconv.FormatInt(int64(tid), 16),
2475 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2476
2477 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2478 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002479 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2480 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002481 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002482 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002483 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002484 }
2485
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002486 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002487 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002488 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002489 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002490 }
2491
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002492 omciRxCallbackPair := CallbackPair{CbKey: tid,
2493 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002494 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002495 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002496 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002497 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002498 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002499 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002500 logger.Debug(ctx, "send MulticastGEMIWTP-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002501 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002502 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002503 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002504 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002505 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002506}
2507
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002508// SendSetMulticastGemIWTPVar sets MulticastGemInterworkingTerminationPoint ME instance
2509func (oo *OmciCC) SendSetMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002510 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002511 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002512 logger.Debugw(ctx, "send MulticastGemIWTP-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002513 "SequNo": strconv.FormatInt(int64(tid), 16),
2514 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2515
2516 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2517 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002518 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2519 oframe.AddDefaults(true))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002520 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002521 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002522 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002523 }
2524
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002525 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002526 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002527 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002528 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002529 }
2530
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002531 omciRxCallbackPair := CallbackPair{CbKey: tid,
2532 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002533 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002534 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002535 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002536 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002537 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002538 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002539 logger.Debug(ctx, "send MulticastGEMIWTP-set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002540 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002541 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002542 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002543 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002544 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002545}
2546
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002547// SendCreateMulticastOperationProfileVar creates MulticastOperationsProfile ME instance
2548func (oo *OmciCC) SendCreateMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002549 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002550 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002551 logger.Debugw(ctx, "send MulticastOperationProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002552 "SequNo": strconv.FormatInt(int64(tid), 16),
2553 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2554
2555 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2556 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002557 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2558 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002559 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002560 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002561 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002562 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002563 }
2564
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002565 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002566 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002567 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002568 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002569 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002570 }
2571
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002572 omciRxCallbackPair := CallbackPair{CbKey: tid,
2573 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002574 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002575 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002576 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002577 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002578 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002579 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002580 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002581 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002582 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002583 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002584 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002585 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002586 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002587}
2588
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002589// SendSetMulticastOperationProfileVar sets MulticastOperationsProfile ME instance
2590func (oo *OmciCC) SendSetMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002591 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002592 tid := oo.GetNextTid(highPrio)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002593 logger.Debugw(ctx, "send MulticastOperationProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002594 "SequNo": strconv.FormatInt(int64(tid), 16),
2595 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2596
2597 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2598 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002599 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2600 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002601 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002602 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002603 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002604 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002605 }
2606
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002607 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002608 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002609 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002610 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002611 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002612 }
2613
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002614 omciRxCallbackPair := CallbackPair{CbKey: tid,
2615 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002616 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002617 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002618 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002619 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002620 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002621 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002622 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002623 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002624 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002625 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002626 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002627 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002628 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002629}
2630
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002631// SendCreateMulticastSubConfigInfoVar creates MulticastSubscriberConfigInfo ME instance
2632func (oo *OmciCC) SendCreateMulticastSubConfigInfoVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002633 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002634 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002635 logger.Debugw(ctx, "send MulticastSubConfigInfo-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002636 "SequNo": strconv.FormatInt(int64(tid), 16),
2637 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2638
2639 meInstance, omciErr := me.NewMulticastSubscriberConfigInfo(params[0])
2640 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002641 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2642 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002643 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002644 logger.Errorw(ctx, "Cannot encode MulticastSubConfigInfo for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002645 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002646 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002647 }
2648
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002649 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002650 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002651 logger.Errorw(ctx, "Cannot serialize MulticastSubConfigInfo 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 Hildebrandt4b5e73f2021-08-19 06:51:21 +00002656 omciRxCallbackPair := CallbackPair{CbKey: tid,
2657 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002658 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002659 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002660 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002661 logger.Errorw(ctx, "Cannot send MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002662 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002663 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002664 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002665 logger.Debug(ctx, "send MulticastSubConfigInfo-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002666 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002667 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002668 logger.Errorw(ctx, "Cannot generate MulticastSubConfigInfo Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002669 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002670 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002671}
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00002672
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002673// SendCreateVoipVoiceCTP nolint: unused
2674func (oo *OmciCC) SendCreateVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2675 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2676 tid := oo.GetNextTid(highPrio)
2677 logger.Debugw(ctx, "send VoipVoiceCTP-create-msg:", log.Fields{"device-id": oo.deviceID,
2678 "SequNo": strconv.FormatInt(int64(tid), 16),
2679 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2680
2681 meInstance, omciErr := me.NewVoipVoiceCtp(params[0])
2682 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002683 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2684 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002685 if err != nil {
2686 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for create", log.Fields{"Err": err,
2687 "device-id": oo.deviceID})
2688 return nil, err
2689 }
2690
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002691 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002692 if err != nil {
2693 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP create", log.Fields{"Err": err,
2694 "device-id": oo.deviceID})
2695 return nil, err
2696 }
2697
2698 omciRxCallbackPair := CallbackPair{CbKey: tid,
2699 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2700 }
2701 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2702 if err != nil {
2703 logger.Errorw(ctx, "Cannot send VoipVoiceCTP create", log.Fields{"Err": err,
2704 "device-id": oo.deviceID})
2705 return nil, err
2706 }
2707 logger.Debug(ctx, "send VoipVoiceCTP-create-msg done")
2708 return meInstance, nil
2709 }
2710 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance", log.Fields{"Err": omciErr.GetError(),
2711 "device-id": oo.deviceID})
2712 return nil, omciErr.GetError()
2713}
2714
2715// SendSetVoipVoiceCTP nolint: unused
2716func (oo *OmciCC) SendSetVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2717 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2718 tid := oo.GetNextTid(highPrio)
2719 logger.Debugw(ctx, "send VoipVoiceCTP-set-msg:", log.Fields{"device-id": oo.deviceID,
2720 "SequNo": strconv.FormatInt(int64(tid), 16),
2721 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2722
2723 meInstance, omciErr := me.NewVoipVoiceCtp(params[0])
2724 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002725 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2726 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002727 if err != nil {
2728 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for set", log.Fields{"Err": err,
2729 "device-id": oo.deviceID})
2730 return nil, err
2731 }
2732
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002733 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002734 if err != nil {
2735 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP set", log.Fields{"Err": err,
2736 "device-id": oo.deviceID})
2737 return nil, err
2738 }
2739
2740 omciRxCallbackPair := CallbackPair{CbKey: tid,
2741 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2742 }
2743 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2744 if err != nil {
2745 logger.Errorw(ctx, "Cannot send VoipVoiceCTP set", log.Fields{"Err": err,
2746 "device-id": oo.deviceID})
2747 return nil, err
2748 }
2749 logger.Debug(ctx, "send VoipVoiceCTP-set-msg done")
2750 return meInstance, nil
2751 }
2752 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance", log.Fields{"Err": omciErr.GetError(),
2753 "device-id": oo.deviceID})
2754 return nil, omciErr.GetError()
2755}
2756
2757// SendDeleteVoipVoiceCTP nolint: unused
2758func (oo *OmciCC) SendDeleteVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2759 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
2760 tid := oo.GetNextTid(highPrio)
2761 logger.Debugw(ctx, "send VoipVoiceCTP-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2762 "SequNo": strconv.FormatInt(int64(tid), 16),
2763 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2764
2765 meParams := me.ParamData{EntityID: aInstID}
2766 meInstance, omciErr := me.NewVoipVoiceCtp(meParams)
2767 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002768 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2769 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002770 if err != nil {
2771 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for delete", log.Fields{
2772 "Err": err, "device-id": oo.deviceID})
2773 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2774 // return (dual format) error code that can be used at caller for immediate error treatment
2775 // (relevant to all used sendXX() methods and their error conditions)
2776 return nil, err
2777 }
2778
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002779 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002780 if err != nil {
2781 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP delete", log.Fields{
2782 "Err": err, "device-id": oo.deviceID})
2783 return nil, err
2784 }
2785
2786 omciRxCallbackPair := CallbackPair{
2787 CbKey: tid,
2788 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2789 }
2790 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2791 if err != nil {
2792 logger.Errorw(ctx, "Cannot send VoipVoiceCTP delete", log.Fields{
2793 "Err": err, "device-id": oo.deviceID})
2794 return nil, err
2795 }
2796 logger.Debug(ctx, "send VoipVoiceCTP-Delete-msg done")
2797 return meInstance, nil
2798 }
2799 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance for delete", log.Fields{
2800 "Err": omciErr.GetError(), "device-id": oo.deviceID})
2801 return nil, omciErr.GetError()
2802}
2803
2804// SendCreateVoipMediaProfile nolint: unused
2805func (oo *OmciCC) SendCreateVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2806 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2807 tid := oo.GetNextTid(highPrio)
2808 logger.Debugw(ctx, "send VoipMediaProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
2809 "SequNo": strconv.FormatInt(int64(tid), 16),
2810 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2811
2812 meInstance, omciErr := me.NewVoipMediaProfile(params[0])
2813 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002814 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2815 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002816 if err != nil {
2817 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for create", log.Fields{"Err": err,
2818 "device-id": oo.deviceID})
2819 return nil, err
2820 }
2821
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002822 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002823 if err != nil {
2824 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile create", log.Fields{"Err": err,
2825 "device-id": oo.deviceID})
2826 return nil, err
2827 }
2828
2829 omciRxCallbackPair := CallbackPair{CbKey: tid,
2830 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2831 }
2832 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2833 if err != nil {
2834 logger.Errorw(ctx, "Cannot send VoipMediaProfile create", log.Fields{"Err": err,
2835 "device-id": oo.deviceID})
2836 return nil, err
2837 }
2838 logger.Debug(ctx, "send VoipMediaProfile-create-msg done")
2839 return meInstance, nil
2840 }
2841 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance", log.Fields{"Err": omciErr.GetError(),
2842 "device-id": oo.deviceID})
2843 return nil, omciErr.GetError()
2844}
2845
2846// SendSetVoipMediaProfile nolint: unused
2847func (oo *OmciCC) SendSetVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2848 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2849 tid := oo.GetNextTid(highPrio)
2850 logger.Debugw(ctx, "send VoipMediaProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
2851 "SequNo": strconv.FormatInt(int64(tid), 16),
2852 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2853
2854 meInstance, omciErr := me.NewVoipMediaProfile(params[0])
2855 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002856 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2857 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002858 if err != nil {
2859 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for set", log.Fields{"Err": err,
2860 "device-id": oo.deviceID})
2861 return nil, err
2862 }
2863
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002864 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002865 if err != nil {
2866 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile set", log.Fields{"Err": err,
2867 "device-id": oo.deviceID})
2868 return nil, err
2869 }
2870
2871 omciRxCallbackPair := CallbackPair{CbKey: tid,
2872 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2873 }
2874 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2875 if err != nil {
2876 logger.Errorw(ctx, "Cannot send VoipMediaProfile set", log.Fields{"Err": err,
2877 "device-id": oo.deviceID})
2878 return nil, err
2879 }
2880 logger.Debug(ctx, "send VoipMediaProfile-set-msg done")
2881 return meInstance, nil
2882 }
2883 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance", log.Fields{"Err": omciErr.GetError(),
2884 "device-id": oo.deviceID})
2885 return nil, omciErr.GetError()
2886}
2887
2888// SendDeleteVoipMediaProfile nolint: unused
2889func (oo *OmciCC) SendDeleteVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2890 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
2891 tid := oo.GetNextTid(highPrio)
2892 logger.Debugw(ctx, "send VoipMediaProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2893 "SequNo": strconv.FormatInt(int64(tid), 16),
2894 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2895
2896 meParams := me.ParamData{EntityID: aInstID}
2897 meInstance, omciErr := me.NewVoipMediaProfile(meParams)
2898 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002899 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2900 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002901 if err != nil {
2902 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for delete", log.Fields{
2903 "Err": err, "device-id": oo.deviceID})
2904 return nil, err
2905 }
2906
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002907 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002908 if err != nil {
2909 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile delete", log.Fields{
2910 "Err": err, "device-id": oo.deviceID})
2911 return nil, err
2912 }
2913
2914 omciRxCallbackPair := CallbackPair{
2915 CbKey: tid,
2916 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2917 }
2918 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2919 if err != nil {
2920 logger.Errorw(ctx, "Cannot send VoipMediaProfile delete", log.Fields{
2921 "Err": err, "device-id": oo.deviceID})
2922 return nil, err
2923 }
2924 logger.Debug(ctx, "send VoipMediaProfile-Delete-msg done")
2925 return meInstance, nil
2926 }
2927 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance for delete", log.Fields{
2928 "Err": omciErr.GetError(), "device-id": oo.deviceID})
2929 return nil, omciErr.GetError()
2930}
2931
2932// SendCreateVoiceServiceProfile nolint: unused
2933func (oo *OmciCC) SendCreateVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
2934 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2935 tid := oo.GetNextTid(highPrio)
2936 logger.Debugw(ctx, "send VoiceServiceProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
2937 "SequNo": strconv.FormatInt(int64(tid), 16),
2938 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2939
2940 meInstance, omciErr := me.NewVoiceServiceProfile(params[0])
2941 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002942 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2943 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002944 if err != nil {
2945 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for create", log.Fields{"Err": err,
2946 "device-id": oo.deviceID})
2947 return nil, err
2948 }
2949
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002950 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002951 if err != nil {
2952 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile create", log.Fields{"Err": err,
2953 "device-id": oo.deviceID})
2954 return nil, err
2955 }
2956
2957 omciRxCallbackPair := CallbackPair{CbKey: tid,
2958 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2959 }
2960 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2961 if err != nil {
2962 logger.Errorw(ctx, "Cannot send VoiceServiceProfile create", log.Fields{"Err": err,
2963 "device-id": oo.deviceID})
2964 return nil, err
2965 }
2966 logger.Debug(ctx, "send VoiceServiceProfile-create-msg done")
2967 return meInstance, nil
2968 }
2969 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
2970 "device-id": oo.deviceID})
2971 return nil, omciErr.GetError()
2972}
2973
2974// SendSetVoiceServiceProfile nolint: unused
2975func (oo *OmciCC) SendSetVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
2976 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2977 tid := oo.GetNextTid(highPrio)
2978 logger.Debugw(ctx, "send VoiceServiceProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
2979 "SequNo": strconv.FormatInt(int64(tid), 16),
2980 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2981
2982 meInstance, omciErr := me.NewVoiceServiceProfile(params[0])
2983 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002984 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2985 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002986 if err != nil {
2987 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for set", log.Fields{"Err": err,
2988 "device-id": oo.deviceID})
2989 return nil, err
2990 }
2991
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002992 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002993 if err != nil {
2994 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile set", log.Fields{"Err": err,
2995 "device-id": oo.deviceID})
2996 return nil, err
2997 }
2998
2999 omciRxCallbackPair := CallbackPair{CbKey: tid,
3000 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3001 }
3002 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3003 if err != nil {
3004 logger.Errorw(ctx, "Cannot send VoiceServiceProfile set", log.Fields{"Err": err,
3005 "device-id": oo.deviceID})
3006 return nil, err
3007 }
3008 logger.Debug(ctx, "send VoiceServiceProfile-set-msg done")
3009 return meInstance, nil
3010 }
3011 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3012 "device-id": oo.deviceID})
3013 return nil, omciErr.GetError()
3014}
3015
3016// SendDeleteVoiceServiceProfile nolint: unused
3017func (oo *OmciCC) SendDeleteVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3018 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3019 tid := oo.GetNextTid(highPrio)
3020 logger.Debugw(ctx, "send VoiceServiceProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3021 "SequNo": strconv.FormatInt(int64(tid), 16),
3022 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3023
3024 meParams := me.ParamData{EntityID: aInstID}
3025 meInstance, omciErr := me.NewVoiceServiceProfile(meParams)
3026 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003027 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3028 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003029 if err != nil {
3030 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for delete", log.Fields{
3031 "Err": err, "device-id": oo.deviceID})
3032 return nil, err
3033 }
3034
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003035 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003036 if err != nil {
3037 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile delete", log.Fields{
3038 "Err": err, "device-id": oo.deviceID})
3039 return nil, err
3040 }
3041
3042 omciRxCallbackPair := CallbackPair{
3043 CbKey: tid,
3044 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3045 }
3046 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3047 if err != nil {
3048 logger.Errorw(ctx, "Cannot send VoiceServiceProfile delete", log.Fields{
3049 "Err": err, "device-id": oo.deviceID})
3050 return nil, err
3051 }
3052 logger.Debug(ctx, "send VoiceServiceProfile-Delete-msg done")
3053 return meInstance, nil
3054 }
3055 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance for delete", log.Fields{
3056 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3057 return nil, omciErr.GetError()
3058}
3059
3060// SendCreateSIPUserData nolint: unused
3061func (oo *OmciCC) SendCreateSIPUserData(ctx context.Context, timeout int, highPrio bool,
3062 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3063 tid := oo.GetNextTid(highPrio)
3064 logger.Debugw(ctx, "send SIPUserData-create-msg:", log.Fields{"device-id": oo.deviceID,
3065 "SequNo": strconv.FormatInt(int64(tid), 16),
3066 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3067
3068 meInstance, omciErr := me.NewSipUserData(params[0])
3069 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003070 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3071 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003072 if err != nil {
3073 logger.Errorw(ctx, "Cannot encode SIPUserData for create", log.Fields{"Err": err,
3074 "device-id": oo.deviceID})
3075 return nil, err
3076 }
3077
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003078 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003079 if err != nil {
3080 logger.Errorw(ctx, "Cannot serialize SIPUserData create", log.Fields{"Err": err,
3081 "device-id": oo.deviceID})
3082 return nil, err
3083 }
3084
3085 omciRxCallbackPair := CallbackPair{CbKey: tid,
3086 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3087 }
3088 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3089 if err != nil {
3090 logger.Errorw(ctx, "Cannot send SIPUserData create", log.Fields{"Err": err,
3091 "device-id": oo.deviceID})
3092 return nil, err
3093 }
3094 logger.Debug(ctx, "send SIPUserData-create-msg done")
3095 return meInstance, nil
3096 }
3097 logger.Errorw(ctx, "Cannot generate SIPUserData Instance", log.Fields{"Err": omciErr.GetError(),
3098 "device-id": oo.deviceID})
3099 return nil, omciErr.GetError()
3100}
3101
3102// SendSetSIPUserData nolint: unused
3103func (oo *OmciCC) SendSetSIPUserData(ctx context.Context, timeout int, highPrio bool,
3104 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3105 tid := oo.GetNextTid(highPrio)
3106 logger.Debugw(ctx, "send SIPUserData-set-msg:", log.Fields{"device-id": oo.deviceID,
3107 "SequNo": strconv.FormatInt(int64(tid), 16),
3108 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3109
3110 meInstance, omciErr := me.NewSipUserData(params[0])
3111 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003112 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3113 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003114 if err != nil {
3115 logger.Errorw(ctx, "Cannot encode SIPUserData for set", log.Fields{"Err": err,
3116 "device-id": oo.deviceID})
3117 return nil, err
3118 }
3119
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003120 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003121 if err != nil {
3122 logger.Errorw(ctx, "Cannot serialize SIPUserData set", log.Fields{"Err": err,
3123 "device-id": oo.deviceID})
3124 return nil, err
3125 }
3126
3127 omciRxCallbackPair := CallbackPair{CbKey: tid,
3128 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3129 }
3130 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3131 if err != nil {
3132 logger.Errorw(ctx, "Cannot send SIPUserData set", log.Fields{"Err": err,
3133 "device-id": oo.deviceID})
3134 return nil, err
3135 }
3136 logger.Debug(ctx, "send SIPUserData-set-msg done")
3137 return meInstance, nil
3138 }
3139 logger.Errorw(ctx, "Cannot generate SIPUserData Instance", log.Fields{"Err": omciErr.GetError(),
3140 "device-id": oo.deviceID})
3141 return nil, omciErr.GetError()
3142}
3143
3144// SendDeleteSIPUserData nolint: unused
3145func (oo *OmciCC) SendDeleteSIPUserData(ctx context.Context, timeout int, highPrio bool,
3146 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3147 tid := oo.GetNextTid(highPrio)
3148 logger.Debugw(ctx, "send SIPUserData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3149 "SequNo": strconv.FormatInt(int64(tid), 16),
3150 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3151
3152 meParams := me.ParamData{EntityID: aInstID}
3153 meInstance, omciErr := me.NewSipUserData(meParams)
3154 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003155 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3156 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003157 if err != nil {
3158 logger.Errorw(ctx, "Cannot encode SIPUserData for delete", log.Fields{
3159 "Err": err, "device-id": oo.deviceID})
3160 return nil, err
3161 }
3162
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003163 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003164 if err != nil {
3165 logger.Errorw(ctx, "Cannot serialize SIPUserData delete", log.Fields{
3166 "Err": err, "device-id": oo.deviceID})
3167 return nil, err
3168 }
3169
3170 omciRxCallbackPair := CallbackPair{
3171 CbKey: tid,
3172 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3173 }
3174 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3175 if err != nil {
3176 logger.Errorw(ctx, "Cannot send SIPUserData delete", log.Fields{
3177 "Err": err, "device-id": oo.deviceID})
3178 return nil, err
3179 }
3180 logger.Debug(ctx, "send SIPUserData-Delete-msg done")
3181 return meInstance, nil
3182 }
3183 logger.Errorw(ctx, "Cannot generate SIPUserData Instance for delete", log.Fields{
3184 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3185 return nil, omciErr.GetError()
3186}
3187
3188// SendCreateVoipApplicationServiceProfile nolint: unused
3189func (oo *OmciCC) SendCreateVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3190 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3191 tid := oo.GetNextTid(highPrio)
3192 logger.Debugw(ctx, "send VoipApplicationServiceProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
3193 "SequNo": strconv.FormatInt(int64(tid), 16),
3194 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3195
3196 meInstance, omciErr := me.NewVoipApplicationServiceProfile(params[0])
3197 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003198 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3199 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003200 if err != nil {
3201 logger.Errorw(ctx, "Cannot encode VoipApplicationServiceProfile for create", log.Fields{"Err": err,
3202 "device-id": oo.deviceID})
3203 return nil, err
3204 }
3205
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003206 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003207 if err != nil {
3208 logger.Errorw(ctx, "Cannot serialize VoipApplicationServiceProfile create", log.Fields{"Err": err,
3209 "device-id": oo.deviceID})
3210 return nil, err
3211 }
3212
3213 omciRxCallbackPair := CallbackPair{CbKey: tid,
3214 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3215 }
3216 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3217 if err != nil {
3218 logger.Errorw(ctx, "Cannot send VoipApplicationServiceProfile create", log.Fields{"Err": err,
3219 "device-id": oo.deviceID})
3220 return nil, err
3221 }
3222 logger.Debug(ctx, "send VoipApplicationServiceProfile-create-msg done")
3223 return meInstance, nil
3224 }
3225 logger.Errorw(ctx, "Cannot generate VoipApplicationServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3226 "device-id": oo.deviceID})
3227 return nil, omciErr.GetError()
3228}
3229
3230// SendSetVoipApplicationServiceProfile nolint: unused
3231func (oo *OmciCC) SendSetVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3232 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3233 tid := oo.GetNextTid(highPrio)
3234 logger.Debugw(ctx, "send VoipApplicationServiceProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
3235 "SequNo": strconv.FormatInt(int64(tid), 16),
3236 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3237
3238 meInstance, omciErr := me.NewVoipApplicationServiceProfile(params[0])
3239 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003240 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3241 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003242 if err != nil {
3243 logger.Errorw(ctx, "Cannot encode VoipApplicationServiceProfile for set", log.Fields{"Err": err,
3244 "device-id": oo.deviceID})
3245 return nil, err
3246 }
3247
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003248 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003249 if err != nil {
3250 logger.Errorw(ctx, "Cannot serialize VoipApplicationServiceProfile set", log.Fields{"Err": err,
3251 "device-id": oo.deviceID})
3252 return nil, err
3253 }
3254
3255 omciRxCallbackPair := CallbackPair{CbKey: tid,
3256 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3257 }
3258 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3259 if err != nil {
3260 logger.Errorw(ctx, "Cannot send VoipApplicationServiceProfile set", log.Fields{"Err": err,
3261 "device-id": oo.deviceID})
3262 return nil, err
3263 }
3264 logger.Debug(ctx, "send VoipApplicationServiceProfile-set-msg done")
3265 return meInstance, nil
3266 }
3267 logger.Errorw(ctx, "Cannot generate VoipApplicationServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3268 "device-id": oo.deviceID})
3269 return nil, omciErr.GetError()
3270}
3271
3272// SendDeleteVoipApplicationServiceProfile nolint: unused
3273func (oo *OmciCC) SendDeleteVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3274 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3275 tid := oo.GetNextTid(highPrio)
3276 logger.Debugw(ctx, "send SIPVoipApplicationServiceProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3277 "SequNo": strconv.FormatInt(int64(tid), 16),
3278 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3279
3280 meParams := me.ParamData{EntityID: aInstID}
3281 meInstance, omciErr := me.NewVoipApplicationServiceProfile(meParams)
3282 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003283 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3284 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003285 if err != nil {
3286 logger.Errorw(ctx, "Cannot encode SIPVoipApplicationServiceProfile for delete", log.Fields{
3287 "Err": err, "device-id": oo.deviceID})
3288 return nil, err
3289 }
3290
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003291 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003292 if err != nil {
3293 logger.Errorw(ctx, "Cannot serialize SIPVoipApplicationServiceProfile delete", log.Fields{
3294 "Err": err, "device-id": oo.deviceID})
3295 return nil, err
3296 }
3297
3298 omciRxCallbackPair := CallbackPair{
3299 CbKey: tid,
3300 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3301 }
3302 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3303 if err != nil {
3304 logger.Errorw(ctx, "Cannot send SIPVoipApplicationServiceProfile delete", log.Fields{
3305 "Err": err, "device-id": oo.deviceID})
3306 return nil, err
3307 }
3308 logger.Debug(ctx, "send SIPVoipApplicationServiceProfile-Delete-msg done")
3309 return meInstance, nil
3310 }
3311 logger.Errorw(ctx, "Cannot generate SIPVoipApplicationServiceProfile Instance for delete", log.Fields{
3312 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3313 return nil, omciErr.GetError()
3314}
3315
3316// SendCreateSIPAgentConfigData nolint: unused
3317func (oo *OmciCC) SendCreateSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3318 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3319 tid := oo.GetNextTid(highPrio)
3320 logger.Debugw(ctx, "send SIPAgentConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3321 "SequNo": strconv.FormatInt(int64(tid), 16),
3322 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3323
3324 meInstance, omciErr := me.NewSipAgentConfigData(params[0])
3325 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003326 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3327 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003328 if err != nil {
3329 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for create", log.Fields{"Err": err,
3330 "device-id": oo.deviceID})
3331 return nil, err
3332 }
3333
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003334 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003335 if err != nil {
3336 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData create", log.Fields{"Err": err,
3337 "device-id": oo.deviceID})
3338 return nil, err
3339 }
3340
3341 omciRxCallbackPair := CallbackPair{CbKey: tid,
3342 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3343 }
3344 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3345 if err != nil {
3346 logger.Errorw(ctx, "Cannot send SIPAgentConfigData create", log.Fields{"Err": err,
3347 "device-id": oo.deviceID})
3348 return nil, err
3349 }
3350 logger.Debug(ctx, "send SIPAgentConfigData-create-msg done")
3351 return meInstance, nil
3352 }
3353 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3354 "device-id": oo.deviceID})
3355 return nil, omciErr.GetError()
3356}
3357
3358// SendSetSIPAgentConfigData nolint: unused
3359func (oo *OmciCC) SendSetSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3360 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3361 tid := oo.GetNextTid(highPrio)
3362 logger.Debugw(ctx, "send SIPAgentConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3363 "SequNo": strconv.FormatInt(int64(tid), 16),
3364 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3365
3366 meInstance, omciErr := me.NewSipAgentConfigData(params[0])
3367 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003368 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3369 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003370 if err != nil {
3371 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for set", log.Fields{"Err": err,
3372 "device-id": oo.deviceID})
3373 return nil, err
3374 }
3375
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003376 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003377 if err != nil {
3378 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData set", log.Fields{"Err": err,
3379 "device-id": oo.deviceID})
3380 return nil, err
3381 }
3382
3383 omciRxCallbackPair := CallbackPair{CbKey: tid,
3384 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3385 }
3386 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3387 if err != nil {
3388 logger.Errorw(ctx, "Cannot send SIPAgentConfigData set", log.Fields{"Err": err,
3389 "device-id": oo.deviceID})
3390 return nil, err
3391 }
3392 logger.Debug(ctx, "send SIPAgentConfigData-set-msg done")
3393 return meInstance, nil
3394 }
3395 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3396 "device-id": oo.deviceID})
3397 return nil, omciErr.GetError()
3398}
3399
3400// SendDeleteSIPAgentConfigData nolint: unused
3401func (oo *OmciCC) SendDeleteSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3402 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3403 tid := oo.GetNextTid(highPrio)
3404 logger.Debugw(ctx, "send SIPAgentConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3405 "SequNo": strconv.FormatInt(int64(tid), 16),
3406 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3407
3408 meParams := me.ParamData{EntityID: aInstID}
3409 meInstance, omciErr := me.NewSipAgentConfigData(meParams)
3410 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003411 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3412 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003413 if err != nil {
3414 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for delete", log.Fields{
3415 "Err": err, "device-id": oo.deviceID})
3416 return nil, err
3417 }
3418
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003419 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003420 if err != nil {
3421 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData delete", log.Fields{
3422 "Err": err, "device-id": oo.deviceID})
3423 return nil, err
3424 }
3425
3426 omciRxCallbackPair := CallbackPair{
3427 CbKey: tid,
3428 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3429 }
3430 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3431 if err != nil {
3432 logger.Errorw(ctx, "Cannot send SIPAgentConfigData delete", log.Fields{
3433 "Err": err, "device-id": oo.deviceID})
3434 return nil, err
3435 }
3436 logger.Debug(ctx, "send SIPAgentConfigData-Delete-msg done")
3437 return meInstance, nil
3438 }
3439 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance for delete", log.Fields{
3440 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3441 return nil, omciErr.GetError()
3442}
3443
3444// SendCreateTCPUDPConfigData nolint: unused
3445func (oo *OmciCC) SendCreateTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3446 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3447 tid := oo.GetNextTid(highPrio)
3448 logger.Debugw(ctx, "send TCPUDPConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3449 "SequNo": strconv.FormatInt(int64(tid), 16),
3450 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3451
3452 meInstance, omciErr := me.NewTcpUdpConfigData(params[0])
3453 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003454 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3455 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003456 if err != nil {
3457 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for create", log.Fields{"Err": err,
3458 "device-id": oo.deviceID})
3459 return nil, err
3460 }
3461
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003462 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003463 if err != nil {
3464 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData create", log.Fields{"Err": err,
3465 "device-id": oo.deviceID})
3466 return nil, err
3467 }
3468
3469 omciRxCallbackPair := CallbackPair{CbKey: tid,
3470 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3471 }
3472 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3473 if err != nil {
3474 logger.Errorw(ctx, "Cannot send TCPUDPConfigData create", log.Fields{"Err": err,
3475 "device-id": oo.deviceID})
3476 return nil, err
3477 }
3478 logger.Debug(ctx, "send TCPUDPConfigData-create-msg done")
3479 return meInstance, nil
3480 }
3481 logger.Errorw(ctx, "Cannot generate TCPUDPConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3482 "device-id": oo.deviceID})
3483 return nil, omciErr.GetError()
3484}
3485
3486// SendSetTCPUDPConfigData nolint: unused
3487func (oo *OmciCC) SendSetTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3488 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3489 tid := oo.GetNextTid(highPrio)
3490 logger.Debugw(ctx, "send TCPUDPConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3491 "SequNo": strconv.FormatInt(int64(tid), 16),
3492 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3493
3494 meInstance, omciErr := me.NewTcpUdpConfigData(params[0])
3495 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003496 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3497 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003498 if err != nil {
3499 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for set", log.Fields{"Err": err,
3500 "device-id": oo.deviceID})
3501 return nil, err
3502 }
3503
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003504 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003505 if err != nil {
3506 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData set", log.Fields{"Err": err,
3507 "device-id": oo.deviceID})
3508 return nil, err
3509 }
3510
3511 omciRxCallbackPair := CallbackPair{CbKey: tid,
3512 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3513 }
3514 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3515 if err != nil {
3516 logger.Errorw(ctx, "Cannot send TCPUDPConfigData set", log.Fields{"Err": err,
3517 "device-id": oo.deviceID})
3518 return nil, err
3519 }
3520 logger.Debug(ctx, "send TCPUDPConfigData-set-msg done")
3521 return meInstance, nil
3522 }
3523 logger.Errorw(ctx, "Cannot generate TCPUDPConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3524 "device-id": oo.deviceID})
3525 return nil, omciErr.GetError()
3526}
3527
3528// SendDeleteTCPUDPConfigData nolint: unused
3529func (oo *OmciCC) SendDeleteTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3530 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3531 tid := oo.GetNextTid(highPrio)
3532 logger.Debugw(ctx, "send TCPUDPConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3533 "SequNo": strconv.FormatInt(int64(tid), 16),
3534 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3535
3536 meParams := me.ParamData{EntityID: aInstID}
3537 meInstance, omciErr := me.NewTcpUdpConfigData(meParams)
3538 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003539 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3540 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003541 if err != nil {
3542 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for delete", log.Fields{
3543 "Err": err, "device-id": oo.deviceID})
3544 return nil, err
3545 }
3546
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003547 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003548 if err != nil {
3549 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData delete", log.Fields{
3550 "Err": err, "device-id": oo.deviceID})
3551 return nil, err
3552 }
3553
3554 omciRxCallbackPair := CallbackPair{
3555 CbKey: tid,
3556 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3557 }
3558 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3559 if err != nil {
3560 logger.Errorw(ctx, "Cannot send TCPUDPConfigData delete", log.Fields{
3561 "Err": err, "device-id": oo.deviceID})
3562 return nil, err
3563 }
3564 logger.Debug(ctx, "send TCPUDPConfigData-Delete-msg done")
3565 return meInstance, nil
3566 }
3567 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance for delete", log.Fields{
3568 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3569 return nil, omciErr.GetError()
3570}
3571
3572// SendCreateIPHostConfigData nolint: unused
3573func (oo *OmciCC) SendCreateIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3574 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3575 tid := oo.GetNextTid(highPrio)
3576 logger.Debugw(ctx, "send IPHostConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3577 "SequNo": strconv.FormatInt(int64(tid), 16),
3578 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3579
3580 meInstance, omciErr := me.NewIpHostConfigData(params[0])
3581 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003582 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3583 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003584 if err != nil {
3585 logger.Errorw(ctx, "Cannot encode IPHostConfigData for create", log.Fields{"Err": err,
3586 "device-id": oo.deviceID})
3587 return nil, err
3588 }
3589
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003590 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003591 if err != nil {
3592 logger.Errorw(ctx, "Cannot serialize IPHostConfigData create", log.Fields{"Err": err,
3593 "device-id": oo.deviceID})
3594 return nil, err
3595 }
3596
3597 omciRxCallbackPair := CallbackPair{CbKey: tid,
3598 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3599 }
3600 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3601 if err != nil {
3602 logger.Errorw(ctx, "Cannot send IPHostConfigData create", log.Fields{"Err": err,
3603 "device-id": oo.deviceID})
3604 return nil, err
3605 }
3606 logger.Debug(ctx, "send IPHostConfigData-create-msg done")
3607 return meInstance, nil
3608 }
3609 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3610 "device-id": oo.deviceID})
3611 return nil, omciErr.GetError()
3612}
3613
3614// SendSetIPHostConfigData nolint: unused
3615func (oo *OmciCC) SendSetIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3616 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3617 tid := oo.GetNextTid(highPrio)
3618 logger.Debugw(ctx, "send IPHostConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3619 "SequNo": strconv.FormatInt(int64(tid), 16),
3620 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3621
3622 meInstance, omciErr := me.NewIpHostConfigData(params[0])
3623 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003624 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3625 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003626 if err != nil {
3627 logger.Errorw(ctx, "Cannot encode IPHostConfigData for set", log.Fields{"Err": err,
3628 "device-id": oo.deviceID})
3629 return nil, err
3630 }
3631
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003632 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003633 if err != nil {
3634 logger.Errorw(ctx, "Cannot serialize IPHostConfigData set", log.Fields{"Err": err,
3635 "device-id": oo.deviceID})
3636 return nil, err
3637 }
3638
3639 omciRxCallbackPair := CallbackPair{CbKey: tid,
3640 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3641 }
3642 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3643 if err != nil {
3644 logger.Errorw(ctx, "Cannot send IPHostConfigData set", log.Fields{"Err": err,
3645 "device-id": oo.deviceID})
3646 return nil, err
3647 }
3648 logger.Debug(ctx, "send IPHostConfigData-set-msg done")
3649 return meInstance, nil
3650 }
3651 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3652 "device-id": oo.deviceID})
3653 return nil, omciErr.GetError()
3654}
3655
3656// SendDeleteIPHostConfigData nolint: unused
3657func (oo *OmciCC) SendDeleteIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3658 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3659 tid := oo.GetNextTid(highPrio)
3660 logger.Debugw(ctx, "send IPHostConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3661 "SequNo": strconv.FormatInt(int64(tid), 16),
3662 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3663
3664 meParams := me.ParamData{EntityID: aInstID}
3665 meInstance, omciErr := me.NewIpHostConfigData(meParams)
3666 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003667 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3668 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003669 if err != nil {
3670 logger.Errorw(ctx, "Cannot encode IPHostConfigData for delete", log.Fields{
3671 "Err": err, "device-id": oo.deviceID})
3672 return nil, err
3673 }
3674
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003675 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003676 if err != nil {
3677 logger.Errorw(ctx, "Cannot serialize IPHostConfigData delete", log.Fields{
3678 "Err": err, "device-id": oo.deviceID})
3679 return nil, err
3680 }
3681
3682 omciRxCallbackPair := CallbackPair{
3683 CbKey: tid,
3684 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3685 }
3686 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3687 if err != nil {
3688 logger.Errorw(ctx, "Cannot send IPHostConfigData delete", log.Fields{
3689 "Err": err, "device-id": oo.deviceID})
3690 return nil, err
3691 }
3692 logger.Debug(ctx, "send IPHostConfigData-Delete-msg done")
3693 return meInstance, nil
3694 }
3695 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance for delete", log.Fields{
3696 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3697 return nil, omciErr.GetError()
3698}
3699
3700// SendCreateRTPProfileData nolint: unused
3701func (oo *OmciCC) SendCreateRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3702 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3703 tid := oo.GetNextTid(highPrio)
3704 logger.Debugw(ctx, "send RTPProfileData-create-msg:", log.Fields{"device-id": oo.deviceID,
3705 "SequNo": strconv.FormatInt(int64(tid), 16),
3706 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3707
3708 meInstance, omciErr := me.NewRtpProfileData(params[0])
3709 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003710 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3711 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003712 if err != nil {
3713 logger.Errorw(ctx, "Cannot encode RTPProfileData for create", log.Fields{"Err": err,
3714 "device-id": oo.deviceID})
3715 return nil, err
3716 }
3717
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003718 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003719 if err != nil {
3720 logger.Errorw(ctx, "Cannot serialize RTPProfileData create", log.Fields{"Err": err,
3721 "device-id": oo.deviceID})
3722 return nil, err
3723 }
3724
3725 omciRxCallbackPair := CallbackPair{CbKey: tid,
3726 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3727 }
3728 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3729 if err != nil {
3730 logger.Errorw(ctx, "Cannot send RTPProfileData create", log.Fields{"Err": err,
3731 "device-id": oo.deviceID})
3732 return nil, err
3733 }
3734 logger.Debug(ctx, "send RTPProfileData-create-msg done")
3735 return meInstance, nil
3736 }
3737 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance", log.Fields{"Err": omciErr.GetError(),
3738 "device-id": oo.deviceID})
3739 return nil, omciErr.GetError()
3740}
3741
3742// SendSetRTPProfileData nolint: unused
3743func (oo *OmciCC) SendSetRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3744 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3745 tid := oo.GetNextTid(highPrio)
3746 logger.Debugw(ctx, "send RTPProfileData-set-msg:", log.Fields{"device-id": oo.deviceID,
3747 "SequNo": strconv.FormatInt(int64(tid), 16),
3748 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3749
3750 meInstance, omciErr := me.NewRtpProfileData(params[0])
3751 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003752 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3753 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003754 if err != nil {
3755 logger.Errorw(ctx, "Cannot encode RTPProfileData for set", log.Fields{"Err": err,
3756 "device-id": oo.deviceID})
3757 return nil, err
3758 }
3759
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003760 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003761 if err != nil {
3762 logger.Errorw(ctx, "Cannot serialize RTPProfileData set", log.Fields{"Err": err,
3763 "device-id": oo.deviceID})
3764 return nil, err
3765 }
3766
3767 omciRxCallbackPair := CallbackPair{CbKey: tid,
3768 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3769 }
3770 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3771 if err != nil {
3772 logger.Errorw(ctx, "Cannot send RTPProfileData set", log.Fields{"Err": err,
3773 "device-id": oo.deviceID})
3774 return nil, err
3775 }
3776 logger.Debug(ctx, "send RTPProfileData-set-msg done")
3777 return meInstance, nil
3778 }
3779 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance", log.Fields{"Err": omciErr.GetError(),
3780 "device-id": oo.deviceID})
3781 return nil, omciErr.GetError()
3782}
3783
3784// SendDeleteRTPProfileData nolint: unused
3785func (oo *OmciCC) SendDeleteRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3786 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3787 tid := oo.GetNextTid(highPrio)
3788 logger.Debugw(ctx, "send RTPProfileData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3789 "SequNo": strconv.FormatInt(int64(tid), 16),
3790 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3791
3792 meParams := me.ParamData{EntityID: aInstID}
3793 meInstance, omciErr := me.NewRtpProfileData(meParams)
3794 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003795 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3796 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003797 if err != nil {
3798 logger.Errorw(ctx, "Cannot encode RTPProfileData for delete", log.Fields{
3799 "Err": err, "device-id": oo.deviceID})
3800 return nil, err
3801 }
3802
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003803 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003804 if err != nil {
3805 logger.Errorw(ctx, "Cannot serialize RTPProfileData delete", log.Fields{
3806 "Err": err, "device-id": oo.deviceID})
3807 return nil, err
3808 }
3809
3810 omciRxCallbackPair := CallbackPair{
3811 CbKey: tid,
3812 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3813 }
3814 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3815 if err != nil {
3816 logger.Errorw(ctx, "Cannot send RTPProfileData delete", log.Fields{
3817 "Err": err, "device-id": oo.deviceID})
3818 return nil, err
3819 }
3820 logger.Debug(ctx, "send RTPProfileData-Delete-msg done")
3821 return meInstance, nil
3822 }
3823 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance for delete", log.Fields{
3824 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3825 return nil, omciErr.GetError()
3826}
3827
3828// SendCreateNetworkDialPlanTable nolint: unused
3829func (oo *OmciCC) SendCreateNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
3830 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3831 tid := oo.GetNextTid(highPrio)
3832 logger.Debugw(ctx, "send NetworkDialPlanTable-create-msg:", log.Fields{"device-id": oo.deviceID,
3833 "SequNo": strconv.FormatInt(int64(tid), 16),
3834 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3835
3836 meInstance, omciErr := me.NewNetworkDialPlanTable(params[0])
3837 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003838 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3839 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003840 if err != nil {
3841 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for create", log.Fields{"Err": err,
3842 "device-id": oo.deviceID})
3843 return nil, err
3844 }
3845
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003846 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003847 if err != nil {
3848 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable create", log.Fields{"Err": err,
3849 "device-id": oo.deviceID})
3850 return nil, err
3851 }
3852
3853 omciRxCallbackPair := CallbackPair{CbKey: tid,
3854 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3855 }
3856 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3857 if err != nil {
3858 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable create", log.Fields{"Err": err,
3859 "device-id": oo.deviceID})
3860 return nil, err
3861 }
3862 logger.Debug(ctx, "send NetworkDialPlanTable-create-msg done")
3863 return meInstance, nil
3864 }
3865 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance", log.Fields{"Err": omciErr.GetError(),
3866 "device-id": oo.deviceID})
3867 return nil, omciErr.GetError()
3868}
3869
3870// SendSetNetworkDialPlanTable nolint: unused
3871func (oo *OmciCC) SendSetNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
3872 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3873 tid := oo.GetNextTid(highPrio)
3874 logger.Debugw(ctx, "send NetworkDialPlanTable-set-msg:", log.Fields{"device-id": oo.deviceID,
3875 "SequNo": strconv.FormatInt(int64(tid), 16),
3876 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3877
3878 meInstance, omciErr := me.NewNetworkDialPlanTable(params[0])
3879 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003880 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3881 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003882 if err != nil {
3883 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for set", log.Fields{"Err": err,
3884 "device-id": oo.deviceID})
3885 return nil, err
3886 }
3887
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003888 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003889 if err != nil {
3890 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable set", log.Fields{"Err": err,
3891 "device-id": oo.deviceID})
3892 return nil, err
3893 }
3894
3895 omciRxCallbackPair := CallbackPair{CbKey: tid,
3896 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3897 }
3898 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3899 if err != nil {
3900 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable set", log.Fields{"Err": err,
3901 "device-id": oo.deviceID})
3902 return nil, err
3903 }
3904 logger.Debug(ctx, "send NetworkDialPlanTable-set-msg done")
3905 return meInstance, nil
3906 }
3907 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance", log.Fields{"Err": omciErr.GetError(),
3908 "device-id": oo.deviceID})
3909 return nil, omciErr.GetError()
3910}
3911
3912// SendDeleteNetworkDialPlanTable nolint: unused
3913func (oo *OmciCC) SendDeleteNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
3914 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3915 tid := oo.GetNextTid(highPrio)
3916 logger.Debugw(ctx, "send NetworkDialPlanTable-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3917 "SequNo": strconv.FormatInt(int64(tid), 16),
3918 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3919
3920 meParams := me.ParamData{EntityID: aInstID}
3921 meInstance, omciErr := me.NewNetworkDialPlanTable(meParams)
3922 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003923 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3924 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003925 if err != nil {
3926 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for delete", log.Fields{
3927 "Err": err, "device-id": oo.deviceID})
3928 return nil, err
3929 }
3930
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003931 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003932 if err != nil {
3933 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable delete", log.Fields{
3934 "Err": err, "device-id": oo.deviceID})
3935 return nil, err
3936 }
3937
3938 omciRxCallbackPair := CallbackPair{
3939 CbKey: tid,
3940 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3941 }
3942 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3943 if err != nil {
3944 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable delete", log.Fields{
3945 "Err": err, "device-id": oo.deviceID})
3946 return nil, err
3947 }
3948 logger.Debug(ctx, "send NetworkDialPlanTable-Delete-msg done")
3949 return meInstance, nil
3950 }
3951 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance for delete", log.Fields{
3952 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3953 return nil, omciErr.GetError()
3954}
3955
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003956// SendSyncTime sends SynchronizeTimeRequest
3957func (oo *OmciCC) SendSyncTime(ctx context.Context, timeout int, highPrio bool, rxChan chan Message) error {
3958 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08003959 logger.Debugw(ctx, "send synchronize time request:", log.Fields{"device-id": oo.deviceID,
3960 "SequNo": strconv.FormatInt(int64(tid), 16)})
3961
3962 omciLayer := &omci.OMCI{
3963 TransactionID: tid,
3964 MessageType: omci.SynchronizeTimeRequestType,
3965 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
3966 // Length: 0x28, // Optional, defaults to 40 octets
3967 }
3968 utcTime := time.Now().UTC()
3969 request := &omci.SynchronizeTimeRequest{
3970 MeBasePacket: omci.MeBasePacket{
3971 EntityClass: me.OnuGClassID,
3972 // Default Instance ID is 0
3973 },
3974 Year: uint16(utcTime.Year()),
3975 Month: uint8(utcTime.Month()),
3976 Day: uint8(utcTime.Day()),
3977 Hour: uint8(utcTime.Hour()),
3978 Minute: uint8(utcTime.Minute()),
3979 Second: uint8(utcTime.Second()),
3980 }
3981
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003982 pkt, err := SerializeOmciLayer(ctx, omciLayer, request)
Girish Gowdrae0140f02021-02-02 16:55:09 -08003983 if err != nil {
3984 logger.Errorw(ctx, "Cannot serialize synchronize time request", log.Fields{"Err": err,
3985 "device-id": oo.deviceID})
3986 return err
3987 }
3988
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003989 omciRxCallbackPair := CallbackPair{CbKey: tid,
3990 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08003991 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003992 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08003993 if err != nil {
3994 logger.Errorw(ctx, "Cannot send synchronize time request", log.Fields{"Err": err,
3995 "device-id": oo.deviceID})
3996 return err
3997 }
3998 logger.Debug(ctx, "send synchronize time request done")
3999 return nil
4000}
4001
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004002// SendCreateOrDeleteEthernetPerformanceMonitoringHistoryME creates or deletes EthernetFramePerformanceMonitoringHistoryData ME instance
4003func (oo *OmciCC) SendCreateOrDeleteEthernetPerformanceMonitoringHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004004 upstream bool, create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004005 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004006 logger.Debugw(ctx, "send ethernet-performance-monitoring-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4007 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
4008 meParam := me.ParamData{EntityID: entityID}
4009 var meInstance *me.ManagedEntity
4010 var omciErr me.OmciErrors
4011 if upstream {
4012 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataUpstream(meParam)
4013 } else {
4014 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataDownstream(meParam)
4015 }
4016 if omciErr.GetError() == nil {
4017 var omciLayer *omci.OMCI
4018 var msgLayer gopacket.SerializableLayer
4019 var err error
4020 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004021 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4022 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004023 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004024 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4025 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004026 }
4027 if err != nil {
4028 logger.Errorw(ctx, "Cannot encode ethernet frame performance monitoring history data ME",
4029 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004030 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004031 }
4032
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004033 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004034 if err != nil {
4035 logger.Errorw(ctx, "Cannot serialize ethernet frame performance monitoring history data ME",
4036 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004037 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004038 }
4039
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004040 omciRxCallbackPair := CallbackPair{CbKey: tid,
4041 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004042 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004043 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004044 if err != nil {
4045 logger.Errorw(ctx, "Cannot send ethernet frame performance monitoring history data ME",
4046 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004047 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004048 }
4049 logger.Debugw(ctx, "send ethernet frame performance monitoring history data ME done",
4050 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004051 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08004052 }
4053 logger.Errorw(ctx, "Cannot generate ethernet frame performance monitoring history data ME Instance",
4054 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 +03004055 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08004056}
4057
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004058// SendCreateOrDeleteEthernetUniHistoryME creates or deletes EthernetPerformanceMonitoringHistoryData ME instance
4059func (oo *OmciCC) SendCreateOrDeleteEthernetUniHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004060 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004061 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004062 logger.Debugw(ctx, "send ethernet-uni-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4063 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4064 meParam := me.ParamData{EntityID: entityID}
4065 var meInstance *me.ManagedEntity
4066 var omciErr me.OmciErrors
4067 meInstance, omciErr = me.NewEthernetPerformanceMonitoringHistoryData(meParam)
4068
4069 if omciErr.GetError() == nil {
4070 var omciLayer *omci.OMCI
4071 var msgLayer gopacket.SerializableLayer
4072 var err error
4073 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004074 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4075 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004076 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004077 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4078 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004079 }
4080 if err != nil {
4081 logger.Errorw(ctx, "Cannot encode ethernet uni history data ME",
4082 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004083 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004084 }
4085
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004086 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004087 if err != nil {
4088 logger.Errorw(ctx, "Cannot serialize ethernet uni history data ME",
4089 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004090 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004091 }
4092
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004093 omciRxCallbackPair := CallbackPair{CbKey: tid,
4094 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004095 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004096 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004097 if err != nil {
4098 logger.Errorw(ctx, "Cannot send ethernet uni history data ME",
4099 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004100 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004101 }
4102 logger.Debugw(ctx, "send ethernet uni history data ME done",
4103 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004104 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08004105 }
4106 logger.Errorw(ctx, "Cannot generate ethernet uni history data ME Instance",
4107 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004108 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08004109}
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004110
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004111// SendCreateOrDeleteFecHistoryME creates or deletes FecPerformanceMonitoringHistoryData ME instance
4112func (oo *OmciCC) SendCreateOrDeleteFecHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004113 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004114 tid := oo.GetNextTid(highPrio)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004115 logger.Debugw(ctx, "send fec-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4116 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4117 meParam := me.ParamData{EntityID: entityID}
4118 var meInstance *me.ManagedEntity
4119 var omciErr me.OmciErrors
4120 meInstance, omciErr = me.NewFecPerformanceMonitoringHistoryData(meParam)
4121
4122 if omciErr.GetError() == nil {
4123 var omciLayer *omci.OMCI
4124 var msgLayer gopacket.SerializableLayer
4125 var err error
4126 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004127 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4128 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004129 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004130 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4131 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004132 }
4133 if err != nil {
4134 logger.Errorw(ctx, "Cannot encode fec history data ME",
4135 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004136 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004137 }
4138
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004139 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004140 if err != nil {
4141 logger.Errorw(ctx, "Cannot serialize fec history data ME",
4142 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004143 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004144 }
4145
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004146 omciRxCallbackPair := CallbackPair{CbKey: tid,
4147 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004148 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004149 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004150 if err != nil {
4151 logger.Errorw(ctx, "Cannot send fec history data ME",
4152 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004153 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004154 }
4155 logger.Debugw(ctx, "send fec history data ME done",
4156 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004157 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004158 }
4159 logger.Errorw(ctx, "Cannot generate fec history data ME Instance",
4160 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004161 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004162}
4163
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004164// SendCreateOrDeleteGemPortHistoryME deletes GemPortNetworkCtpPerformanceMonitoringHistoryData ME instance
4165func (oo *OmciCC) SendCreateOrDeleteGemPortHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004166 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004167 tid := oo.GetNextTid(highPrio)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004168 logger.Debugw(ctx, "send gemport-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4169 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4170 meParam := me.ParamData{EntityID: entityID}
4171 var meInstance *me.ManagedEntity
4172 var omciErr me.OmciErrors
4173 meInstance, omciErr = me.NewGemPortNetworkCtpPerformanceMonitoringHistoryData(meParam)
4174
4175 if omciErr.GetError() == nil {
4176 var omciLayer *omci.OMCI
4177 var msgLayer gopacket.SerializableLayer
4178 var err error
4179 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004180 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4181 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004182 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004183 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4184 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004185 }
4186 if err != nil {
4187 logger.Errorw(ctx, "Cannot encode gemport history data ME",
4188 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004189 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004190 }
4191
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004192 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004193 if err != nil {
4194 logger.Errorw(ctx, "Cannot serialize gemport history data ME",
4195 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004196 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004197 }
4198
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004199 omciRxCallbackPair := CallbackPair{CbKey: tid,
4200 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004201 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004202 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004203 if err != nil {
4204 logger.Errorw(ctx, "Cannot send gemport history data ME",
4205 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004206 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004207 }
4208 logger.Debugw(ctx, "send gemport history data ME done",
4209 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004210 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004211 }
4212 logger.Errorw(ctx, "Cannot generate gemport history data ME Instance",
4213 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004214 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004215}
4216
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004217// SendStartSoftwareDownload sends StartSoftwareDownloadRequest
4218func (oo *OmciCC) SendStartSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004219 rxChan chan Message, aImageMeID uint16, aDownloadWindowSize uint8, aFileLen uint32, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004220 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004221 logger.Debugw(ctx, "send StartSwDlRequest:", log.Fields{"device-id": oo.deviceID,
4222 "SequNo": strconv.FormatInt(int64(tid), 16),
4223 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4224
4225 omciLayer := &omci.OMCI{
4226 TransactionID: tid,
4227 MessageType: omci.StartSoftwareDownloadRequestType,
4228 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4229 // Length: 0x28, // Optional, defaults to 40 octets
4230 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004231 if aIsExtendedOmci {
4232 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4233 }
mpagenko80622a52021-02-09 16:53:23 +00004234 request := &omci.StartSoftwareDownloadRequest{
4235 MeBasePacket: omci.MeBasePacket{
4236 EntityClass: me.SoftwareImageClassID,
4237 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004238 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004239 },
4240 WindowSize: aDownloadWindowSize,
4241 ImageSize: aFileLen,
4242 NumberOfCircuitPacks: 1, //parallel download to multiple circuit packs not supported
4243 CircuitPacks: []uint16{0}, //circuit pack indication don't care for NumberOfCircuitPacks=1, but needed by omci-lib
4244 }
4245
4246 var options gopacket.SerializeOptions
4247 options.FixLengths = true
4248 buffer := gopacket.NewSerializeBuffer()
4249 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4250 if err != nil {
4251 logger.Errorw(ctx, "Cannot serialize StartSwDlRequest", log.Fields{"Err": err,
4252 "device-id": oo.deviceID})
4253 return err
4254 }
4255 outgoingPacket := buffer.Bytes()
4256
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004257 omciRxCallbackPair := CallbackPair{CbKey: tid,
4258 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko80622a52021-02-09 16:53:23 +00004259 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004260 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004261 if err != nil {
4262 logger.Errorw(ctx, "Cannot send StartSwDlRequest", log.Fields{"Err": err,
4263 "device-id": oo.deviceID})
4264 return err
4265 }
4266 logger.Debug(ctx, "send StartSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004267 return nil
4268}
4269
kesavand011d5162021-11-25 19:21:06 +05304270// PrepareOnuSectionsOfWindow prepares a list of sections for each window
4271//Before invoking this function the oo.mutexTid needs to be be locked so that
4272//GetOnuSwSecNextTid can be invoked without further locking
4273func (oo *OmciCC) PrepareOnuSectionsOfWindow(ctx context.Context,
4274 aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004275 omciMsgsPerWindow *ia.OmciMessages, aIsExtendedOmci bool) (OmciTransferStructure, error) {
kesavand011d5162021-11-25 19:21:06 +05304276 //onuswsections uses only low prioirity tids
4277 tid := oo.GetOnuSwSecNextTid()
4278 logger.Infow(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
4279 "SequNo": strconv.FormatInt(int64(tid), 16),
4280 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest, "sectionNo": aDownloadSectionNo, "sectionData": aSection})
4281
4282 var omciTxReq OmciTransferStructure
4283 msgType := omci.DownloadSectionRequestType
4284
4285 if aAckRequest > 0 {
4286 msgType = omci.DownloadSectionRequestWithResponseType
4287
4288 }
4289 omciLayer := &omci.OMCI{
4290 TransactionID: tid,
4291 MessageType: msgType,
4292 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4293 // Length: 0x28, // Optional, defaults to 40 octets
4294 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004295 if aIsExtendedOmci {
4296 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4297 }
kesavand011d5162021-11-25 19:21:06 +05304298 localSectionData := make([]byte, len(aSection))
4299
4300 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
4301 request := &omci.DownloadSectionRequest{
4302 MeBasePacket: omci.MeBasePacket{
4303 EntityClass: me.SoftwareImageClassID,
4304 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004305 Extended: aIsExtendedOmci,
kesavand011d5162021-11-25 19:21:06 +05304306 },
4307 SectionNumber: aDownloadSectionNo,
4308 SectionData: localSectionData,
4309 }
4310
4311 var options gopacket.SerializeOptions
4312 options.FixLengths = true
4313 buffer := gopacket.NewSerializeBuffer()
4314 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4315 if err != nil {
4316 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
4317 "device-id": oo.deviceID})
4318 return omciTxReq, err
4319 }
4320 outgoingPacket := buffer.Bytes()
4321
4322 omciMsgsPerWindow.Messages = append(omciMsgsPerWindow.Messages, outgoingPacket)
4323
4324 if aAckRequest > 0 {
4325 // only the last section should have a timeout as an ack is required only for the last section of the window
4326 omciTxReq = OmciTransferStructure{
4327 withFramePrint: true,
4328 OnuSwWindow: omciMsgsPerWindow,
4329 }
4330 return omciTxReq, nil
4331 }
4332
4333 return omciTxReq, nil
4334}
4335
4336//SendOnuSwSectionsWindowWithRxSupervision sends onu swd sections
4337func (oo *OmciCC) SendOnuSwSectionsWindowWithRxSupervision(ctx context.Context,
4338 aOmciTxRequest OmciTransferStructure, aTimeout int, rxChan chan Message) {
4339 if aOmciTxRequest.OnuSwWindow == nil {
4340 logger.Errorw(ctx, "SendOnuSwSectionsWindowWithRxSupervision: omciTxRequest.OnuSwWindow is nil",
4341 log.Fields{"device-id": oo.deviceID})
4342 return
4343
4344 }
4345
4346 tid := oo.GetOnuSwSecLastTid()
4347 logger.Debugw(ctx, "SendOnuSwSectionsWindowWithRxSupervision tid for the last segment is ", log.Fields{"TID": tid})
4348 omciRxCallbackPair := CallbackPair{CbKey: tid,
4349 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4350 }
4351
4352 aOmciTxRequest.cbPair = omciRxCallbackPair
4353 logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TansCorrId": aOmciTxRequest.cbPair.CbKey})
4354 oo.mutexRxSchedMap.Lock()
4355 // it could be checked, if the callback key is already registered - but simply overwrite may be acceptable ...
4356 oo.rxSchedulerMap[aOmciTxRequest.cbPair.CbKey] = aOmciTxRequest.cbPair.CbEntry
4357 oo.mutexRxSchedMap.Unlock()
4358
4359 chSuccess := make(chan bool)
4360 aOmciTxRequest.chSuccess = chSuccess
4361 aOmciTxRequest.timeout = aTimeout
4362 aOmciTxRequest.retries = CDefaultRetries
4363
4364 //tid := aOmciTxRequest.cbPair.CbKey
4365 oo.mutexMonReq.Lock()
4366 oo.monitoredRequests[tid] = aOmciTxRequest
4367 oo.mutexMonReq.Unlock()
4368
4369 retries := aOmciTxRequest.retries
4370 retryCounter := 0
4371 if aTimeout == 0 {
4372 logger.Errorw(ctx, "no timeout present for last section of window", log.Fields{"device-id": oo.deviceID})
4373 return
4374 }
4375loop:
4376 for retryCounter <= retries {
4377 // the onu sw sections are enqueued only to the low priority queue
4378 oo.mutexLowPrioTxQueue.Lock()
4379 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4380 oo.mutexLowPrioTxQueue.Unlock()
4381
4382 go oo.sendQueuedRequests(ctx)
4383
4384 select {
4385 case success := <-chSuccess:
4386 if success {
4387 logger.Debugw(ctx, "reqMon: response received in time",
4388 log.Fields{"tid": tid, "device-id": oo.deviceID})
4389 } else {
4390 logger.Debugw(ctx, "reqMon: wait for response aborted",
4391 log.Fields{"tid": tid, "device-id": oo.deviceID})
4392 }
4393 break loop
4394 case <-time.After(time.Duration(aTimeout) * time.Second):
4395 if retryCounter == retries {
Holger Hildebrandtc56febd2022-02-09 13:23:30 +00004396 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - send ONU device event!",
kesavand011d5162021-11-25 19:21:06 +05304397 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
Holger Hildebrandtc56febd2022-02-09 13:23:30 +00004398 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationFailureSwUpgrade, OnuOmciCommunicationFailureSwUpgradeDesc)
kesavand011d5162021-11-25 19:21:06 +05304399 break loop
4400 } else {
4401 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
4402 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4403 }
4404 }
4405 retryCounter++
4406 }
4407 oo.mutexMonReq.Lock()
4408 delete(oo.monitoredRequests, tid)
4409 oo.mutexMonReq.Unlock()
4410}
4411
4412func (oo *OmciCC) sendOnuSwSectionsOfWindow(ctx context.Context, omciTxRequest OmciTransferStructure) error {
4413 if omciTxRequest.withFramePrint && omciTxRequest.OnuSwWindow != nil {
4414 lastSection := omciTxRequest.OnuSwWindow.Messages[len(omciTxRequest.OnuSwWindow.Messages)-1]
4415 logger.Debugw(ctx, "omci-message-to-send:", log.Fields{
4416 "TxOmciMessage": hex.EncodeToString(lastSection),
4417 "device-id": oo.deviceID,
4418 "toDeviceType": oo.pBaseDeviceHandler.GetProxyAddressType(),
4419 "proxyDeviceID": oo.pBaseDeviceHandler.GetProxyAddressID(),
4420 "proxyAddress": oo.pBaseDeviceHandler.GetProxyAddress()})
4421 }
4422 sendErr := oo.pBaseDeviceHandler.SendOnuSwSectionsOfWindow(ctx, oo.pBaseDeviceHandler.GetProxyAddress().AdapterEndpoint, omciTxRequest.OnuSwWindow)
4423 if sendErr != nil {
4424 logger.Errorw(ctx, "send onu sw sections omci request error", log.Fields{"ChildId": oo.deviceID, "error": sendErr})
4425 return sendErr
4426 }
4427 return nil
4428}
4429
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004430// SendDownloadSection sends DownloadSectionRequestWithResponse
4431func (oo *OmciCC) SendDownloadSection(ctx context.Context, aTimeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004432 rxChan chan Message, aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte, aPrint bool, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004433 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004434 logger.Debugw(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
4435 "SequNo": strconv.FormatInt(int64(tid), 16),
mpagenko15ff4a52021-03-02 10:09:20 +00004436 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest})
mpagenko80622a52021-02-09 16:53:23 +00004437
4438 //TODO!!!: don't know by now on how to generate the possibly needed AR (or enforce it to 0) with current omci-lib
4439 // by now just try to send it as defined by omci-lib
mpagenko15ff4a52021-03-02 10:09:20 +00004440 msgType := omci.DownloadSectionRequestType
mpagenkoc26d4c02021-05-06 14:27:57 +00004441 var timeout int = 0 //default value for no response expected
mpagenko15ff4a52021-03-02 10:09:20 +00004442 if aAckRequest > 0 {
4443 msgType = omci.DownloadSectionRequestWithResponseType
mpagenkoc26d4c02021-05-06 14:27:57 +00004444 timeout = aTimeout
mpagenko15ff4a52021-03-02 10:09:20 +00004445 }
mpagenko80622a52021-02-09 16:53:23 +00004446 omciLayer := &omci.OMCI{
4447 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004448 MessageType: msgType,
mpagenko80622a52021-02-09 16:53:23 +00004449 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4450 // Length: 0x28, // Optional, defaults to 40 octets
4451 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004452 if aIsExtendedOmci {
4453 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4454 }
Himani Chawla43f95ff2021-06-03 00:24:12 +05304455 localSectionData := make([]byte, len(aSection))
4456
mpagenko15ff4a52021-03-02 10:09:20 +00004457 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
mpagenko80622a52021-02-09 16:53:23 +00004458 request := &omci.DownloadSectionRequest{
4459 MeBasePacket: omci.MeBasePacket{
4460 EntityClass: me.SoftwareImageClassID,
4461 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004462 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004463 },
4464 SectionNumber: aDownloadSectionNo,
4465 SectionData: localSectionData,
4466 }
4467
4468 var options gopacket.SerializeOptions
4469 options.FixLengths = true
4470 buffer := gopacket.NewSerializeBuffer()
4471 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4472 if err != nil {
4473 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
4474 "device-id": oo.deviceID})
4475 return err
4476 }
4477 outgoingPacket := buffer.Bytes()
4478
mpagenko15ff4a52021-03-02 10:09:20 +00004479 //for initial debug purpose overrule the requested print state for some frames
4480 printFrame := aPrint
4481 if aAckRequest > 0 || aDownloadSectionNo == 0 {
4482 printFrame = true
4483 }
4484
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004485 omciRxCallbackPair := CallbackPair{CbKey: tid,
mpagenkoc26d4c02021-05-06 14:27:57 +00004486 // the callback is set even though no response might be required here, the tid (key) setting is needed here anyway
4487 // (used to avoid retransmission of frames with the same TID)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004488 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, printFrame /*aPrint*/},
mpagenko80622a52021-02-09 16:53:23 +00004489 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004490 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004491 if err != nil {
4492 logger.Errorw(ctx, "Cannot send DlSectionRequest", log.Fields{"Err": err,
4493 "device-id": oo.deviceID})
4494 return err
4495 }
4496 logger.Debug(ctx, "send DlSectionRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004497 return nil
4498}
4499
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004500//SendEndSoftwareDownload sends EndSoftwareDownloadRequest
4501func (oo *OmciCC) SendEndSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004502 rxChan chan Message, aImageMeID uint16, aFileLen uint32, aImageCrc uint32, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004503 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004504 logger.Debugw(ctx, "send EndSwDlRequest:", log.Fields{"device-id": oo.deviceID,
4505 "SequNo": strconv.FormatInt(int64(tid), 16),
4506 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4507
mpagenko15ff4a52021-03-02 10:09:20 +00004508 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00004509 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004510 MessageType: omci.EndSoftwareDownloadRequestType,
mpagenko80622a52021-02-09 16:53:23 +00004511 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4512 // Length: 0x28, // Optional, defaults to 40 octets
4513 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004514 if aIsExtendedOmci {
4515 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4516 }
mpagenko15ff4a52021-03-02 10:09:20 +00004517 request := &omci.EndSoftwareDownloadRequest{
mpagenko80622a52021-02-09 16:53:23 +00004518 MeBasePacket: omci.MeBasePacket{
4519 EntityClass: me.SoftwareImageClassID,
4520 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004521 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004522 },
mpagenko15ff4a52021-03-02 10:09:20 +00004523 CRC32: aImageCrc,
4524 ImageSize: aFileLen,
4525 NumberOfInstances: 1, //parallel download to multiple circuit packs not supported
4526 ImageInstances: []uint16{0}, //don't care for NumberOfInstances=1, but probably needed by omci-lib as in startSwDlRequest
mpagenko80622a52021-02-09 16:53:23 +00004527 }
mpagenko15ff4a52021-03-02 10:09:20 +00004528
4529 var options gopacket.SerializeOptions
4530 options.FixLengths = true
4531 buffer := gopacket.NewSerializeBuffer()
4532 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4533 if err != nil {
4534 logger.Errorw(ctx, "Cannot serialize EndSwDlRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00004535 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00004536 return err
mpagenko80622a52021-02-09 16:53:23 +00004537 }
mpagenko15ff4a52021-03-02 10:09:20 +00004538 outgoingPacket := buffer.Bytes()
4539
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004540 omciRxCallbackPair := CallbackPair{CbKey: tid,
4541 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko15ff4a52021-03-02 10:09:20 +00004542 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004543 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00004544 if err != nil {
4545 logger.Errorw(ctx, "Cannot send EndSwDlRequest", log.Fields{"Err": err,
4546 "device-id": oo.deviceID})
4547 return err
4548 }
4549 logger.Debug(ctx, "send EndSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004550 return nil
4551}
4552
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004553// SendActivateSoftware sends ActivateSoftwareRequest
4554func (oo *OmciCC) SendActivateSoftware(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004555 rxChan chan Message, aImageMeID uint16, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004556 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004557 logger.Debugw(ctx, "send ActivateSwRequest:", log.Fields{"device-id": oo.deviceID,
4558 "SequNo": strconv.FormatInt(int64(tid), 16),
4559 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4560
4561 omciLayer := &omci.OMCI{
4562 TransactionID: tid,
4563 MessageType: omci.ActivateSoftwareRequestType,
4564 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4565 // Length: 0x28, // Optional, defaults to 40 octets
4566 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004567 if aIsExtendedOmci {
4568 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4569 }
mpagenko80622a52021-02-09 16:53:23 +00004570 request := &omci.ActivateSoftwareRequest{
4571 MeBasePacket: omci.MeBasePacket{
4572 EntityClass: me.SoftwareImageClassID,
4573 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004574 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004575 },
4576 ActivateFlags: 0, //unconditionally reset as the only relevant option here (regardless of VOIP)
4577 }
4578
4579 var options gopacket.SerializeOptions
4580 options.FixLengths = true
4581 buffer := gopacket.NewSerializeBuffer()
4582 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4583 if err != nil {
4584 logger.Errorw(ctx, "Cannot serialize ActivateSwRequest", log.Fields{"Err": err,
4585 "device-id": oo.deviceID})
4586 return err
4587 }
4588 outgoingPacket := buffer.Bytes()
4589
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004590 omciRxCallbackPair := CallbackPair{CbKey: tid,
4591 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko80622a52021-02-09 16:53:23 +00004592 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004593 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004594 if err != nil {
4595 logger.Errorw(ctx, "Cannot send ActivateSwRequest", log.Fields{"Err": err,
4596 "device-id": oo.deviceID})
4597 return err
4598 }
4599 logger.Debug(ctx, "send ActivateSwRequest done")
mpagenko15ff4a52021-03-02 10:09:20 +00004600 return nil
4601}
mpagenko80622a52021-02-09 16:53:23 +00004602
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004603// SendCommitSoftware sends CommitSoftwareRequest
4604func (oo *OmciCC) SendCommitSoftware(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004605 rxChan chan Message, aImageMeID uint16, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004606 tid := oo.GetNextTid(highPrio)
mpagenko15ff4a52021-03-02 10:09:20 +00004607 logger.Debugw(ctx, "send CommitSwRequest:", log.Fields{"device-id": oo.deviceID,
4608 "SequNo": strconv.FormatInt(int64(tid), 16),
4609 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4610
4611 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00004612 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004613 MessageType: omci.CommitSoftwareRequestType,
mpagenko80622a52021-02-09 16:53:23 +00004614 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4615 // Length: 0x28, // Optional, defaults to 40 octets
4616 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004617 if aIsExtendedOmci {
4618 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4619 }
mpagenko15ff4a52021-03-02 10:09:20 +00004620 request := &omci.CommitSoftwareRequest{
mpagenko80622a52021-02-09 16:53:23 +00004621 MeBasePacket: omci.MeBasePacket{
4622 EntityClass: me.SoftwareImageClassID,
4623 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004624 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004625 },
mpagenko80622a52021-02-09 16:53:23 +00004626 }
mpagenko15ff4a52021-03-02 10:09:20 +00004627
4628 var options gopacket.SerializeOptions
4629 options.FixLengths = true
4630 buffer := gopacket.NewSerializeBuffer()
4631 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4632 if err != nil {
4633 logger.Errorw(ctx, "Cannot serialize CommitSwRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00004634 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00004635 return err
mpagenko80622a52021-02-09 16:53:23 +00004636 }
mpagenko15ff4a52021-03-02 10:09:20 +00004637 outgoingPacket := buffer.Bytes()
4638
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004639 omciRxCallbackPair := CallbackPair{CbKey: tid,
4640 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko15ff4a52021-03-02 10:09:20 +00004641 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004642 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00004643 if err != nil {
4644 logger.Errorw(ctx, "Cannot send CommitSwRequest", log.Fields{"Err": err,
4645 "device-id": oo.deviceID})
4646 return err
4647 }
4648 logger.Debug(ctx, "send CommitSwRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004649 return nil
4650}
4651
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004652//SendSelfTestReq sends TestRequest
4653func (oo *OmciCC) SendSelfTestReq(ctx context.Context, classID me.ClassID, instdID uint16, timeout int, highPrio bool, rxChan chan Message) error {
4654 tid := oo.GetNextTid(highPrio)
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004655 logger.Debugw(ctx, "send self test request:", log.Fields{"device-id": oo.deviceID,
4656 "SequNo": strconv.FormatInt(int64(tid), 16),
4657 "InstId": strconv.FormatInt(int64(instdID), 16)})
4658 omciLayer := &omci.OMCI{
4659 TransactionID: tid,
4660 MessageType: omci.TestRequestType,
4661 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4662 // Length: 0x28, // Optional, defaults to 40 octets
4663 }
4664
4665 var request *omci.OpticalLineSupervisionTestRequest
4666 switch classID {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004667 case me.AniGClassID:
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004668 request = &omci.OpticalLineSupervisionTestRequest{
4669 MeBasePacket: omci.MeBasePacket{
4670 EntityClass: classID,
4671 EntityInstance: instdID,
4672 },
4673 SelectTest: uint8(7), // self test
4674 GeneralPurposeBuffer: uint16(0),
4675 VendorSpecificParameters: uint16(0),
4676 }
4677 default:
4678 logger.Errorw(ctx, "unsupported class id for self test request", log.Fields{"device-id": oo.deviceID, "classID": classID})
4679 return fmt.Errorf("unsupported-class-id-for-self-test-request-%v", classID)
4680 }
4681 // Test serialization back to former string
4682 var options gopacket.SerializeOptions
4683 options.FixLengths = true
4684
4685 buffer := gopacket.NewSerializeBuffer()
4686 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4687 if err != nil {
4688 logger.Errorw(ctx, "Cannot serialize self test request", log.Fields{"Err": err,
4689 "device-id": oo.deviceID})
4690 return err
4691 }
4692 outgoingPacket := buffer.Bytes()
4693
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004694 omciRxCallbackPair := CallbackPair{CbKey: tid,
4695 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004696 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004697 err = oo.Send(ctx, outgoingPacket, timeout, 0, highPrio, omciRxCallbackPair)
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004698 if err != nil {
4699 logger.Errorw(ctx, "Cannot send self test request", log.Fields{"Err": err,
4700 "device-id": oo.deviceID})
4701 return err
4702 }
4703 logger.Debug(ctx, "send self test request done")
4704 return nil
4705}
4706
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004707//nolint: gocyclo
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004708func (oo *OmciCC) isSuccessfulResponseWithMibDataSync(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet) (bool, error) {
4709
4710 nextLayer, err := omci.MsgTypeToNextLayer(omciMsg.MessageType, false)
4711 if err != nil {
4712 logger.Errorw(ctx, "omci-message: could not map msgType to nextLayer", log.Fields{"device-id": oo.deviceID})
4713 return false, fmt.Errorf("could not map msgType to nextLayer - %s", oo.deviceID)
4714 }
4715 msgLayer := (*packet).Layer(nextLayer)
4716 if msgLayer != nil {
4717 // Note: Due to relaxed decoding, you may now still have a decoding error attached to the layers
4718 if failure := (*packet).ErrorLayer(); failure != nil {
4719 if nextLayer == omci.LayerTypeMibUploadNextResponse {
4720 // In the case of MibUploadNextResponse, we let the packet pass so that later processing
4721 // can examine for UnkonwnMEs and UnknownAttributes
4722 logger.Infow(ctx, "omci-message: MibUploadNextResponse packet with ErrorLayer - let it pass",
4723 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4724 return false, nil
4725 } else if nextLayer == omci.LayerTypeGetResponse {
4726 if resp := msgLayer.(*omci.GetResponse); resp != nil {
4727 if resp.NextLayerType() == omci.LayerTypeUnknownAttributes {
4728 unknownAttrLayer := (*packet).Layer(omci.LayerTypeUnknownAttributes)
4729 if unknownAttrLayer != nil {
4730 logger.Errorw(ctx, "omci-message: GetResponse packet contains unknownAttrLayer - skip it!",
4731 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "unknownAttrLayer": unknownAttrLayer})
4732 return false, fmt.Errorf("packet contains unknownAttrLayer - %s", oo.deviceID)
4733 }
4734 }
4735 }
4736 }
4737 // Try to decode any further error information
4738 if decodeFailure, ok := failure.(*gopacket.DecodeFailure); ok && decodeFailure != nil {
4739 logger.Errorw(ctx, "omci-message: packet contains ErrorLayer with further info - skip it!",
4740 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "decodeFailure": decodeFailure.String()})
4741 return false, fmt.Errorf("packet contains ErrorLayer with further info - %s", oo.deviceID)
4742 }
4743 logger.Errorw(ctx, "omci-message: packet contains ErrorLayer - skip it!",
4744 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4745 return false, fmt.Errorf("packet contains ErrorLayer - %s", oo.deviceID)
4746 }
4747 } else if failure := (*packet).ErrorLayer(); failure != nil {
4748 // message layer could not be decoded, but at least check if additional failure information is available
4749 if decodeFailure, ok := failure.(*gopacket.DecodeFailure); ok && decodeFailure != nil {
Holger Hildebrandt93d183f2022-04-22 15:50:26 +00004750 errMsg := decodeFailure.String()
4751 if nextLayer == omci.LayerTypeMibUploadNextResponse {
4752 if strings.Contains(strings.ToLower(errMsg), "table decode") {
4753 // In the case of MibUploadNextResponse with non-standard table attributes, we let the packet pass
4754 // so that later processing can deal with it
4755 logger.Infow(ctx, "omci-message: MibUploadNextResponse packet with table attributes - let it pass",
4756 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4757 return false, nil
4758 }
4759 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004760 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet, further info available - skip it!",
Holger Hildebrandt93d183f2022-04-22 15:50:26 +00004761 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "decodeFailure": errMsg})
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004762 return false, fmt.Errorf("could not decode msgLayer of packet, further info available - %s", oo.deviceID)
4763 }
4764 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet, ErrorLayer available",
4765 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4766 return false, fmt.Errorf("could not decode msgLayer of packet, ErrorLayer available - %s", oo.deviceID)
4767 } else {
4768 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet", log.Fields{"device-id": oo.deviceID})
4769 return false, fmt.Errorf("could not decode msgLayer of packet - %s", oo.deviceID)
4770 }
4771
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004772 for _, v := range responsesWithMibDataSync {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004773 if v == omciMsg.MessageType {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004774 switch nextLayer {
4775 case omci.LayerTypeCreateResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004776 if resp := msgLayer.(*omci.CreateResponse); resp != nil {
4777 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004778 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004779 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004780 }
4781 case omci.LayerTypeDeleteResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004782 if resp := msgLayer.(*omci.DeleteResponse); resp != nil {
4783 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004784 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004785 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004786 }
4787 case omci.LayerTypeSetResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004788 if resp := msgLayer.(*omci.SetResponse); resp != nil {
4789 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004790 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004791 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004792 }
4793 case omci.LayerTypeStartSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004794 if resp := msgLayer.(*omci.StartSoftwareDownloadResponse); resp != nil {
4795 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004796 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004797 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004798 }
4799 case omci.LayerTypeEndSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004800 if resp := msgLayer.(*omci.EndSoftwareDownloadResponse); resp != nil {
4801 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004802 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004803 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004804 }
4805 case omci.LayerTypeActivateSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004806 if resp := msgLayer.(*omci.ActivateSoftwareResponse); resp != nil {
4807 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004808 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004809 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004810 }
4811 case omci.LayerTypeCommitSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004812 if resp := msgLayer.(*omci.CommitSoftwareResponse); resp != nil {
4813 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004814 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004815 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004816 }
4817 }
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004818 }
4819 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004820 return false, nil
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004821}
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004822
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004823func (oo *OmciCC) processRequestMonitoring(ctx context.Context, aOmciTxRequest OmciTransferStructure) {
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004824 timeout := aOmciTxRequest.timeout
mpagenkoc26d4c02021-05-06 14:27:57 +00004825 if timeout == 0 {
4826 //timeout 0 indicates that no response is expected - fire and forget
Holger Hildebrandt34555512021-10-01 16:26:59 +00004827 // enqueue
4828 if aOmciTxRequest.highPrio {
4829 oo.mutexHighPrioTxQueue.Lock()
4830 oo.highPrioTxQueue.PushBack(aOmciTxRequest)
4831 oo.mutexHighPrioTxQueue.Unlock()
4832 } else {
4833 oo.mutexLowPrioTxQueue.Lock()
4834 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4835 oo.mutexLowPrioTxQueue.Unlock()
4836 }
4837 go oo.sendQueuedRequests(ctx)
mpagenkoc26d4c02021-05-06 14:27:57 +00004838 } else {
mpagenko7455fd42021-06-10 16:25:55 +00004839 //the supervised sending with waiting on the response (based on TID) is called in background
4840 // to avoid blocking of the sender for the complete OMCI handshake procedure
4841 // to stay consistent with the processing tested so far, sending of next messages of the same control procedure
4842 // is ensured by the according control instances (FSM's etc.) (by waiting for the respective responses there)
4843 go oo.sendWithRxSupervision(ctx, aOmciTxRequest, timeout)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004844 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004845}
4846
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004847func (oo *OmciCC) sendWithRxSupervision(ctx context.Context, aOmciTxRequest OmciTransferStructure, aTimeout int) {
mpagenko7455fd42021-06-10 16:25:55 +00004848 chSuccess := make(chan bool)
4849 aOmciTxRequest.chSuccess = chSuccess
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004850 tid := aOmciTxRequest.cbPair.CbKey
mpagenko7455fd42021-06-10 16:25:55 +00004851 oo.mutexMonReq.Lock()
4852 oo.monitoredRequests[tid] = aOmciTxRequest
4853 oo.mutexMonReq.Unlock()
4854
4855 retries := aOmciTxRequest.retries
4856 retryCounter := 0
4857loop:
4858 for retryCounter <= retries {
Holger Hildebrandt34555512021-10-01 16:26:59 +00004859 // enqueue
4860 if aOmciTxRequest.highPrio {
4861 oo.mutexHighPrioTxQueue.Lock()
4862 oo.highPrioTxQueue.PushBack(aOmciTxRequest)
4863 oo.mutexHighPrioTxQueue.Unlock()
4864 } else {
4865 oo.mutexLowPrioTxQueue.Lock()
4866 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4867 oo.mutexLowPrioTxQueue.Unlock()
4868 }
4869 go oo.sendQueuedRequests(ctx)
mpagenko7455fd42021-06-10 16:25:55 +00004870
4871 select {
4872 case success := <-chSuccess:
4873 if success {
4874 logger.Debugw(ctx, "reqMon: response received in time",
4875 log.Fields{"tid": tid, "device-id": oo.deviceID})
4876 } else {
4877 logger.Debugw(ctx, "reqMon: wait for response aborted",
4878 log.Fields{"tid": tid, "device-id": oo.deviceID})
4879 }
4880 break loop
4881 case <-time.After(time.Duration(aTimeout) * time.Second):
4882 if retryCounter == retries {
Holger Hildebrandtc56febd2022-02-09 13:23:30 +00004883 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - send ONU device event!",
mpagenko7455fd42021-06-10 16:25:55 +00004884 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
Holger Hildebrandtc56febd2022-02-09 13:23:30 +00004885 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationFailureConfig, OnuOmciCommunicationFailureConfigDesc)
mpagenko7455fd42021-06-10 16:25:55 +00004886 break loop
4887 } else {
4888 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
4889 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4890 }
4891 }
4892 retryCounter++
4893 }
4894 oo.mutexMonReq.Lock()
4895 delete(oo.monitoredRequests, tid)
4896 oo.mutexMonReq.Unlock()
4897}
4898
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004899//CancelRequestMonitoring terminates monitoring of outstanding omci requests
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004900func (oo *OmciCC) CancelRequestMonitoring(ctx context.Context) {
Holger Hildebrandt12609a12022-03-25 13:23:25 +00004901 logger.Debugw(ctx, "CancelRequestMonitoring entered", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004902 oo.mutexMonReq.RLock()
4903 for k := range oo.monitoredRequests {
mpagenko8cd1bf72021-06-22 10:11:19 +00004904 //implement non-blocking channel send to avoid blocking on mutexMonReq later
4905 select {
4906 case oo.monitoredRequests[k].chSuccess <- false:
Holger Hildebrandt12609a12022-03-25 13:23:25 +00004907 logger.Debugw(ctx, "send cancellation on omciRespChannel",
4908 log.Fields{"index": k, "device-id": oo.deviceID})
mpagenko8cd1bf72021-06-22 10:11:19 +00004909 default:
Holger Hildebrandt12609a12022-03-25 13:23:25 +00004910 logger.Debugw(ctx, "cancellation could not be send on omciRespChannel (no receiver)",
4911 log.Fields{"index": k, "device-id": oo.deviceID})
mpagenko8cd1bf72021-06-22 10:11:19 +00004912 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004913 }
4914 oo.mutexMonReq.RUnlock()
4915}
4916
4917//GetMaxOmciTimeoutWithRetries provides a timeout value greater than the maximum
4918//time consumed for retry processing of a particular OMCI-request
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004919func (oo *OmciCC) GetMaxOmciTimeoutWithRetries() time.Duration {
4920 return time.Duration((CDefaultRetries+1)*oo.pBaseDeviceHandler.GetOmciTimeout() + 1)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004921}
Himani Chawla43f95ff2021-06-03 00:24:12 +05304922
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004923// SendCreateOrDeleteEthernetFrameExtendedPMME deletes EthernetFrameExtendedPm ME instance
4924func (oo *OmciCC) SendCreateOrDeleteEthernetFrameExtendedPMME(ctx context.Context, timeout int, highPrio bool,
Himani Chawla43f95ff2021-06-03 00:24:12 +05304925 upstream bool, create bool, rxChan chan Message, entityID uint16, classID me.ClassID, controlBlock []uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004926 tid := oo.GetNextTid(highPrio)
Himani Chawla43f95ff2021-06-03 00:24:12 +05304927 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-msg:", log.Fields{"device-id": oo.deviceID,
4928 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
4929
4930 meParam := me.ParamData{EntityID: entityID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00004931 Attributes: me.AttributeValueMap{me.EthernetFrameExtendedPm_ControlBlock: controlBlock},
Himani Chawla43f95ff2021-06-03 00:24:12 +05304932 }
4933 var meInstance *me.ManagedEntity
4934 var omciErr me.OmciErrors
4935 if classID == me.EthernetFrameExtendedPmClassID {
4936 meInstance, omciErr = me.NewEthernetFrameExtendedPm(meParam)
4937 } else {
4938 meInstance, omciErr = me.NewEthernetFrameExtendedPm64Bit(meParam)
4939 }
4940
4941 if omciErr.GetError() == nil {
4942 var omciLayer *omci.OMCI
4943 var msgLayer gopacket.SerializableLayer
4944 var err error
4945 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004946 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4947 oframe.AddDefaults(true))
Himani Chawla43f95ff2021-06-03 00:24:12 +05304948 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004949 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4950 oframe.AddDefaults(true))
Himani Chawla43f95ff2021-06-03 00:24:12 +05304951 }
4952 if err != nil {
4953 logger.Errorw(ctx, "cannot-encode-ethernet-frame-extended-pm-me",
4954 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
4955 return nil, err
4956 }
4957
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004958 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Himani Chawla43f95ff2021-06-03 00:24:12 +05304959 if err != nil {
4960 logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me",
4961 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
4962 return nil, err
4963 }
4964
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004965 omciRxCallbackPair := CallbackPair{CbKey: tid,
4966 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Himani Chawla43f95ff2021-06-03 00:24:12 +05304967 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004968 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawla43f95ff2021-06-03 00:24:12 +05304969 if err != nil {
4970 logger.Errorw(ctx, "Cannot send ethernet-frame-extended-pm-me",
4971 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
4972 return nil, err
4973 }
4974 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-done",
4975 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
4976 return meInstance, nil
4977 }
4978 logger.Errorw(ctx, "cannot-generate-ethernet-frame-extended-pm-me-instance",
4979 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
4980 return nil, omciErr.GetError()
4981}
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004982
4983// RLockMutexMonReq lock read access to monitoredRequests
4984func (oo *OmciCC) RLockMutexMonReq() {
4985 oo.mutexMonReq.RLock()
4986}
4987
4988// RUnlockMutexMonReq unlock read access to monitoredRequests
4989func (oo *OmciCC) RUnlockMutexMonReq() {
4990 oo.mutexMonReq.RUnlock()
4991}
4992
4993// GetMonitoredRequest get OmciTransferStructure for an omciTransID
4994func (oo *OmciCC) GetMonitoredRequest(omciTransID uint16) (value OmciTransferStructure, exist bool) {
4995 value, exist = oo.monitoredRequests[omciTransID]
4996 return value, exist
4997}
4998
4999// SetChMonitoredRequest sets chSuccess to indicate whether response was received or not
5000func (oo *OmciCC) SetChMonitoredRequest(omciTransID uint16, chVal bool) {
5001 oo.monitoredRequests[omciTransID].chSuccess <- chVal
5002}
Himani Chawlaee10b542021-09-20 16:46:40 +05305003
5004// SendSetEthernetFrameExtendedPMME sends the set request for ethernet frame extended type me
5005func (oo *OmciCC) SendSetEthernetFrameExtendedPMME(ctx context.Context, timeout int, highPrio bool,
5006 rxChan chan Message, entityID uint16, classID me.ClassID, controlBlock []uint16) (*me.ManagedEntity, error) {
5007 tid := oo.GetNextTid(highPrio)
5008 logger.Debugw(ctx, "send-set-ethernet-frame-extended-pm-me-control-block:", log.Fields{"device-id": oo.deviceID,
5009 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16)})
5010
5011 meParams := me.ParamData{EntityID: entityID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00005012 Attributes: me.AttributeValueMap{me.EthernetFrameExtendedPm_ControlBlock: controlBlock},
Himani Chawlaee10b542021-09-20 16:46:40 +05305013 }
5014 var meInstance *me.ManagedEntity
5015 var omciErr me.OmciErrors
5016 if classID == me.EthernetFrameExtendedPmClassID {
5017 meInstance, omciErr = me.NewEthernetFrameExtendedPm(meParams)
5018 } else {
5019 meInstance, omciErr = me.NewEthernetFrameExtendedPm64Bit(meParams)
5020 }
5021
5022 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00005023 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Himani Chawlaee10b542021-09-20 16:46:40 +05305024 if err != nil {
5025 logger.Errorw(ctx, "cannot-encode-ethernet-frame-extended-pm-me",
5026 log.Fields{"err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5027 return nil, err
5028 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00005029 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Himani Chawlaee10b542021-09-20 16:46:40 +05305030 if err != nil {
5031 logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me-set-msg",
5032 log.Fields{"err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5033 return nil, err
5034 }
5035 omciRxCallbackPair := CallbackPair{
5036 CbKey: tid,
5037 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
5038 }
5039 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
5040 if err != nil {
5041 logger.Errorw(ctx, "Cannot send ethernet-frame-extended-pm-me",
5042 log.Fields{"Err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5043 return nil, err
5044 }
5045 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-set-msg-done",
5046 log.Fields{"device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5047 return meInstance, nil
5048 }
5049 logger.Errorw(ctx, "cannot-generate-ethernet-frame-extended-pm-me-instance",
5050 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5051 return nil, omciErr.GetError()
5052}
Holger Hildebrandte7cc6092022-02-01 11:37:03 +00005053
5054// PrepareForGarbageCollection - remove references to prepare for garbage collection
5055func (oo *OmciCC) PrepareForGarbageCollection(ctx context.Context, aDeviceID string) {
5056 logger.Debugw(ctx, "prepare for garbage collection", log.Fields{"device-id": aDeviceID})
5057 oo.pBaseDeviceHandler = nil
5058 oo.pOnuDeviceEntry = nil
5059 oo.pOnuAlarmManager = nil
5060}